Modbus2mqtt — это приложение, которое предназначено для взаимодействия с устройствами Modbus RTU/ Modbus RTU-over-TCP / Modbus TCP. Оно позволяет собирать данные от Modbusустройств и публиковать их в брокере MQTT, форматировать полученные данные.
Приложение предназначено для использования в системах, где необходима интеграция различных устройств Modbus с брокером MQTT для обработки данных в реальном времени.
Modbus2mqtt решает следующие задачи:
| Описание в YAML | Описание | Диапазон | Размер (байт) | Код функции для чтения | Код функции для записи |
|---|---|---|---|---|---|
| boolean / bool | Булева переменная (0 или 1) | 1-0 | 1 | 01, 02 | |
| f32 / float | 32-разрядное число с плавающей запятой | 4 | 03, 04 | 16 | |
| f64 / double | 64-разрядное число с плавающей запятой | 8 | 03, 04 | 16 | |
| s16 / shortInt / int16 | 16-разрядное знаковое целое число | -32768 до 32767 | 2 | 03, 04 | 06, 16 |
| s32 / integer / int32 | 32-разрядное знаковое целое число | -2147483648 до 2147483647 | 4 | 03, 04 | 16 |
| s64 / int64 | 64-разрядное знаковое целое число | -9223372036854775808 до 9223372036854775807 | 8 | 03, 04 | 16 |
| u16 / word / uint16 | 16-разрядное беззнаковое целое число | 0 до 65535 | 2 | 03, 04 | 06, 16, 22 |
| u32 / dword / uint32 | 32-разрядное беззнаковое целое число | 0 до 4294967295 | 4 | 03, 04 | 16 |
| u64/uint64 | 64-разрядное беззнаковое целое число | 0 до 18446744073709551615 | 8 | 03, 04 | 16 |
Порядок байт выставляется в параметре byteorder
Для 16 битных типов данных:
Для 32 битных типов данных:
Для 64 битных типов данных:
Порядок слов выставляется в параметре wordorder
Для 64 битных типов данных:
| Описание в YAMl | Название | Описание |
|---|---|---|
| coil | Read Coil 0x01 | Чтение состояния дискретных выводов(катушек) |
| discrete | Read Discrete Inputs 0x02 | Чтение состояния дискретных выходов |
| holding | Read Holding Registers 0x03 | Чтение регистров хранения |
| input | Read Input Registers 0x04 | Чтение входных регистров |
| 5 | Write Single Coil 0x05 | Запись одного дискретного вывода |
| 6 | Write Single Register 0x06 | Запись одного регистра хранения |
| 16 | Write Multiple Registers 0x10 | Запись нескольких регистров хранения |
| 22 | Mask Write Register (0x16) | Запись битовой маски |
| Описание в YAMl | Название | Описание / Допустимые значения |
|---|---|---|
| broker | URL брокера tcp://127.0.0.1:1883 или Unix Socket "unix:///var/run/mosquitto/mosquitto.sock"; по умолчанию tcp://127.0.0.1:1883 | tcp://127.0.0.1:1883 или unix сокет (например) unix:///var/run/mosquitto/mosquitto.sock |
| client_id | Идентификатор клиента; по умолчанию modbus2mqtt | modbus2mqtt |
| keepalive | Параметр keepalive в секундах; по умолчанию 60 | 120 |
| Описание в YAMl | Название | Описание / Допустимые значения |
|---|---|---|
| write_in_logfile | Включение записи в файл; по умолчанию false | true |
| level_log | Уровень логирования; по умолчанию 1 | 1,2,3,4,6,7 (раздел “уровни логирования”) |
| path_log | Путь к лог-файлу | mnt/data/etc/andromeda_embedded/log/modbus2mqtt.log |
| max_size_log | Максимальный размер файла в мегабайтах; по умолчанию 2 | 2 |
| max_backups_log | Максимальное количество резервных копий; по умолчанию 10 | 100 |
| max_age_log | Максимальный возраст файлов в днях; по умолчанию 1 | 500-5000 |
| level_log | Будут выводиться сообщения уровня: |
|---|---|
| 1 | INFO, WARN, ERROR |
| 2 | WARN, ERROR |
| 3 | DEBUG, INFO, WARN, ERROR |
| 4 | ERROR |
| 6 | MONITOR, DEBUG, INFO, WARN, ERROR |
| 7 | MONITOR |
INFO

