Modbus RTU/TCP Slave: различия между версиями

Материал из Wiren Board
(→‎Input- и Holding-registers: исправил информацию для текстовых полей)
 
(не показаны 22 промежуточные версии 7 участников)
Строка 1: Строка 1:
В Wiren Board добавлена возможность отображать сообщения из определённых топиков в очереди сообщений MQTT в регистры Modbus TCP. Это может быть полезным для настройки
{{DISPLAYTITLE: Шлюз Modbus RTU/TCP}}
простого взаимодействия Wiren Board и SCADA-систем с поддержкой Modbus 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'''.


Для начала нужно установить пакет wb-mqtt-mbgate. В консоли устройства вводим
{{Note|info| Обратите внимание, что порт, выбранный для работы в режиме Modbus-slave, не должен использоваться в настройках опроса драйвера wb-mqtt-serial!}}


<syntaxhighlight lang="bash">
== Modbus TCP binding ==
root@wirenboard:~# apt-get update && apt-get install wb-mqtt-mbgate
[[Image:web-mbgate-settings.png|300 px|thumb|right|Настройка Modbus TCP шлюза в веб-интерфейсе контроллера Wiren Board]]
</syntaxhighlight>
Выберите здесь тип шлюза — '''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 — стоп-биты.


[[File:web-mbgate-settings.png|right|thumb|250 px|Страница настройки шлюза]]
== MQTT connection ==
 
Здесь можно настроить параметры для подключения к брокеру сообщений MQTT. По умолчанию шлюз использует MQTT-брокер контроллера. Также вы можете настроить аутентификацию при подключении к брокеру.
После установки требуется указать топики, которые будут отображаться на регистры Modbus TCP, уточнить их адреса и указать формат регистров. Для этого в веб-интерфейсе переходим в раздел Configs (Конфигурирование) и открываем конфигурационный файл /etc/wb-mqtt-mbgate.conf.
 
==== Modbus binding ====
Здесь можно настроить порт и адрес, по которым будет доступен сервер Modbus TCP.


Обязательные параметры:
Обязательные параметры:
* '''Bind address''' - адрес, по которому будет доступен сервер Modbus TCP. Значение по умолчанию - * - означает, что возможно подключение по любому адресу, по которому доступен контроллер (например, по IP-адресу или по доменному имени).
* Address — адрес брокера сообщений. По умолчанию: <code>localhost</code> — подключение к брокеру контроллера.
* '''Server TCP port''' - номер порта, по которому будет доступен сервер Modbus TCP. Значение по умолчанию - 502 - стандартный порт для Modbus TCP.
* Port — номер порта, по которому доступен брокер. По умолчанию: <code>1883</code>.


==== MQTT connection ====
Нажав на кнопку '''Properties''' вы можете включить дополнительные параметры:
Здесь настраиваются параметры для подключения к брокеру сообщений MQTT. По умолчанию шлюз использует MQTT-брокер контроллера. Есть возможность настроить аутентификацию.
* Keep-alive interval — интервал ожидания ответа от брокера. Если сообщение не пришло — запрос повторяется.
* Enable username+password authentification — если брокер требует аутентификации с помощью логина и пароля, установите этот флаг. Также потребуется указать данные учетной записи:
** Login — имя пользователя.  
** Password — пароль.


Обязательные параметры:
== Общие для  Modbus RTU/TCP параметры ==
* '''Address''' - адрес брокера сообщений. По умолчанию - localhost - подключение к брокеру контроллера.
=== Register bindings ===
* '''Port''' - номер порта, по которому доступен брокер. По умолчанию - 1883.


Дополнительные параметры:
В этом разделе можно настроить соответствия топиков и регистров.  
* '''Keep-alive interval'''
* '''Enable username+password authentification''' - установите этот флаг в случае, если брокер требует аутентификации с помощью логина и пароля.
* '''Login''' - имя пользователя для подключения к брокеру. Обязательный параметр, если установлен флаг '''Enable username+password authentification'''.
* '''Password''' - пароль для подключения к брокеру. Обязательный параметр, если установлен флаг '''Enable username+password authentification'''.


