Управление модулями реле Wirenboard по протоколу Modbus

Материал из Wiren Board


Параметры Modbus

Modbus-адрес

Modbus-адрес, установленный на производстве

Modbus-адрес устройств Wiren Board легко определить — он нанесен на наклейке (адрес указан в десятичном формате). Новый адрес устройства записывается командой WRITE_SINGLE_REGISTER в регистр хранения (holding register) с адресом 128 (0x80). Подробно о том, как определить или изменить Modbus-адрес модуля, написано на странице Определение и изменение Modbus-адреса устройств Wirenboard.

Команды Modbus, поддерживаемые устройством

Релейные модули Wirenboard поддерживают все основные команды Modbus. Подробнее смотрите здесь: Коды функций чтения и записи регистров.

Безопасный режим

В этом режиме при прекращении обмена данными по Modbus устройство отключает реле по прошествии заданного времени.

Для включения безопасного режима (Safety timer) нужно записать значение, отличное от 0, в регистр хранения командой WRITE_SINGLE_REGISTER по адресу 2. Это значение — таймаут в секундах. Значение "0" отключает безопасный режим.

Режим работы реле в случае отключении питания

В последних версиях прошивки (начина с 1.5.3) для устройств WB-MR появилась возможность запоминать состояние выхода при отключении питания. Режим контролируется Modbus-регистром 6. Если в регистре записано значение '0', то состояние выходов не сохраниться и при подаче питания все реле буду выключены. Если в регистре записана единица, то после возобновления питания все включенные до аварии реле включатся снова.

Цифровые входы

Состояние входа можно получить чтением регистров Discrete Inputs 0—x (где x = (количество управляемых каналов - 1)). Если вход соединён с GND, значение регистра равно 1, если не соединён - 0.

Режимы взаимодействия цифровых входов с релейными выходами

В релейном модуле можно включить прямое управление релейными выходами с цифровых входов. Есть три варианта такого управления:

  • Режим 0: управление выключателем без фиксации (кнопкой "с самостоятельным отжатием обратно"). Вы нажимаете на кнопку (замыкаете цифровой вход с GND), она сама "отжимается обратно", состояние реле переключается на противоположное.
  • Режим 1: управление выключателем с фиксацией. Реле всегда устанавливается в соответствии с положением выключателя. Если выключатель "включён" (замыкает цифровой вход с GND), реле тоже замкнуто. Если выключатель "выключен", реле разомкнуто.
  • Режим 3: управление релейным выходом в цифрового входа отключено.

По умолчанию на устройствах установлен режим 0. Установить режим для всех каналов одновременно можно, записав соответствующее число в регистр хранения с адресом 5.

Режим также можно установить отдельно для каждого канала. Для этого в регистре 5 должно находиться значение "0", а режим для каждого канала записывается в регистры хранения, начиная с адреса 9 для первого канала и т.д.

Карта регистров модулей реле

В таблице:

  • x — количество релейных выходов;
  • y — количество цифровых входов.

(для модулей WB-MRM2 карту регистров смотрите на странице описания этого модуля)

Регистр / адрес Тип Чтение/запись Значение по умолчанию Формат Назначение
0 .. (x-1) coil RW - 1 или 0 состояние реле с номером 1 .. x
0 .. (y-1) discrete R - 1 или 0 состояние входа с номером 1 .. y
5 holding RW 0
  • 0: кнопки без фиксации
  • 1: выключатель с фиксацией
  • 3: отключить взаимодействие
режим взаимодействия цифровых входов с релейными выходами
6

(только в прошивках 1.5.3 и позднее)

holding RW
  • 0: не сохранять состояние реле при отключении питания
  • 1: сохранять состояние реле при отключении питания
режим работы реле в случае отключении питания
8 holding RW 0 секунды таймаут для безопасного режима
9 .. (9+x-1) holding RW
  • 0: кнопки без фиксации
  • 1: выключатель с фиксацией
  • 3: отключить взаимодействие
режим взаимодействия отдельного цифрового входа с соответствующим релейным выходом;

в регистре 5 должен быть записан "0"

32 .. (32+y-1) input R 0 16-bit unsigned int счетчик срабатываний входа 1 .. y
120 (0x78) holding RW 0 отличное от 0 запись в регистр вызывает перезагрузку модуля без сохранения состояния
121 (0x79) holding R - мВ текущее напряжение питания модуля
128 (0x80) holding RW 1 1 — 247 Modbus-адрес устройства
200-206 holding R {'X','X','X','X','X','X'} сигнатура устройства (см. таблицу ниже)
220-241 holding R __date__ __time__ дата сборки прошивки

