Segnetics

Вернуться   Segnetics > Форум Segnetics > Связь с внешним миром

Связь с внешним миром Modbus, RS232, RS485, Lon и другое.

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.04.2017, 13:58   #1
binarick
Новичок
 
Регистрация: Jan 2017
Сообщения: 20
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию PHP modbus

Может кто сможет подсказать

Пытаюсь сделать свой умный дом на Pixel - 25... пока зацепил только датчики температуры, проект стандартный из под мастера, таблица переменных модбас тоже. Так вот сама скада будет на php. Нашёл библиотечку Phpmodbus_0.8.r106 которая умеет получать данные, запилил её в проект, но она мне выдаёт непонятные для меня значения... и я не понимаю как это пофиксить. Значения не стабильные, меняются раз в несколько секунд кардинально.
В OPC сервере все ок.
пытаюсь получить данные, получаю массив непонятных чисел. Предполагаю что нужно что-то сделать ещё.
Если необходимо могу показать код.
Может ктото чтото такое ваял, подскажите пожалуйста

Спасибо за ваше время и ответы
Вложения
Тип файла: zip Phpmodbus_0.8.r106.zip (58.8 Кбайт, 109 просмотров)
binarick вне форума   Ответить с цитированием
Старый 10.04.2017, 14:00   #2
LordN
Senior Member
 
Регистрация: Dec 2007
Адрес: Томск
Сообщения: 4 123
Благодарил(а): 239 раз(а)
Поблагодарили: 161 раз(а) в 153 сообщениях
По умолчанию Ответ: PHP modbus

Цитата
Сообщение от binarick Посмотреть сообщение
Может кто сможет подсказать

Пытаюсь сделать свой умный дом на Pixel - 25... пока зацепил только датчики температуры, проект стандартный из под мастера, таблица переменных модбас тоже. Так вот сама скада будет на php. Нашёл библиотечку Phpmodbus_0.8.r106 которая умеет получать данные, запилил её в проект, но она мне выдаёт непонятные для меня значения... и я не понимаю как это пофиксить. Значения не стабильные, меняются раз в несколько секунд кардинально.
В OPC сервере все ок.
пытаюсь получить данные, получаю массив непонятных чисел. Предполагаю что нужно что-то сделать ещё.
Если необходимо могу показать код.
Может ктото чтото такое ваял, подскажите пожалуйста

Спасибо за ваше время и ответы
скачут обычно из-за траблов в бигендиан-литлэндиан
используйте сниффер чтобы увидеть отличия
еще см. может ли библиотека разгребать длинные запросы, м.б. там ограничение есть на длину


__________________
C уважением, LordN
LordN вне форума   Ответить с цитированием
Старый 10.04.2017, 14:08   #3
binarick
Новичок
 
Регистрация: Jan 2017
Сообщения: 20
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию Ответ: PHP modbus

Цитата
Сообщение от LordN Посмотреть сообщение
скачут обычно из-за траблов в бигендиан-литлэндиан
используйте сниффер чтобы увидеть отличия
еще см. может ли библиотека разгребать длинные запросы, м.б. там ограничение есть на длину
Ограничения на длину есть и оно задаётся в ручную и честно сказать я не знаю что поставить там. Сейчас установлено 10

пример кода


результат


а верное число результата 9.хххххххххххххх
binarick вне форума   Ответить с цитированием
Старый 10.04.2017, 14:13   #4
binarick
Новичок
 
Регистрация: Jan 2017
Сообщения: 20
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию Ответ: PHP modbus

всегда заполнено 12 элементов массива, значить эта длина всего числа.
Но числа не понятные.
Может их нужно както конвертировать ?
binarick вне форума   Ответить с цитированием
Старый 10.04.2017, 14:16   #5
tvf
Senior Member
 
Регистрация: Dec 2011
Сообщения: 741
Благодарил(а): 1 раз(а)
Поблагодарили: 9 раз(а) в 9 сообщениях
По умолчанию Ответ: PHP modbus

Цитата
Сообщение от binarick Посмотреть сообщение
Может их нужно както конвертировать ?
Если правильно понял, то вы читаете 10 регистров и в ответ вам приходит 20 байт. Осталось из 20 байт получит 10 регистров.


