Подключение устройств по протоколу Modbus
August 30, 2021Описанное ниже ориентировано, как и для рядовых пользователей, так и для IT-инженеров. Обычно, если устройство уже поддерживается в BARY, то раздела с подключением и настройкой уже достаточно для начала работы.
Краткое описание протокола Modbus
Протокол Modbus используется для обмена данными между хабом и устройствами автоматизации, чаще всего в последовательных линиях связи RS-485. Каждое устройство в сети (кроме хаба) имеет адрес от 1 до 247. Адрес 0 используется для широковещательной передачи данных, а адреса 248-255 зарезервированы самим протоколом. Обмен данными происходит через регистры 4-х типов:
- coil (чтение и запись);
- discrete (только для чтения);
- holding (чтение и запись);
- input (только для чтения);
У каждого типа регистра также есть свои адреса от 0 до 65535 и у каждого типа свое адресное пространство (могут быть регистры с одинаковым адресом но разным типом).
Сам протокол работает на заданной скорости, которая должна совпадать со скоростью самих устройств.
Подключение
Тут описание физического подключения
Настройка
Для начала нужно добавить сам порт RS-485 в BARY. Для этого перейдите в Настройки, выберите пункт Устройства и нажмите кнопку добавить:
Рис. Добавление устройства
Выберите в списке Шлюзы - MODBUS-RTU:
Рис. Выбор типа устройства
В следующем окне укажите название порта и его скорость:
Рис. Указание настроек устройства
Поле Response timeout отвечает за таймаут при операциях чтения-записи и задается в миллисекундах. Не нужно ставить слишком большое значение, т.к. сама шина последовательная (нельзя опрашивать более одного устройства одновременно) и слишком большая задержка может повлиять на работу остальных устройств.
Поле Desired poll interval задает задержку при переключении на устройство и последующим его опросом.
Галочка Disable auto scan on startup запрещает автоматическое сканирование устройств. Рекомендуется устанавливать ее, если все устройства подключены.
Галочка External driver указывает, что сам порт физически находится на другом устройстве и более подробно про данный механизм работы будет написано отдельно.
Нажимаем продолжить, в следующем окне можно задать имя, комнату и поменять иконку, после чего сохраняем.
Если все параметры указаны верно, то BARY установит все необходимые зависимости и начнет сканировать порт на наличие поддерживаемых устройств. Обо всех найденных устройствах будет всплывающее уведомление. Сами устройства при этом добавлять не нужно (кроме WBIO устройств). Не нужно добавлять все необходимые порты одновременно.
Добавление устройств вручную
Поскольку WBIO устройства работают через переходник WB-MIO, то они не могут быть обнаружены при автоматическом сканировании (а также устройства, у которых нет сигнатур). Для добавления таких устройств адрес устройства нужно указывать так:
адрес устройства WB-MIO:порядковый номер устройства
Например 30:1, где 30 - адрес устройства WB-MIO, а 1 - порядковый номер подключенного к нему устройства.
А теперь переходим в окно добавления устройств и выбираем Система - MODBUS-RTU SubDevice:
Рис. Выбор типа устройства
В следующем окне выбираем Parent Device - это порт RS-485, к которому подключен WB-MIO. Еси в списке ничего не отображается, значит порт RS-485 по предыдущему описанию добавлен не был, либо он не работает.
В поле Slave id of the device указываем адрес в формате описанном выше.
В поле Template указываем шаблон самого устройства.
Рис. Указание настроек устройства
Нажимаем продолжить, в следующем окне можно задать имя, комнату и поменять иконку, после чего сохраняем.
Изменение скорости работы устройства
Рекомендуемая скорость работы с портом RS-485 - 115200, но устройства по умолчанию работают со скоростью 9600. Это очень медленно, поэтому скорость всех устройств лучше изменить на 115200.
Для сканирования шины можно использовать утилиту scan.js (должна находиться в директории BARY). Утилита подходит исключительно для устройств WirenBoard. Никакие сервисы при сканировании не должны занимать порт RS-485, перед запуском сканера сервисы нужно остановить.
Для сервиса BARY:
sudo service bary stop
Для сервиса WirenBoard:
service wb-mqtt-serial stop
Утилита запускается из командной строки и принимает следующие опции:
- port - порт для сканирования;
- timeout - таймаут при опросе устройств (100 мс по умолчанию);
- baudRates - скорость порта для опроса через запятую (по умолчанию сканируются устройства на всех скоростях);
- address - адреса устройства через запятую или диапозон (по умочанию сканируются все адреса);
- setSpeed - задать скорость устройства. Задается в формате скорость деленная на 100.
Пример:
node scan.js --port=/dev/ttyRS485-1 --baudRates=9600,115200 --address=1-10,12-240 --setSpeed=1152
Данный пример запустит сканирование на порту /dev/ttyRS485-1
со скоростью 9600 и 115200, адреса для сканирования все кроме 11.
Всем найденным устройствам будет выставлена скорость 115200.
Изменение адреса устройства
Описание способа изменения адреса устройства
Создание шаблонов
Все шаблоны устройств Modbus лежат в директории в формате json:
/bary_dir/templates/modbus
Шаблон устройства выглядит так (это не пример реального шаблона):
{
"device_type": "WB-MWAC",
"device": {
"name": "WB-MWAC",
"signature": "WBMWAC",
"icon": "leak",
"channels": [
{
"name": "K1",
"display_name": "${main.power}",
"reg_type": "coil",
"type": "switch",
"address": 0,
"icon": "faucet",
"readonly": true,
"subdevice": "1",
"homekit": true,
"yandex": true
},
{
"name": "RGB",
"type": "rgb",
"consists_of": [
{
"reg_type": "holding",
"address": 1,
"ident": "red"
},
{
"reg_type": "holding",
"address": 0,
"ident": "green"
},
{
"reg_type": "holding",
"address": 2,
"ident": "blue"
}
]
},
{
"name": "Input 0 Mode",
"reg_type": "holding",
"address": 5,
"type": "settings",
"settings_type": "select",
"settings_items": [
{
"id": 0,
"title": "Кнопки без фиксации"
},
{
"id": 1,
"title": "Выключатель с фиксацией"
},
{
"id": 2,
"title": "Отключить взаимодействие"
}
]
}
]
}
}
- device_type (строка) - идентификатор шаблона (не устройства), можно сделать несколько шаблонов для одного устройства с разными идентификаторами (например WB-MRGBW-D - для цветной ленты или для 4-х отдельных каналов);
- device (объект) - главная секция описания всех параметров устройства;
- name (строка) - название устройства, которое подставится автоматически при добавлении устройства;
- signature (строка) - сигнатура устройства, по которой, при сканировании устройств, будет подставлен этот шаблон;
- icon (строка) - иконка устройства, которая подставится автоматически при добавлении устройства;
- channels (массив) - описание всех характеристик устройства;
- name (строка) - название характеристики (отображается по умолчанию);
- display_name (строка) - отображаемое название характеристики (отображается вместо name и имеет приоритет);
- reg_type (строка) - тип регистра, может принимать значения описанные выше;
- type (строка) - тип характеристики, может принимать следующие значения:
- switch - переключатель, имеет состояние включено/выключено;
- temperature - температура;
- rel_humidity - влажность;
- co2 - уровень содержания СО2;
- voc - уровень содержания летучих органических веществ (ЛОВ);
- lux - уровень освещенности;
- sound_level - уровень звука;
- rgb - управление RGB подсветкой;
- power - текущее энергопотребление;
- power_consumption - суммарное энергопотребление;
- voltage - напряжение;
- amperage - сила тока;
- range - диапазон;
- value - значение (текст);
- settings - особый тип, служащий для задания настроек устройства и отображается только в настройках устройства и должен содержать как минимум тип настроек:
- settings_type - типа настроек (text, password, checkbox, select), в примере выше указан select, а значит для него нужно указать сам список:
- settings_items - выпадающий список для типа настроек select;
- address (число) - адрес характеристики;
- icon (строка) - иконка (задается если данная характеристика создает дочернее устройство);
- readonly (булево) - характеристика только для чтения. Если тип характеристики указан switch, то вместо кнопки будет отображаться текст (при условии, что характеристика в активном состоянии);
- subdevice (строка) - идентификатор дочернего устройства (например модуль реле на 6 каналов удобнее разделить на дочерние устройства и каждое привязать к нужной зоне);
- homekit (булево) - нужно ли пробрасывать данную характеристику в Apple Homekit (не все типы характеристик можно пробросить);
- yandex (булево) - нужно ли пробрасывать данную характеристику в Яндекс Умный Дом (не все типы характеристик можно пробросить);
- consists_of (массив) - содержит массив значений для характеристик содержащихся в нескольких адресах, например RGB;