ModBus master (обновлено: 12 Dec 2022, 12:56:47)


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

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

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


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

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

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

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

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

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


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

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

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


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

На данный момент все подключаемые устройства должны быть настроены на скорость 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.

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

Шаблон переменных указывается через запятую, допустимо опускать число "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.


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

Настройка опции для чтения 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,r2,r1d1,rd2, выдает по порядку: напряжение (1 регистр, 1 знак после запятой), ток (2 регистра, 3 знака после запятой), текущую мощность (2 регистра, 1 знак после запятой), потребленную энергию (2 регистра), частоту сети (1 регистр, 1 знак после запятой), фактор мощности (1 регистр, 2 знака после запятой).

Тип регистров - 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)

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