Wb-mqtt-serial driver: различия между версиями

Материал из Wiren Board
 
(не показано 165 промежуточных версий 9 участников)
Строка 1: Строка 1:
'''Внимание!''' В этой статье даётся упрощённое и, возможно, устаревшее описание драйвера, работающего с устройствами Modbus и Uniel и передающего сообщения в MQTT. Полное актуальное описание смотрите на https://github.com/contactless/wb-homa-drivers/#wb-homa-modbus
{{DISPLAYTITLE: Драйвер wb-mqtt-serial}}
== Описание ==
[[Image: wb-mqtt-serial a few protocols.png |500px|thumb|right| Драйвер wb-mqtt-serial может одновременно опрашивать устройства, работающие по разным протоколам: <br> ​1 — виртуальный порт для устройств с протоколом Modbus TCP,<br> 2  — устройство работает по протоколу Modbus RTU,<br> 3 — устройство работает по протоколу DLMS]]
=== Общая информация ===
''wb-mqtt-serial'' — драйвер master-slave протоколов для устройств, подключённых:
* к шине RS-485 — протокол Modbus RTU и других;
* через Ethernet — протоколы Modbus TCP, Modbus over TCP и другие;
* к разъёмам MOD1–MOD3 — при наличии модулей расширения, использующих обмен по UART.


== Краткое описание драйвера ==
Драйвер опрашивает serial-устройства и публикует данные в топики [[MQTT|MQTT]]-брокера. Устройства и порты настраиваются через веб-интерфейс, подробнее в статье [[RS-485:Configuration via Web Interface | Начальное конфигурирование устройств через веб-интерфейс]].
В настоящее время поддерживается работа с устройствами протоколов Modbus RTU и Uniel, подключаемыми через RS-485.