__________________
Нет абсолютно бездарных людей. Каждый бездарен в своей области.
tvf вне форума   Ответить с цитированием
Старый 10.04.2017, 14:19   #6
binarick
Новичок
 
Регистрация: Jan 2017
Сообщения: 20
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию Ответ: PHP modbus

Цитата
Сообщение от tvf Посмотреть сообщение
Если правильно понял, то вы читаете 10 регистров и в ответ вам приходит 20 байт. Осталось из 20 байт получит 10 регистров.
Да вот не вникну ни как что именно читает функция
readMultipleRegisters(1, 40995, 10) - адрес , регистр, и длина массива

написано так:
This function reads {@link $quantity} of Words (2 bytes) from reference
binarick вне форума   Ответить с цитированием
Старый 10.04.2017, 14:28   #7
tvf
Senior Member
 
Регистрация: Dec 2011
Сообщения: 741
Благодарил(а): 1 раз(а)
Поблагодарили: 9 раз(а) в 9 сообщениях
По умолчанию Ответ: PHP modbus

Цитата
Сообщение от binarick Посмотреть сообщение
Да вот не вникну ни как что именно читает функция
readMultipleRegisters(1, 40995, 10) - адрес , регистр, и длина массива
Все правильно, Адрес 1, Стартовый регистр 0995, число регистров 10.
А 4 - это номер адресного пространства. Или регистр записи или регистр чтения. Сделайте тестовый проект, гораздо проще будет. 10 регистров на чтение, 10 на запись, разные значения в регистры.


__________________
Нет абсолютно бездарных людей. Каждый бездарен в своей области.
tvf вне форума   Ответить с цитированием
Старый 10.04.2017, 14:32   #8
binarick
Новичок
 
Регистрация: Jan 2017
Сообщения: 20
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию Ответ: PHP modbus

Цитата
Сообщение от tvf Посмотреть сообщение
Все правильно, Адрес 1, Стартовый регистр 0995, число регистров 10.
А 4 - это номер адресного пространства. Или регистр записи или регистр чтения. Сделайте тестовый проект, гораздо проще будет. 10 регистров на чтение, 10 на запись, разные значения в регистры.
а я взял 40995 из таблицы Модбас. Там уличная температура крутится.
Сейчас попытаюсь осознать то что вы мне написали, не все понимаю просто.
У меня вроде это и так тестовый проект.
binarick вне форума   Ответить с цитированием
Старый 10.04.2017, 14:51   #9
младшой
Senior Member
 
Регистрация: May 2010
Адрес: Москва
Сообщения: 857
Благодарил(а): 4 раз(а)
Поблагодарили: 85 раз(а) в 66 сообщениях
По умолчанию Ответ: 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}.
*
*
* @param int $unitId usually ID of Modbus device
* @param int $reference Reference in the device memory to read data (e.g. in device WAGO 750-841, memory MW0 starts at address 12288).
* @param int $quantity Amounth of the data to be read from device.
* @return false|Array Success flag or array of received data.
*/
Words (2 bytes) соответствует формату числа Integer.
Стандартная программа вентустановки из Конструктора (а видимо у вас именно такая) выводит температуры в формате Real (4 байта).
Вам надо брать 2 последовательных значения из получаемого массива и преобразовывать их в одно значение Real.

Либо изменить программу в контроллере так, чтобы в модбас уходили значения температур в формате Integer (2 байта).

Последний раз редактировалось младшой, 10.04.2017 в 15:13
младшой вне форума   Ответить с цитированием
Старый 10.04.2017, 15:06   #10
LordN
Senior Member
 
Регистрация: Dec 2007
Адрес: Томск
Сообщения: 4 123
Благодарил(а): 239 раз(а)
Поблагодарили: 161 раз(а) в 153 сообщениях
По умолчанию Ответ: PHP modbus

Цитата
Сообщение от binarick Посмотреть сообщение
Ограничения на длину есть и оно задаётся в ручную и честно сказать я не знаю что поставить там. Сейчас установлено 10

пример кода


результат


а верное число результата 9.хххххххххххххх
плз юзайте теги для КОДа, гребанный радикал вечно через анус работает


