Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Shared Memory и PHP

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: проблема
-КРОНОС-
Отправлено: 25 Июня, 2013 - 06:05:11
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




Добрый день!
Не знаю в ту ли тему форума задаю вопрос, и сможет ли кто-нибдуь мне помочь.... Попытаюсь описать свою проблему.
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 Производитель не знает ответа на мой вопрос.
 
 Top
DeepVarvar Супермодератор
Отправлено: 25 Июня, 2013 - 06:18:45
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




http://forum.php.su/topic.php?fo...40073#1300540073
(Добавление)
Не помню точно, давно это было, там в конструктор передается ключик (имя) семафора и ключик (имя) сегмента.
 
 Top
-КРОНОС-
Отправлено: 25 Июня, 2013 - 07:11:58
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




что-то я почитал и, честно говоря, ничего не понял.
Не поянл что это такое: $this->semkey = $semkey; (this это "указатель" или что-то другое).
Далее...
В приведенном примере есть функция
shm_attach($this->shmkey,$shmsize,0660);
она соаздает или открывает сегмент Shared памяти. Но у меня нет key чтобы получить доступ к этой памяти, и вот этот key как раз мне и необходимо узнать....
 
 Top
DeepVarvar Супермодератор
Отправлено: 25 Июня, 2013 - 09:37:54
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Она создает если сегмента нет, и открывает если сегмент уже существует.
Т.е. по идее он откроет существующий, который был создан в смлоджикс.
-КРОНОС- пишет:
у меня нет key
-КРОНОС- пишет:
0x134 – адрес переменной в адресном пространстве ядра «logix»
Не оно?
 
 Top
-КРОНОС-
Отправлено: 25 Июня, 2013 - 10:04:47
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




0x134 – адрес переменной в адресном пространстве ядра «logix»
Это написано в руководстве....
 
 Top
DeepVarvar Супермодератор
Отправлено: 25 Июня, 2013 - 13:48:38
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




-КРОНОС- пишет:
почитал и, честно говоря, ничего не понял
Это плохо - сейчас без ООП никуда, тем более в таком деле, когда на один сегмент памяти нужен один экземпляр для работы с этим сегментом.

По делу далее:

Попробуйте ключи в виде целых чисел методом подбора: 1,2,3,4 и т.д..
Какой-то из запрошеных сегментов вернет информацию которую засунул туда контроллер.

Удалять уже выделенные неиспользуемые сегменты так:

CODE (bash):
скопировать код в буфер обмена
  1. # ipcrm -S 1 && ipcrm -M 1


Где число 1 это ключики от выделенной памяти (M) и её семафора (S).
Ну или после экспериментов - рестарт системы и все ок.
Чтобы увеличить максимальное кол-во сегментов и объема в них (работает до перезапуска):

CODE (bash):
скопировать код в буфер обмена
  1. # echo 268435456 > /proc/sys/kernel/shmmax
  2. # echo 268435456 > /proc/sys/kernel/shmall
  3. # echo 8192 > /proc/sys/kernel/shmmni
  4. # echo 256 > /proc/sys/kernel/shmseg


Как видно - все от рута.

Хотя, полюбому должен быть способ узнать какие сегменты заняты и какие у них ключики, чтобы не перебором, а наверняка получить данные из существующих сегментов в пхп.
 
 Top
-КРОНОС-
Отправлено: 25 Июня, 2013 - 13:54:54
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




DeepVarvar пишет:
Это плохо - сейчас без ООП никуда, тем более в таком деле, когда на один сегмент памяти нужен один экземпляр для работы с этим сегментом.

Я вообще специлиаст по АСУТП и программирую в основном контроллеры и скада-системы... а не по программированию для ПК (немного этим баловался раньше)... и вот теперь попалась смежная задача - надо программить для АСУТП и знать PHP а также разбираться (хотя бы немного) в Linux... вот и пытаюсь...
 
 Top
DeepVarvar Супермодератор
Отправлено: 25 Июня, 2013 - 14:40:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