Конфигурация драйвера задаётся в файле /etc/wb-homa-modbus.conf. Если такой файл создан, драйвер запускается при загрузке контроллера автоматически. Также драйвером можно управлять в ручном режиме из консоли:
Wb-mqtt-serial использует систему JSON-шаблонов, которые описывают подключённые устройства: тип протокола, номера регистров, название параметров и контролов в веб-интерфейсе контроллера. В стандартной поставке есть шаблоны для всех устройств Wiren Board, а также некоторых сторонних устройств: счётчики электроэнергии, частотные преобразователи, холодильные контроллеры и другие.
<syntaxhighlight lang="bash">
service wb-homa-modbus stop #остановить драйвер
service wb-homa-modbus start #запустить драйвер
wb-homa-modbus -c /etc/wb-homa-modbus.conf -d #запустить драйвер в принудительном отладочном режиме
</syntaxhighlight>
== Конфигурационный файл ==
Для работы драйвера нужно создать файл <code>/etc/wb-homa-modbus.conf</code>. Для этого:
#Зайдите в консоль устройства через [[Debug UART]] или по [[SSH]]
#Созайте файл и отрокйте его для редактирования:
#: <syntaxhighlight lang="bash">
mcedit /etc/wb-homa-modbus.conf #открыть файл в псевдографическом редакторе
</syntaxhighlight>
#:Если файл уже был создан, та же команда просто откроет его для редактирования.
#Файл имеет структуру ''порты (ports) -> устройства (devices)'': в файле есть описания физических портов контроллера, а внутри них - список устройств, которые подключены к этому порту. В файле-образце собраны примеры конфигурации для разных устройств - ненужные придётся удалить.
#:Для каждого порта указываются настройки (скорость, чётность и т.п.), а также протокол (Modbus, RTU, etc.)
#:Для каждого устройства обязательно указывается его уникальный адрес на шине - ''slave_id'' (подробнее про это можно прочитать в статье [[RS-485]]). Также можно указать другие необязательные параметры - смотрите полное описание формата в [https://github.com/contactless/wb-homa-drivers/#wb-homa-modbus подробной документации].
===Пример конфигурации для [[WB-MRM2 Реле 2х канальное | модуля реле WB-MRM2]], подключённого к изолированному порту (RS-485-ISO) Wiren Board 4===
<syntaxhighlight lang="javascript">{
    "ports": [
        {
            "path" : "/dev/ttyNSC0", //псевдофайл, соответствующий порту
            "baud_rate": 9600, //скорость порта, 9600 почти для всех устройств, но проверьте документацию к ним
            "parity": "N", //четность
            "data_bits": 8, //битов данных в посылке
            "stop_bits": 2, //количество стоп-битов. Чётность, количество битов и стоп-битов тоже редко меняются
            "poll_interval": 10, //интервал опроса устройств на порту в миллисекундах
            "enabled": true,
            "devices" : [
                {
                    "device_type" : "WB-MRM2", //тип устройства, распознаваемый драйвером
                    "slave_id": 25, //адрес устройства
                }
            ]
        }
    ]
}</syntaxhighlight>
Узнать файл, соответствующий порту для вашего контроллера - [[RS-485#Реализация портов в разных версиях Wiren Board ]].


Полный список поддерживаемых типов устройств - https://github.com/contactless/wb-homa-drivers/blob/master/README.md#%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0-%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%BE%D0%B2-device_type
Если ваше устройство работает по поддерживаемому драйвером протоколу, но в стандартной поставке под него нет шаблона — можете написать шаблон сами: [[Connecting_Third_Party_Devices_to_Wiren_Board | Подключение стороннего Modbus-устройства к контроллеру Wiren Board]].


=== Пример конфигурационного файла для нескольких подключённых устройств ===
Файлы и папки:
<syntaxhighlight lang="javascript">
* <code>/etc/wb-mqtt-serial.conf</code> — файл настроек драйвера, редактировать вручную не рекомендуем;
* <code>/usr/share/wb-mqtt-serial/templates</code> — папка с предустановленными шаблонами;
* <code>/etc/wb-mqtt-serial.conf.d/templates</code> — папка для пользовательских шаблонов, которые имеют приоритет над предустановленными.


// Configuration options
Если вы добавили свой шаблон или изменили существующий, подождите 20 секунд, а потом перезагрузите страницу конфигуратора в веб-интерфейсе клавишами <kbd>Ctrl</kbd>+<kbd>F5</kbd> или перезапустите сервис: <syntaxhighlight lang="bash>systemctl restart wb-mqtt-confed</syntaxhighlight>
{
    "debug": false,
    "ports": [
        {
            "path" : "/dev/ttyNSC1",
            "baud_rate": 9600,
            "parity": "N",
            "data_bits": 8,
            "stop_bits": 2,
            "poll_interval": 0,
            "enabled": true,
            "devices" : [
                {
                    "name": "DRB88",
                    "id": "drb88",
                    "enabled": true,
                    "slave_id": "0x23",
    "device_type" : "DRB88"
                },
                {
                    "slave_id": "0x26",
    "device_type" : "MSU24"
                },
                {
                    "slave_id": "0x31",
    "device_type" : "MSU34"
                },
                {
                    "slave_id": "0x04",
    "device_type" : "LC-103"
                },
{
    "device_type" : "DDL24",
    "slave_id" : "0x20"
},
                {
                  "enabled": true,
                  "slave_id": "0x06",
    "device_type" : "WB-MRM2"
              },
      {
                "slave_id" : 16,
"device_type" : "WB-MRGB"
      }
            ]
        },
{
    "path" : "/dev/ttyNSC0",
    "type": "uniel",
    "poll_interval": 10,
    "enabled": true,
    "devices" : [
{
    "device_type" : "UCH-M141RC",
    "slave_id": 1
}
    ]
}
    ]
}
</syntaxhighlight>


== Детали конфигурирования для разных устройств ==
О том, как получить доступ к файлам и папкам, читайте в статье [[View controller files from your computer|Просмотр файлов контроллера с компьютера]].
В секции приведены подробные описания устройств, а также примеры конфигурационных файлов для разных вариантов использования. По умолчанию можно пользоваться простым описанием устройств с помощью шаблонов device_type, как указано выше.
====MSU34+TLP, MSU24 и MSU21 и подобные устройства====


Сайт производителя - http://www.razumdom.ru/
Полное описание драйвера, список поддерживаемых протоколов и примеры шаблонов, смотрите '''[https://github.com/contactless/wb-mqtt-serial в репозитории на Github]'''.


Документация:
=== Особенности ===
При работе с Modbus-устройствами, драйвер оптимизирует запросы к устройствам: считывает несколько регистров подряд, не выдерживает некоторые задержки, рекомендованные стандартом.


[http://www.razumdom.ru/userfiles/file/Modbus/MSU21.pdf MSU21]
Поэтому при написании шаблона для сторонних Modbus-устройств, нужно указать параметр ''guard_interval_us'', который рассчитывается по формуле:
<syntaxhighlight lang="js">
guard_interval_us = (3.5*11*10^6)/(скорость в бит/с)
</syntaxhighlight>
Так же этот параметр можно установить через веб-интерфейс:
* Guard interval (us) — для порта.
* Additional delay before each writing to port (us) — для устройства.


[http://www.razumdom.ru/userfiles/file/Modbus/MSU24.pdf MSU24]
Если при чтении регистра устройства возникла ошибка, то соответствующий контрол в веб-интерфейсе  будет окрашен в красный цвет. Аналогично с устройством — если оно давно не отвечает, то все его контролы будут окрашены красным.


[http://www.razumdom.ru/userfiles/file/Modbus/MSU34.pdf MSU34]
== Управление драйвером ==


Устройства выдают значения с датчиков через
Обычно драйвер запускается автоматически при загрузке контроллера и перезапускается при сохранении файла конфигурации в веб-интерфейсе.
input-регистры. Для значений температуры используются
8-битные знаковые значения без расширения знака
на старшие 8 бит input-регистра, вследствие
чего для значений температуры в конфигурационном
файле необходимо указывать "format": "s8".


Подключаемые к устройству датчики конфигурируются
Также можно управлять драйвером в ручном режиме — это может быть полезно для поиска ошибок в конфигурационном файле или если вам нужно освободить порт для использования [[modbus-client | modbus_client]].
через holding-регистры (см. описание). Для конфигурации
датчиков можно использовать команду <code>modbus_client</code>,
или сделать setup-секцию в конфигурации драйвера.


Для установки адреса slave можно использовать скрипт
Для выполнения команд подключитесь к контроллеру по [[SSH]]. Доступны команды:
set-rd-address.sh. При этом необходимо убедиться, что к
<syntaxhighlight lang="bash">
порту RS-485 было подлкючено только то устройство,
systemctl stop wb-mqtt-serial # остановить
у которого необходимо сменить адрес, затем выполнить
systemctl start wb-mqtt-serial # запустить
команду:
systemctl restart wb-mqtt-serial # перезапустить
<pre>
wb-mqtt-serial -c /etc/wb-mqtt-serial.conf -d # запустить в отладочном режиме с указанием пути к конфигурационному файлу
set-rd.address.sh /dev/ttyNSC0 0x02
</syntaxhighlight>
</pre>
Вместо 0x02 можно задать любой другой адрес
в диапазоне от 0 до 247 (0xf7).


Пример конфигурации:
== Диагностика неполадок ==
<div class="mw-collapsible mw-collapsed"  style="width:500px; overflow: hidden;" >
Если возникли проблемы с запуском драйвера, например, новое устройство не появилось, то можно узнать причину: выполните команду <code>systemctl status wb-mqtt-serial</code> и в последних двух строчках ответа будет подсказка.


<pre>
В примере файл конфигурации содержит синтаксическую ошибку во второй строке на 14 позиции:
{
<syntaxhighlight lang="console">
    "debug": false,
# systemctl status wb-mqtt-serial
    "ports": [
● wb-mqtt-serial.service - MQTT Driver for serial devices
        {
  Loaded: loaded (/lib/systemd/system/wb-mqtt-serial.service; enabled; vendor preset: enabled)
            "path" : "/dev/ttyNSC0",
  Active: inactive (dead) since Thu 2021-01-28 15:10:51 +04; 4s ago
            "baud_rate": 9600,
  Process: 23682 ExecStart=/usr/bin/wb-mqtt-serial (code=exited, status=0/SUCCESS)
            "parity": "N",
Main PID: 23682 (code=exited, status=0/SUCCESS)
            "data_bits": 8,
            "stop_bits": 2,
            "poll_interval": 10,
            "enabled": true,
            "devices" : [
                {
                    "name": "MSU34+TLP",
                    "id": "msu34tlp",
                    "slave_id": 2,
                    "enabled": false,
                    "channels": [
                        {
                            "name" : "Temp 1",
                            "reg_type" : "input",
                            "address" : 0,
                            "type": "temperature",
                            "format": "s8"
                        },
                        {
                            "name" : "Illuminance",
                            "reg_type" : "input",
                            "address" : 1,
                            "type": "text"
                        },
                        {
                            "name" : "Pressure",
                            "reg_type" : "input",
                            "address" : 2,
                            "type": "text",
                            "scale": 0.075
                        },
                        {
                            "name" : "Temp 2",
                            "reg_type" : "input",
                            "address" : 3,
                            "type": "temperature",
                            "format": "s8"
                        }
                    ]
                }
            ]
        }
    ]
}
</pre>
</div>
Пример конфигурации MSU21 с секцией инициализации ("setup"):


<div class="mw-collapsible mw-collapsed"  style="width:500px; overflow: hidden;" >
Jan 28 15:10:47 wirenboard-A6XXXT2R systemd[1]: Started MQTT Driver for serial devices.
<pre>
Jan 28 15:10:51 wirenboard-A6XXXT2R wb-mqtt-serial[23682]: ERROR: [serial] Failed to parse JSON /etc/wb-mqtt-serial.conf:* Line 2, Column 14
                {
Jan 28 15:10:51 wirenboard-A6XXXT2R wb-mqtt-serial[23682]:   Syntax error: value, object or array expected.
                    "name": "MSU21",
</syntaxhighlight>
                    "id": "msu21",
                    "slave_id": 24,
                    "enabled": true,
                    "setup": [
                        {
                            "title": "Input 0 type",
                            "address": 1,
                            "value": 2
                        },
                        {
                            "title": "Input 0 module",
                            "address": 3,
                            "value": 6
                        }
                    ],
                    "channels": [
                        {
                            "name" : "Temperature",
                            "reg_type" : "input",
                            "address" : 0,
                            "type": "temperature",
                            "format": "s8"
                        }
                    ]
                }
</pre>
</div>


====Четырёхканальный (RGBW) диммер светодиодов DDL24====
Проверить только шаблоны, в том числе и не подключённые в файле конфигурации, можно командой:
<syntaxhighlight lang="console">
# wb-mqtt-serial -g
<3>ERROR: [serial config] Failed to parse /usr/share/wb-mqtt-serial/templates/config-bac-6000-series.json
Failed to parse JSON /usr/share/wb-mqtt-serial/templates/config-bac-6000-series.json:* Line 12, Column 5
  Missing ',' or '}' in object declaration
</syntaxhighlight>


Сайт производителя - [http://www.razumdom.ru/ www.razumdom.ru]
Проверить файл конфигурации и шаблоны на ошибки:
<syntaxhighlight lang="console">
# wb-mqtt-serial -j
<3>ERROR: [serial config] Failed to parse /usr/share/wb-mqtt-serial/templates/config-wb-mdm3.json
Failed to parse JSON /usr/share/wb-mqtt-serial/templates/config-wb-mdm3.json:* Line 8, Column 9
  Missing ',' or '}' in object declaration


Документация:
<3>ERROR: [serial] Can't find template for 'WB-MDM3'
[http://www.razumdom.ru/userfiles/file/Modbus/DDL24.pdf DDL24]
</syntaxhighlight>


Устройство предназначено для управления светодиодными
При необходимости, можно добавить путь к файлу, который нужно проверить:
лентами RGBW сигналами ШИМ или для управления приводами
<syntaxhighlight lang="bash">
сигналами 0-10 В.
wb-mqtt-serial -c /etc/wb-mqtt-serial.conf -j
</syntaxhighlight>


Управление осуществляется записью значений в
== Включение отладки==
holding-регистры.
[[Файл:Serial Web config.png|400px|thumb|right|Веб-интерфейс. Флажок ''Enable debug logging'' установлен, отладка включена]]
Иногда нужно включить отладочный режим драйвера. Это можно сделать из [[#Управление драйвером | командной строки]] или через веб-интерфейс.


Как и в случае с устройствами MSU*, адрес
{{note|info| При включённой отладке размер системного журнала будет быстро расти, поэтому не забудьте отключить отладку, когда необходимость в ней отпадет.}}
modbus slave устанавливается командой
set-rd-address.sh.
<pre>
set-rd-address.sh /dev/ttyNSC0 0x17 0x00
</pre>
Здесь происходит установка slave-адреса
в 0x17. Дополнительное значение
0x00 нужно, т.к. DDL24 использует для
конфигурации адреса holding-регистр 0x00,
а не 0x80, используемый скриптом set-rd-address.sh
по умолчанию.


Пример конфигурации:
Включение отладки через [[Wiren Board Web Interface|веб-интерфейс]]:
# Зайдите в веб-интерфейс контроллера
# Если вы работаете под обычным пользователем, то смените [[RS-485:Configuration via Web Interface#Смена уровня доступа к веб-интерфейсу| уровень доступа]]
# Перейдите '''Settings''' → '''Configs''' → '''Serial Device Driver Configuration'''
# Установите флажок '''Enable debug logging'''
# Нажмите на кнопку '''Save''', чтобы сохранить настройки.


Теперь в системный журнал будут записываться отправленные и принятые драйвером пакеты.


<div class="mw-collapsible mw-collapsed"  style="width:500px; overflow: hidden;" >
Чтобы посмотреть debug-вывод драйвера, выполните в консоли контроллера команду <code>journalctl -e -p 7</code>, где <code>-e</code> — отобразить последние записи, а <code>-p 7</code> задает уровень сообщений, где 7 — это debug. Подробнее о параметрах утилиты, читайте в статье [[journalctl]].
<pre>
                {
                    "name": "DDL24",
                    "id": "ddl24",
                    "enabled": true,
                    "slave_id": 23,
                    "channels": [
                        {
                            "name" : "Red",
                            "reg_type" : "holding",
                            "address" : 4,
                            "type": "range",
                            "max": 255
                        },
                        {
                            "name" : "Green",
                            "reg_type" : "holding",
                            "address" : 5,
                            "type": "range",
                            "max": 255
                        },
                        {
                            "name" : "Blue",
                            "reg_type" : "holding",
                            "address" : 6,
                            "type": "range",
                            "max": 255
                        },
                        {
                            "name" : "White",
                            "reg_type" : "holding",
                            "address" : 7,
                            "type": "range",
                            "max": 255
                        },
                        {
                            "name" : "RGB",
                            "reg_type" : "holding",
                            "address" : 8,
                            "type": "range",
                            "max": 100
                        },
                        {
                            "name" : "White1",
                            "reg_type" : "holding",
                            "address" : 9,
                            "type": "range",
                            "max": 100
                        },
                        {
                            "name" : "Voltage",
                            "reg_type" : "holding",
                            "address" : 18,
                            "type": "text"
                        }
                    ]
                }
</pre>
</div>
 
====Исполнительный модуль релейный восьмиканальный DRB88====
 
Сайт производителя - [http://www.razumdom.ru/ www.razumdom.ru]
 
Документация:
[http://www.razumdom.ru/userfiles/file/Modbus/DRB88S16_v14.pdf DRB88]
 
Исполнительные модули DRB88 предназначены для создания
систем автоматизации зданий. При работе по протоколу Modbus
поддерживается работа с реле через coils и с входами
через input registers.
 
Для установки адреса slave можно использовать скрипт
set-rd-address.sh. При этом необходимо убедиться, что к
порту RS-485 было подлкючено только то устройство,
у которого необходимо сменить адрес, затем выполнить
команду:
<pre>
set-rd.address.sh /dev/ttyNSC0 0x16
</pre>
Вместо 0x16 можно задать любой другой адрес
в диапазоне от 0 до 247 (0xf7).
 
Настройка типов input'ов осуществляется через
holding-регистры (см. описание). Для задания конфигурации
можно использовать команду <code>modbus_client</code>,
или сделать setup-секцию в конфигурации драйвера.
 
Пример конфигурации:
 
 
<div class="mw-collapsible mw-collapsed"  style="width:500px; overflow: hidden;" >
<pre>
                {
                    "name": "DRB88",
                    "id": "drb88",
                    "enabled": true,
                    "slave_id": 22,
                    "setup": [
                        {
                            "title": "Input 0 type",
                            "address": 1,
                            "value": 1
                        },
                        {
                            "title": "Input 0 module",
                            "address": 3,
                            "value": 3
                        }
                    ],
                    "channels": [
                        {
                            "name" : "Relay 1",
                            "reg_type" : "coil",
                            "address" : 0,
                            "type": "switch"
                        },
                        {
                            "name" : "Relay 2",
                            "reg_type" : "coil",
                            "address" : 1,
                            "type": "switch"
                        },
                        {
                            "name" : "Relay 3",
                            "reg_type" : "coil",
                            "address" : 2,
                            "type": "switch"
                        },
                        {
                            "name" : "Relay 4",
                            "reg_type" : "coil",
                            "address" : 3,
                            "type": "switch"
                        },
                        {
                            "name" : "Relay 5",
                            "reg_type" : "coil",
                            "address" : 4,
                            "type": "switch"
                        },
                        {
                            "name" : "Relay 6",
                            "reg_type" : "coil",
                            "address" : 5,
                            "type": "switch"
                        },
                        {
                            "name" : "Relay 7",
                            "reg_type" : "coil",
                            "address" : 6,
                            "type": "switch"
                        },
                        {
                            "name" : "Relay 8",
                            "reg_type" : "coil",
                            "address" : 7,
                            "type": "switch"
                        },
                        {
                            "name" : "Input 1",
                            "reg_type" : "input",
                            "address" : 0,
                            "type": "switch",
                            "on_value": 101
                        },
                        {
                            "name" : "Input 2",
                            "reg_type" : "input",
                            "address" : 1,
                            "type": "switch",
                            "on_value": 101
                        },
                        {
                            "name" : "Input 3",
                            "reg_type" : "input",
                            "address" : 2,
                            "type": "switch",
                            "on_value": 101
                        },
                        {
                            "name" : "Input 4",
                            "reg_type" : "input",
                            "address" : 3,
                            "type": "switch",
                            "on_value": 101
                        },
                        {
                            "name" : "Input 5",
                            "reg_type" : "input",
                            "address" : 4,
                            "type": "switch",
                            "on_value": 101
                        },
                        {
                            "name" : "Input 6",
                            "reg_type" : "input",
                            "address" : 5,
                            "type": "switch",
                            "on_value": 101
                        },
                        {
                            "name" : "Input 7",
                            "reg_type" : "input",
                            "address" : 6,
                            "type": "switch",
                            "on_value": 101
                        },
                        {
                            "name" : "Input 8",
                            "reg_type" : "input",
                            "address" : 7,
                            "type": "switch",
                            "on_value": 101
                        }
                    ]
                }
</pre>
</div>
 
====Модуль ввода-вывода ICP DAS tM-P3R3====
 
Описание:
[http://www.icpdas.com/root/product/solutions/remote_io/rs-485/tm-series/tm-p3r3.html tM-P3R3]
и
[http://www.icpdas.com/root/product/solutions/datasheet/tm-series/tM-Series_DIO_User_Manual.pdf User_Manual]
 
Модуль имеет 3 канала дискретного ввода, доступных через discrete inputs,
и 3 канала релейного вывода, доступного через coils.
 
Пример конфигурации:
 
 
<div class="mw-collapsible mw-collapsed"  style="width:500px; overflow: hidden;" >
<pre>
                {
                    "name": "tM-P3R3",
                    "id": "tmp3r3",
                    "enabled": true,
                    "slave_id": 1,
                    "channels": [
                        {
                            "name" : "Relay 0",
                            "reg_type" : "coil",
                            "address" : 0,
                            "type": "switch"
                        },
                        {
                            "name" : "Relay 1",
                            "reg_type" : "coil",
                            "address" : 1,
                            "type": "switch"
                        },
                        {
                            "name" : "Relay 2",
                            "reg_type" : "coil",
                            "address" : 2,
                            "type": "switch"
                        },
                        {
                            "name" : "Input 0",
                            "reg_type" : "discrete",
                            "address" : 32
                        },
                        {
                            "name" : "Input 1",
                            "reg_type" : "discrete",
                            "address" : 33
                        },
                        {
                            "name" : "Input 2",
                            "reg_type" : "discrete",
                            "address" : 34
                        }
                    ]
                }
</pre>
</div>
 
====Модуль управления освещением ICP DAS LC-103====
 
Описание:
[http://www.icpdas.com/root/product/solutions/remote_io/rs-485/lighting_control/lc-103.html LC-103]
и
[http://www.icpdas-europe.com/uploads/tx_v4icpdascatalog/K128992/web/icpdas/manual-lc-103.pdf  User manual]
 
Модуль имеет 3 релейных вывода и один дискретный вход, допускающий
подключение к сети переменного тока.
 
Адрес Modbus slave задаётся при помощи физического переключателя.
 
Пример конфигурации:


Пример вывода команды:
<syntaxhighlight lang="bash">
~# journalctl -e -p 7
Jan 29 14:27:24 wirenboard-A6ZZXT2R wb-mqtt-serial[1667]: DEBUG: [serial port driver] channel 'Urms L1' of device 'wb-modbus-0-0' <-- 224.647
Jan 29 14:27:24 wirenboard-A6ZZXT2R wb-mqtt-serial[1667]: DEBUG: [modbus] read 2 input(s) @ 5136 of device modbus:142
Jan 29 14:27:24 wirenboard-A6ZZXT2R wb-mqtt-serial[1667]: DEBUG: [port] Sleep 0 us
Jan 29 14:27:24 wirenboard-A6ZZXT2R wb-mqtt-serial[1667]: DEBUG: [port] Write: 8e 04 14 10 00 02 6a c1
Jan 29 14:27:24 wirenboard-A6ZZXT2R wb-mqtt-serial[1667]: DEBUG: [port] Sleep 10000 us
Jan 29 14:27:24 wirenboard-A6ZZXT2R wb-mqtt-serial[1667]: DEBUG: [port] ReadFrame: 16 04 02 0f 3d 09 12
Jan 29 14:27:24 wirenboard-A6ZZXT2R wb-mqtt-serial[1667]: DEBUG: [register handler] new val for input @ 3 of device modbus:22: f3d
Jan 29 14:27:24 wirenboard-A6ZZXT2R wb-mqtt-serial[1667]: DEBUG: [serial port driver] register value change: input @ 3 of device modbus:22 <- 39.01
</syntaxhighlight>


<div class="mw-collapsible mw-collapsed"  style="width:500px; overflow: hidden;" >
== Полезные ссылки ==
<pre>
* [[Connecting_Third_Party_Devices_to_Wiren_Board | Как подключить стороннее Modbus-устройство]]
                {
* [https://github.com/contactless/wb-mqtt-serial Описание wb-mqtt-serial на Github]
                    "name": "LC-103",
* [[Modbus|Описание протокола Modbus]]
                    "id": "lc103",
* [[Fast_Modbus| Описание расширения Быстрый Modbus]]
                    "enabled": true,
* [[RS-485|Описание шины RS-485]]
                    "slave_id": 4,
                    "channels": [
                        {
                            "name" : "Relay 1",
                            "reg_type" : "coil",
                            "address" : 0,
                            "type": "switch"
                        },
                        {
                            "name" : "Relay 2",
                            "reg_type" : "coil",
                            "address" : 1,
                            "type": "switch"
                        },
                        {
                            "name" : "Relay 3",
                            "reg_type" : "coil",
                            "address" : 2,
                            "type": "switch"
                        },
                        {
                            "name" : "Switch AC In",
                            "reg_type" : "discrete",
                            "address" : 0
                        }
                    ]
                }
</pre>
</div>

Текущая версия на 11:49, 5 октября 2023

Описание

Драйвер wb-mqtt-serial может одновременно опрашивать устройства, работающие по разным протоколам:
​1 — виртуальный порт для устройств с протоколом Modbus TCP,
2 — устройство работает по протоколу Modbus RTU,
3 — устройство работает по протоколу DLMS

Общая информация

wb-mqtt-serial — драйвер master-slave протоколов для устройств, подключённых:

  • к шине RS-485 — протокол Modbus RTU и других;
  • через Ethernet — протоколы Modbus TCP, Modbus over TCP и другие;
  • к разъёмам MOD1–MOD3 — при наличии модулей расширения, использующих обмен по UART.

Драйвер опрашивает serial-устройства и публикует данные в топики MQTT-брокера. Устройства и порты настраиваются через веб-интерфейс, подробнее в статье Начальное конфигурирование устройств через веб-интерфейс.

Wb-mqtt-serial использует систему JSON-шаблонов, которые описывают подключённые устройства: тип протокола, номера регистров, название параметров и контролов в веб-интерфейсе контроллера. В стандартной поставке есть шаблоны для всех устройств Wiren Board, а также некоторых сторонних устройств: счётчики электроэнергии, частотные преобразователи, холодильные контроллеры и другие.

Если ваше устройство работает по поддерживаемому драйвером протоколу, но в стандартной поставке под него нет шаблона — можете написать шаблон сами: Подключение стороннего Modbus-устройства к контроллеру Wiren Board.

Файлы и папки:

  • /etc/wb-mqtt-serial.conf — файл настроек драйвера, редактировать вручную не рекомендуем;
  • /usr/share/wb-mqtt-serial/templates — папка с предустановленными шаблонами;
  • /etc/wb-mqtt-serial.conf.d/templates — папка для пользовательских шаблонов, которые имеют приоритет над предустановленными.

Если вы добавили свой шаблон или изменили существующий, подождите 20 секунд, а потом перезагрузите страницу конфигуратора в веб-интерфейсе клавишами Ctrl+F5 или перезапустите сервис:

systemctl restart wb-mqtt-confed

О том, как получить доступ к файлам и папкам, читайте в статье Просмотр файлов контроллера с компьютера.

Полное описание драйвера, список поддерживаемых протоколов и примеры шаблонов, смотрите в репозитории на Github.

Особенности

При работе с Modbus-устройствами, драйвер оптимизирует запросы к устройствам: считывает несколько регистров подряд, не выдерживает некоторые задержки, рекомендованные стандартом.

Поэтому при написании шаблона для сторонних Modbus-устройств, нужно указать параметр guard_interval_us, который рассчитывается по формуле:

guard_interval_us = (3.5*11*10^6)/(скорость в бит/с)

Так же этот параметр можно установить через веб-интерфейс:

  • Guard interval (us) — для порта.
  • Additional delay before each writing to port (us) — для устройства.

Если при чтении регистра устройства возникла ошибка, то соответствующий контрол в веб-интерфейсе будет окрашен в красный цвет. Аналогично с устройством — если оно давно не отвечает, то все его контролы будут окрашены красным.

Управление драйвером

Обычно драйвер запускается автоматически при загрузке контроллера и перезапускается при сохранении файла конфигурации в веб-интерфейсе.

Также можно управлять драйвером в ручном режиме — это может быть полезно для поиска ошибок в конфигурационном файле или если вам нужно освободить порт для использования modbus_client.

Для выполнения команд подключитесь к контроллеру по SSH. Доступны команды:

systemctl stop wb-mqtt-serial # остановить
systemctl start wb-mqtt-serial # запустить
systemctl restart wb-mqtt-serial # перезапустить
wb-mqtt-serial -c /etc/wb-mqtt-serial.conf -d # запустить в отладочном режиме с указанием пути к конфигурационному файлу

Диагностика неполадок

Если возникли проблемы с запуском драйвера, например, новое устройство не появилось, то можно узнать причину: выполните команду systemctl status wb-mqtt-serial и в последних двух строчках ответа будет подсказка.

В примере файл конфигурации содержит синтаксическую ошибку во второй строке на 14 позиции:

# systemctl status wb-mqtt-serial
● wb-mqtt-serial.service - MQTT Driver for serial devices
   Loaded: loaded (/lib/systemd/system/wb-mqtt-serial.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Thu 2021-01-28 15:10:51 +04; 4s ago
  Process: 23682 ExecStart=/usr/bin/wb-mqtt-serial (code=exited, status=0/SUCCESS)
 Main PID: 23682 (code=exited, status=0/SUCCESS)

Jan 28 15:10:47 wirenboard-A6XXXT2R systemd[1]: Started MQTT Driver for serial devices.
Jan 28 15:10:51 wirenboard-A6XXXT2R wb-mqtt-serial[23682]: ERROR: [serial] Failed to parse JSON /etc/wb-mqtt-serial.conf:* Line 2, Column 14
Jan 28 15:10:51 wirenboard-A6XXXT2R wb-mqtt-serial[23682]:   Syntax error: value, object or array expected.

Проверить только шаблоны, в том числе и не подключённые в файле конфигурации, можно командой:

# wb-mqtt-serial -g
<3>ERROR: [serial config] Failed to parse /usr/share/wb-mqtt-serial/templates/config-bac-6000-series.json
Failed to parse JSON /usr/share/wb-mqtt-serial/templates/config-bac-6000-series.json:* Line 12, Column 5
  Missing ',' or '}' in object declaration

Проверить файл конфигурации и шаблоны на ошибки:

# wb-mqtt-serial -j
<3>ERROR: [serial config] Failed to parse /usr/share/wb-mqtt-serial/templates/config-wb-mdm3.json
Failed to parse JSON /usr/share/wb-mqtt-serial/templates/config-wb-mdm3.json:* Line 8, Column 9
  Missing ',' or '}' in object declaration

<3>ERROR: [serial] Can't find template for 'WB-MDM3'

При необходимости, можно добавить путь к файлу, который нужно проверить:

wb-mqtt-serial -c /etc/wb-mqtt-serial.conf -j

Включение отладки

Веб-интерфейс. Флажок Enable debug logging установлен, отладка включена

Иногда нужно включить отладочный режим драйвера. Это можно сделать из командной строки или через веб-интерфейс.

При включённой отладке размер системного журнала будет быстро расти, поэтому не забудьте отключить отладку, когда необходимость в ней отпадет.

Включение отладки через веб-интерфейс:

  1. Зайдите в веб-интерфейс контроллера
  2. Если вы работаете под обычным пользователем, то смените уровень доступа
  3. Перейдите SettingsConfigsSerial Device Driver Configuration
  4. Установите флажок Enable debug logging
  5. Нажмите на кнопку Save, чтобы сохранить настройки.

Теперь в системный журнал будут записываться отправленные и принятые драйвером пакеты.

Чтобы посмотреть debug-вывод драйвера, выполните в консоли контроллера команду journalctl -e -p 7, где -e — отобразить последние записи, а -p 7 задает уровень сообщений, где 7 — это debug. Подробнее о параметрах утилиты, читайте в статье journalctl.

Пример вывода команды:

~# journalctl -e -p 7
Jan 29 14:27:24 wirenboard-A6ZZXT2R wb-mqtt-serial[1667]: DEBUG: [serial port driver] channel 'Urms L1' of device 'wb-modbus-0-0' <-- 224.647
Jan 29 14:27:24 wirenboard-A6ZZXT2R wb-mqtt-serial[1667]: DEBUG: [modbus] read 2 input(s) @ 5136 of device modbus:142
Jan 29 14:27:24 wirenboard-A6ZZXT2R wb-mqtt-serial[1667]: DEBUG: [port] Sleep 0 us
Jan 29 14:27:24 wirenboard-A6ZZXT2R wb-mqtt-serial[1667]: DEBUG: [port] Write: 8e 04 14 10 00 02 6a c1
Jan 29 14:27:24 wirenboard-A6ZZXT2R wb-mqtt-serial[1667]: DEBUG: [port] Sleep 10000 us
Jan 29 14:27:24 wirenboard-A6ZZXT2R wb-mqtt-serial[1667]: DEBUG: [port] ReadFrame: 16 04 02 0f 3d 09 12
Jan 29 14:27:24 wirenboard-A6ZZXT2R wb-mqtt-serial[1667]: DEBUG: [register handler] new val for input @ 3 of device modbus:22: f3d
Jan 29 14:27:24 wirenboard-A6ZZXT2R wb-mqtt-serial[1667]: DEBUG: [serial port driver] register value change: input @ 3 of device modbus:22 <- 39.01

Полезные ссылки