длина 10, это м.б. длина всего запроса в байтах, тогда
байт адрес
байт функция
два байта адрес регистра
тело = 4байта
два байта CRC
, а м.б. указана длина тела - тогда весь запрос будет равен 16байт
кажется так.


__________________
C уважением, LordN
LordN вне форума   Ответить с цитированием
Старый 10.04.2017, 15:14   #11
ViS
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}.
Запросил 10 слов, получил 10 слов - 10х2байта=20 байт. Дальше что хочешь, то и делай с ними. Не?

UPD
Ой, пока отвлекся с отправкой, младшой о том же уже..

UPD2
А не.. не совсем о том же...
Цитата Вам надо брать 2 последовательных значения из получаемого массива и преобразовывать их в одно значение Real.
Не 2, а 4...
12 значений в массиве - 3 температуры, по 4 байта на каждую (Наружка, канал, обратка).
Следующие 2 - помещения и вытяжки - у него по нулям, вот 8 байт и нули.

Последний раз редактировалось ViS, 10.04.2017 в 15:30
ViS вне форума   Ответить с цитированием
Старый 10.04.2017, 16:01   #12
младшой
Senior Member
 
Регистрация: May 2010
Адрес: Москва
Сообщения: 857
Благодарил(а): 4 раз(а)
Поблагодарили: 85 раз(а) в 66 сообщениях
По умолчанию Ответ: PHP modbus

Цитата
Сообщение от ViS Посмотреть сообщение
UPD2
А не.. не совсем о том же...

Не 2, а 4...
12 значений в массиве - 3 температуры, по 4 байта на каждую (Наружка, канал, обратка).
Следующие 2 - помещения и вытяжки - у него по нулям, вот 8 байт и нули.
Ну да. Я сходу не обратил внимания, что оно пишет в каждый элемент массива не слово, а только 1 байт.
Ну и кстати в библиотеке уже предусмотрены какие-то функции для конвертации массива байтов в нужные форматы.
младшой вне форума   Ответить с цитированием
Старый 10.04.2017, 20:56   #13
ATS
Senior Member
 
Регистрация: Aug 2013
Сообщения: 3 737
Благодарил(а): 12 раз(а)
Поблагодарили: 192 раз(а) в 188 сообщениях
По умолчанию Ответ: PHP modbus

Цитата
Сообщение от binarick Посмотреть сообщение
Пытаюсь сделать свой умный дом на Pixel - 25... пока зацепил только датчики температуры, проект стандартный из под мастера, таблица переменных модбас тоже. Так вот сама скада будет на php. Нашёл библиотечку Phpmodbus_0.8.r106 которая умеет получать данные
Там все сложно. Лучше покопай это (именно файлик class_2GiMbusTcp.php) там все проще. И тут полистай
.
Да, при желании и для Пикселя нужный файлик load_files.map можно найти для Win7 в C:\Users\{Текущий Юзверь}\AppData\Local\Temp\sm_logix после компиляции проекта Лоджиком.
ATS сейчас на форуме   Ответить с цитированием
Старый 11.04.2017, 09:37   #14
binarick
Новичок
 
Регистрация: Jan 2017
Сообщения: 20
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию Ответ: PHP modbus

Цитата
Сообщение от ATS Посмотреть сообщение
Там все сложно. Лучше покопай это (именно файлик class_2GiMbusTcp.php) там все проще. И тут полистай
.
Да, при желании и для Пикселя нужный файлик load_files.map можно найти для Win7 в C:\Users\{Текущий Юзверь}\AppData\Local\Temp\sm_logix после компиляции проекта Лоджиком.
Спасибо хорошая подсказка, зайду в неразрешимый тупик воспользуюсь.

простите за вопросы чайника.

Цитата
Сообщение от ViS Посмотреть сообщение
[CODE]* [COLOR="Red"]readMultipleRegisters
Запросил 10 слов, получил 10 слов - 10х2байта=20 байт. Дальше что хочешь, то и делай с ними. Не?
Да я понял, что данные получаются верно просто тип не тот. Дальше я хочу чтобы они были Интовыми например. И тут у меня затруднения.
Просто тупо не знаю что взять и алгоритм преобразования.