-КРОНОС- пишет:
Я вообще специлиаст по ...
А у меня неполное среднее, аттестат вечерней школы, и ничего, справляюсь.

Добро пожаловать в линукс и пхп! Чем можем - поможем.
 
 Top
Stierus Супермодератор
Отправлено: 25 Июня, 2013 - 18:52:52
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




не легче из php вызывать приложение, отдающее всю нужную инфу и тупо ее выводить?
 
My status
 Top
-КРОНОС-
Отправлено: 26 Июня, 2013 - 05:33:59
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




Stierus пишет:
не легче из php вызывать приложение, отдающее всю нужную инфу и тупо ее выводить?

не понимаю о чем Вы?
Мне нужно организовать веб-страничку на которую можно было бы зайти с браузера. Данные для отображения находятся в Shared Memory. Это уже по сути реализовано но через заппись в файл. ПРограмма написана на С++ под линукс выдергивает данные из Shared Memory и записывает их в XML файл. А HMTL страница читает данные из файла и при помощи функции ajax обновляет данные с частотой 1 раз в секунду. НО у данного способа есть ряд минусов:
1. Работает несколько программ для организации веб сервера (так себе минус, но все-же)
2. Производитель контроллера регламентировал 15 млн. перезаписей в EEPROM. Программа на С++ записывает файл 1 раз в секунду. Соответсвенно теоретически производитель гарантирует что такая программа будет работать 174 дня. Далее негарантированно EEPROM начнет умирать. Не хотелось бы чтобы так случилось с уже внедренной системой... (самое страшное что это может вылезти года через 2, когда гарантия закончится... и как тогда я буду выглядеть в глазах заказчика?).
 
 Top
DeepVarvar Супермодератор
Отправлено: 26 Июня, 2013 - 07:02:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Подписывайте долгосрочный договор с заказчиком.
Ставьте его на обслуживания.
Осуществляйте обслуживаание.
 
 Top
Ch_chov
Отправлено: 26 Июня, 2013 - 08:14:49
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




Цитата:
Программа на С++ записывает файл 1 раз в секунду.

Может быть есть возможность сделать этот файл "вирутальным"? Разместить на tmpfs и т.д.
 
 Top
-КРОНОС-
Отправлено: 26 Июня, 2013 - 08:22:21
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




DeepVarvar пишет:
Подписывайте долгосрочный договор с заказчиком.
Ставьте его на обслуживания.
Осуществляйте обслуживаание.

Нет, это не варинат. тем более я задумал сделать "серийное" устройство которое сможет купить кто угодно. И если они начнуть умирать (пусть даже не через 174 дня, а года через 2) то это будет очень и очень плохо.
(Добавление)
Ch_chov пишет:
Цитата:
Программа на С++ записывает файл 1 раз в секунду.

Может быть есть возможность сделать этот файл "вирутальным"? Разместить на tmpfs и т.д.

рассматривается и такой варинат... но это "костыль"... желательно все-же разобраться как получить данные, тем более что php может работать с shared memory напрямую, то почему бы не воспользовтаься такой функцией... кстати могу скинуть исходнки на С++ в которых реализовано чтение этих данных их Shared Memory... там все работает но по аналогии в PHP реализовать мне пока не удалось...
 
 Top
DeepVarvar Супермодератор
Отправлено: 26 Июня, 2013 - 09:05:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




-КРОНОС- пишет:
кстати могу скинуть исходнки на С++ в которых реализовано чтение этих данных их Shared Memory... там все работает но по аналогии в PHP реализовать мне пока не удалось...
Кидайте. Но я уже скинул кусок кода для работы с шаред. Или вы не знаете как прикрутить его? Кидайте код на сях.
 
 Top
caballero
Отправлено: 26 Июня, 2013 - 09:54:43
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
рассматривается и такой варинат... но это "костыль"... желательно все-же разобраться как получить данные, тем более что php может работать с shared memory напрямую, то почему бы не воспользовтаься такой функцией...

потому что работа через shared memory сторонним приложением и есть самый настоящий костыль.
какие проблеммы с обменом через обычный файл?


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Операционная система и системные вызовы »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB