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

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


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


== Modbus TCP binding ==
<syntaxhighlight lang="bash">
[[Image:web-mbgate-settings.png|300 px|thumb|right|Настройка Modbus TCP шлюза в веб-интерфейсе контроллера Wiren Board]]
root@wirenboard:~# apt-get update && apt-get install wb-mqtt-mbgate
Выберите здесь тип шлюза — '''TCP''', а также укажите IP-адрес и порт создаваемого сервера:
</syntaxhighlight>
* 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 ==
[[File:web-mbgate-settings.png|right|thumb|250 px|Страница настройки шлюза]]
Здесь можно настроить параметры для подключения к брокеру сообщений MQTT. По умолчанию шлюз использует MQTT-брокер контроллера. Также вы можете настроить аутентификацию при подключении к брокеру.
 
После установки требуется указать топики, которые будут отображаться на регистры Modbus TCP, уточнить их адреса и указать формат регистров. Для этого в веб-интерфейсе переходим в раздел Configs (Конфигурирование) и открываем конфигурационный файл /etc/wb-mqtt-mbgate.conf.
 
==== Modbus binding ====
Здесь можно настроить порт и адрес, по которым будет доступен сервер Modbus TCP.


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


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


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


Раздел содержит список всех найденных каналов в очереди сообщений MQTT, распределённых по типу. Каналы определяются по имени топика: в список вносятся все топики, соответствующие шаблону <code>/devices/+/controls/+</code>, при этом в списке они отображаются как <code>+/+</code>. Например, если в брокере сообщений обнаружено сообщение с топиком <code>/devices/alarms/controls/alarm_test</code>, то в этом списке канал будет записан как <code>alarms/alarm_test</code>.
Дополнительные параметры:
* '''Keep-alive interval'''
* '''Enable username+password authentification''' - установите этот флаг в случае, если брокер требует аутентификации с помощью логина и пароля.
* '''Login''' - имя пользователя для подключения к брокеру. Обязательный параметр, если установлен флаг '''Enable username+password authentification'''.
* '''Password''' - пароль для подключения к брокеру. Обязательный параметр, если установлен флаг '''Enable username+password authentification'''.


Если в брокере сообщений появились новые каналы, например, при подключении нового устройства — они будут добавлены в список при перезапуске службы. Чтобы перезапустить службу, сохраните конфигурацию или перезапустите контроллер.
==== Register bindings ====
В этом разделе настраиваются соответствия топиков и регистров.  


Каналы распределены по четырем группам — типам регистров в Modbus:
Раздел содержит список всех найденных каналов в очереди сообщений MQTT, распределённых по типу. Каналы определяются по имени топика: в список вносятся все топики, соответствующие шаблону /devices/+/controls/+, при этом в списке они отображаются как +/+. Например, если в брокере сообщений обнаружено сообщение с топиком /devices/alarms/controls/alarm_test, то в этом списке канал будет записан как alarms/alarm_test.
* 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>, чтобы считать внесенные сервисом изменения.  
Каналы распределены по 4 группам - типам регистров в Modbus:
* '''Discrete inputs''' - дискретные входы - двоичные значения (1/0), доступные только на чтение (например, состояния входов GPIO);
* '''Coils''' - регистры флагов - двоичные значения, доступные на чтение и на запись (например, переключатели состояний реле);
* '''Input registers''' - регистры ввода - численные значения, доступные только на чтение (например, значение с датчика температуры);
* '''Holding registers''' - регистры хранения - численные значения, доступные на чтение и на запись (например, яркость освещения).


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