Вообще применил функцию конвертирования и все полетело.
Но до сих пор не понимаю как математически конвертить.

Рабочий код с конвертером:
binarick вне форума   Ответить с цитированием
Старый 11.04.2017, 10:05   #15
tvf
Senior Member
 
Регистрация: Dec 2011
Сообщения: 741
Благодарил(а): 1 раз(а)
Поблагодарили: 9 раз(а) в 9 сообщениях
По умолчанию Ответ: PHP modbus

Цитата
Сообщение от binarick Посмотреть сообщение
Но до сих пор не понимаю как математически конвертить.
Посмотрите по ссылке http://forum.segnetics.com/showthread.php?t=461 В макросе все описано.


__________________
Нет абсолютно бездарных людей. Каждый бездарен в своей области.
tvf вне форума   Ответить с цитированием
Старый 12.04.2017, 13:47   #16
ViS
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];
		}
ViS вне форума   Ответить с цитированием
Старый 12.04.2017, 15:55   #17
ATS
Senior Member
 
Регистрация: Aug 2013
Сообщения: 3 737
Благодарил(а): 12 раз(а)
Поблагодарили: 192 раз(а) в 188 сообщениях
По умолчанию Ответ: PHP modbus

Цитата
Сообщение от ViS Посмотреть сообщение
Код:
	private function ...
Ну не желает топикстартер class_2GiMbusTcp.php смотреть.
А там есть всё.
ATS сейчас на форуме   Ответить с цитированием
Старый 12.04.2017, 16:02   #18
ViS
Senior Member
 
Регистрация: Aug 2010
Сообщения: 718
Благодарил(а): 1 раз(а)
Поблагодарили: 15 раз(а) в 12 сообщениях
По умолчанию Ответ: PHP modbus

Цитата
Сообщение от ATS Посмотреть сообщение
Ну не желает топикстартер class_2GiMbusTcp.php смотреть.
А там есть всё.
Да-да.. Глядя именно в нее себе на Питоне делал
ViS вне форума   Ответить с цитированием
Старый 12.04.2017, 18:43   #19
ATS
Senior Member
 
Регистрация: Aug 2013
Сообщения: 3 737
Благодарил(а): 12 раз(а)
Поблагодарили: 192 раз(а) в 188 сообщениях
По умолчанию Ответ: PHP modbus

Цитата
Сообщение от ViS Посмотреть сообщение
Да-да.. Глядя именно в нее себе на Питоне делал
А что делал на Питоне? Была мысль модбас клиента на Телеофисном модеме поднять, но не созрела.

А в исходнике modbustcp-2007-12-02.zip у французов WordToFloat помню сильно удивил.
ATS сейчас на форуме   Ответить с цитированием
Старый 12.04.2017, 21:11   #20
ViS
Senior Member
 
Регистрация: Aug 2010
Сообщения: 718
Благодарил(а): 1 раз(а)
Поблагодарили: 15 раз(а) в 12 сообщениях
По умолчанию Ответ: PHP modbus

класс написал и сделал бота для jabber, работающего по Modbus/TCP, упоминал в теме 2Gi
ViS вне форума   Ответить с цитированием
Старый 19.09.2017, 19:30   #21
PA3JlUBHOE
Member
 
Регистрация: Jun 2012
Адрес: СПб
Сообщения: 77
Благодарил(а): 7 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию Ответ: PHP modbus

Правильно я понимаю, что если скрипт на серваке читает переменные по модбас, то при количестве одновременно подключившихся пользователей >1 могут возникнуть всякие глюки, т.к. два и более php скрипта одновременно будут слать запросы на один порт (особенно если MODBUS RTU)?
PA3JlUBHOE вне форума   Ответить с цитированием
Старый 19.09.2017, 20:29   #22
ATS
Senior Member
 
Регистрация: Aug 2013
Сообщения: 3 737
Благодарил(а): 12 раз(а)
Поблагодарили: 192 раз(а) в 188 сообщениях
По умолчанию Ответ: PHP modbus

