10.04.2017, 13:58 | #1 |
Новичок
Регистрация: Jan 2017
Сообщения: 20
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
PHP modbus
Может кто сможет подсказать
Пытаюсь сделать свой умный дом на Pixel - 25... пока зацепил только датчики температуры, проект стандартный из под мастера, таблица переменных модбас тоже. Так вот сама скада будет на php. Нашёл библиотечку Phpmodbus_0.8.r106 которая умеет получать данные, запилил её в проект, но она мне выдаёт непонятные для меня значения... и я не понимаю как это пофиксить. Значения не стабильные, меняются раз в несколько секунд кардинально. В OPC сервере все ок. пытаюсь получить данные, получаю массив непонятных чисел. Предполагаю что нужно что-то сделать ещё. Если необходимо могу показать код. Может ктото чтото такое ваял, подскажите пожалуйста Спасибо за ваше время и ответы |
10.04.2017, 14:00 | #2 | |
Senior Member
Регистрация: Dec 2007
Адрес: Томск
Сообщения: 4 180
Благодарил(а): 242 раз(а)
Поблагодарили:
166 раз(а) в 158 сообщениях
|
Ответ: PHP modbus
Цитата:
используйте сниффер чтобы увидеть отличия еще см. может ли библиотека разгребать длинные запросы, м.б. там ограничение есть на длину |
|
10.04.2017, 14:08 | #3 | |
Новичок
Регистрация: Jan 2017
Сообщения: 20
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: PHP modbus
Цитата:
пример кода результат а верное число результата 9.хххххххххххххх |
|
10.04.2017, 14:13 | #4 |
Новичок
Регистрация: Jan 2017
Сообщения: 20
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: PHP modbus
всегда заполнено 12 элементов массива, значить эта длина всего числа.
Но числа не понятные. Может их нужно както конвертировать ? |
10.04.2017, 14:16 | #5 |
Senior Member
Регистрация: Dec 2011
Сообщения: 768
Благодарил(а): 1 раз(а)
Поблагодарили:
11 раз(а) в 11 сообщениях
|
Ответ: PHP modbus
Если правильно понял, то вы читаете 10 регистров и в ответ вам приходит 20 байт. Осталось из 20 байт получит 10 регистров.
__________________ Нет абсолютно бездарных людей. Каждый бездарен в своей области. |
10.04.2017, 14:19 | #6 | |
Новичок
Регистрация: Jan 2017
Сообщения: 20
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: PHP modbus
Цитата:
readMultipleRegisters(1, 40995, 10) - адрес , регистр, и длина массива написано так: This function reads {@link $quantity} of Words (2 bytes) from reference |
|
10.04.2017, 14:28 | #7 | |
Senior Member
Регистрация: Dec 2011
Сообщения: 768
Благодарил(а): 1 раз(а)
Поблагодарили:
11 раз(а) в 11 сообщениях
|
Ответ: PHP modbus
Цитата:
А 4 - это номер адресного пространства. Или регистр записи или регистр чтения. Сделайте тестовый проект, гораздо проще будет. 10 регистров на чтение, 10 на запись, разные значения в регистры. __________________ Нет абсолютно бездарных людей. Каждый бездарен в своей области. |
|
10.04.2017, 14:32 | #8 | |
Новичок
Регистрация: Jan 2017
Сообщения: 20
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: PHP modbus
Цитата:
Сейчас попытаюсь осознать то что вы мне написали, не все понимаю просто. У меня вроде это и так тестовый проект. |
|
10.04.2017, 14:51 | #9 | |
Senior Member
Регистрация: May 2010
Адрес: Москва
Сообщения: 865
Благодарил(а): 4 раз(а)
Поблагодарили:
87 раз(а) в 68 сообщениях
|
Ответ: PHP modbus
Цитата:
Стандартная программа вентустановки из Конструктора (а видимо у вас именно такая) выводит температуры в формате Real (4 байта). Вам надо брать 2 последовательных значения из получаемого массива и преобразовывать их в одно значение Real. Либо изменить программу в контроллере так, чтобы в модбас уходили значения температур в формате Integer (2 байта). Последний раз редактировалось младшой, 10.04.2017 в 15:13 |
|
10.04.2017, 15:06 | #10 | |
Senior Member
Регистрация: Dec 2007
Адрес: Томск
Сообщения: 4 180
Благодарил(а): 242 раз(а)
Поблагодарили:
166 раз(а) в 158 сообщениях
|
Ответ: PHP modbus
Цитата:
длина 10, это м.б. длина всего запроса в байтах, тогда байт адрес байт функция два байта адрес регистра тело = 4байта два байта CRC , а м.б. указана длина тела - тогда весь запрос будет равен 16байт кажется так. |
|
10.04.2017, 15:14 | #11 | |
Senior Member
Регистрация: Aug 2010
Сообщения: 718
Благодарил(а): 1 раз(а)
Поблагодарили:
15 раз(а) в 12 сообщениях
|
Ответ: PHP modbus
Код:
* readMultipleRegisters * * Modbus function FC 3(0x03) - Read Multiple Registers. * * This function reads {@link $quantity} of Words (2 bytes) from reference * {@link $referenceRead} of a memory of a Modbus device given by * {@link $unitId}. UPD Ой, пока отвлекся с отправкой, младшой о том же уже.. UPD2 А не.. не совсем о том же... Цитата:
12 значений в массиве - 3 температуры, по 4 байта на каждую (Наружка, канал, обратка). Следующие 2 - помещения и вытяжки - у него по нулям, вот 8 байт и нули. Последний раз редактировалось ViS, 10.04.2017 в 15:30 |
|
10.04.2017, 16:01 | #12 | |
Senior Member
Регистрация: May 2010
Адрес: Москва
Сообщения: 865
Благодарил(а): 4 раз(а)
Поблагодарили:
87 раз(а) в 68 сообщениях
|
Ответ: PHP modbus
Цитата:
Ну и кстати в библиотеке уже предусмотрены какие-то функции для конвертации массива байтов в нужные форматы. |
|
10.04.2017, 20:56 | #13 | |
Senior Member
Регистрация: Aug 2013
Сообщения: 3 795
Благодарил(а): 12 раз(а)
Поблагодарили:
194 раз(а) в 190 сообщениях
|
Ответ: PHP modbus
Цитата:
. Да, при желании и для Пикселя нужный файлик load_files.map можно найти для Win7 в C:\Users\{Текущий Юзверь}\AppData\Local\Temp\sm_logix после компиляции проекта Лоджиком. |
|
11.04.2017, 09:37 | #14 | ||
Новичок
Регистрация: Jan 2017
Сообщения: 20
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: PHP modbus
Цитата:
простите за вопросы чайника. Цитата:
Просто тупо не знаю что взять и алгоритм преобразования. Вообще применил функцию конвертирования и все полетело. Но до сих пор не понимаю как математически конвертить. Рабочий код с конвертером: |
||
11.04.2017, 10:05 | #15 |
Senior Member
Регистрация: Dec 2011
Сообщения: 768
Благодарил(а): 1 раз(а)
Поблагодарили:
11 раз(а) в 11 сообщениях
|
Ответ: PHP modbus
Посмотрите по ссылке http://forum.segnetics.com/showthread.php?t=461 В макросе все описано.
__________________ Нет абсолютно бездарных людей. Каждый бездарен в своей области. |
12.04.2017, 13:47 | #16 |
Senior Member
Регистрация: Aug 2010
Сообщения: 718
Благодарил(а): 1 раз(а)
Поблагодарили:
15 раз(а) в 12 сообщениях
|
Ответ: PHP modbus
Код:
private function BytesToWord( $lbyte = 0, $rbyte = 0 ) { return( ord($lbyte) * 256 + ord($rbyte) ); } private function WordToDouble( $lword, $rword) { return ( ($lword & 0xFFFF) << 16) + (($rword & 0xFFFF) ); } private function WordToFloat( $lword, $rword) { $varDouble = pack("L", $this->WordToDouble( $lword, $rword)); $varFloat = unpack("f", $varDouble); return $varFloat[1]; } |
12.04.2017, 15:55 | #17 |
Senior Member
Регистрация: Aug 2013
Сообщения: 3 795
Благодарил(а): 12 раз(а)
Поблагодарили:
194 раз(а) в 190 сообщениях
|
Ответ: PHP modbus
|
12.04.2017, 16:02 | #18 |
Senior Member
Регистрация: Aug 2010
Сообщения: 718
Благодарил(а): 1 раз(а)
Поблагодарили:
15 раз(а) в 12 сообщениях
|
Ответ: PHP modbus
|
12.04.2017, 18:43 | #19 |
Senior Member
Регистрация: Aug 2013
Сообщения: 3 795
Благодарил(а): 12 раз(а)
Поблагодарили:
194 раз(а) в 190 сообщениях
|
Ответ: PHP modbus
А что делал на Питоне? Была мысль модбас клиента на Телеофисном модеме поднять, но не созрела.
А в исходнике modbustcp-2007-12-02.zip у французов WordToFloat помню сильно удивил. |
12.04.2017, 21:11 | #20 |
Senior Member
Регистрация: Aug 2010
Сообщения: 718
Благодарил(а): 1 раз(а)
Поблагодарили:
15 раз(а) в 12 сообщениях
|
Ответ: PHP modbus
класс написал и сделал бота для jabber, работающего по Modbus/TCP, упоминал в теме 2Gi
|
19.09.2017, 19:30 | #21 |
Member
Регистрация: Jun 2012
Адрес: СПб
Сообщения: 77
Благодарил(а): 7 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: PHP modbus
Правильно я понимаю, что если скрипт на серваке читает переменные по модбас, то при количестве одновременно подключившихся пользователей >1 могут возникнуть всякие глюки, т.к. два и более php скрипта одновременно будут слать запросы на один порт (особенно если MODBUS RTU)?
|
19.09.2017, 20:29 | #22 | |
Senior Member
Регистрация: Aug 2013
Сообщения: 3 795
Благодарил(а): 12 раз(а)
Поблагодарили:
194 раз(а) в 190 сообщениях
|
Ответ: PHP modbus
Цитата:
|
|
20.09.2017, 00:57 | #23 |
Member
Регистрация: Jun 2012
Адрес: СПб
Сообщения: 77
Благодарил(а): 7 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: PHP modbus
Малинка, nginx, страничка с js периодически и также по событиям запускает php-скрипт, который опрашивает сеть с контроллерами соединенными с этим серваком через переходник USB-RS485. Если несколько пользователей обращаются к этому вебсерверу через интернет, то и несколько скриптов одновременно будут пытаться работать с одним портом. Ну и получится кавардак, я так понимаю?Наверное стоит сделать по другому - программулина на С/питоне/еще чем-нибудь опрашивает и пишет в базу, а php скрипт общается с базой и выдаёт/принимает от пользователя? Верно мыслю?
|
20.09.2017, 10:29 | #24 |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 191
Благодарил(а): 15 раз(а)
Поблагодарили:
666 раз(а) в 608 сообщениях
|
Ответ: PHP modbus
Это хорошо с точки зрения оптимизации трафика. А по поводу опроса из php в несколько потоков, это зависит от того, через один сокет идёт работа или для каждого запроса свой открывается.
__________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
22.09.2017, 05:45 | #25 |
Новичок
Регистрация: Jan 2017
Сообщения: 20
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: PHP modbus
А вы попробуйте запустите OPC сервер (например лектус) и вообще не получите данных от установки PHP скриптом. Отсюда вопрос: а как можно читать не из оборудования из OPC также с помощью PHP скриптов?
|
22.09.2017, 21:29 | #26 | ||
Senior Member
Регистрация: Aug 2013
Сообщения: 3 795
Благодарил(а): 12 раз(а)
Поблагодарили:
194 раз(а) в 190 сообщениях
|
Ответ: PHP modbus
Цитата:
А по TCP для 2Gi и выше без проблем. Цитата:
|
||