ModBus master (обновлено: 01 Sep 2024, 14:20:30)


Опция для чтения ModBus RTU slave устройств.

Отправка готовых данных сразу в системы и сервисы

На конструкторе ESP8266 noOS управление через GET запрос на данный момент только на запись !!!


Краткое описание протокола

Передача происходит в полудуплекстном (поочередном) режиме по интерфейсу RS485 в виде бинарных данных.

Пакет данных чаще всего состоит: <адрес устройства (1 байт)> <код функции (1 байт)> <данные> <контрольная сумма  CRC (2 байта)>

Состав данных зависит от кода функции.

Подключение конвертера

Конвертер требуется, если подключаемое устройство имеет интерфейс RS-485. В качестве конвертера может использоваться микросхема MAX485 или аналог. В Китае существуют в продаже готовые платы с этой микросхемой.


У ESP32 в шестеренке требуется указать выводы для подключения конвертора UART-RS485 и номер UART.

У ESP8266 подключение на UART gpio 1 и 3, RTS соответствует выводу 15 (доступна настройка в шестеренке).

Если вывод RTS не используется(если конвертер с автоопределением), то пишем в шестеренке номер 255.


Настройка опции. Аналоговые регистры

Скорость с 11.08.24 настраивается в веб модуля. Ранее скорость была фиксирована на 9600. 

В веб модуля требуется указать параметры для каждого ModBus устройства:

1 Включив опцию выбрав тип регистров: Read Input Registers(0x04) или Read Holding Registers(0x03)

2. Адрес устройства на шине ModBus

3. Стартовый адрес регистра

4. Количество регистров для считывания(каждый регистр - это 2 байта или 16 бит), если нужные регистры данных идут подряд. В противном случае придется читать как несколько устройств

5. Шаблон который задает формат ответа: 

rX - задается количество регистров для переменной(внутри регистра старший байт первый, порядок регистров - первый регистр младший), например r2 (переменная из 2 регистров). Доступны варианты с другим порядком байт - e2 и g2 .

sX - пропуск регистров.

dX - указывает количество знаков, дополнительный необязательный параметр, если переменная имеет дробный вид, например d2 (2 знака после запятой): значение регистра  1234 дает число 12.34

mX - указывает, что число требуется умножить на 1- 10, 2-100 , 3-1000 и т.д.

i - указывает, что число имеет знак (например температура)

f - float переменная, подпараметры fa и fb в зависимости от порядка байт в устройстве. Дополнительно можно указать количество знаков после запятой, по умолчанию 2.

tX - указание типа значения, ток, напряжение, температура или прочее. Где Х - тип датчика, список кодов смотрим тут.

По мере тестирования опции с разным железом будут добавлены и другие варианты данных.

Шаблон переменных указывается через запятую, допустимо опускать число "1" в написании шаблона.

Примеры работы с шаблонами находятся внизу статьи.


Настройка Опции. Цифровые регистры

Это дополнительная надстройка, включается в шестеренке установкой количества читаемых устройств в поле "Количество дискретных модулей". Опция доступна только на RTOS прошивках. Доступные регистры:

Discrete Inputs — однобитовый тип, доступен только для чтения (например чтение "сухих" контактов).

Coils — однобитовый тип, доступен для чтения и записи (например управление реле).

Чтение и управление входами назначается на карту GPIO модуля с номера 180(пока не меняется).

В веб настройках требуется указать адрес устройства и начальный регистр.

На данный момент чтение состояния возможно только в опциях , настраиваемых через селекторы(текстовые поля ввода номера) , а  так же Intepreter. Отправка данных состояний на сервера пока не реализована.


Управление через GET запрос

Запись RAW данных http://[IP]/modbus&write=данные в hex строкой, crc считается автоматически, его передавать не требуется! В ответ на запрос должен прийти ответ в hex формате (у noOS нет ответа).

Запись регистра http://[IP]/modbus?addr=X?reg=Y&data=Z Где X- адрес устройства, Y - номер регистра. Z - значение.(не протестировано)

Запись метрики http://[IP]/modbus&dev=X&num=Y&data=Z Где X- номер устройства, Y - номер метрики. Z - значение, может быть дробное число. Поддерживается запись только у типа регистров Holding Registers. Поддерживается на данный момент только тип шаблона r.(Не протестировано)

Управление через MQTT(не протестировано)

Топик login/hostname/mbraw - запись raw данных  hex строкой, crc считается автоматически, его передавать не требуется!

Топик login/hostname/mbregX/Y - запись регистра. Где X- адрес устройства, Y - номер регистра

Если тип регистра настроенных данных Holding Registers , то в его топик можно записать новое значение. Поддерживается на данный момент только тип шаблона r.


Управление через Intepreter

Слать данные hex строкой можно через функцию mbwrite(ххххх), crc считается автоматически, его передавать не требуется! 


Linux приложение

Для выбора устройства UART/Serial требуется вручную указать его адрес в файле wifi-iot.ini строку вида devserialmodbus=/dev/ttyUSB4 , где /dev/ttyUSB4 - устройство serial, к которому подключен RS485 конвертор.


Примеры чтения аналоговых регистров:

Настройка опции для чтения PZEM-014/016 и новой PZEM-004

Для чтения Power Monitor PZEM-014, PZEM-016 и PZEM-004 требуется указать адрес устройства, по умолчанию 1.

PZEM-004 подключается напрямую к UART  без преобразователя RS485

Начальный регистр(Start register) - 0

Количество регистров - 9

Шаблон ответа(mask) - r1d1,r2d3,r2d1,r2d3,r1d1,rd2, выдает по порядку: напряжение (1 регистр, 1 знак после запятой), ток (2 регистра, 3 знака после запятой), текущую мощность (2 регистра, 1 знак после запятой), потребленную энергию (2 регистра), частоту сети (1 регистр, 1 знак после запятой), фактор мощности (1 регистр, 2 знака после запятой).

Шаблон ответа с указанием типов метрик (поддержка с 27.04.2023) - r1d1t9,r2d3t10,r2d1t11,r2d3t12,r1d1t24,rd2

Тип регистров - Read Input Registers(0x04)

Поменять адрес устройства можно командой http://IP/modbus&write=010600020005, где 01 - адрес текущий, 05 - адрес новый.

Сброс счетчика киловатчасов http://IP/modbus&write=0142 , где 01 - адрес устройства.



Настройка опции для чтения PZEM-017

PZEM-017 -Монитор постоянного тока !! Разновидность PZEM-0хх , требуется включение 2 stop bits в шестеренке опции.

Шаблон ответа(mask) -r1d2,r1d2,r2d1,r2

Тип регистров - Read Input Registers(0x04)

Адрес по умолчанию 1

Начальный регистр 0

Количество регистров 6


Настройка подключения Eastron SDM220, SDM120, SDM630

Для чтения Power Monitor  Eastron SDM требуется указать адрес устройства, по умолчанию 1. А в настройках устройства требуется указать скорость 9600 !!!

Чтобы прочитать текущие показания напряжения, тока и активной мощности, надо настроить устройство 1 в настройках modbus.

Тип регистров - Read Input Registers(0x04)

Начальный регистр (Start register) - 0

Количество регистров (len)- 14

Шаблон ответа(mask) : fb,s4,fb,s4,fb (для 630 скорее всего fb,fb,fb,fb,fb,fb,fb,fb,fb)

Устройство имеет и другие параметры, они выводятся аналогично как отдельное устройство