=== 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 при указании его в вашем ПО.
* '''Enabled''' - флаг, включающий привязку канала к регистру. По умолчанию, все каналы отключены.
* '''MQTT channel''' - имя канала в формате +/+ (как соответствие /devices/+/controls/+)
* '''Meta-type''' - тип канала, полученный из очереди MQTT. Параметр внесён только "для пользователя", не влияет на работу службы.
* '''Unit ID''' и '''Start address''' - адресные поля Modbus TCP. Определяются хешированием от имени канала; таким образом, одинаковые каналы на разных контроллерах с большой вероятностью будут иметь одинаковые адресные поля. ''Замечание:'' Unit ID 1 и 2 зарезервированы за пользователем - никакие каналы не будут автоматически назначены на эти адреса.


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


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


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


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


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


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


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


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


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

Версия 17:35, 7 ноября 2016

В Wiren Board добавлена возможность отображать сообщения из определённых топиков в очереди сообщений MQTT в регистры Modbus TCP. Это может быть полезным для настройки простого взаимодействия Wiren Board и SCADA-систем с поддержкой Modbus TCP.


Установка и настройка на контроллере

Установка

Для начала нужно установить пакет wb-mqtt-mbgate. В консоли устройства вводим

root@wirenboard:~# apt-get update && apt-get install wb-mqtt-mbgate

Настройка

Страница настройки шлюза

После установки требуется указать топики, которые будут отображаться на регистры Modbus TCP, уточнить их адреса и указать формат регистров. Для этого в веб-интерфейсе переходим в раздел Configs (Конфигурирование) и открываем конфигурационный файл /etc/wb-mqtt-mbgate.conf.

Modbus binding

Здесь можно настроить порт и адрес, по которым будет доступен сервер Modbus TCP.

Обязательные параметры:

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

MQTT connection

Здесь настраиваются параметры для подключения к брокеру сообщений MQTT. По умолчанию шлюз использует MQTT-брокер контроллера. Есть возможность настроить аутентификацию.

Обязательные параметры:

  • Address - адрес брокера сообщений. По умолчанию - localhost - подключение к брокеру контроллера.
  • Port - номер порта, по которому доступен брокер. По умолчанию - 1883.

Дополнительные параметры:

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

Register bindings

В этом разделе настраиваются соответствия топиков и регистров.

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

Если в брокере сообщений появились новые каналы (например, при подключении нового устройства), они будут добавлены в список при перезапуске службы (это происходит при сохранении конфигурационного файла или при перезапуске контроллера).

Каналы распределены по 4 группам - типам регистров в Modbus:

  • Discrete inputs - дискретные входы - двоичные значения (1/0), доступные только на чтение (например, состояния входов GPIO);
  • Coils - регистры флагов - двоичные значения, доступные на чтение и на запись (например, переключатели состояний реле);
  • Input registers - регистры ввода - численные значения, доступные только на чтение (например, значение с датчика температуры);
  • Holding registers - регистры хранения - численные значения, доступные на чтение и на запись (например, яркость освещения).

Распределение происходит автоматически на основании описания канала (в топиках /devices/+/controls/+/meta/+).

Для дискретных и числовых регистров доступны следующие параметры:

  • Enabled - флаг, включающий привязку канала к регистру. По умолчанию, все каналы отключены.
  • MQTT channel - имя канала в формате +/+ (как соответствие /devices/+/controls/+)
  • Meta-type - тип канала, полученный из очереди MQTT. Параметр внесён только "для пользователя", не влияет на работу службы.
  • Unit ID и Start address - адресные поля Modbus TCP. Определяются хешированием от имени канала; таким образом, одинаковые каналы на разных контроллерах с большой вероятностью будут иметь одинаковые адресные поля. Замечание: Unit ID 1 и 2 зарезервированы за пользователем - никакие каналы не будут автоматически назначены на эти адреса.

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

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

Общие параметры:

  • Remap addresses after edit - обновить адреса устройств в случае, если произошло наложение адресов. Полезно, если требуется изменить размер данных в сторону увеличения. При установке этого флага после сохранения конфигурационного файла он будет проанализирован на наложения адресов; если таковые будут обнаружены, сервис попытается их устранить, после чего флаг будет снят. (Для того, чтобы получить обновлённый конфигурационный файл, после сохранения требуется перезагрузить страницу).