Перейти к содержанию

Навигация

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

 
(не показано 145 промежуточных версий 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.


Конфигурация драйвера задаётся в файле <code>/etc/wb-homa-modbus.conf</code>. Если такой файл создан, драйвер запускается при загрузке контроллера автоматически. Также драйвером можно управлять в ручном режиме из консоли:
Wb-mqtt-serial использует систему JSON-шаблонов, которые описывают подключённые устройства: тип протокола, номера регистров, название параметров и контролов в веб-интерфейсе контроллера. В стандартной поставке есть шаблоны для всех устройств Wiren Board, а также некоторых сторонних устройств: счётчики электроэнергии, частотные преобразователи, холодильные контроллеры и другие.
 
Если ваше устройство работает по поддерживаемому драйвером протоколу, но в стандартной поставке под него нет шаблона — можете написать шаблон сами: [[Connecting_Third_Party_Devices_to_Wiren_Board | Подключение стороннего Modbus-устройства к контроллеру Wiren Board]].
 
Файлы и папки:
* <code>/etc/wb-mqtt-serial.conf</code> — файл настроек драйвера, редактировать вручную не рекомендуем;
* <code>/usr/share/wb-mqtt-serial/templates</code> — папка с предустановленными шаблонами;
* <code>/etc/wb-mqtt-serial.conf.d/templates</code> — папка для пользовательских шаблонов, которые имеют приоритет над предустановленными.
 
Если вы добавили свой шаблон или изменили существующий, подождите 20 секунд, а потом перезагрузите страницу конфигуратора в веб-интерфейсе клавишами <kbd>Ctrl</kbd>+<kbd>F5</kbd> или перезапустите сервис: <syntaxhighlight lang="bash>systemctl restart wb-mqtt-confed</syntaxhighlight>
 
О том, как получить доступ к файлам и папкам, читайте в статье [[View controller files from your computer|Просмотр файлов контроллера с компьютера]].
 
Полное описание драйвера, список поддерживаемых протоколов и примеры шаблонов, смотрите '''[https://github.com/contactless/wb-mqtt-serial в репозитории на Github]'''.
 
=== Особенности ===
При работе с Modbus-устройствами, драйвер оптимизирует запросы к устройствам: считывает несколько регистров подряд, не выдерживает некоторые задержки, рекомендованные стандартом.
 
Поэтому при написании шаблона для сторонних 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) — для устройства.
 
Если при чтении регистра устройства возникла ошибка, то соответствующий контрол в веб-интерфейсе  будет окрашен в красный цвет. Аналогично с устройством — если оно давно не отвечает, то все его контролы будут окрашены красным.
 
== Управление драйвером ==
 
Обычно драйвер запускается автоматически при загрузке контроллера и перезапускается при сохранении файла конфигурации в веб-интерфейсе.
 
Также можно управлять драйвером в ручном режиме — это может быть полезно для поиска ошибок в конфигурационном файле или если вам нужно освободить порт для использования [[modbus-client | modbus_client]].
 
Для выполнения команд подключитесь к контроллеру по [[SSH]]. Доступны команды:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
service wb-homa-modbus stop #остановить драйвер
systemctl stop wb-mqtt-serial # остановить
service wb-homa-modbus start #запустить драйвер
systemctl start wb-mqtt-serial # запустить
service wb-homa-modbus restart #перезапустить драйвер
systemctl restart wb-mqtt-serial # перезапустить
wb-homa-modbus -c /etc/wb-homa-modbus.conf -d #запустить драйвер в принудительном отладочном режиме
wb-mqtt-serial -c /etc/wb-mqtt-serial.conf -d # запустить в отладочном режиме с указанием пути к конфигурационному файлу
</syntaxhighlight>
</syntaxhighlight>


== Конфигурационный файл ==
== Диагностика неполадок ==
Для работы драйвера нужно создать файл <code>/etc/wb-homa-modbus.conf</code>. Для этого:
Если возникли проблемы с запуском драйвера, например, новое устройство не появилось, то можно узнать причину: выполните команду <code>systemctl status wb-mqtt-serial</code> и в последних двух строчках ответа будет подсказка.  
#Зайдите в консоль устройства через [[Debug UART]] или по [[SSH]].
 
#Создайте файл и откройте его для редактирования:
В примере файл конфигурации содержит синтаксическую ошибку во второй строке на 14 позиции:
#: <syntaxhighlight lang="bash">
<syntaxhighlight lang="console">
mcedit /etc/wb-homa-modbus.conf #открыть файл в псевдографическом редакторе
# 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.
</syntaxhighlight>
</syntaxhighlight>
#:Если файл уже был создан, эта же команда просто откроет его для редактирования.
 
#Файл имеет структуру ''порты (ports) -> устройства (devices)'': в файле есть описания физических портов контроллера, а внутри них - список устройств, которые подключены к этому порту.
Проверить только шаблоны, в том числе и не подключённые в файле конфигурации, можно командой:
#:Для каждого порта указываются настройки (скорость, чётность и т.п.), а также протокол (Modbus, RTU, etc.)
<syntaxhighlight lang="console">
#:Для каждого устройства обязательно указывается его уникальный адрес на шине - ''slave_id'' (подробнее про это можно прочитать в статье [[RS-485]]). Также можно указать другие необязательные параметры - смотрите полное описание формата в [https://github.com/contactless/wb-homa-drivers/#wb-homa-modbus подробной документации].
# wb-mqtt-serial -g
#Впишите конфигурацию для портов и подключённых устройств в файл, используя примеры ниже. Затем нажмите ''F2'', чтобы сохранить изменения, и ''F10'', чтобы выйти из редактора.
<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
#: <syntaxhighlight lang="bash">
  Missing ',' or '}' in object declaration
