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 157
Благодарил(а): 240 раз(а)
Поблагодарили: 165 раз(а) в 157 сообщениях
По умолчанию Ответ: 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
Сообщения: 748
Благодарил(а): 1 раз(а)
Поблагодарили: 10 раз(а) в 10 сообщениях
По умолчанию Ответ: 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
Сообщения: 748
Благодарил(а): 1 раз(а)
Поблагодарили: 10 раз(а) в 10 сообщениях
По умолчанию Ответ: 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
Адрес: Москва
Сообщения: 862
Благодарил(а): 4 раз(а)
Поблагодарили: 86 раз(а) в 67 сообщениях
По умолчанию Ответ: 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 157
Благодарил(а): 240 раз(а)
Поблагодарили: 165 раз(а) в 157 сообщениях
По умолчанию Ответ: 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
Адрес: Москва
Сообщения: 862
Благодарил(а): 4 раз(а)
Поблагодарили: 86 раз(а) в 67 сообщениях
По умолчанию Ответ: PHP modbus

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

Не 2, а 4...
12 значений в массиве - 3 температуры, по 4 байта на каждую (Наружка, канал, обратка).
Следующие 2 - помещения и вытяжки - у него по нулям, вот 8 байт и нули.
Ну да. Я сходу не обратил внимания, что оно пишет в каждый элемент массива не слово, а только 1 байт.
Ну и кстати в библиотеке уже предусмотрены какие-то функции для конвертации массива байтов в нужные форматы.
младшой вне форума   Ответить с цитированием
Старый 10.04.2017, 20:56   #13
ATS
Senior Member
 
Регистрация: Aug 2013
Сообщения: 3 784
Благодарил(а): 12 раз(а)
Поблагодарили: 194 раз(а) в 190 сообщениях
По умолчанию Ответ: 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
Сообщения: 748
Благодарил(а): 1 раз(а)
Поблагодарили: 10 раз(а) в 10 сообщениях
По умолчанию Ответ: 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 784
Благодарил(а): 12 раз(а)
Поблагодарили: 194 раз(а) в 190 сообщениях
По умолчанию Ответ: 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 784
Благодарил(а): 12 раз(а)
Поблагодарили: 194 раз(а) в 190 сообщениях
По умолчанию Ответ: 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 784
Благодарил(а): 12 раз(а)
Поблагодарили: 194 раз(а) в 190 сообщениях
По умолчанию Ответ: 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 085
Благодарил(а): 15 раз(а)
Поблагодарили: 660 раз(а) в 604 сообщениях
По умолчанию Ответ: 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 784
Благодарил(а): 12 раз(а)
Поблагодарили: 194 раз(а) в 190 сообщениях
По умолчанию Ответ: PHP modbus

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

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

Расширенный поиск

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

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



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


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