Modbus RTU/TCP Slave: различия между версиями
Fizikdaos (обсуждение | вклад) |
(→Input- и Holding-registers: исправил информацию для текстовых полей) |
||
(не показано 18 промежуточных версий 5 участников) | |||
Строка 1: | Строка 1: | ||
{{DISPLAYTITLE: Шлюз Modbus RTU/TCP}} | |||
== Описание == | |||
Контроллеры Wiren Board могут выступать в роли Slave-устройства и транслировать сообщения из выбранных MQTT-топиков по протоколам Modbus RTU, Modbus TCP. | |||
Функция трансляции топиков может быть полезна для настройки взаимодействия между контроллером Wiren Board и внешним программным обеспечением, например, SCADA-системы с поддержкой Modbus RTU/TCP. | |||
Для создания шлюза Modbus RTU/TCP служит сервис [https://github.com/wirenboard/wb-mqtt-mbgate wb-mqtt-mbgate]. Перед использованием нужно указать топики, отображаемые в регистры Modbus RTU/TCP, уточнить их адреса и выбрать формат регистров. | |||
Настройки шлюза хранятся в файле <code>/etc/wb-mqtt-mbgate.conf</code> и могут быть изменены через веб-интерфейс. Чтобы открыть настройку шлюза, перейдите в веб-интерфейсе в раздел '''Settings''' → '''Configs''' → '''MQTT to Modbus TCP and RTU slave gateway configuration'''. | |||
{{Note|info| Обратите внимание, что порт, выбранный для работы в режиме Modbus-slave, не должен использоваться в настройках опроса драйвера wb-mqtt-serial!}} | |||
== Modbus TCP binding == | |||
[[Image:web-mbgate-settings.png|300 px|thumb|right|Настройка Modbus TCP шлюза в веб-интерфейсе контроллера Wiren Board]] | |||
Выберите здесь тип шлюза — '''TCP''', а также укажите IP-адрес и порт создаваемого сервера: | |||
* Bind address — IP-адрес по которому будет доступен сервер Modbus TCP. По умолчанию: <code>*</code> — возможно подключение к любому IP-адресу контроллера. | |||
* Server TCP port — порт, на котором сервер будет ждать соединение. По умолчанию: <code>502</code> — стандартный для Modbus TCP порт. | |||
== Modbus RTU binding == | |||
[[Image:Modbus-RTU-settings-mbgate.png|300 px|thumb|right|Настройка Modbus RTU шлюза в веб-интерфейсе контроллера Wiren Board]] | |||
Выберите здесь тип шлюза — '''RTU''', а также укажите serial-порт и параметры соединения: | |||
* Path to device — адрес serial-порта контроллера, на котором будет доступен шлюз. | |||
* Baud rate — скорость соединения. | |||
* Parity — контроль четности. | |||
* Data bits — биты данных. | |||
* Stop bits — стоп-биты. | |||
=== | == MQTT connection == | ||
Здесь можно настроить параметры для подключения к брокеру сообщений MQTT. По умолчанию шлюз использует MQTT-брокер контроллера. Также вы можете настроить аутентификацию при подключении к брокеру. | |||
Обязательные параметры: | Обязательные параметры: | ||
* | * Address — адрес брокера сообщений. По умолчанию: <code>localhost</code> — подключение к брокеру контроллера. | ||
* | * Port — номер порта, по которому доступен брокер. По умолчанию: <code>1883</code>. | ||
Нажав на кнопку '''Properties''' вы можете включить дополнительные параметры: | |||
* Keep-alive interval — интервал ожидания ответа от брокера. Если сообщение не пришло — запрос повторяется. | |||
* Enable username+password authentification — если брокер требует аутентификации с помощью логина и пароля, установите этот флаг. Также потребуется указать данные учетной записи: | |||
** Login — имя пользователя. | |||
** Password — пароль. | |||
== Общие для Modbus RTU/TCP параметры == | |||
=== Register bindings === | |||
В этом разделе можно настроить соответствия топиков и регистров. | |||
Раздел содержит список всех найденных каналов в очереди сообщений MQTT, распределённых по типу. Каналы определяются по имени топика: в список вносятся все топики, соответствующие шаблону <code>/devices/+/controls/+</code>, при этом в списке они отображаются как <code>+/+</code>. Например, если в брокере сообщений обнаружено сообщение с топиком <code>/devices/alarms/controls/alarm_test</code>, то в этом списке канал будет записан как <code>alarms/alarm_test</code>. | |||
Если в брокере сообщений появились новые каналы, например, при подключении нового устройства — они будут добавлены в список при перезапуске службы. Чтобы перезапустить службу, сохраните конфигурацию или перезапустите контроллер. | |||
< | Каналы распределены по четырем группам — типам регистров в Modbus: | ||
* Discrete inputs — дискретные входы. Двоичные значения <code>1/0</code>, доступные только на чтение. Например, состояния входов GPIO. | |||
* Coils — регистры флагов. Двоичные значения, доступные на чтение и на запись: переключатели состояний реле и т.п. | |||
* Input registers — регистры ввода. Численные значения, доступные только на чтение: значение с датчика температуры, давления и т.п. | |||
* Holding registers — регистры хранения. Численные значения, доступные на чтение и на запись: яркость освещения, уставки температуры и т.п. | |||
< | Распределение происходит автоматически на основании описания канала в топиках: <code>/devices/+/controls/+/meta/+</code>. | ||
< | '''Remap addresses after edit''' — если произошло наложение адресов, то обновить адреса устройств. Если установить флаг и сохранить настройки, то файл будет проанализирован на наложение адресов. Если наложения будут обнаружены, сервис попытается устранить их и после операции снимет флаг. Обновите страницу клавишами <code>Ctrl+Shift+R</code>, чтобы считать внесенные сервисом изменения. | ||
'''ВНИМАНИЕ:''' используйте флаг '''Remap addresses after edit''' только на настраиваемой системе — адреса любых каналов могут измениться, в том числе и настроенных ранее. | |||
=== Discrete inputs and Coils === | |||
* | Для дискретных и числовых регистров доступны параметры: | ||
* | * Enabled — флаг, включающий привязку канала к регистру. По умолчанию все каналы отключены. | ||
* | * MQTT Device — имя канала в формате <code>+/+</code>, как соответствие <code>/devices/+/controls/+/</code>. | ||
* | * Meta-type — тип канала, полученный из очереди MQTT. Параметр отображен только «для пользователя», не влияет на работу службы. | ||
* Modbus unit ID и Start address — адрес slave-устройства в сети Modbus RTU/TCP и адрес его регистра. Определяются хешированием от имени канала. Таким образом, одинаковые каналы на разных контроллерах с большой вероятностью будут иметь одинаковые адресные поля. Адреса 1 и 2 зарезервированы за пользователем, поэтому ни один канал не будет назначен на них автоматически. | |||
'''Важно для Modbus TCP:''' Так как контроллер является шлюзом, то он назначает разным устройствам, которые к нему подключены разные Unit ID. Некоторое программное обеспечение рассчитано на работу с одним Unit ID (например 1) на одном IP-адресе. В некоторых программах стартовый адрес считается начинающимся с 1, а не с 0. В таком случае к стартовому адресу из конфигурации шлюза надо добавлять 1 при указании его в вашем ПО. | |||
'''Важно:''' | |||
=== Input- и Holding-registers === | |||
Для Input- и Holding-регистров, доступны все параметры [[#Discrete inputs and Coils |дискретных и числовых]], а также дополнительно: | |||
* Register format — тип хранимых данных: | |||
* ''' | ** ''Signed integer'' — знаковое целое; | ||
** | ** ''Unsigned integer'' — беззнаковое целое; | ||
** | ** ''BCD'' — двоично-десятичное беззнаковое целое. Например, десятичное значение <code>123</code> будет кодироваться как <code>0x123 == 291</code>; | ||
** | ** ''IEEE 754 float'' — число с плавающей точкой; | ||
** ''Varchar'' — текстовое поле фиксированного размера (1 символ на регистр). | |||
* Size (in bytes) — размер данных в байтах. Нужно учитывать, что для всех типов в один регистр укладывается два байта: | |||
* ''' | ** ''для целочисленных типов'' — 2, 4 и 8 байт — это будет 1, 2 и 4 регистра соответственно; | ||
** ''для чисел с плавающей точкой'' — 4 и 8 байт, то есть 2 и 4 регистра соответственно; | |||
** ''для текстовых полей'' — длина строки указывается в регистрах (не в байтах), при этом 1 регистр = 1 символ. | |||
* Maximum value — максимальное значение поля. Требуется для каналов типа ''range''. Все значения больше максимума будут заменены на максимальное. | |||
* ''' | |||
* Value scale — множитель значения. Например, если множитель равен 2 и в канале появилось значение 10, значение регистра будет 20. И наоборот, если в регистр было записано значение 30, в брокер уйдёт сообщение со значением 15. | |||
* | |||
* Byte swap — поменять порядок байт в modbus-регистрах. По умолчанию значения записываются в регистры в формате ''big-endian''. Если установить этот флаг, регистр будет интерпретироваться как ''little-endian''. ''Важно:'' флаг действует только на отдельные регистры; в случае составных значений (размером больше 2 байт), меняется порядок только в каждом двухбайтном слове. Например, значение <code>0x12345678</code> будет записываться как <code>0x34127856</code>, | |||
< | * Word swap — поменять порядок слов для составных значений. Например, значение <code>0x12345678</code> будет записываться как <code>0x56781234</code>. | ||
Таким образом, чтобы записать значение в формате ''little-endian'', нужно установить оба последних флага: ''Byte swap'' и ''Word swap''. | |||
Текущая версия на 10:51, 8 июля 2022
Описание
Контроллеры Wiren Board могут выступать в роли Slave-устройства и транслировать сообщения из выбранных MQTT-топиков по протоколам Modbus RTU, Modbus TCP.
Функция трансляции топиков может быть полезна для настройки взаимодействия между контроллером Wiren Board и внешним программным обеспечением, например, SCADA-системы с поддержкой Modbus RTU/TCP.
Для создания шлюза Modbus RTU/TCP служит сервис wb-mqtt-mbgate. Перед использованием нужно указать топики, отображаемые в регистры Modbus RTU/TCP, уточнить их адреса и выбрать формат регистров.
Настройки шлюза хранятся в файле /etc/wb-mqtt-mbgate.conf
и могут быть изменены через веб-интерфейс. Чтобы открыть настройку шлюза, перейдите в веб-интерфейсе в раздел Settings → Configs → MQTT to Modbus TCP and RTU slave gateway configuration.
Обратите внимание, что порт, выбранный для работы в режиме Modbus-slave, не должен использоваться в настройках опроса драйвера wb-mqtt-serial!
Modbus TCP binding
Выберите здесь тип шлюза — TCP, а также укажите IP-адрес и порт создаваемого сервера:
- Bind address — IP-адрес по которому будет доступен сервер Modbus TCP. По умолчанию:
*
— возможно подключение к любому IP-адресу контроллера. - Server TCP port — порт, на котором сервер будет ждать соединение. По умолчанию:
502
— стандартный для Modbus TCP порт.
Modbus RTU binding
Выберите здесь тип шлюза — RTU, а также укажите serial-порт и параметры соединения:
- Path to device — адрес serial-порта контроллера, на котором будет доступен шлюз.
- Baud rate — скорость соединения.
- Parity — контроль четности.
- Data bits — биты данных.
- Stop bits — стоп-биты.
MQTT connection
Здесь можно настроить параметры для подключения к брокеру сообщений MQTT. По умолчанию шлюз использует MQTT-брокер контроллера. Также вы можете настроить аутентификацию при подключении к брокеру.
Обязательные параметры:
- Address — адрес брокера сообщений. По умолчанию:
localhost
— подключение к брокеру контроллера. - Port — номер порта, по которому доступен брокер. По умолчанию:
1883
.
Нажав на кнопку Properties вы можете включить дополнительные параметры:
- Keep-alive interval — интервал ожидания ответа от брокера. Если сообщение не пришло — запрос повторяется.
- Enable username+password authentification — если брокер требует аутентификации с помощью логина и пароля, установите этот флаг. Также потребуется указать данные учетной записи:
- Login — имя пользователя.
- Password — пароль.
Общие для Modbus RTU/TCP параметры
Register bindings
В этом разделе можно настроить соответствия топиков и регистров.
Раздел содержит список всех найденных каналов в очереди сообщений MQTT, распределённых по типу. Каналы определяются по имени топика: в список вносятся все топики, соответствующие шаблону /devices/+/controls/+
, при этом в списке они отображаются как +/+
. Например, если в брокере сообщений обнаружено сообщение с топиком /devices/alarms/controls/alarm_test
, то в этом списке канал будет записан как alarms/alarm_test
.
Если в брокере сообщений появились новые каналы, например, при подключении нового устройства — они будут добавлены в список при перезапуске службы. Чтобы перезапустить службу, сохраните конфигурацию или перезапустите контроллер.
Каналы распределены по четырем группам — типам регистров в Modbus:
- Discrete inputs — дискретные входы. Двоичные значения
1/0
, доступные только на чтение. Например, состояния входов GPIO. - Coils — регистры флагов. Двоичные значения, доступные на чтение и на запись: переключатели состояний реле и т.п.
- Input registers — регистры ввода. Численные значения, доступные только на чтение: значение с датчика температуры, давления и т.п.
- Holding registers — регистры хранения. Численные значения, доступные на чтение и на запись: яркость освещения, уставки температуры и т.п.
Распределение происходит автоматически на основании описания канала в топиках: /devices/+/controls/+/meta/+
.
Remap addresses after edit — если произошло наложение адресов, то обновить адреса устройств. Если установить флаг и сохранить настройки, то файл будет проанализирован на наложение адресов. Если наложения будут обнаружены, сервис попытается устранить их и после операции снимет флаг. Обновите страницу клавишами Ctrl+Shift+R
, чтобы считать внесенные сервисом изменения.
ВНИМАНИЕ: используйте флаг Remap addresses after edit только на настраиваемой системе — адреса любых каналов могут измениться, в том числе и настроенных ранее.
Discrete inputs and Coils
Для дискретных и числовых регистров доступны параметры:
- Enabled — флаг, включающий привязку канала к регистру. По умолчанию все каналы отключены.
- MQTT Device — имя канала в формате
+/+
, как соответствие/devices/+/controls/+/
. - Meta-type — тип канала, полученный из очереди MQTT. Параметр отображен только «для пользователя», не влияет на работу службы.
- Modbus unit ID и Start address — адрес slave-устройства в сети Modbus RTU/TCP и адрес его регистра. Определяются хешированием от имени канала. Таким образом, одинаковые каналы на разных контроллерах с большой вероятностью будут иметь одинаковые адресные поля. Адреса 1 и 2 зарезервированы за пользователем, поэтому ни один канал не будет назначен на них автоматически.
Важно для Modbus TCP: Так как контроллер является шлюзом, то он назначает разным устройствам, которые к нему подключены разные Unit ID. Некоторое программное обеспечение рассчитано на работу с одним Unit ID (например 1) на одном IP-адресе. В некоторых программах стартовый адрес считается начинающимся с 1, а не с 0. В таком случае к стартовому адресу из конфигурации шлюза надо добавлять 1 при указании его в вашем ПО.
Input- и Holding-registers
Для Input- и Holding-регистров, доступны все параметры дискретных и числовых, а также дополнительно:
- Register format — тип хранимых данных:
- Signed integer — знаковое целое;
- Unsigned integer — беззнаковое целое;
- BCD — двоично-десятичное беззнаковое целое. Например, десятичное значение
123
будет кодироваться как0x123 == 291
; - IEEE 754 float — число с плавающей точкой;
- Varchar — текстовое поле фиксированного размера (1 символ на регистр).
- Size (in bytes) — размер данных в байтах. Нужно учитывать, что для всех типов в один регистр укладывается два байта:
- для целочисленных типов — 2, 4 и 8 байт — это будет 1, 2 и 4 регистра соответственно;
- для чисел с плавающей точкой — 4 и 8 байт, то есть 2 и 4 регистра соответственно;
- для текстовых полей — длина строки указывается в регистрах (не в байтах), при этом 1 регистр = 1 символ.
- Maximum value — максимальное значение поля. Требуется для каналов типа range. Все значения больше максимума будут заменены на максимальное.
- Value scale — множитель значения. Например, если множитель равен 2 и в канале появилось значение 10, значение регистра будет 20. И наоборот, если в регистр было записано значение 30, в брокер уйдёт сообщение со значением 15.
- Byte swap — поменять порядок байт в modbus-регистрах. По умолчанию значения записываются в регистры в формате big-endian. Если установить этот флаг, регистр будет интерпретироваться как little-endian. Важно: флаг действует только на отдельные регистры; в случае составных значений (размером больше 2 байт), меняется порядок только в каждом двухбайтном слове. Например, значение
0x12345678
будет записываться как0x34127856
,
- Word swap — поменять порядок слов для составных значений. Например, значение
0x12345678
будет записываться как0x56781234
.
Таким образом, чтобы записать значение в формате little-endian, нужно установить оба последних флага: Byte swap и Word swap.