DEBUG

MONITOR (6)
.png)
MONITOR (7)
.png)
| Описание в YAMl | Название | Описание / Допустимые значения | Реализация |
|---|---|---|---|
| settings 9600:8:N:1 | Настройки COM | 1.0.0 | |
| 9600 | Скорость порта | 1200, 2400, 4800, 9600, 19200, 38400, 57600,115200 | 1.0.0 |
| 8 | Количество бит данных: | 5, 6, 7, 8 | 1.0.0 |
| N | Тип чётности: | N, E, O | 1.0.0 |
| 1 | Количество стоп-бит: | 1, 2 | 1.0.0 |
| timeout | Время ожидания ответа на com порту, мс | 500-10000 | 1.1.12 |
| Описание в YAMl | Название | Описание / Допустимые значения | Реализация |
|---|---|---|---|
| ip | IP адрес | 192.168.100.1 | 1.1.6 |
| port | Порт | 1-65000 | 1.1.6 |
| № | Название | Описание | Пример |
|---|---|---|---|
| 1 | name | Имя устройства | Modbus_device_tcp1 |
| 2 | enabled | Опция активации и деактивации работы устройства true/false; по умолчанию true | true |
| 3 | root_topic_mqtt | root топик | bAf0r0_bAf0r0_0_n1_climate |
| 4 | Ip | IP сервера: Port сервера | 127.0.0.1:502 |
| 5 | unit_id | ID сервера Modbus TCP | 10 |
| 6 | use_shared_connection | Использование 1 TCP соединения для группы устройств; по умолчанию false | false |
| 7 | response_timeout_ms | Время в мс, максимальное время ответа устройств; по умолчанию 500 | 2000 |
| 8 | request_timeout_ms | Время в мс, задержка между запросами к серверу; по умолчанию 0 | 5 |
| 9 | idle_timeout_s | Время в секундах, как долго TCP соединение может оставаться открытым без передачи данных; по умолчанию 60 | 60 |
| 10 | retries | Кол-во попыток для повторов соединения с тайм- аутом time_retries, по умолчанию 10 | 100 |
| 11 | time_retries_s | Время в секундах, тайм-аут на повтор соединения с сервером, по умолчанию 10 | 10 |
| 12 | time_reconnect_s | Время в секундах, тайм-аут на повтор соединения с сервером после retries, по умолчанию 300 | 300 |
| 13 | global_publish_interval | Время в секундах, период гарантированной отправки данных не зависимо от апертур, по умолчанию 0 Если не указано или 0 то апертуры не работают |
3600 |
| № | Название | Описание | Пример |
|---|---|---|---|
| 1 | name | Имя устройства | modbus_device_rtu1 |
| 2 | enabled | Опция активации и деактивации работы устройства true/false; по умолчанию true | true |
| 3 | root_topic_mqtt | root топик | bAf0r0_bAf0r0_0_n1_climate |
| 4 | com_port | ссылка на com port из файла настроек modbus.yaml | com1 |
| 5 | unit_id | ID сервера Modbus RTU | 10 |
| 6 | frame_timeout_ms | Время в мс, между командами на чтение, при ошибке типа serial: timeout увеличиваем время между запросами (ms); по умолчанию 20 | 20 |
| 7 | retries | Кол-во попыток для повторов соединения с тайм- аутом time_retries, по умолчанию 10 | 100 |
| 8 | time_retries_s | Время в секундах, тайм-аут на повтор соединения с сервером, по умолчанию 10 | 10 |
| 9 | time_reconnect_s | Время в секундах, тайм-аут на повтор соединения с сервером после retries, по умолчанию 300 | 300 |
| 10 | global_publish_interval | Время в секундах, период гарантированной отправки данных не зависимо от апертур, по умолчанию 0 Если не указано или 0 то апертуры не работают |
3600 |
| № | Название | Описание | Пример |
|---|---|---|---|
| 1 | name | Имя устройства | modbus_device_rtuovertcp1 |
| 2 | enabled | Опция активации и деактивации работы устройства true/false; по умолчанию true | true |
| 3 | root_topic_mqtt | root топик | bAf0r0_bAf0r0_0_n1_climate |
| 4 | vcom_port | ссылка на vcom port из файла настроек modbus.yaml | vcom1 |
| 5 | unit_id | ID сервера Modbus RTU | 10 |
| 6 | *response_timeout_ms | Время в мс, максимальное время ответа устройств; по умолчанию 500 | 2000 |
| 7 | frame_timeout_ms | Время в мс, между командами на чтение, при ошибке типа serial: timeout увеличиваем время между запросами (ms); по умолчанию 20 | 20 |
| 8 | retries | Кол-во попыток для повторов соединения с тайм-аутом time_retries, по умолчанию 10 | 100 |
| 9 | time_retries_s | Время в секундах, тайм-аут на повтор соединения с сервером, по умолчанию 10 | 10 |
| 10 | time_reconnect_s | Время в секундах, тайм-аут на повтор соединения с сервером после retries, по умолчанию 300 | 300 |
| 11 | global_publish_interval | Время в секундах, период гарантированной отправки данных не зависимо от апертур, по умолчанию 0 Если не указано или 0 то апертуры не работают |
3600 |
| № | Название | Описание | Пример |
|---|---|---|---|
| 1 | read_period_ms | Время в мс – частота опроса каналов slave-устройства | 5000 |
| 2 | enabled_group | Включает автоматическую группировку параметров по коду функции чтения и последовательности адресации регистров для группового запроса; по умолчанию false | true |
| 3 | max_quantity | максимальное кол-во регистров информации для группового запроса, для кодов функции “coil” & “discrete” - 2000; “holding” & “ input” -125; | 100 |
| 4 | parameter_name | Будет использоваться как `/devices/{parameter_name} Если в название параметра сразу указан /devices/ … то для публикации не учитывается преобразование с ${root_topic_mqtt} и берётся полное имя parameter_name |
TemperatureIndoor1 |
| 5 | aperture | Абсолютная апертура для этого параметра для записи данных в MQTT | 0.01 |
| 6 | transform | Формула для преобразования значения y = (a*x + b); x - исходное значение, y - преобразованное значение для записи, по умолчанию (a:b) = (1:0) | 1:0 |
| 7 | precision | Кол-во знаков после запятой, по умолчанию = 0 | 127.0.0.1:502 |
| 8 | object: address | Modbus адрес регистра в dec, если указан с разделителем : то чтение бита | 10 или 10:1 |
| 9 | object: reg_type | Формат данных Modbus Поддерживаемые: coil, input, holding см Modbus функции чтения-записи | input |
| 10 | object: data_type | Тип данных Modbus. Поддерживается (см таблицу Типы данных) |
f32 |
| 11 | object: byteorder | Порядок следования байт "little"/ "big". По умолчанию установлено в "big" | little |
| 12 | object: wordorder | Порядок следования слов "low"/ "high". По умолчанию установлено в "high" | low |
| № | Название | Описание | Пример |
|---|---|---|---|
| 1 | parameter_name | Будет использоваться как `/devices/{parameter_name}; Если в название параметра сразу указан /devices/ … то для публикации не учитывается преобразование с ${root_topic_mqtt} и берётся полное имя parameter_name |
TemperatureIndoor1 |
| 2 | command_topic | Будет использоваться как `/devices/{parameter_name}/${command_toppic}/, по умолчанию on |
cmd |
| 5 | object: address | Modbus адрес регистра в dec | 10 |
| 6 | object: func_code | Код функции записи Modbus Поддерживаемые: 5-0х05, 6-0х06, 16-0х16 см Modbus функции чтения-записи | 5 |
| 7 | object: data_type | Тип данных Modbus. Поддерживается (см таблицу Типы данных) |
f32 |
| 8 | object: byteorder | Порядок следования байт "little"/ "big". По умолчанию установлено в "big" | little |
| 9 | object: wordorder | Порядок следования слов "low"/ "high". По умолчанию установлено в "high" | low |
Установить deb пакет (либо загрузите скомпилированный бинарный файл для соответствующей платформы).
Указать путь к файлу конфигурации modbus.yaml; дефолт относительный путь:
-cfgpath
configs/modbus/modbus.yaml
Задать уровень информативности логов
-loglvl 1
Приоритет настройки логера
1.Конфигурация из файла имеет высший приоритет;
2.Если файл не задан, используются параметры командной строки;
3.Если ничего не задано, применяются значения по умолчанию.
При старте всегда создаётся файл логов log/init_modbus2mqtt.log в который пишется инициализация драйвера с уровнем логирования info
Запись лог файлов
-logfile 1 -logpath log/modbus2mqtt.log
Вывести версию сборки без запуска драйвера
-version
Установка deb пакета через пакетный менеджер apt: apt install ./modbus2mqtt_x.x.x.x_linux_x
Директория для исполнительного файла: /mnt/data/etc/andromeda_embedded/
Директория с файлами конфигурации: /mnt/data/etc/andromeda_embedded/configs/modbus/
Файл службы: /etc/systemd/system/
[Unit]
Description=Andromeda Modbus2MQTT embedded service
Wants=mosquitto.service
After=network.target
[Service]
WorkingDirectory=/mnt/data/etc/andromeda_embedded
ExecStart=/mnt/data/etc/andromeda_embedded/modbus2mqtt \
-cfgpath configs/modbus/modbus.yaml
Restart=always
RestartSec=5s
User=root
[Install]
WantedBy=multi-user.target
Если установка в ручном режиме, то обязательно после создания файла службы выполнить:
sudo systemctl daemon-reload
sudo systemctl enable modbus2mqtt.service sudo systemctl start modbus2mqtt.service
Так же для работы необходима установка lsof: apt install lsof
Нативный драйвер WirenBoard (wb-mqtt-serial) должен быть остановлен: systemctl stop wb-mqtt-serial
Запуск в ручном режиме:
./modbus2mqtt -cfgpath configs/modbus/modbus.yaml -loglvl x
Перед запуском в ручном режиме необходимо остановить demon, если он был запущен: systemctl stop modbus2mqtt
Запуск с выводом уровня логирования:
./modbus2mqtt -cfgpath configs/modbus/modbus.yaml -loglvl 3
Запуск с выводом логов уровня “Monitor” 6/7:
./modbus2mqtt -cfgpath configs/modbus/modbus.yaml -loglvl 6
modbus:
enabled: true
############################################
# Описание конфигурации подключения mqtt
mqtt:
broker: "unix:///var/run/mosquitto/mosquitto.sock" # unix:///var/run/mosquitto/mosquitto.sock или tcp://127.0.0.1:1883
client_id: "modbus2mqtt"
keepalive: 60
username: test # Дефолт без логина/пароля
password: test123
############################################
# Описание конфигурации логирования
# logger:
# write_in_logfile: false
# level_log: 1
# path_log: configs/modbus/log/modbus2mqtt.log
# max_size_log: 2
# max_backups_log: 10
# max_age_log: 10
############################################
# Описание конфигурации COM портов
# com_ports:
# com1:
# port: /dev/ttyS1
# settings: 38400:8:N:1
# timeout: 500
############################################
# Описание конфигурации VCOM портов
# vcom_ports:
# vcom1:
# ip: 192.168.1.201
# port: 9001
############################################
# Описание конфигурации для RTU Серверов
# rtu:
# device_rtu1:
# file: config/rtu1.yaml
############################################
# Описание конфигурации для TCP Серверов
# tcp:
# device_tcp1:
# file: config/tcp1.yaml
############################################
# Описание конфигурации для RTUoverTCP Серверов
# rtuovertcp:
# device_rtuovertcp1:
# file: config/rtuovertcp1.yaml
device:
name: device_tcp_1
enabled: true
root_topic_mqtt: device_tcp_1
unit_id: 1
use_shared_connection: false
ip: 192.168.1.172:1502
response_timeout_ms: 2000
idle_timeout_s: 60
retries: 5
time_retries_s: 10
time_reconnect_s: 120
global_publish_interval: 300
data_model:
read:
- read_period_ms: 1000
enabled_group: false
parameters:
- parameter_name: level1
aperture: 2
object:
address: 1
reg_type: input
data_type: float
byteorder: big
wordorder: high
write:
- parameter_name: parameter_name4
command_topic: on
object:
address: 1
func_code: 16
data_type: float
byteorder: big
Для ускорения процесса пуско-наладочных работ (проверка регистров, типов данных и кодов функций) был разработан дополнительный функционал mscan, встроенный в драйвер modbus2mqtt.
Функция mscan предназначена для автоматического однократного сканирования устройств Modbus (согласно конфигурационным файлам драйвера) с целью определения корректных параметров опроса и формирования отчёта о состоянии всех устройств и их регистров.
Запуск сервиса в режиме mscan выполняется при помощи параметра запуска -mscan 1: ./modbus2mqtt_x.x.x.x_linux_arm64 -mscan 1
Инициализация конфигурации:
Опрос регистров:
Опрос каждого параметра осуществляется последовательным перебором нескольких методов:
Обработка ошибок
В случае возникновения ошибок чтения (недоступность устройства, ошибка соединения) информация фиксируется в логах и итоговом отчёте.
После завершения однократного опроса генерируется Excel-отчёт с названием: report_mscan_{date-time}.xlsx
Отчёт содержит таблицу с результатами опроса каждого параметра всех устройств и включает следующие данные:
ВАЖНО!
Индикатор совпадения параметра с конфигурацией (отмечается светло-зелёной заливкой ячейка с значением которая соответствует настройкам из конфигурации)
| № | Устройство | Подключение | UnitID/SlaveID | Параметр | Регистр DEC | Бит | Функции чтения | Доступность | S16-AB (Big endian) | S16-BA (Little endian) | S32-ABCD (Big endian) | S32-DCBA (Little endian) | Float-ABCD (Big endian) | Float-DCBA (Little endian) | S32-BADC (BigSwap endian) | S32-CDAB (LittleSwap endian) | Float-BADC (BigSwap endian) | Float-CDAB (LittleSwap endian) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | device_rtu_1 | com1 | 2 | Urms L1 | 256 | -1 | Read Input Registers 0x04 | OK | 15252 | -23856 | 9.99608482e+08 | -1.563388869e+09 | 0 | 0 | -1.808031024e+09 | -7.94674284e+08 | 0 | -2.1774508032e+10 |
| 2 | device_rtu_1 | com1 | 2 | Urms L1 | 256 | -1 | Read Holding Registers 0x03 | OK | 15252 | -23856 | 9.99608482e+08 | -1.563388869e+09 | 0 | 0 | -1.808031024e+09 | -7.94674284e+08 | 0 | -2.1774508032e+10 |
| 3 | device_rtu_1 | com1 | 2 | Urms L2 | 258 | -1 | Read Holding Registers 0x03 | OK | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | device_rtu_1 | com1 | 2 | Urms L2 | 258 | -1 | Read Input Registers 0x04 | OK | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 5 | device_rtu_1 | com1 | 2 | I1 | 262 | -1 | Read Input Registers 0x04 | OK | 14342 | -29562 | 9.39951756e+08 | -1.93737364e+09 | 0 | 0 | 1.04369286e+08 | -2.03763097e+09 | 0 | 0 |
| 6 | device_rtu_1 | com1 | 2 | I1 | 262 | -1 | Read Holding Registers 0x03 | OK | 14342 | -29562 | 9.39951756e+08 | -1.93737364e+09 | 0 | 0 | 1.04369286e+08 | -2.03763097e+09 | 0 | 0 |
| 7 | device_rtu_1 | com1 | 2 | I2 | 264 | -1 | Read Input Registers 0x04 | OK | 14226 | 28022 | 9.32345453e+08 | 1.836487223e+09 | 0 | 4.769379707241949e+27 | -1.841861258e+09 | 1.986869138e+09 | 0 | 1.2028334524537911e+33 |
| 8 | device_rtu_1 | com1 | 2 | I2 | 264 | -1 | Read Holding Registers 0x03 | OK | 14226 | 28022 | 9.32345453e+08 | 1.836487223e+09 | 0 | 4.769379707241949e+27 | -1.841861258e+09 | 1.986869138e+09 | 0 | 1.2028334524537911e+33 |
| 9 | device_rtu_1 | com1 | 2 | I3 | 266 | -1 | Read Holding Registers 0x03 | OK | 14999 | 26972 | 9.82998121e+08 | 1.767675706e+09 | 0 | 1.66673642228305e+25 | -1.75777962e+09 | 1.550400151e+09 | 0 | 2.625923591522222e+17 |
| 10 | device_rtu_1 | com1 | 2 | I3 | 266 | -1 | Read Input Registers 0x04 | OK | 15000 | -26858 | 9.83045783e+08 | -1.760126918e+09 | 0 | 0 | -1.740990698e+09 | 3.79009688e+08 | 0 | 0 |
| 11 | device_rtu_1 | com1 | 2 | PF1 | 268 | -1 | Read Input Registers 0x04 | OK | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 12 | device_rtu_1 | com1 | 2 | PF1 | 268 | -1 | Read Holding Registers 0x03 | OK | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 13 | device_rtu_1 | com1 | 2 | PF2 | 270 | -1 | Read Holding Registers 0x03 | OK | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 14 | device_rtu_1 | com1 | 2 | PF2 | 270 | -1 | Read Input Registers 0x04 | OK | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 15 | device_rtu_1 | com1 | 2 | PF3 | 272 | -1 | Read Input Registers 0x04 | OK | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 16 | device_rtu_1 | com1 | 2 | PF3 | 272 | -1 | Read Holding Registers 0x03 | OK | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 17 | device_rtu_1 | com1 | 2 | Ch1_Q1 | 276 | -1 | Read Holding Registers 0x03 | OK | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 18 | device_rtu_1 | com1 | 2 | Ch1_Q1 | 276 | -1 | Read Input Registers 0x04 | OK | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 19 | device_rtu_1 | com1 | 2 | Ch1_Q2 | 278 | -1 | Read Input Registers 0x04 | OK | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 20 | device_rtu_1 | com1 | 2 | Ch1_Q2 | 278 | -1 | Read Holding Registers 0x03 | OK | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 21 | device_rtu_1 | com1 | 2 | Ch1_Q3 | 280 | -1 | Read Input Registers 0x04 | OK | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
PDF-версия данного руководства пользователя доступна для скачивания и печати. Документ содержит полную информацию по установке, настройке и эксплуатации драйвера Modbus2mqtt, включая все разделы, представленные в данной HTML-версии.