|
|
Строка 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> |
Назначение
Матрица действий над выходами по изменению состояний входов позволяет гибко настраивать реакцию устройства в зависимости от изменения его входов.
Эта функциональность появилась с версии 1.9.0 для устройств серии WB-MR и WB-MWAC.
Устройство и принцип работы
Регистры |
|
Выходы
|
|
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8
|
Входы
|
1 |
384 |
385 |
386 |
387 |
388 |
389 |
390 |
391
|
2 |
392 |
393 |
394 |
395 |
396 |
397 |
398 |
399
|
3 |
400 |
401 |
402 |
403 |
404 |
405 |
406 |
407
|
4 |
408 |
409 |
410 |
411 |
412 |
413 |
414 |
415
|
5 |
416 |
417 |
418 |
419 |
420 |
421 |
422 |
423
|
6 |
424 |
425 |
426 |
427 |
428 |
429 |
430 |
431
|
7 |
432 |
433 |
434 |
435 |
436 |
437 |
438 |
439
|
0 |
440 |
441 |
442 |
443 |
444 |
445 |
446 |
447
|
Mapping-матрица находится в регистрах начиная с адреса 384, и содержит 64 регистра из расчета 8 входов / 8 выходов.
В каждом регистре записан код действия входа на выход.
В ячейке на пересечении строки входа и столбца выхода - регистр действия входа на выход.
В него записывается шестнадцатибитное слово 0b0000 0000 0000 yyxx, где биты yy описывают действия при замыкании входа (переход из 0 в 1,передний фронт), а биты xx — при размыкании (из 1 в 0, задний фронт).
Действия, в зависимости от битов:
- 00 — ничего не делать
- 01 — выключить
- 10 — включить
- 11 — инвертировать значение
Таким образом, можно запрограммировать реакцию каждого выхода на замыкание и размыкание любых входов.
|
|
Задний фронт
|
|
|
00 |
01 |
10 |
11
|
Передний фронт
|
00
|
(0) — Вход отключен, не управляет выходами
|
(1) — Выключить при размыкании
|
(2) — Включить при размыкании
|
(3) — Изменить состояние выхода при размыкании
|
01
|
(4) — Выключить при замыкании
|
(5) — Всегда выключать
|
(6) — Работать как инвертированный выключатель с фиксацией
|
(7) — Выключить при размыкании, потом изменять состояние при переключении
|
10
|
(8) — Включить при замыкании
|
(9) — Работать как выключатель с фиксацией (повторять вход)
|
(10, 0x0A)— Всегда включать
|
(11, 0x0B) — Включить, потом изменять состояние при размыкании
|
11
|
(12, 0x0C) — Изменить состояние выхода при замыкании (выключатель без фиксации)
|
(13, 0x0D) — Изменить состояние, потом выключить при размыкании
|
(14, 0x0E) — Изменить состояние, потом включить при размыкании
|
(15, 0x0F) — Изменить состояние при замыкании и вернуться к исходному состоянию при размыкании
|
Примеры программирования взаимодействия входов и выходов
Еxamples of interaction