В новых моделях реле поддерживаются дополнительные регистры настройки параметров обмена данными по RS-485:

Регистр / адрес Тип Чтение/запись Значение по умолчанию Формат Назначение
110 holding RW 96 baud rate / 100 скорость порта RS-485, делённая на 100. Допустимые скорости: 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200
111 holding RW 0 настройка бита чётности порта RS-485. Допустимые значения: 0 - нет бита чётности (none), 1 - нечётный (odd), 2 - чётный (even)
112 holding RW 2 количество стоп-битов порта RS-485. Допустимые значения: 1, 2


По адресу 200 лежит сигнатура релейного модуля длиной 6 байт. Сигнатура уникальна для каждой модели устройств Wiren Board и позволяет идентифицировать модель по Modbus:

Модуль Сигнатура
WB-MR6C WBMR6
WB-MR3xV WBMR3
WB-MR6xV WBMR6
WB-MR14 WBMR14
WB-MR11 WBMR11
WB-MRM2 WBMR2

WBMR2m

Для получения сигнатуры нужно выполнить команду READ_HOLDING_REGISTERS по адресу 200 (длина 6 регистров). Запись в эту область памяти не поддерживается, при попытке записи в недопустимое место возвращается ошибка 3. Пустые места в тексте сигнатуры забиваются значением 0x00. Начиная с регистра 220 записана дата сборки прошивки, в формате "числоx00времяx00" в виде строки (пример: 'Jan 27 2017 17:01:13'). Длина записи — 21 регистр.

Значение состояния каждого реле хранится в регистрах флагов (coil). У 1-го реле адрес регистра 0, у 2-го — 1 и т.д.

Управление модулем из командной строки

Программное обеспечение контроллера Wiren Board включает в себя утилиту modbus_client для работы с устройствами, подключенными к выходам RS-485, по протоколу Modbus, подробное описание команды находится на странице Modbus-client. Доступ к командной строке описан в статье SSH.

Пример чтения регистров

Проверим, верно ли, что мы подключились именно к модулю нужного типа. (Модуль wb-mqtt-serial должен быть предварительно остановлен). По адресу 200 хранится уникальная сигнатура длиной в 6 регистров. Прочтем 6 регистров, начиная с адреса 200, и преобразуем полученный шестнадцатеричный ответ в символьную строку:

echo  -e `modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 \
-a1 -t0x03 -r200 -c 6 | \
grep Data | sed -e 's/0x00/\\\x/g' -e 's/Data://' -e 's/\s//g'`

В результате выполнения команды получаем строку, например WBMR6. Релейный модуль WB-MR6 имеет Modbus-адрес 1.

Перезагрузка

В ряде случаев может потребоваться перезагрузка модуля. Для этого в регистр 120 (0x78) необходимо записать любое значение, отличное от нуля:

modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a1 -t0x06 -r0x78 100

Такая перезагрузка равносильна сбросу по питанию и изменению адреса устройства на 0x01. Все реле при этом выключаются. Предварительно, конечно, необходимо остановить сервис wb-mqtt-serial и убедиться, что к контроллеру не подключены другие Modbus-устройства.

Выбор типа управления внешними входами

В релейных модулях предусмотрено два режима управления каналами реле: с помощью внешних входов и по протоколу RS-485. В релейных модулях можно выбрать режим 0, когда ко внешнему входу подключена кнопка (без фиксации), или режим 1, когда для управления используется обычный выключатель (с фиксацией). Режим 3 отключает внешнее управление, но при этом все равно сохраняется возможность управления по RS-485 и чтение состояния внешних входов. По умолчанию включен режим 0.

В режиме внешнего управления реле срабатывает по падению логического уровня: к внешним входам подключены резисторы подтяжки к линии +5V и реле соответствующего канала срабатывает при соединении входа с GND. Состояние реле каждого канала хранится в памяти контроллера до перезагрузки, по умолчанию при включении питания все реле выключены. После инициализации модуля опрашиваются внешние входы и реле всех каналов переводятся в соответствующее состояние.

Тип внешнего управления можно выбрать для каждого канала отдельно через регистры 9 — (9+x). Для этого в holding-регистре 5 должно быть записано значение 0:

modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a1 -t0x06 -r5 0

Инициализировать регистр при старте можно и через настройки web-интерфейса, смотрите страницу RS-485:Настройка_через_веб-интерфейс.