service wb-homa-modbus restart
</syntaxhighlight>
</syntaxhighlight>
#:Она перезапустит драйвер, и подключённое устройство появится в веб-интерфейсе. Если устройство не появилось, выполните команду <syntaxhighlight lang="bash">tail /var/log/messages</syntaxhighlight>Если там будет строчка такого типа:
#:<code>May  6 17:50:58 wirenboard user.notice modbus: FATAL: Error parsing config file: Failed to parse JSON: * Line <b>15</b>, Column 17</code>
#:- ищите ошибку в 15-й строке конфигурационного файла.


Проверить файл конфигурации и шаблоны на ошибки:
<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'
</syntaxhighlight>


===Пример конфигурации для [[WB-MRM2 Реле 2х канальное | модуля реле WB-MRM2]], подключённого к изолированному порту (RS-485-ISO) Wiren Board 4===
При необходимости, можно добавить путь к файлу, который нужно проверить:
<syntaxhighlight lang="javascript">{
<syntaxhighlight lang="bash">
    "ports": [
wb-mqtt-serial -c /etc/wb-mqtt-serial.conf -j
        {
</syntaxhighlight>
            "path" : "/dev/ttyNSC0",  //псевдофайл, соответствующий порту
            "baud_rate": 9600, //скорость порта, 9600 почти для всех устройств, но проверьте документацию к ним
            "parity": "N", //четность
            "data_bits": 8, //битов данных в посылке
            "stop_bits": 2, //количество стоп-битов. Чётность, количество битов и стоп-битов тоже редко меняются
            "poll_interval": 10, //интервал опроса устройств на порту в миллисекундах
            "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
== Включение отладки==
[[Файл:Serial Web config.png|400px|thumb|right|Веб-интерфейс. Флажок ''Enable debug logging'' установлен, отладка включена]]
Иногда нужно включить отладочный режим драйвера. Это можно сделать из [[#Управление драйвером | командной строки]] или через веб-интерфейс.


=== Пример конфигурационного файла для нескольких подключённых устройств ===
{{note|info| При включённой отладке размер системного журнала будет быстро расти, поэтому не забудьте отключить отладку, когда необходимость в ней отпадет.}}
<syntaxhighlight lang="javascript">


// Configuration options
Включение отладки через [[Wiren Board Web Interface|веб-интерфейс]]:
{
# Зайдите в веб-интерфейс контроллера
    "debug": false,
# Если вы работаете под обычным пользователем, то смените [[RS-485:Configuration via Web Interface#Смена уровня доступа к веб-интерфейсу| уровень доступа]]
    "ports": [
# Перейдите '''Settings''' → '''Configs''' → '''Serial Device Driver Configuration'''
        {
# Установите флажок '''Enable debug logging'''
            "path" : "/dev/ttyNSC1",
# Нажмите на кнопку '''Save''', чтобы сохранить настройки.
            "baud_rate": 9600,
 
            "parity": "N",
Теперь в системный журнал будут записываться отправленные и принятые драйвером пакеты.
            "data_bits": 8,
 
            "stop_bits": 2,
Чтобы посмотреть debug-вывод драйвера, выполните в консоли контроллера команду <code>journalctl -e -p 7</code>, где <code>-e</code> — отобразить последние записи, а <code>-p 7</code> задает уровень сообщений, где 7 — это debug. Подробнее о параметрах утилиты, читайте в статье [[journalctl]].
            "poll_interval": 0,
 
            "enabled": true,
Пример вывода команды:
            "devices" : [
<syntaxhighlight lang="bash">
                {
~# journalctl -e -p 7
                    "name": "DRB88",
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
                    "id": "drb88",
Jan 29 14:27:24 wirenboard-A6ZZXT2R wb-mqtt-serial[1667]: DEBUG: [modbus] read 2 input(s) @ 5136 of device modbus:142
                    "enabled": true,
Jan 29 14:27:24 wirenboard-A6ZZXT2R wb-mqtt-serial[1667]: DEBUG: [port] Sleep 0 us
                    "slave_id": "0x23",
Jan 29 14:27:24 wirenboard-A6ZZXT2R wb-mqtt-serial[1667]: DEBUG: [port] Write: 8e 04 14 10 00 02 6a c1
    "device_type" : "DRB88"
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
                    "slave_id": "0x26",
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
    "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>
</syntaxhighlight>


== Доработка драйвера для поддержки новых устройств ==
== Полезные ссылки ==
В качестве отправной точки смотрите статью [[Драйвер wb-homa-modbus:Примеры написания шаблонов]], для дальнейшей поддержки свяжитесь с нами.
* [[Connecting_Third_Party_Devices_to_Wiren_Board | Как подключить стороннее Modbus-устройство]]
* [https://github.com/contactless/wb-mqtt-serial Описание wb-mqtt-serial на Github]
* [[Modbus|Описание протокола Modbus]]
* [[Fast_Modbus| Описание расширения Быстрый Modbus]]
* [[RS-485|Описание шины RS-485]]
translator, wb_editors
4218

правок