==== Register bindings ====
Раздел содержит список всех найденных каналов в очереди сообщений MQTT, распределённых по типу. Каналы определяются по имени топика: в список вносятся все топики, соответствующие шаблону <code>/devices/+/controls/+</code>, при этом в списке они отображаются как <code>+/+</code>. Например, если в брокере сообщений обнаружено сообщение с топиком <code>/devices/alarms/controls/alarm_test</code>, то в этом списке канал будет записан как <code>alarms/alarm_test</code>.
В этом разделе настраиваются соответствия топиков и регистров.  


Раздел содержит список всех найденных каналов в очереди сообщений MQTT, распределённых по типу. Каналы определяются по имени топика: в список вносятся все топики, соответствующие шаблону /devices/+/controls/+, при этом в списке они отображаются как +/+. Например, если в брокере сообщений обнаружено сообщение с топиком /devices/alarms/controls/alarm_test, то в этом списке канал будет записан как alarms/alarm_test.
Если в брокере сообщений появились новые каналы, например, при подключении нового устройства — они будут добавлены в список при перезапуске службы. Чтобы перезапустить службу, сохраните конфигурацию или перезапустите контроллер.


Если в брокере сообщений появились новые каналы (например, при подключении нового устройства), они будут добавлены в список при перезапуске службы (это происходит при сохранении конфигурационного файла или при перезапуске контроллера).
Каналы распределены по четырем группам — типам регистров в Modbus:
* Discrete inputs — дискретные входы. Двоичные значения <code>1/0</code>, доступные только на чтение. Например, состояния входов GPIO.
* Coils — регистры флагов. Двоичные значения, доступные на чтение и на запись: переключатели состояний реле и т.п.
* Input registers — регистры ввода. Численные значения, доступные только на чтение: значение с датчика температуры, давления и т.п.
* Holding registers — регистры хранения. Численные значения, доступные на чтение и на запись: яркость освещения, уставки температуры и т.п.


Каналы распределены по 4 группам - типам регистров в Modbus:
Распределение происходит автоматически на основании описания канала в топиках: <code>/devices/+/controls/+/meta/+</code>.
* '''Discrete inputs''' - дискретные входы - двоичные значения (1/0), доступные только на чтение (например, состояния входов GPIO);
* '''Coils''' - регистры флагов - двоичные значения, доступные на чтение и на запись (например, переключатели состояний реле);
* '''Input registers''' - регистры ввода - численные значения, доступные только на чтение (например, значение с датчика температуры);
* '''Holding registers''' - регистры хранения - численные значения, доступные на чтение и на запись (например, яркость освещения).


Распределение происходит автоматически на основании описания канала (в топиках /devices/+/controls/+/meta/+).
'''Remap addresses after edit''' — если произошло наложение адресов, то обновить адреса устройств. Если установить флаг и сохранить настройки, то файл будет проанализирован на наложение адресов. Если наложения будут обнаружены, сервис попытается устранить их и после операции снимет флаг. Обновите страницу клавишами <code>Ctrl+Shift+R</code>, чтобы считать внесенные сервисом изменения.  


Для дискретных и числовых регистров доступны следующие параметры:
'''ВНИМАНИЕ:''' используйте флаг '''Remap addresses after edit''' только на настраиваемой системе — адреса любых каналов могут измениться, в том числе и настроенных ранее.


