WB-MR14 Modbus 14 Channel Relay Module: различия между версиями

Материал из Wiren Board
Строка 2: Строка 2:


'''Магазин: [http://contactless.ru/modbus-actuators-and-sensors/ Исполнительные устройства и датчики для шины RS-485 Modbus RTU]'''
'''Магазин: [http://contactless.ru/modbus-actuators-and-sensors/ Исполнительные устройства и датчики для шины RS-485 Modbus RTU]'''
==Общая информация==


==== Назначение ====
=== Назначение ===
14-ти канальный модуль реле предназначен для систем промышленной и домашней автоматизации.
14-канальный модуль реле предназначен для систем промышленной и домашней автоматизации.
Использование групп реле позволяет упростить проводку при использовании модуля для автоматизации освещения и при управлении внешними контакторами.
Реле объединены в группы, что упрощает проводку при использовании модуля для автоматизации освещения или управления внешними контакторами.


Исполнение: корпус на DIN-рейку (ширина 6 юнита). Напряжение питания 9 – 24В
=== Выходы ===
В модуле установлены 14 реле HF32F-G ([http://www.hongfa.com/pro/pdf/HF32F-G_en.pdf Datasheet]), коммутирующие соответствующие 14 выходов, выведенных на винтовые зажимы, рассчитанные на максимальный ток 20 А.
Контакты реле объединены в две группы, каждая со своим общим проводом, COM1 и COM2. На общий провод отводится две винтовых клеммы, соединенных на плате. Для двойных винтовых зажимов COM-контактов общий максимально допустимый ток — 40 А.  


Управление модулем производится с контроллера или ПК по шине RS-485 командами по протоколу MODBUS, а также с помощью внешних кнопок.
В случае активной (резистивной) нагрузки реле могут коммутировать до 10 А/230 В переменного тока и до 10 А/30 В постоянного. В случае реактивной (ёмкостной или индуктивной) нагрузки (двигатели, импульсные блоки питания и т.д.) не следует коммутировать ток больше 400 мА. Используйте внешние контакторы, рассчитанные на соответствующую нагрузку.  


==== Технические характеристики ====
Каждый контакт реле защищен от образования дуги при замыкании/размыкании симметричным TVS-диодом.
Основное:
* 14 каналов реле на 10А (230V AC)


* Напряжение питания: от 9 до 24 В.
[[Файл:Relay_switches_mr14.png|450px|thumb|center|Контакты реле]]
* Интерфейс: RS485, ModBus RTU.
 
* Светодиодная индикация состояния каждого канала.
В модуле может быть включен таймер безопасного режима, который при прекращении обмена данными по Modbus с модулем отключает все реле по прошествии заданного времени.
* 14 входов типа "сухой контакт" общего назначения с функцией прямого управления каналами
 
=== Входы ===
На безвинтовые зажимы модуля выведены 14 входов типа "сухой контакт", не изолированные от источника питания. Для устранения дребезга контактов на каждой входной линии применяются RC-цепочки. Входы подтянуты резисторами к линии питания +5V. Кнопки или выключатели с фиксацией подключаются между выводами GND и соответствующим входом Inputs. Входы могут использоваться как входы общего назначения, для счета сигналов и для прямого управления каналами реле. Программно можно выбрать три режима работы входов: управление кнопкой без фиксации или по Modbus; управление выключателем (с фиксацией) или по Modbus; управление только по Modbus. По умолчанию включен режим управления кнопкой без фиксации.
 
=== Технические характеристики ===


* Установка в электрощит на DIN рейку, корпус шириной 6 DIN.
{| class="wikitable"
{| class="wikitable"
!Параметр
!Параметр
!Значение
!Значение
|-
! colspan="2" |Питание
|-
|Напряжение питания
|9 — 24 В постоянного тока
|-
Потребляемая мощность
|
*В режиме холостого хода (со всеми выключенными реле) — 0,5 Вт
*Пиковое значение — до 12 Вт
|-
|-
! colspan="2" |'''Выходы'''
! colspan="2" |'''Выходы'''
Строка 31: Строка 45:
|-
|-
|Тип выходов
|Тип выходов
|механическое реле
|Контакты механического реле
|-
|-
|Конфигурация контактов
|Конфигурация контактов
|SPST, нормально открытые
|Двухпозиционные, нормально открытые.
состояния:
Состояния: разомкнут <&mdash;> замкнут Kx и COM
 
выкл,
 
замкнут K и COM
|-
|-
|Конфигурация выходов
|Конфигурация выходов
|Две группы по 7 выходов,  
|Две группы по 7 выходов, общий провод в каждой группе
общий провод в каждой группе
|-
|-
|Максимальное коммутируемое напряжение, AC
|Максимальное коммутируемое напряжение, AC
|250V
|250 В
|-
|-
|Максимальное коммутируемое напряжение, DC
|Максимальное коммутируемое напряжение, DC
|30V
|30 В
|-
|-
|Максимальный коммутируемый ток, на каждый канал  
|Максимальный коммутируемый ток на каждый канал  
(для резистивной нагрузки)
|
|10A
* для резистивной нагрузки — 10 А
* для ёмкостной и индуктивной нагрузки — 400 мА
|-
|-
|Сопротивление канала в открытом состоянии
|Сопротивление канала в открытом состоянии
|< 100 mOhm
|< 100 мОм
|-
|-
|Напряжение изоляции между контроллером и выходом
|Напряжение изоляции между контроллером и выходом
|1500Vrms
|1500 В (среднеквадратичное значение)
|-
|-
|Срок жизни: количество переключений
|Срок жизни: количество переключений для нагрузки  
для нагрузки 10A 230V AC, cos φ = 1
10 А/230 В переменного тока (резистивная нагрузка)
|100 000
|100 000
|-
|Индикация
|Светодиодная индикация состояния каждого канала
|-
|-
! colspan="2" |Входы
! colspan="2" |Входы
|-
|-
|Количество входов
|Количество входов (Inputs 1&mdash;14)
|14
|14
|-
|-
|Тип входов
|Тип входов
|сухой контакт,
|"Сухой контакт", не изолированные от источника питания
не изолированные от источника питания
|-
|-
|Функции
|Функции
|
|
* Входы общего назначения
* Входы общего назначения
* Счёт сигналов
* Счет сигналов
* Прямое управление каналами реле
* Прямое управление каналами реле
|-
|-
Строка 89: Строка 95:
|-
|-
|Изоляция интерфейса
|Изоляция интерфейса
|неизолированный
|Неизолированный
|-
|-
|Протокол обмена
|Протокол обмена данными
|Modbus RTU
|Modbus RTU, адрес задается программно, заводские настройки указаны на наклейке
|-
|-
|Напряжение питания
|Параметры интерфейса RS-485
|9-24 V DC
|  
*Скорость: 9600 бит/сек
*Данные: 8 бит
*Проверка чётности: нет
*Стоповых бит: 2
|-
|-
! colspan="2" |Прочее
|Готовность к работе после подачи питания
| ~0,1 c
|-
|-
|Максимальная потреблеямая мощность
! colspan="2" |Габариты
|2 Вт
|-
|-
|Ширина, DIN юнитов
|Ширина, DIN-юнитов
|6
|6
|-
|-
|Размер
|Габаритные размеры (Д x Ш х В)
|106.25x90.2x57.5 mm
|106,25 x 90,2 x 57,5 мм
|-
! colspan="2" |Индикация
|-
|Индикация питания и обмена данными
|Жёлтый светодиод Status
|-
|Индикация состояния каналов реле
|Зеленые светодиоды 1 — 14
|-
! colspan="2" |Условия эксплуатации
|-
|Температура воздуха
|От -20 до +50 °С
|-
|Относительная влажность
|До 92%, без конденсации влаги
|-
|-
|Индикация
|индикация питания и обмена данными
|}
|}
*


[[File:DIN 6U.png |300px|thumb|right|Габаритные размеры]]
=== Габаритные размеры модуля ===


==== Условия эксплуатации: ====
[[File:DIN 6U.png |450px|thumb|center|Габаритные размеры]]


* Температура воздуха от -20°С до +50°С;
* Относительная влажность воздуха до 92%,без конденсата влаги.


==== Допустимая нагрузка ====
=== Обмен данными ===


Модуль реле предназначен для коммутирования резистивной нагрузки. Для переменного тока (230V AC), допустимый ток для каждого канала указан в описании. Если каналы модуля реле используются для коммутирования ёмкостной или индуктивной нагрузки, то пиковые значения тока или мощности при включении или отключении нагрузки могут превысить максимальные допустимые параметры, даже в том случае, если заявленные паметры потребления прибора в стационарном режиме и укладываются в заявленные параметры.
На физическом уровне модуль подключается через интерфейс [[RS-485]]. Для управления WB-MR14 используется протокол Modbus RTU. В устройствах Wirenboard данные Modbus передаются по линиям связи RS-485. Подробнее смотрите страницу [[Протокол Modbus]]. Modbus-адрес модуля задается на заводе и нанесен на наклейке на его боковой стороне. Адрес может быть изменен программно. Подробно смотрите в разделе [[#Параметры_Modbus]]


Мы не рекомендуем использовать WB-MR14 для коммутирования индуктивной или ёмкостной нагрузки номинальной мощностью более 400W для канлов реле с допустимым током 10А.
== Монтаж ==
Релейный модуль монтируется на стандартную DIN-рейку шириной 35 мм и занимает ширину 6 DIN-модулей.


==== Порядок подключения ====
Блоки безвинтовых зажимов на плате реле служат для подключения линий питания, управления (RS-485) и входных контактов. Все выводы GND на безвинтовых зажимах (в том числе и "минус" питания) объединены на плате. При использовании при монтаже наконечников типа НШВИ необходимо, чтобы диаметр изолированных манжет не превышал 3,6 мм, сечение провода — 0,75 мм<sup>2</sup>, а длина проводящей втулки — 5—6 мм. Винтовые зажимы принимают провод сечением 2,5—4 мм<sup>2</sup>. Сечение провода должно соответствовать коммутируемой нагрузке.


Модуль выполнен в пластмассовом корпусе и предназначен для установки в монтажную коробку на DIN рейку.
При подключении коммутируемых устройств важно помнить, что хотя каждый из 7 винтовых зажимов выдерживает соответствующий ток 10 А, два зажима общего провода не рассчитаны на протекание общего тока 70 А. Такой ток приведет к повреждению платы релейного модуля. Сдвоенные общие контакты COM выдерживают ток около 40 А.  


К синим клеммам подключаются RS-485 и питание:
Кнопки или выключатели с фиксацией подключаются между выводами GND и соответствующим входом Inputs. Ток, протекающий при замыкании кнопки или выключателя, невелик, так что тип кнопки или выключателя может быть любым. Несмотря на встроенную защиту от дребезга, выбирайте качественные кнопки и выключатели, чтобы исключить ложные срабатывания из-за плохих контактов.


* А и В - сигнальные линии RS485
Если устройство — последнее на линии RS-485, то между его входами A и B необходимо установить резистор-терминатор сопротивлением 120 Ом. Практика показывает, что в случае стендовых испытаний при небольшой длине линии RS-485 и небольшом количестве устройств терминатор на последнем устройстве в линии можно не устанавливать.
* V+ и GND - питание


Внешние кнопки и датчики подключаются между соответствующим входом блока Inputs и GND.  
Модуль необходимо устанавливать таким образом, чтобы удовлетворять требованиям электробезопасности и не допускать случайного касания контактов, находящихся под высоким напряжением. Модуль должен эксплуатироваться при рекомендованных условиях окружающей среды.


Например
[[File:Installation_WB14.png|550px|thumb|center|Образец монтажа и подключения модуля (у последнего модуля на линии устанавливается терминирующий резистор). Выбор качественного блока питания очень важен для работы модуля.]]


* Между Input 1 и GND - кнопка управления 1 реле
== Добавление модуля в web-интерфейс контроллера Wiren Board==
[[Файл:The_new_device.png|300px|thumb|Новый модуль WB-MR14 в web-интерфейсе]]
Новое устройство добавляется в web-интерфейс в раздел соответствующего порта RS-485. В web-интерфейсе на панели справа выбираем пункт Configs -> Serial Device Driver Configuration. В настройках порта /dev/ttyAPP1 добавляем новое устройство, нажав на кнопку '''+ Serial device''' в разделе List of Devices. Затем указываем адрес устройства и выбираем его тип. Подробно о настройке устройств в web-интерфейсе Wiren Board смотрите страницу [[RS-485:Настройка_через_веб-интерфейс]].


== Управление ==
В разделе Devices появилось новое устройство, название составлено из типа устройства и адреса: '''WB-MR14 1'''


==== Параметры шины. ====
Обратите внимание: желтый индикатор Status на WB_MR14 начал периодически мигать, это означает, что Wiren Board обменивается данными с модулем реле. В web-интерфейсе можно следить за параметром Supply voltage (напряжение питания модуля реле) — он меняется почти при каждом опросе модуля.


Скорость 9600 бит/сек, данных - 8 бит,
Устройство WB-MR14 стандартное, поэтому его описание задано в шаблоне, который хранится на контроллере Wiren Board в файле /usr/share/wb-mqtt-serial/templates/config-wb-mr14.json.
чётность – нет, стоповый бит - 2.


== Управление модулем через web-интерфейс Wiren Board ==


=== Команды поддерживаемые устройством ===
Пример управления релейного модуля WB-MR14 контроллером Wiren Board 5 и программирования сценариев управления мы рассмотрим на простом макете, когда релейный модуль является единственным устройством, подключенным к контроллеру. Нормально разомкнутая кнопка без фиксации подключена ко входу 1 и GND. Питание 12 В подается на входы V+(+) и GND (-). Входы/выходы RS-485 A и B первого порта контроллера и модуля WB-MR14 соединены.
[[Файл:Lab_mr14_2.png|800px|thumb|center|Лабораторный макет]]
 
{|  border="0" class="wikitable" style="text-align:center"
|-
|[[Файл:Web_buttons.png|300px|thumb|center|Кнопки управления каналами реле]]
|[[Файл:Web_options.png|300px|thumb|center|Флажки состояния входов]]
|[[Файл:Web_input_counter.png|300px|thumb|center|Счетчик входов]]
|[[Файл:Web_safety_timer.png|300px|thumb|center|Время отключения таймера безопасности]]
|}
 
 
С помощью виртуальных выключателей в web-интерфейсе K1-K14 можно управлять соответствующими выходами модуля и следить за их состоянием. Если реле будет включено или выключено через внешний вход, это отразится и в web-интерфейсе.
Текущее состояние входов показывают флажки Input1 — Input14 (на них нельзя щелкнуть, чтобы изменить состояние). Счетчики нажатий/включений отображаются в полях  Input 1 counter – Input 14 counter. Значения счетчиков хранятся в оперативной памяти микроконтроллера модуля реле и обнуляются при выключении/включении питания и сбросе.
 
Ползунок Safety Timer позволяет задать время отключения (в секундах) всех выходов при отсутствии обмена данными с Wiren Board (0 – таймер безопасности отключен). При возобновлении связи с контроллером выключившиеся реле останутся выключенными. Ползунком удобно управлять с помощью клавиш со стрелками, предварительно сфокусировавшись на нем мышью: перемещение ползунка с помощью мыши не обеспечивает достаточную точность. Таймер безопасности позволяет остановить технологические процессы в случае, если контроль над модулем утрачен (например, перебит кабель RS-485). Если реле останутся включенными, то, например, не закроется клапан подачи жидкости, что приведет к переполнению резервуара и затоплению помещения. Всегда учитывайте возможность потери связи с контроллером при проектировании систем управления.
 
== Параметры Modbus ==
 
=== Modbus-адрес ===
[[Файл:modbus_address_mr14.png|150px|thumb|left|Modbus-адрес, установленный на производстве]]
Modbus-адрес устройств Wiren Board легко определить — он нанесен на наклейке (адрес указан в десятичном формате). Новый адрес устройства записывается командой WRITE_SINGLE_REGISTER в регистр хранения (holding register) с адресом 128 (0x80). Подробно о том, как определить или изменить Modbus-адрес модуля, написано на странице [[Определение_и_изменение_Modbus-адреса_устройств_Wirenboard]].
 
=== Команды Modbus, поддерживаемые устройством ===




{|  border="1" class="wikitable" style="text-align:center"
{|  border="1" class="wikitable" style="text-align:center"
!Command
!Команда
!command (dec)
!десятичный код
|-
|-
|READ_COIL  
|READ_COIL  
Строка 176: Строка 222:
|}
|}


Смена адреса производится широковещательный (slave_id 0) командой записи (WRITE_SINGLE_REGISTER) в holding register с адресом 128 (0x80).
=== Безопасный режим ===
 
В этом режиме при прекращении обмена данными по Modbus устройство отключает реле по прошествии заданного времени.  
По адресу 200 лежит сигнатура длинной 6 байт. Сигнатура уникальна для каждой модели устройства и позволяет идентифицировать модель.
Для получения сигнатуры нужно выполнить READ_HOLDING_REGISTERS адрес 200 длина 6. 
Запись в эту область памяти не поддерживается, при попытки записи в недопустимое место возвращается ошибка 3.


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


Значение каждого реле хранится в COIL. У 1го реле адрес 0, у 2го - 1.
=== Цифровые входы  ===
 
==== Безопасный режим ====
В этом режиме при прекращении обмена данными по modbus устройство отключает реле по прошествии заданного времени.
 
Для включения безопасного режима нужно записать значение отличное от 0 в HOLDING_REGISTER по адресу 2. Это значение - таймаут в секундах.
 
==== Цифровые входы  ====


Поддерживается три режима работы цифровых входов:
Поддерживается три режима работы цифровых входов:
* Режим 0: прямое управление каналами, выключатели без фиксации (кнопки). Нажатие на кнопку переключает состояние реле.  
* Режим 0: прямое управление каналами, выключатели без фиксации (кнопки). Нажатие на кнопку изменяет состояние реле.  
* Режим 1: прямое управление каналами, выключатели с фиксацией. Переключение выключателя с фиксацией устанавливает состояние реле в соответствии с положением выключателя.
* Режим 1: прямое управление каналами, выключатели с фиксацией. Переключение выключателя с фиксацией устанавливает состояние реле в соответствии с положением выключателя.
* Режим 3: управление каналами отключено  
* Режим 3: управление каналами отключено.


Поведением по-умолчанию является прямое управление каналами реле (режим 0). Установить режим для всех каналов можно записав соответствующее число в HOLDING_REGISTER по адресу 5.
Поведением по умолчанию является прямое управление каналами реле (режим 0). Установить режим для всех каналов можно, записав соответствующее число в регистр хранения с адресом 5.
Режим можно устанавливать отдельно для каждого канала с помощью регистров 9-22. Настройки для каждого канала учитываются только в том случае, если общие настройки (регистр 5) находятся в состоянии "0", т.е. имеют значение по-умолчанию.
Режим можно устанавливать отдельно для каждого канала с помощью регистров 9—22. Настройки для каждого канала учитываются только в том случае, если регистр 5 (общие настройки режимов входов) находится в состоянии "0", т.е. имеет значение по умолчанию.


В любом режиме работы, текущее состояние кнопок можно прочесть чтением Discrete Inputs 0-13 (см. таблицу ниже).
В любом режиме работы текущее состояние кнопок можно получить чтением регистров Discrete Inputs 0—13 (см. таблицу ниже).


==== Карта регистров ====
=== Карта регистров ===
{|  border="1" class="wikitable" style="text-align:center"
{|  border="1" class="wikitable" style="text-align:center"
!Регистр / адрес
!Регистр / адрес
!тип
!тип
!чтение/запись
!чтение/запись
!значение по-умолчанию
!значение по умолчанию
!формат
!формат
!назначение
!назначение
|-
|-
 
| 0—13 || coil || RW || - || 1 или 0|| состояние реле 1—14
| 0-13 || coil || RW || - || 1 or 0|| состояние реле 1-14
|-
|-
| 0-13 || discrete || R || - ||  || состояние входа 1-14
| 0—13 || discrete || R || - ||  1 или 0
|| состояние входа 1—14
|-
|-
| 5 || holding || RW || 0 ||  '''0''': кнопки без фиксации
| 5 || holding || RW || 0 ||  '''0''': кнопки без фиксации
'''1''': выключатель с фиксацией
'''1''': выключатель с фиксацией
'''3''': отключить управление  
'''3''': отключить управление  
|| режим работы кнопок
|| режим работы кнопок
|-
|-
| 8 || holding || RW || 0 || seconds || таймаут для безопасного режима
| 8 || holding || RW || 0 || секунды || таймаут для безопасного режима
|-
|-
| 9-22 || holding || RW || 0 || '''0''': кнопки без фиксации
| 9—22 || holding || RW || 0 || '''0''': кнопки без фиксации
'''1''': выключатель с фиксацией
'''1''': выключатель с фиксацией


'''3''': отключить управление  
'''3''': отключить управление  
|| режим работы входа N. В регистре 5 должен быть записан "0".
|| режим работы входа N;
в регистре 5 должен быть записан "0"
|-
|-
 
| 32—45||  input || R || 0 || 16-bit unsigned int || счетчик нажатий входа 1—14
 
| 32-45||  input || R || 0 || 16-bit unsigned int || счетчик нажатий входа 1-11
|-
|-
 
| 120 (0x78) || holding || RW || 0 ||  отличное от 0 || запись в регистр вызывает перезагрузку модуля без сохранения состояния
| 120 (0x78) || holding || RW || 0 ||  отличное от 0 || запись в регистр вызывает перезагрузку МК без сохранения состояния
|-
|-
| 121 (0x79) || holding || R || - ||  mV || текущее напряжение питания модуля
| 121 (0x79) || holding || R || - ||  мВ || текущее напряжение питания модуля
|-
|-
| 128 (0x80) || holding || RW || 1 || || Modbus-адрес устройства  
| 128 (0x80) || holding || RW || 1 || 1—247
|| Modbus-адрес устройства  
|-
|-
| 200-206 || holding || R || {'W','B','M','R','1','4'} ||  || сигнатура
| 200-206 || holding || R || {'W','B','M','R','1','4'} ||  || сигнатура
|-
|-
| 220-241 || holding || R || ||  __date__ __time__||  дата сборки прошивки
|-
|}
По адресу 200 лежит сигнатура релейного модуля длиной 6 байт, соответствующая строке "WBMR14". Сигнатура уникальна для каждой модели устройств Wiren Board и позволяет идентифицировать модель по Modbus.
Для получения сигнатуры нужно выполнить команду READ_HOLDING_REGISTERS по адресу 200 (длина 6 регистров). Запись в эту область памяти не поддерживается, при попытки записи в недопустимое место возвращается ошибка 3.
Начиная с регистра 220 записана дата сборки прошивки, в формате "число'''x00'''время'''x00'''" в виде строки (пример: 'Oct 10 2016 13:31:55'). Длина записи — 21 регистр.


| 220-241 || holding || R || ||  __date__ __time__||  дата сборки прошивки
Значение состояния каждого реле хранится в регистрах флагов (coil). У 1-го реле адрес регистра 0, у 2-го &mdash; 1 и т.д.
 
== Управление модулем из командной строки ==
Программное обеспечение контроллера Wiren Board включает в себя утилиту modbus_client для работы с устройствами, подключенными к выходам RS-485, по протоколу Modbus, подробное описание команды находится на странице [[Modbus-client]]. Доступ к командной строке описан в статье [[SSH]].
 
=== Чтение регистров ===
Проверим, верно ли, что мы подключились именно к WB-MR14. По адресу 200 хранится уникальная для WB-MR14 сигнатура длиной в 6 регистров. Прочтем 6 регистров, начиная с адреса 200, и преобразуем полученный шестнадцатеричный ответ в символьную строку:
 
<syntaxhighlight lang="bash">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'` </syntaxhighlight>
 
В результате выполнения команды получаем строку '''WBMR14'''. Всё верно -- это релейный модуль WB-MR14.
 
=== Перезагрузка ===
В ряде случаев может потребоваться перезагрузка модуля. Для этого в регистр 120 (0x78) необходимо записать любое значение, отличное от нуля:
<syntaxhighlight lang="bash">
modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a1 -t0x06 -r0x78 100
</syntaxhighlight>
Такая перезагрузка равносильна сбросу по питанию и изменению адреса устройства на 0x01. Все реле при этом выключаются. Предварительно, конечно, необходимо остановить сервис wb-mqtt-serial и убедиться, что к контроллеру не подключены другие Modbus-устройства.
 
=== Выбор типа управления внешними входами ===
В модуле WB-MR14 предусмотрено два режима управления каналами реле: с помощью внешних входов и по протоколу RS-485.
В WB-MR14 можно выбрать режим 0, когда ко внешнему входу подключена кнопка (без фиксации), или режим 1, когда для управления используется обычный выключатель (с фиксацией). Режим 3 отключает внешнее управление, но при этом все равно сохраняется возможность управления по RS-485 и чтение состояния внешних входов. По умолчанию включен режим 0.
 
В режиме внешнего управления реле срабатывает по падению логического уровня: к внешним входам подключены резисторы подтяжки к линии +5V и реле соответствующего канала срабатывает при соединении входа с GND.
Состояние реле каждого канала хранится в памяти контроллера до перезагрузки, по умолчанию при включении питания все реле выключены. После инициализации модуля опрашиваются внешние входы и реле всех каналов переводятся в соответствующее состояние.
 
Тип внешнего управления можно выбрать для каждого канала отдельно через регистры 9—22. Для этого в holding-регистре 5 должно быть записано значение 0:
<syntaxhighlight lang="bash">
modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a1 -t0x06 -r5 0
</syntaxhighlight>
 
Инициализировать регистр при старте можно и через настройки web-интерфейса, смотрите страницу [[RS-485:Настройка_через_веб-интерфейс]].
<!--
== Конструкция релейного модуля WB-MR14 ==
Физически контроллер состоит из двух плат: платы реле и контактов и платы управления, питания и индикации. Платы расположены под прямым углом и соединены пайкой. Платы установлены в пластиковом корпусе для монтажа на DIN-рейку. На корпусе имеется доступ к индикаторам и контактам.
[[Файл:Armstm32F.png|250px|thumb|right|Центральный процессор модуля]]
В основе устройства лежит 32-битный RISC-процессор STM32F051R8T6 с ядром Cortex-M0, функционирующий на частоте 16 МГц.
На плате управления предусмотрено место для установки разъема для перепрограммирования контроллера. Разъем не распаян.
На плате контактов и реле расположены 12 реле HF32F-G, коммутирующие соответствующие 12 выходов, выведенных на винтовые зажимы.
Контакты реле объединены в две группы, каждая со своим общим проводом, COM1 и COM2. На общий провод отводится две винтовых клеммы, соединенных на плате.
 
В случае активной (резистивной) нагрузки реле могут коммутировать до 10 А/230 В переменного тока и до 10 А/30 В постоянного. В случае реактивной (ёмкостной или индуктивной) нагрузки (двигатели, импульсные блоки питания и т.д.) не следует коммутировать ток больше 400 мА. Используйте внешние контакторы, рассчитанные на соответствующую нагрузку.
Каждый контакт реле защищен от образования дуги при замыкании/размыкании симметричным TVS-диодом.
Микропроцессор управляет реле и индикаторами через модули ULN2003A, состоящие  из дарлингтоновских транзисторных сборок и защитных диодов, гасящих ток самоиндукции катушек реле. Для устранения дребезга контактов на каждой входной линии применяются RC-цепочки. Входы подтянуты резисторами к линии питания +5V.
-->
 
== Примеры программирования ==
=== Пишем простой скрипт ===
Попробуем перенести логику управления контактами реле модуля на контроллер Wiren Board. Для этого мы перейдем в режим, когда внешнее управление релейным модулем отключено, и будем считывать состояние входов модуля и соответствующим образом переключать реле. <!--Оценим затем, насколько этот способ управления окажется дольше, чем при переключении средствами релейного модуля.-->
MQTT-названия устройств и их элементов управления можно найти в разделе Settings web-интерфейса (см. [[MQTT]]).
 
В качестве альтернативного способа мы можем в командной строке строке подписаться на все топики (/#) командой
<syntaxhighlight lang="bash">mosquitto_sub -v -t /#</syntaxhighlight>
и очень скоро понимаем, что имя нашего устройства '''wb-mr14_1'''.
Теперь мы можем подписаться только на сообщения данного устройства и без труда определить названия элементов управления:
<syntaxhighlight lang="bash">mosquitto_sub -v -t /devices/wb-mr14_1/#</syntaxhighlight>
Реле называются /devices/wb-mr14_1/controls/K1 – /devices/wb-mr14_1/controls/K14,
входы:  /devices/wb-mr14_1/controls/Input 1 – /devices/wb-mr14_1/controls/Input 14.
Мы будем работать с первым реле и первым входом. Отключим управление через внешние входы, установив значение 3 в регистр хранения 0x05:
<syntaxhighlight lang="bash">
service wb-mqtt-serial stop
modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a1 -t0x05 -r0x05 3
service wb-mqtt-serial start
</syntaxhighlight>
Проверяем — реле модуля не должны реагировать на нажатие кнопки, соединяющей выводы 1 и GND. Однако при этом в очереди публикуются сообщения о состоянии входа Input 1:
<syntaxhighlight lang="bash">
/devices/wb-mr14_1/controls/Input 1 1
/devices/wb-mr14_1/controls/Input 1 0
</syntaxhighlight>
 
Простые скрипты можно создавать прямо в веб-интерфейсе Wiren Board, для сложных стоит выбрать свою любимую среду разработки.
Переходим в раздел Scripts и нажимаем ссылку '''New...'''
Наше первое правило будет устанавливать состояние реле в зависимости от состояния кнопки: кнопка нажата — реле включено, кнопка отпущена — реле выключено.
 
<syntaxhighlight lang="ecmascript">
defineRule("switch_relay_1", {
  whenChanged: "wb-mr14_1/Input 1",
  then: function (newValue, devName, cellName)  {
dev["wb-mr14_1"]["K1"] = newValue;
      }
});
</syntaxhighlight>
 
Нажимаем кнопку Save, сохраняя скрипт в штатной директории /etc/wb-rules под именем r1k1.js (расширение должно быть .js, иначе получите ошибку при сохранении). Правило начинает работать автоматически после нажатия кнопки Save, если в нем нет ошибок. Проверим? Нажмем на кнопку — включается реле 1, отпускаем кнопку — реле 1 отключается. Однако все процессы происходят с задержкой: время тратится на передачу Modbus-сообщений, отработку правила контроллером. <!--К контроллеру подсоединено только одно устройство и выполняется одно простейшее правило, а задержка между нажатием кнопки и срабатыванием реле составляет уже более 300 мс. Такая задержка отклика может оказаться неприемлемой, если релейный модуль управляет, например, освещением.
 
{border="0" class="wikitable" style="text-align:center"
|-
|-
|[[Файл:Buttonpress.png|600px|thumb|left|Управление реле средствами модуля — задержка менее 0,1 c (бирюзовая линия -- кнопка, желтая -- контакт реле)]]
|[[Файл:R1t1_timings.png|600px|thumb|left|Управление реле командой с контроллера — задержка около 0,3 c (бирюзовая линия -- кнопка, желтая -- контакт реле)]]
|} -->




Мы также можем следить за нажатиями на кнопки при помощи счетчика нажатий:
<syntaxhighlight lang="ecmascript">
defineRule("switch_relay_2", {
  whenChanged: "wb-mr14_1/Input 2 counter",
  then: function (newValue, devName, cellName)  {
dev["wb-mr14_1"]["K2"] = !dev["wb-mr14_1"]["K2"];
      }
});
</syntaxhighlight>
Этот скрипт изменяет состояние реле на противоположное тому, в котором оно находилось до нажатия кнопки.
=== Более сложный скрипт ===
<!-- TODO: это всё конечно адский ад и набор плохих практик. Так делать не стоит, раздел переписать. Правильный способ - смотреть на изменение Input 1 Counter. -->
Давайте усложним задачу и напишем скрипт, который будет включать и выключать основное освещение (реле 3), но если кнопка нажата два раза подряд в течение полутора секунд, то будет включено дополнительное освещение (реле 4). Нажатие на кнопку через продолжительное время отключает основное, а повторное нажатие в течение полутора секунд и дополнительное освещение. Для этого мы используем компонент Input 3 counter и таймер, управляемый функциями setTimeout()/clearTimeout)() (подробнее смотрите на [https://github.com/contactless/wb-rules странице описания wb-rules в Github.])
В модуле реле WB-MR14 режим работы можно задавать не только для всех входов сразу, но и для отдельных входов. При этом общий режим (регистр хранения 5) должен быть 0. А для отдельного входа 3 (и 4) — значение 3 (управление только контроллером).
{|  border="1" class="wikitable" style="text-align:center"
|-
|[[Файл:List_of_channels_setup.png |800px|thumb|center|]]
|-
|[[Файл:Do_not_react_on_inputs.png|800px|thumb|center|Обратите внимание на тип -- integer. Адреса берутся из списка регистров или из шаблона]]
|}
|}
----
<syntaxhighlight lang="ecmascript">
//Повторное нажатие на кнопку в течение button_timer_delay приводит к включению дополнительного реле при включении,
//и отключениии дополнительного реле при отключении первого
//Используем реле 3 и 4
//В списке Setup commands для устройства в регистр 5 заносится значение 0, а в регистры 11 и 12 -- 3.
//Для отслеживания изменения состояния внешних входов используем счетчик нажатий Input 3 counter
//Для просмотра вывода функций log() щелкните на значке с гаечным ключом снизу справа на странице и отметьте галочку "Включить отладку"
 
var button_timer_delay = 1500 //ms; задержка для включения второго реле
var button_timer_id = null  //идентификатор таймера
defineRule("switch_relay_3_4", {
    whenChanged: "wb-mr14_1/Input 3 counter", //Следим за Input 3
    then: function(newValue, devName, cellName) {
        if (newValue && !button_timer_id) {
            log("switch_relay_3_4: Счетчик входа 3 изменил свое значение: ", newValue);
            dev["wb-mr14_1"]["K3"] = !dev["wb-mr14_1"]["K3"];
            button_timer_id = setTimeout(function() {
                log("switch_relay_3_4: Закончился таймаут: ", button_timer_id);
                button_timer_id = null;
            }, button_timer_delay);
            log("Запускаем  таймер", button_timer_id);
        } else if (newValue && button_timer_id) {
            dev["wb-mr14_1"]["K4"] = dev["wb-mr14_1"]["K3"];
            log("switch_relay_3_4: Отключаем таймаут: ", button_timer_id);
            clearTimeout(button_timer_id);
            button_timer_id = null;
        }
    }
});
</syntaxhighlight>

Версия 19:46, 15 декабря 2016

WB-MR14 модуль реле 14-ти канальный

Магазин: Исполнительные устройства и датчики для шины RS-485 Modbus RTU

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

Назначение

14-канальный модуль реле предназначен для систем промышленной и домашней автоматизации. Реле объединены в группы, что упрощает проводку при использовании модуля для автоматизации освещения или управления внешними контакторами.

Выходы

В модуле установлены 14 реле HF32F-G (Datasheet), коммутирующие соответствующие 14 выходов, выведенных на винтовые зажимы, рассчитанные на максимальный ток 20 А. Контакты реле объединены в две группы, каждая со своим общим проводом, COM1 и COM2. На общий провод отводится две винтовых клеммы, соединенных на плате. Для двойных винтовых зажимов COM-контактов общий максимально допустимый ток — 40 А.

В случае активной (резистивной) нагрузки реле могут коммутировать до 10 А/230 В переменного тока и до 10 А/30 В постоянного. В случае реактивной (ёмкостной или индуктивной) нагрузки (двигатели, импульсные блоки питания и т.д.) не следует коммутировать ток больше 400 мА. Используйте внешние контакторы, рассчитанные на соответствующую нагрузку.

Каждый контакт реле защищен от образования дуги при замыкании/размыкании симметричным TVS-диодом.

Контакты реле

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

Входы

На безвинтовые зажимы модуля выведены 14 входов типа "сухой контакт", не изолированные от источника питания. Для устранения дребезга контактов на каждой входной линии применяются RC-цепочки. Входы подтянуты резисторами к линии питания +5V. Кнопки или выключатели с фиксацией подключаются между выводами GND и соответствующим входом Inputs. Входы могут использоваться как входы общего назначения, для счета сигналов и для прямого управления каналами реле. Программно можно выбрать три режима работы входов: управление кнопкой без фиксации или по Modbus; управление выключателем (с фиксацией) или по Modbus; управление только по Modbus. По умолчанию включен режим управления кнопкой без фиксации.

Технические характеристики

Потребляемая мощность
Параметр Значение
Питание
Напряжение питания 9 — 24 В постоянного тока
  • В режиме холостого хода (со всеми выключенными реле) — 0,5 Вт
  • Пиковое значение — до 12 Вт
Выходы
Количество выходов 14
Тип выходов Контакты механического реле
Конфигурация контактов Двухпозиционные, нормально открытые.

Состояния: разомкнут <—> замкнут Kx и COM

Конфигурация выходов Две группы по 7 выходов, общий провод в каждой группе
Максимальное коммутируемое напряжение, AC 250 В
Максимальное коммутируемое напряжение, DC 30 В
Максимальный коммутируемый ток на каждый канал
  • для резистивной нагрузки — 10 А
  • для ёмкостной и индуктивной нагрузки — 400 мА
Сопротивление канала в открытом состоянии < 100 мОм
Напряжение изоляции между контроллером и выходом 1500 В (среднеквадратичное значение)
Срок жизни: количество переключений для нагрузки

10 А/230 В переменного тока (резистивная нагрузка)

100 000
Входы
Количество входов (Inputs 1—14) 14
Тип входов "Сухой контакт", не изолированные от источника питания
Функции
  • Входы общего назначения
  • Счет сигналов
  • Прямое управление каналами реле
Управление
Интерфейс управления RS-485
Изоляция интерфейса Неизолированный
Протокол обмена данными Modbus RTU, адрес задается программно, заводские настройки указаны на наклейке
Параметры интерфейса RS-485
  • Скорость: 9600 бит/сек
  • Данные: 8 бит
  • Проверка чётности: нет
  • Стоповых бит: 2
Готовность к работе после подачи питания ~0,1 c
Габариты
Ширина, DIN-юнитов 6
Габаритные размеры (Д x Ш х В) 106,25 x 90,2 x 57,5 мм
Индикация
Индикация питания и обмена данными Жёлтый светодиод Status
Индикация состояния каналов реле Зеленые светодиоды 1 — 14
Условия эксплуатации
Температура воздуха От -20 до +50 °С
Относительная влажность До 92%, без конденсации влаги

Габаритные размеры модуля

Габаритные размеры


Обмен данными

На физическом уровне модуль подключается через интерфейс RS-485. Для управления WB-MR14 используется протокол Modbus RTU. В устройствах Wirenboard данные Modbus передаются по линиям связи RS-485. Подробнее смотрите страницу Протокол Modbus. Modbus-адрес модуля задается на заводе и нанесен на наклейке на его боковой стороне. Адрес может быть изменен программно. Подробно смотрите в разделе #Параметры_Modbus

Монтаж

Релейный модуль монтируется на стандартную DIN-рейку шириной 35 мм и занимает ширину 6 DIN-модулей.

Блоки безвинтовых зажимов на плате реле служат для подключения линий питания, управления (RS-485) и входных контактов. Все выводы GND на безвинтовых зажимах (в том числе и "минус" питания) объединены на плате. При использовании при монтаже наконечников типа НШВИ необходимо, чтобы диаметр изолированных манжет не превышал 3,6 мм, сечение провода — 0,75 мм2, а длина проводящей втулки — 5—6 мм. Винтовые зажимы принимают провод сечением 2,5—4 мм2. Сечение провода должно соответствовать коммутируемой нагрузке.

При подключении коммутируемых устройств важно помнить, что хотя каждый из 7 винтовых зажимов выдерживает соответствующий ток 10 А, два зажима общего провода не рассчитаны на протекание общего тока 70 А. Такой ток приведет к повреждению платы релейного модуля. Сдвоенные общие контакты COM выдерживают ток около 40 А.

Кнопки или выключатели с фиксацией подключаются между выводами GND и соответствующим входом Inputs. Ток, протекающий при замыкании кнопки или выключателя, невелик, так что тип кнопки или выключателя может быть любым. Несмотря на встроенную защиту от дребезга, выбирайте качественные кнопки и выключатели, чтобы исключить ложные срабатывания из-за плохих контактов.

Если устройство — последнее на линии RS-485, то между его входами A и B необходимо установить резистор-терминатор сопротивлением 120 Ом. Практика показывает, что в случае стендовых испытаний при небольшой длине линии RS-485 и небольшом количестве устройств терминатор на последнем устройстве в линии можно не устанавливать.

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

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

Добавление модуля в web-интерфейс контроллера Wiren Board

Новый модуль WB-MR14 в web-интерфейсе

Новое устройство добавляется в web-интерфейс в раздел соответствующего порта RS-485. В web-интерфейсе на панели справа выбираем пункт Configs -> Serial Device Driver Configuration. В настройках порта /dev/ttyAPP1 добавляем новое устройство, нажав на кнопку + Serial device в разделе List of Devices. Затем указываем адрес устройства и выбираем его тип. Подробно о настройке устройств в web-интерфейсе Wiren Board смотрите страницу RS-485:Настройка_через_веб-интерфейс.

В разделе Devices появилось новое устройство, название составлено из типа устройства и адреса: WB-MR14 1

Обратите внимание: желтый индикатор Status на WB_MR14 начал периодически мигать, это означает, что Wiren Board обменивается данными с модулем реле. В web-интерфейсе можно следить за параметром Supply voltage (напряжение питания модуля реле) — он меняется почти при каждом опросе модуля.

Устройство WB-MR14 стандартное, поэтому его описание задано в шаблоне, который хранится на контроллере Wiren Board в файле /usr/share/wb-mqtt-serial/templates/config-wb-mr14.json.

Управление модулем через web-интерфейс Wiren Board

Пример управления релейного модуля WB-MR14 контроллером Wiren Board 5 и программирования сценариев управления мы рассмотрим на простом макете, когда релейный модуль является единственным устройством, подключенным к контроллеру. Нормально разомкнутая кнопка без фиксации подключена ко входу 1 и GND. Питание 12 В подается на входы V+(+) и GND (-). Входы/выходы RS-485 A и B первого порта контроллера и модуля WB-MR14 соединены.

Лабораторный макет
Кнопки управления каналами реле
Флажки состояния входов
Счетчик входов
Время отключения таймера безопасности


С помощью виртуальных выключателей в web-интерфейсе K1-K14 можно управлять соответствующими выходами модуля и следить за их состоянием. Если реле будет включено или выключено через внешний вход, это отразится и в web-интерфейсе. Текущее состояние входов показывают флажки Input1 — Input14 (на них нельзя щелкнуть, чтобы изменить состояние). Счетчики нажатий/включений отображаются в полях Input 1 counter – Input 14 counter. Значения счетчиков хранятся в оперативной памяти микроконтроллера модуля реле и обнуляются при выключении/включении питания и сбросе.

Ползунок Safety Timer позволяет задать время отключения (в секундах) всех выходов при отсутствии обмена данными с Wiren Board (0 – таймер безопасности отключен). При возобновлении связи с контроллером выключившиеся реле останутся выключенными. Ползунком удобно управлять с помощью клавиш со стрелками, предварительно сфокусировавшись на нем мышью: перемещение ползунка с помощью мыши не обеспечивает достаточную точность. Таймер безопасности позволяет остановить технологические процессы в случае, если контроль над модулем утрачен (например, перебит кабель RS-485). Если реле останутся включенными, то, например, не закроется клапан подачи жидкости, что приведет к переполнению резервуара и затоплению помещения. Всегда учитывайте возможность потери связи с контроллером при проектировании систем управления.

Параметры Modbus

Modbus-адрес

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

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

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

Команда десятичный код
READ_COIL 1
WRITE_SINGLE_COIL 5
WRITE_MULTI_COILS 15
READ_HOLDING_REGISTERS 3
WRITE_SINGLE_REGISTER 6
WRITE_MULTI_REGISTERS 16

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

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

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

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

Поддерживается три режима работы цифровых входов:

  • Режим 0: прямое управление каналами, выключатели без фиксации (кнопки). Нажатие на кнопку изменяет состояние реле.
  • Режим 1: прямое управление каналами, выключатели с фиксацией. Переключение выключателя с фиксацией устанавливает состояние реле в соответствии с положением выключателя.
  • Режим 3: управление каналами отключено.

Поведением по умолчанию является прямое управление каналами реле (режим 0). Установить режим для всех каналов можно, записав соответствующее число в регистр хранения с адресом 5. Режим можно устанавливать отдельно для каждого канала с помощью регистров 9—22. Настройки для каждого канала учитываются только в том случае, если регистр 5 (общие настройки режимов входов) находится в состоянии "0", т.е. имеет значение по умолчанию.

В любом режиме работы текущее состояние кнопок можно получить чтением регистров Discrete Inputs 0—13 (см. таблицу ниже).

Карта регистров

Регистр / адрес тип чтение/запись значение по умолчанию формат назначение
0—13 coil RW - 1 или 0 состояние реле 1—14
0—13 discrete R - 1 или 0 состояние входа 1—14
5 holding RW 0 0: кнопки без фиксации

1: выключатель с фиксацией 3: отключить управление

режим работы кнопок
8 holding RW 0 секунды таймаут для безопасного режима
9—22 holding RW 0 0: кнопки без фиксации

1: выключатель с фиксацией

3: отключить управление

режим работы входа N;

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

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

По адресу 200 лежит сигнатура релейного модуля длиной 6 байт, соответствующая строке "WBMR14". Сигнатура уникальна для каждой модели устройств Wiren Board и позволяет идентифицировать модель по Modbus. Для получения сигнатуры нужно выполнить команду READ_HOLDING_REGISTERS по адресу 200 (длина 6 регистров). Запись в эту область памяти не поддерживается, при попытки записи в недопустимое место возвращается ошибка 3. Начиная с регистра 220 записана дата сборки прошивки, в формате "числоx00времяx00" в виде строки (пример: 'Oct 10 2016 13:31:55'). Длина записи — 21 регистр.

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

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

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

Чтение регистров

Проверим, верно ли, что мы подключились именно к WB-MR14. По адресу 200 хранится уникальная для WB-MR14 сигнатура длиной в 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'`

В результате выполнения команды получаем строку WBMR14. Всё верно -- это релейный модуль WB-MR14.

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

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

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

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

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

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

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

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

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

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

Примеры программирования

Пишем простой скрипт

Попробуем перенести логику управления контактами реле модуля на контроллер Wiren Board. Для этого мы перейдем в режим, когда внешнее управление релейным модулем отключено, и будем считывать состояние входов модуля и соответствующим образом переключать реле. MQTT-названия устройств и их элементов управления можно найти в разделе Settings web-интерфейса (см. MQTT).

В качестве альтернативного способа мы можем в командной строке строке подписаться на все топики (/#) командой

mosquitto_sub -v -t /#

и очень скоро понимаем, что имя нашего устройства wb-mr14_1. Теперь мы можем подписаться только на сообщения данного устройства и без труда определить названия элементов управления:

mosquitto_sub -v -t /devices/wb-mr14_1/#

Реле называются /devices/wb-mr14_1/controls/K1 – /devices/wb-mr14_1/controls/K14, входы: /devices/wb-mr14_1/controls/Input 1 – /devices/wb-mr14_1/controls/Input 14. Мы будем работать с первым реле и первым входом. Отключим управление через внешние входы, установив значение 3 в регистр хранения 0x05:

service wb-mqtt-serial stop
modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a1 -t0x05 -r0x05 3
service wb-mqtt-serial start

Проверяем — реле модуля не должны реагировать на нажатие кнопки, соединяющей выводы 1 и GND. Однако при этом в очереди публикуются сообщения о состоянии входа Input 1:

/devices/wb-mr14_1/controls/Input 1 1
/devices/wb-mr14_1/controls/Input 1 0

Простые скрипты можно создавать прямо в веб-интерфейсе Wiren Board, для сложных стоит выбрать свою любимую среду разработки. Переходим в раздел Scripts и нажимаем ссылку New... Наше первое правило будет устанавливать состояние реле в зависимости от состояния кнопки: кнопка нажата — реле включено, кнопка отпущена — реле выключено.

defineRule("switch_relay_1", {
  whenChanged: "wb-mr14_1/Input 1",
  then: function (newValue, devName, cellName)  {
	dev["wb-mr14_1"]["K1"] = newValue;
      }
});

Нажимаем кнопку Save, сохраняя скрипт в штатной директории /etc/wb-rules под именем r1k1.js (расширение должно быть .js, иначе получите ошибку при сохранении). Правило начинает работать автоматически после нажатия кнопки Save, если в нем нет ошибок. Проверим? Нажмем на кнопку — включается реле 1, отпускаем кнопку — реле 1 отключается. Однако все процессы происходят с задержкой: время тратится на передачу Modbus-сообщений, отработку правила контроллером.


Мы также можем следить за нажатиями на кнопки при помощи счетчика нажатий:

defineRule("switch_relay_2", {
  whenChanged: "wb-mr14_1/Input 2 counter",
  then: function (newValue, devName, cellName)  {
	dev["wb-mr14_1"]["K2"] = !dev["wb-mr14_1"]["K2"];
      }
});

Этот скрипт изменяет состояние реле на противоположное тому, в котором оно находилось до нажатия кнопки.

Более сложный скрипт

Давайте усложним задачу и напишем скрипт, который будет включать и выключать основное освещение (реле 3), но если кнопка нажата два раза подряд в течение полутора секунд, то будет включено дополнительное освещение (реле 4). Нажатие на кнопку через продолжительное время отключает основное, а повторное нажатие в течение полутора секунд и дополнительное освещение. Для этого мы используем компонент Input 3 counter и таймер, управляемый функциями setTimeout()/clearTimeout)() (подробнее смотрите на странице описания wb-rules в Github.) В модуле реле WB-MR14 режим работы можно задавать не только для всех входов сразу, но и для отдельных входов. При этом общий режим (регистр хранения 5) должен быть 0. А для отдельного входа 3 (и 4) — значение 3 (управление только контроллером).

List of channels setup.png
Обратите внимание на тип -- integer. Адреса берутся из списка регистров или из шаблона


//Повторное нажатие на кнопку в течение button_timer_delay приводит к включению дополнительного реле при включении,
//и отключениии дополнительного реле при отключении первого
//Используем реле 3 и 4
//В списке Setup commands для устройства в регистр 5 заносится значение 0, а в регистры 11 и 12 -- 3.
//Для отслеживания изменения состояния внешних входов используем счетчик нажатий Input 3 counter
//Для просмотра вывода функций log() щелкните на значке с гаечным ключом снизу справа на странице и отметьте галочку "Включить отладку"
  
var button_timer_delay = 1500 //ms; задержка для включения второго реле
var button_timer_id = null  //идентификатор таймера 


defineRule("switch_relay_3_4", {
    whenChanged: "wb-mr14_1/Input 3 counter", //Следим за Input 3
    then: function(newValue, devName, cellName) {

        if (newValue && !button_timer_id) {
            log("switch_relay_3_4: Счетчик входа 3 изменил свое значение: ", newValue);
            dev["wb-mr14_1"]["K3"] = !dev["wb-mr14_1"]["K3"];

            button_timer_id = setTimeout(function() {
                log("switch_relay_3_4: Закончился таймаут: ", button_timer_id);
                button_timer_id = null;
            }, button_timer_delay);
            log("Запускаем  таймер", button_timer_id);
        } else if (newValue && button_timer_id) {
            dev["wb-mr14_1"]["K4"] = dev["wb-mr14_1"]["K3"];
            log("switch_relay_3_4: Отключаем таймаут: ", button_timer_id);
            clearTimeout(button_timer_id);
            button_timer_id = null;
        }
    }
});