Цитата
Сообщение от PA3JlUBHOE Посмотреть сообщение
Правильно я понимаю, что если скрипт на серваке читает переменные по модбас, то при количестве одновременно подключившихся пользователей >1 могут возникнуть всякие глюки, т.к. два и более php скрипта одновременно будут слать запросы на один порт (особенно если MODBUS RTU)?
Совершенно не факт. Все зависит от того как сервер отдает эти полученные данные пользователям.
ATS сейчас на форуме   Ответить с цитированием
Старый 20.09.2017, 00:57   #23
PA3JlUBHOE
Member
 
Регистрация: Jun 2012
Адрес: СПб
Сообщения: 77
Благодарил(а): 7 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию Ответ: PHP modbus

Цитата
Сообщение от ATS Посмотреть сообщение
Совершенно не факт. Все зависит от того как сервер отдает эти полученные данные пользователям.
Малинка, nginx, страничка с js периодически и также по событиям запускает php-скрипт, который опрашивает сеть с контроллерами соединенными с этим серваком через переходник USB-RS485. Если несколько пользователей обращаются к этому вебсерверу через интернет, то и несколько скриптов одновременно будут пытаться работать с одним портом. Ну и получится кавардак, я так понимаю?Наверное стоит сделать по другому - программулина на С/питоне/еще чем-нибудь опрашивает и пишет в базу, а php скрипт общается с базой и выдаёт/принимает от пользователя? Верно мыслю?
PA3JlUBHOE вне форума   Ответить с цитированием
Старый 20.09.2017, 10:29   #24
Arsie
Сотрудник Segnetics
 
Аватара для Arsie
 
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 017
Благодарил(а): 15 раз(а)
Поблагодарили: 655 раз(а) в 599 сообщениях
По умолчанию Ответ: PHP modbus

Цитата
Сообщение от PA3JlUBHOE Посмотреть сообщение
Наверное стоит сделать по другому - программулина на С/питоне/еще чем-нибудь опрашивает и пишет в базу, а php скрипт общается с базой и выдаёт/принимает от пользователя? Верно мыслю?
Это хорошо с точки зрения оптимизации трафика. А по поводу опроса из php в несколько потоков, это зависит от того, через один сокет идёт работа или для каждого запроса свой открывается.


__________________
Программа делает то что написал программист, а не то что он хотел.

Добро всегда побеждает зло. Кто победил - тот и добрый.
Arsie сейчас на форуме   Ответить с цитированием
Старый 22.09.2017, 05:45   #25
binarick
Новичок
 
Регистрация: Jan 2017
Сообщения: 20
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию Ответ: PHP modbus

А вы попробуйте запустите OPC сервер (например лектус) и вообще не получите данных от установки PHP скриптом. Отсюда вопрос: а как можно читать не из оборудования из OPC также с помощью PHP скриптов?
binarick вне форума   Ответить с цитированием
Старый 22.09.2017, 21:29   #26
ATS
Senior Member
 
Регистрация: Aug 2013
Сообщения: 3 737
Благодарил(а): 12 раз(а)
Поблагодарили: 192 раз(а) в 188 сообщениях
По умолчанию Ответ: PHP modbus

Цитата
Сообщение от binarick Посмотреть сообщение
А вы попробуйте запустите OPC сервер (например лектус) и вообще не получите данных от установки PHP скриптом.
Если Modbus RTU по 485-му то естественно - два мастера это конфликт.
А по TCP для 2Gi и выше без проблем.
Цитата Отсюда вопрос: а как можно читать не из оборудования из OPC также с помощью PHP скриптов?
OPC и создан чтобы собрать и отдать. Реализация на PHP тема не для этого форума.
ATS сейчас на форуме   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать свои сообщения

BB code is Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SMH4, Modbus TCP, ошибка приема/передачи "Connection Closed Gracefully" Makrel Связь с внешним миром 11 21.04.2020 14:23
Honeywell MVC80-DH10M LordN Связь с внешним миром 30 28.11.2016 14:21
Форматы передачи "длинных" регистров MODBUS Arsie Библиотека 0 20.06.2016 12:30
Конвертер карты памяти в файл конфигурации Modbus Universal MasterOPC Server 32 Arsie Библиотека макросов 0 25.04.2016 13:38


Часовой пояс GMT +4, время: 14:37.


Версия vBulletin: 3.8.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Segnetics 2005 - 2023