* '''Enabled''' - флаг, включающий привязку канала к регистру. По умолчанию, все каналы отключены.
=== Discrete inputs and Coils ===
* '''MQTT channel''' - имя канала в формате +/+ (как соответствие /devices/+/controls/+)
Для дискретных и числовых регистров доступны параметры:
* '''Meta-type''' - тип канала, полученный из очереди MQTT. Параметр внесён только "для пользователя", не влияет на работу службы.
* Enabled флаг, включающий привязку канала к регистру. По умолчанию все каналы отключены.
* '''Unit ID''' и '''Start address''' - адресные поля Modbus TCP. Определяются хешированием от имени канала; таким образом, одинаковые каналы на разных контроллерах с большой вероятностью будут иметь одинаковые адресные поля. ''Замечание:'' Unit ID 1 и 2 зарезервированы за пользователем - никакие каналы не будут автоматически назначены на эти адреса.
* MQTT Device — имя канала в формате <code>+/+</code>, как соответствие <code>/devices/+/controls/+/</code>.
* Meta-type тип канала, полученный из очереди MQTT. Параметр отображен только «для пользователя», не влияет на работу службы.
* Modbus unit ID и Start address — адрес slave-устройства в сети Modbus RTU/TCP и адрес его регистра. Определяются хешированием от имени канала. Таким образом, одинаковые каналы на разных контроллерах с большой вероятностью будут иметь одинаковые адресные поля. Адреса 1 и 2 зарезервированы за пользователем, поэтому ни один канал не будет назначен на них автоматически.


'''Важно:''' Поскольку контроллер является шлюзом, он назначает разным устройствам, подключенным к нему, свои разные Unit ID. Некоторое программное обеспечение рассчитано на работу с одним Unit ID (например 1) на одном IP-адресе. В некоторых программах стартовый адрес считается начинающимся с 1, а не с 0. В таком случае к стартовому адресу из конфигурации шлюза надо добавлять 1 при задании его в вашем ПО.
'''Важно для Modbus TCP:''' Так как контроллер является шлюзом, то он назначает разным устройствам, которые к нему подключены разные Unit ID. Некоторое программное обеспечение рассчитано на работу с одним Unit ID (например 1) на одном IP-адресе. В некоторых программах стартовый адрес считается начинающимся с 1, а не с 0. В таком случае к стартовому адресу из конфигурации шлюза надо добавлять 1 при указании его в вашем ПО.


Для числовых регистров, помимо вышеописанных, доступны также параметры:
=== Input- и Holding-registers ===


