Добрый день!
Не знаю в ту ли тему форума задаю вопрос, и сможет ли кто-нибдуь мне помочь.... Попытаюсь описать свою проблему.
1. Есть такие контроллеры для АСУТП под названием Segnetics SMH2Gi, которые работают под управлением ОС Linux. вот ссылка:
http://segnetics[dot]com/smh_2gi
2. Для программирования этих контроллеров есть специализированное программное обеспечение Smlogix и в контроллере для Linux написано программное обеспечение, обеспечивающее работу программы написаннной на SMLogix. Для обмена данными из программы написанной в SMLogix с программами на Linux разработчики использовали технологию Shared Memory.
3. В итоге при использовании переменных задествованный во программе SMLogix и выведенных в Shared Memory я имею перечень таких переменных типа такого:
[Slave]
Instat=0xccc0,65536,2
Coil=0xccc1,65538,2
Inreg=0xccc2,65540,24
ShmSize=65564
[Instat]
var0=0x6f,1,0,65536,status
var1=0x71,1,0,65537,zima_leto
[Coil]
var0=0x51,1,0,65538,pusk_stop_btn
var1=0x52,1,0,65539,zima_leto_btn
[Inreg]
var0=0x19a,2,1,65540,vlazh
var1=0x110,4,3,65544,temp_vnesh
var2=0x124,4,3,65548,temp_vitzh
var3=0x138,4,3,65552,temp_room
var4=0x14c,4,3,65556,temp_kanal
var5=0x160,4,3,65560,temp_vobr
Вот описание того, что означают эти цифры и буквы от производителя:
var1=0x134,4,3,8,Parameter
где:
0x134 – адрес переменной в адресном пространстве ядра «logix»
4 – размер переменной в байтах
3 – тип данных переменной в среде «SMLogix» - float (real)
В среде « SMLogix » встречаются типы данных:
• 0 – bool
• 1 – int (тип short int – 2 байта в «C/С++»)
• 2 – long
• 3 – real (тип float в «C/С++»)
8 – адрес переменной в адресном пространстве разделяемой памяти контроллера «/dev/shm/wsi»
Parameter – имя (идентификатор) переменной
4. Теперь собственно какая стоит задача. Мне нужно эти переменные прочитать при помощи PHP (контроллер имеет установленный веб-сервер апач и есть возможность сделать веб-страницу в которой будет отображаться нужная мне информация о работе технологического процесса). Для этого я пробовал использовать функцию shmop_read. И все бы ничего, но вот как найти "Системный идентификатор блока разделяемой памяти" я не знаю. Пытался сделать вот так:
$shm_key = ftok('/dev/shm/wsi', '6');
echo ($shm_key);
echo ('<br>');
echo ('привет <br>');
$shm_id = shmop_open($shm_key, "w", 0, 0);
$shm_size = shmop_size($shm_id);
echo ($shm_size);
$shm_data = shmop_read($shm_id, 65544, 4);
echo ($shm_data);
shmop_close($shm_id);
Естественно ничего не получилось. Как я понял ftok создает новый системный идентификатор а мне нужно найти тот, который уже создан. В общем я встав в тупик и не знаю что делать дальше.
PS Производитель не знает ответа на мой вопрос.