ModBus master (обновлено: 22 Feb 2020, 13:19:48)


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

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

Опция на ESP8266 работает в тестовом режиме, управление через GET запрос на данный момент только на запись !!!


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

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

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

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

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

В качестве конвертора может использоваться микросхема 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 регистров)

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

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

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

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

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

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

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

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


Отправка RAW команд через GET запрос

Команду необходимо передать по адресу http://[IP]/modbus&write=данные в hex строкой, crc считается автоматически, его передавать не требуется!

В ответ на запрос должен прийти ответ в hex формате.


Настройка опции для чтения 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)

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