|
|
Строка 111: |
Строка 111: |
| == Примеры программирования взаимодействия входов и выходов == <!--T:17--> | | == Примеры программирования взаимодействия входов и выходов == <!--T:17--> |
|
| |
|
| <!--T:18-->
| | [[Еxamples of interaction]] |
| Рассмотрим несколько примеров программирования программирования взаимодействия входов и выходов на примере релейного модуля WB-MR6C с прошивкой 1.9.4. Модуль имеет 7 входов типа "сухой контакт" и 6 релейных выходов. Вход 0 по умолчанию используется для отключения всех реле модулей, а кнопки 1 — 6 для управления модулями реле.
| |
|
| |
|
| <!--T:19-->
| |
| В примерах ориентируемся на заводские настройки параметров коммуникации модуля, Modbus-адрес — 1. Модуль подключен к первому порту контроллера Wiren Board 6.
| |
|
| |
|
| |
| <!--T:20-->
| |
| '''Все примеры выполняются при остановленном драйвере wb-mqtt-serial:'''
| |
| <syntaxhighlight lang="bash">service wb-mqtt-serial stop</syntaxhighlight>
| |
|
| |
| === Выключатели с фиксацией === <!--T:21-->
| |
|
| |
| <!--T:22-->
| |
| Запишем в регистр 5 значение 1:
| |
| <syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x06 -r5 1</syntaxhighlight>
| |
|
| |
| <!--T:23-->
| |
| Теперь все входы модуля функционируют как входы для выключателей с фиксацией.
| |
| Недостаток: Вход 0 перестает функционировать.
| |
|
| |
|
| |
| <!--T:24-->
| |
| Чтобы сохранить "аварийный" режим входа 0 вернем в регистр 5 значение 0, а в регистры 9, 10, 11, 12, 13, 14 запишем 1:
| |
| <syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x06 -r5 0</syntaxhighlight>
| |
| <syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x10 -r9 1 1 1 1 1 1</syntaxhighlight>
| |
|
| |
| <!--T:25-->
| |
| Теперь все входы функционируют в режиме выключателей с фиксацией, а кратковременное нажатие на кнопку, подключенную ко входу 0, выключит все реле.
| |
|
| |
| === Отключить взаимодействие входов и реле === <!--T:26-->
| |
|
| |
| <!--T:27-->
| |
| Для отключения взаимодействия входов и реле (например, если мы хотим управлять реле только через движок правил контроллера) запишем в регистр 5 значение 0, а в регистры 9, 10, 11, 12, 13, 14 запишем значение 3:
| |
|
| |
| <!--T:28-->
| |
| <syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x06 -r5 0</syntaxhighlight>
| |
| <syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x10 -r9 3 3 3 3 3 3</syntaxhighlight>
| |
|
| |
| <!--T:29-->
| |
| Теперь нажатия на кнопки или переключение выключателей не будет изменять состояние реле: ими можно управлять только программно, по Modbus.
| |
| При этом функция аварийного входа 0 сохраняется: кратковременное нажатие на кнопку, подключенную ко входу 0, выключит все реле.
| |
|
| |
| <!--T:30-->
| |
| Если мы хотим отключить и вход 0, то запишем значение 3 в регистр 16:
| |
| <syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x06 -r16 3</syntaxhighlight>
| |
|
| |
|
| |
| === Использование Mapping-матрицы === <!--T:31-->
| |
| Более сложные сценарии взаимодействия входов с реле можно реализовать с помощью Mapping-матрицы.
| |
| Для использования Mapping-матрицы запишем в holding-регистр 5 значение 0:
| |
| <syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x06 -r5 0 </syntaxhighlight>
| |
| А в регистры настройки взаимодействия входов/выходов — значение 4:
| |
| <syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x10 -r9 4 4 4 4 4 4 </syntaxhighlight>
| |
| <syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x06 -r16 4</syntaxhighlight>
| |
|
| |
| <!--T:32-->
| |
| В заводской поставке Mapping-матрица заполнена нулями. Если вы не уверены в этом и хотите стереть всю матрицу, запишите 0 в каждый из 64 holding-регистров, начиная с 384:
| |
| <syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x10 -r384 $(printf ' 0%.0s' {1..64})</syntaxhighlight>
| |
|
| |
| ==== Вход 0 включает и выключает все реле ==== <!--T:33-->
| |
|
| |
| <!--T:34-->
| |
| Запрограммируем матрицу таким образом, чтобы вход 0, работая в режиме кнопки (выключателя без фиксации) последовательно включал и отключал все реле модуля при замыкании.
| |
|
| |
| <!--T:35-->
| |
| Для этого обратимся к карте регистров mapping-матрицы и увидим, что входу 0 соответствуют регистры 440 — 447. Причем за взаимодействие со входами 1 — 6 отвечают регистры 440 — 445.
| |
|
| |
|
| |
| <!--T:36-->
| |
| Мы хотим, чтобы вход работал, как выключатель без фиксации и срабатывал при нажатии (по переднему фронту), а при размыкании ничего бы не происходило. При каждом нажатии состояние всех реле должно инвертироваться. Это соответствует комбинации 11 00: (12, 0x0C) — Изменить состояние выхода при замыкании:
| |
| [[File:Mm_1100.png|frameless|270px]]<br>
| |
| Запишем в регистры 440 — 445 значение 12:
| |
|
| |
| <!--T:37-->
| |
| <syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x10 -r440 12 12 12 12 12 12</syntaxhighlight>
| |
|
| |
| <!--T:38-->
| |
| Проверим работу: при первом замыкании входа 0 все реле включаются, при втором — все реле выключаются.
| |
|
| |
|
| |
| ==== Инвертированный выключатель с фиксацией ==== <!--T:39-->
| |
| Настроим входы таким образом, чтобы при замкнутых входах реле были бы выключены, а при разомкнутых -- включены.
| |
| Для этого при замыкании входа (передний фронт) соответствующий выход должен выключаться (01), а при размыкании входа (задний фронт) — включаться (10). Это соответствует значению 6: [[File:Mm_0110.png|frameless|270px]]<br>
| |
| В матрице нужные регистры взаимодействия вход 1 — выход 1, вход 2 — выход 2 и т.д. расположены по диагонали. Это регистры 384, 393, 402, 411, 420, 429. В них надо записать значение 6:
| |
| <syntaxhighlight lang="bash">for i in 384 393 402 411 420 429; do modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x06 -r$i 6; done</syntaxhighlight>
| |
|
| |
| <!--T:40-->
| |
| Обратите внимание: изменение состояния реле происходят только при изменении состояния ввода.
| |
|
| |
| ==== Датчик протечки ==== <!--T:41-->
| |
|
| |
| <!--T:42-->
| |
| Пусть датчик протечки подключен ко '''входу 1''', а '''реле 1 и 2''' управляют приводами шаровых кранов. '''Реле 3''' управляет сигнальной лампой или зуммером. При смачивании датчика протечки '''реле 1 и реле 2''' замыкаются и приводы закрывают шаровые краны. '''Реле 3''' замыкается и включает зуммер. '''Вход 2''' запрограммируем для сброса тревоги и открытия шаровых кранов.
| |
|
| |
| <!--T:43-->
| |
| Очистим mapping-матрицу:
| |
| <syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x10 -r384 $(printf ' 0%.0s' {1..64})</syntaxhighlight>
| |
|
| |
| <!--T:44-->
| |
| Применим в нашем случае режим, когда состояние входа повторяется каждые 20 минут, для этого запишем в регистр 9 значение 5 (управлять в соответствии с mapping-матрицей, через 20 минут повторно имитировать состояние ввода), а в остальные — значение 4 (управлять в соответствии с mapping-матрицей).
| |
|
| |
| <!--T:45-->
| |
| <syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x10 -r9 5 4 4 4 4 4</syntaxhighlight>
| |
|
| |
| <!--T:46-->
| |
| Для входа датчика протечки (вход 1) используем режим 1000 (8) — включать при замыкании. [[File:Mm_1000.png|frameless|270px]]<br> Для входа кнопки сброса (вход 2) используем режим 0100 (4) — выключить при замыкании. [[File:Mm_0100.png|frameless|270px]]<br>
| |
|
| |
| <!--T:47-->
| |
| По карте mapping-регистров определяем, что для входа 1 надо записать значение 8 в регистры 384, 385, 386, а для входа 2 — записать значение 4 в регистры 392, 393, 394:
| |
|
| |
| <!--T:48-->
| |
| <syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x10 -r384 8 8 8</syntaxhighlight>
| |
| <syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x10 -r392 4 4 4</syntaxhighlight>
| |
|
| |
|
| |
| <!--T:49-->
| |
| Проверка: замкнем вход 1 и iGND и оставим его замкнутым. Должны включиться реле 1, 2 и 3. Затем замкнем и разомкнем вход 2 — все три реле реле выключились. Ждем 20 минут. Поскольку вход 1 остается замкнутым (протечка не устранена), через 20 минут реле 1, 2 и 3 снова включатся.
| |
|
| |
| <!--T:50-->
| |
| Оставляя вход 1 замкнутым, выключим и включим питание реле: через 20 минут реле 1, 2 и 3 снова включатся.
| |
| </translate> | | </translate> |