* '''Register format''' - тип хранимых данных:
Для Input- и Holding-регистров, доступны все параметры [[#Discrete inputs and Coils |дискретных и числовых]], а также дополнительно:
** '''Signed integer''' - знаковое целое;
** '''Unsigned integer''' - беззнаковое целое;
** '''BCD''' - двоично-десятичное беззнаковое целое. (Например, десятичное значение 123 будет кодироваться как 0x123 == 291);
** '''IEEE 754 float''' - число с плавающей точкой;
** '''Varchar''' - текстовое поле фиксированного размера (1 символ на регистр).


* '''Size''' - размер данных в байтах. Нужно учитывать, что для всех типов, кроме текстового, в один регистр укладывается два байта.
* Register format — тип хранимых данных:
** для целочисленных типов - 2, 4 и 8 байт (соответственно, в регистрах это будет 1, 2 и 4 регистра);
** ''Signed integer'' — знаковое целое;
** для чисел с плавающей точкой - 4 и 8 байт (2 и 4 регистра);
** ''Unsigned integer'' — беззнаковое целое;
** для текстовых полей - любое неотрицательное значение.
** ''BCD'' — двоично-десятичное беззнаковое целое. Например, десятичное значение <code>123</code> будет кодироваться как <code>0x123 == 291</code>;
** ''IEEE 754 float'' — число с плавающей точкой;
** ''Varchar'' — текстовое поле фиксированного размера (1 символ на регистр).


* '''Maximum value''' - максимальное значение поля. Требуется для каналов типа range. Все значения больше максимума будут заменены на максимальное.
* Size (in bytes) — размер данных в байтах. Нужно учитывать, что для всех типов в один регистр укладывается два байта:
** ''для целочисленных типов'' — 2, 4 и 8 байт — это будет 1, 2 и 4 регистра соответственно;
** ''для чисел с плавающей точкой'' — 4 и 8 байт, то есть 2 и 4 регистра соответственно;
** ''для текстовых полей'' — длина строки указывается в регистрах (не в байтах), при этом 1 регистр = 1 символ.


* '''Value scale''' - множитель значения. Например, если множитель равен 2 и в канале появилось значение 10, значение регистра будет 20. И наоборот, если в регистр было записано значение 30, в брокер уйдёт сообщение со значением 15.
* Maximum value — максимальное значение поля. Требуется для каналов типа ''range''. Все значения больше максимума будут заменены на максимальное.


* '''Byte swap''' - поменять порядок байт в регистрах Modbus. По умолчанию, значения записываются в регистры в формате big-endian. Если установить этот флаг, регистр будет интерпретироваться как little-endian. ''Важно:'' флаг действует только на отдельные регистры; в случае составных значений (размером больше 2 байт), меняется порядок только в каждом двухбайтном слове. Например, значение 0x12345678 будет записываться как 0x34127856,
* Value scale — множитель значения. Например, если множитель равен 2 и в канале появилось значение 10, значение регистра будет 20. И наоборот, если в регистр было записано значение 30, в брокер уйдёт сообщение со значением 15.


* '''Word swap''' - поменять порядок слов для составных значений. Например, значение 0x12345678 будет записываться как 0x56781234.
* Byte swap — поменять порядок байт в modbus-регистрах. По умолчанию значения записываются в регистры в формате ''big-endian''. Если установить этот флаг, регистр будет интерпретироваться как ''little-endian''. ''Важно:'' флаг действует только на отдельные регистры; в случае составных значений (размером больше 2 байт), меняется порядок только в каждом двухбайтном слове. Например, значение <code>0x12345678</code> будет записываться как <code>0x34127856</code>,


Таким образом, чтобы записать значение в формате little-endian, нужно установить оба последних флага.
* Word swap — поменять порядок слов для составных значений. Например, значение <code>0x12345678</code> будет записываться как <code>0x56781234</code>.


Общие параметры:
Таким образом, чтобы записать значение в формате ''little-endian'', нужно установить оба последних флага: ''Byte swap'' и ''Word swap''.
* '''Remap addresses after edit''' - обновить адреса устройств в случае, если произошло наложение адресов. Полезно, если требуется изменить размер данных в сторону увеличения. При установке этого флага после сохранения конфигурационного файла он будет проанализирован на наложения адресов; если таковые будут обнаружены, сервис попытается их устранить, после чего флаг будет снят. (Для того, чтобы получить обновлённый конфигурационный файл, после сохранения требуется перезагрузить страницу). '''Внимание!''' Использовать этот флаг можно только на настраиваемой системе, так как могут измениться адреса любых каналов, в том числе и уже настроенных.

Текущая версия на 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 и могут быть изменены через веб-интерфейс. Чтобы открыть настройку шлюза, перейдите в веб-интерфейсе в раздел SettingsConfigsMQTT to Modbus TCP and RTU slave gateway configuration.

Обратите внимание, что порт, выбранный для работы в режиме Modbus-slave, не должен использоваться в настройках опроса драйвера wb-mqtt-serial!

Modbus TCP binding

Настройка Modbus TCP шлюза в веб-интерфейсе контроллера Wiren Board

Выберите здесь тип шлюза — TCP, а также укажите IP-адрес и порт создаваемого сервера:

  • Bind address — IP-адрес по которому будет доступен сервер Modbus TCP. По умолчанию: * — возможно подключение к любому IP-адресу контроллера.
  • Server TCP port — порт, на котором сервер будет ждать соединение. По умолчанию: 502 — стандартный для Modbus TCP порт.

Modbus RTU binding

Настройка Modbus RTU шлюза в веб-интерфейсе контроллера Wiren Board

Выберите здесь тип шлюза — 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.