Добрый день!
Не знаю в ту ли тему форума задаю вопрос, и сможет ли кто-нибдуь мне помочь.... Попытаюсь описать свою проблему.
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 Производитель не знает ответа на мой вопрос.
1. -КРОНОС- - 25 Июня, 2013 - 06:05:11 - перейти к сообщению
2. DeepVarvar - 25 Июня, 2013 - 06:18:45 - перейти к сообщению
http://forum.php.su/topic.php?fo...40073#1300540073
(Добавление)
Не помню точно, давно это было, там в конструктор передается ключик (имя) семафора и ключик (имя) сегмента.
(Добавление)
Не помню точно, давно это было, там в конструктор передается ключик (имя) семафора и ключик (имя) сегмента.
3. -КРОНОС- - 25 Июня, 2013 - 07:11:58 - перейти к сообщению
что-то я почитал и, честно говоря, ничего не понял.
Не поянл что это такое: $this->semkey = $semkey; (this это "указатель" или что-то другое).
Далее...
В приведенном примере есть функция
shm_attach($this->shmkey,$shmsize,0660);
она соаздает или открывает сегмент Shared памяти. Но у меня нет key чтобы получить доступ к этой памяти, и вот этот key как раз мне и необходимо узнать....
Не поянл что это такое: $this->semkey = $semkey; (this это "указатель" или что-то другое).
Далее...
В приведенном примере есть функция
shm_attach($this->shmkey,$shmsize,0660);
она соаздает или открывает сегмент Shared памяти. Но у меня нет key чтобы получить доступ к этой памяти, и вот этот key как раз мне и необходимо узнать....
4. DeepVarvar - 25 Июня, 2013 - 09:37:54 - перейти к сообщению
Она создает если сегмента нет, и открывает если сегмент уже существует.
Т.е. по идее он откроет существующий, который был создан в смлоджикс.
Т.е. по идее он откроет существующий, который был создан в смлоджикс.
-КРОНОС- пишет:
у меня нет key
-КРОНОС- пишет:
Не оно?
0x134 – адрес переменной в адресном пространстве ядра «logix»
5. -КРОНОС- - 25 Июня, 2013 - 10:04:47 - перейти к сообщению
0x134 – адрес переменной в адресном пространстве ядра «logix»
Это написано в руководстве....
Это написано в руководстве....
6. DeepVarvar - 25 Июня, 2013 - 13:48:38 - перейти к сообщению
-КРОНОС- пишет:
Это плохо - сейчас без ООП никуда, тем более в таком деле, когда на один сегмент памяти нужен один экземпляр для работы с этим сегментом.почитал и, честно говоря, ничего не понял
По делу далее:
Попробуйте ключи в виде целых чисел методом подбора: 1,2,3,4 и т.д..
Какой-то из запрошеных сегментов вернет информацию которую засунул туда контроллер.
Удалять уже выделенные неиспользуемые сегменты так:
Где число 1 это ключики от выделенной памяти (M) и её семафора (S).
Ну или после экспериментов - рестарт системы и все ок.
Чтобы увеличить максимальное кол-во сегментов и объема в них (работает до перезапуска):
CODE (bash):
скопировать код в буфер обмена
скопировать код в буфер обмена
- # echo 268435456 > /proc/sys/kernel/shmmax
- # echo 268435456 > /proc/sys/kernel/shmall
- # echo 8192 > /proc/sys/kernel/shmmni
- # echo 256 > /proc/sys/kernel/shmseg
Как видно - все от рута.
Хотя, полюбому должен быть способ узнать какие сегменты заняты и какие у них ключики, чтобы не перебором, а наверняка получить данные из существующих сегментов в пхп.