I/O Mapping Matrix: различия между версиями

Материал из Wiren Board
Строка 3: Строка 3:
<!--T:1-->
<!--T:1-->
{{DISPLAYTITLE: I/O Mapping Matrix}}
{{DISPLAYTITLE: I/O Mapping Matrix}}
<!--T:2-->
[[File:WB-MWAC-FRONT.png|300px|thumb|right| Модуль учета водопотребления и контроля протечек WB-MWAC]]


=== Назначение === <!--T:3-->
=== Назначение === <!--T:3-->
Матрица действий над выходами по изменению состояний входов позволяет гибко настраивать реакцию устройства в зависимости от состояния его входов.
Матрица действий над выходами по изменению состояний входов позволяет гибко настраивать реакцию устройства в зависимости от изменения его входов.
Эта функциональность появилась с версии '''1.9.0''' для устройств серии '''WB-MR''' и [[WB-MWAC]].
Эта функциональность появилась с версии '''1.9.0''' для устройств серии '''WB-MR''' и [[WB-MWAC]].


== Устройство и принцип работы == <!--T:4-->
== Устройство и принцип работы == <!--T:4-->
{| class="wikitable" style="float:right; margin-left: 10px;"
! Регистры !!  !! colspan="8"| Выходы
|-
!
|  || '''1''' || '''2''' || '''3''' || '''4''' || '''5''' || '''6''' || '''7''' || '''8'''
|-
!rowspan="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 выходов.
Mapping-матрица находится в регистрах начиная с адреса 384, и содержит 64 регистра из расчета 8 входов / 8 выходов.
В каждом регистре записан код действия входа на выход.
В каждом регистре записан код действия входа на выход.


<!--T:5-->
<!--T:5-->
Строки описывают действия при изменении соответствующего входа, столбцы — соответствующие выходы.
В ячейке на пересечении строки входа и столбца выхода - регистр действия входа на выход.
Таким образом в ячейке на пересечении сроки входа и столбца выхода содержится значение, задающее работу выхода при изменении соответствующего входа.
В него записывается шестнадцатибитное слово '''0b0000 0000 0000 yyxx''', где биты '''yy''' описывают действия при замыкании входа (переход из 0 в 1,передний фронт), а биты '''xx''' — при размыкании (из 1 в 0, задний фронт).
Действие описывается значением младших четырех бит шестнадцатибитного слова '''0b0000 0000 0000 yyxx''', хранящегося в регистре.
Биты '''yy''' описывают действия при переходе значения входа из 0 в 1 (передний фронт), а биты '''xx''' — из 1 в 0 (задний фронт).


<!--T:6-->
Каждая комбинация из двух бит описывает четыре возможных действия:


Действия, в зависимости от битов:
<!--T:7-->
<!--T:7-->
*00 — ничего не делать
*00 — ничего не делать
Строка 92: Строка 109:
| style="text-align:center;vertical-align:bottom;" | [[File:Mm_1111.png|frameless|270px]]<br>(15, 0x0F) — Изменить состояние при замыкании<br>и вернуться к исходному состоянию<br>при размыкании
| style="text-align:center;vertical-align:bottom;" | [[File:Mm_1111.png|frameless|270px]]<br>(15, 0x0F) — Изменить состояние при замыкании<br>и вернуться к исходному состоянию<br>при размыкании
|}
|}
==Карта регистров mapping-матрицы == <!--T:10-->
{| class="wikitable"
! Регистры !!  !! colspan="8"| Выходы
|-
!
|  || '''1''' || '''2''' || '''3''' || '''4''' || '''5''' || '''6''' || '''7''' || '''8'''
|-
!rowspan="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
|}
== Предыдущая версия настройки взаимодействия входов и выходов релейных модулей == <!--T:11-->
<!--T:12-->
В новых прошивках также сохранился механизм управления связями вход-выход из предыдущих прошивок. Holding-регистр 5 описывает поведение всех входов, а регистры с 9 по 9+x-1 (x — число реле в модуле) и регистр 16 (нулевой вход) — поведение каждого отдельного входа.
<!--T:13-->
Регистры могут содержать следующие управляющие значения:
<!--T:14-->
{| class="wikitable"
! Значение регистра !! Режим работы входов !! Примечание
|-
| 0 || Кнопки без фиксации (триггерный режим). В этом режиме для изменения состояния реле достаточно однократно замкнуть и разомкнуть вход. Изменение состояния происходят по переднему фронту (то есть при замыкании) ||
|-
| 1 || Выключатель с фиксацией. Реле повторяет состояние входа, в момент переключения входа происходит событие которое меняет состояние реле. Если позже реле будет переключено Modbus-командой, то состояние входа не будет влиять на реле до следующего переключения. В момент включения модуля состояние входа не учитывается: если на входе будет замкнутое состояние, то реле не будет включено во избежание не желательного включения (например, когда вечером свет был выключен командой с контроллера, выключатель остался включенным, ночью пропадало питание, модуль перезагрузился, но свет при этом не включится). ||
|-
| 2 || Отключать все реле при нажатии (по умолчанию такой режим имеет вход 0) || с прошивки 1.9.0
|-
| 3 || Отключить взаимодействие входов и выходов: изменение входа на влияет на состояние реле ||
|-
| 4 || Управлять в соответствии с Mapping-матрицей || с прошивки 1.9.0
|-
| 5 || Управлять в соответствии с Mapping-матрицей, <br>через 20 минут повторно имитировать состояние ввода || с прошивки 1.9.0
|}
<!--T:15-->
Настройка управления режима отдельных входов возможно, только если в holding-регистре 5 записано значение 0. В последних прошивках в заводской поставке все регистры режима входов содержат 0, кроме регистра 16  — в нем записано значение 2, что обеспечивает работу входа 0 как "аварийного" — при нажатии на кнопку без фиксации, подсоединенную к этому входу, все реле выключатся. Повторное нажатие оставит все реле выключенными.
<!--T:16-->
Повторная имитация состояния ввода через 20 минут (режим 5) означает, что каждые 20 минут над выходом будет выполняться действие (согласно матрице), как будто вход только что изменил состояние: если вход замкнут, то выполняется действие по переднему фронту. Если разомкнут — то по заднему. Такой режим обеспечивает дополнительную надежность при управлении реле датчиками протечки, подключенными ко входам. Отрабатывается следующий сценарий: при замыкании входа датчиком протечки шаровой кран перекрывает воду. В какой-то момент поступает команда на открытие крана (например, по Modbus). Но, если протечка все еще фиксируется датчиком, через 20 минут кран снова будет перекрыт.


== Примеры программирования взаимодействия входов и выходов == <!--T:17-->
== Примеры программирования взаимодействия входов и выходов == <!--T:17-->

Версия 18:21, 25 апреля 2020

Другие языки:


Назначение

Матрица действий над выходами по изменению состояний входов позволяет гибко настраивать реакцию устройства в зависимости от изменения его входов. Эта функциональность появилась с версии 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 Mm 0000.png
(0) — Вход отключен, не управляет выходами
Mm 0001.png
(1) — Выключить при размыкании
Mm 0010.png
(2) — Включить при размыкании
Mm 0011.png
(3) — Изменить состояние выхода при размыкании
01 Mm 0100.png
(4) — Выключить при замыкании
Mm 0101.png
(5) — Всегда выключать
Mm 0110.png
(6) — Работать как инвертированный
выключатель с фиксацией
Mm 0111.png
(7) — Выключить при размыкании, потом
изменять состояние при переключении
10 Mm 1000.png
(8) — Включить при замыкании
Mm 1001.png
(9) — Работать как выключатель с фиксацией
(повторять вход)
Mm 1010.png
(10, 0x0A)— Всегда включать
Mm 1011.png
(11, 0x0B) — Включить, потом изменять
состояние при размыкании
11 Mm 1100.png
(12, 0x0C) — Изменить состояние выхода
при замыкании
(выключатель без фиксации)
Mm 1101.png
(13, 0x0D) — Изменить состояние, потом
выключить при размыкании
Mm 1110.png
(14, 0x0E) — Изменить состояние, потом
включить при размыкании
Mm 1111.png
(15, 0x0F) — Изменить состояние при замыкании
и вернуться к исходному состоянию
при размыкании

Примеры программирования взаимодействия входов и выходов

Рассмотрим несколько примеров программирования программирования взаимодействия входов и выходов на примере релейного модуля WB-MR6C с прошивкой 1.9.4. Модуль имеет 7 входов типа "сухой контакт" и 6 релейных выходов. Вход 0 по умолчанию используется для отключения всех реле модулей, а кнопки 1 — 6 для управления модулями реле.

В примерах ориентируемся на заводские настройки параметров коммуникации модуля, Modbus-адрес — 1. Модуль подключен к первому порту контроллера Wiren Board 6.


Все примеры выполняются при остановленном драйвере wb-mqtt-serial:

service wb-mqtt-serial stop

Выключатели с фиксацией

Запишем в регистр 5 значение 1:

modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x06 -r5 1

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


Чтобы сохранить "аварийный" режим входа 0 вернем в регистр 5 значение 0, а в регистры 9, 10, 11, 12, 13, 14 запишем 1:

modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x06 -r5 0
modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x10 -r9 1 1 1 1 1 1

Теперь все входы функционируют в режиме выключателей с фиксацией, а кратковременное нажатие на кнопку, подключенную ко входу 0, выключит все реле.

Отключить взаимодействие входов и реле

Для отключения взаимодействия входов и реле (например, если мы хотим управлять реле только через движок правил контроллера) запишем в регистр 5 значение 0, а в регистры 9, 10, 11, 12, 13, 14 запишем значение 3:

modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x06 -r5 0
modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x10 -r9 3 3 3 3 3 3

Теперь нажатия на кнопки или переключение выключателей не будет изменять состояние реле: ими можно управлять только программно, по Modbus. При этом функция аварийного входа 0 сохраняется: кратковременное нажатие на кнопку, подключенную ко входу 0, выключит все реле.

Если мы хотим отключить и вход 0, то запишем значение 3 в регистр 16:

modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x06 -r16 3


Использование Mapping-матрицы

Более сложные сценарии взаимодействия входов с реле можно реализовать с помощью Mapping-матрицы. Для использования Mapping-матрицы запишем в holding-регистр 5 значение 0:

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

А в регистры настройки взаимодействия входов/выходов — значение 4:

modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x10 -r9 4 4 4 4 4 4
modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x06 -r16 4

В заводской поставке Mapping-матрица заполнена нулями. Если вы не уверены в этом и хотите стереть всю матрицу, запишите 0 в каждый из 64 holding-регистров, начиная с 384:

modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x10 -r384 $(printf ' 0%.0s' {1..64})

Вход 0 включает и выключает все реле

Запрограммируем матрицу таким образом, чтобы вход 0, работая в режиме кнопки (выключателя без фиксации) последовательно включал и отключал все реле модуля при замыкании.

Для этого обратимся к карте регистров mapping-матрицы и увидим, что входу 0 соответствуют регистры 440 — 447. Причем за взаимодействие со входами 1 — 6 отвечают регистры 440 — 445.


Мы хотим, чтобы вход работал, как выключатель без фиксации и срабатывал при нажатии (по переднему фронту), а при размыкании ничего бы не происходило. При каждом нажатии состояние всех реле должно инвертироваться. Это соответствует комбинации 11 00: (12, 0x0C) — Изменить состояние выхода при замыкании: Mm 1100.png
Запишем в регистры 440 — 445 значение 12:

modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x10 -r440 12 12 12 12 12 12

Проверим работу: при первом замыкании входа 0 все реле включаются, при втором — все реле выключаются.


Инвертированный выключатель с фиксацией

Настроим входы таким образом, чтобы при замкнутых входах реле были бы выключены, а при разомкнутых -- включены. Для этого при замыкании входа (передний фронт) соответствующий выход должен выключаться (01), а при размыкании входа (задний фронт) — включаться (10). Это соответствует значению 6: Mm 0110.png
В матрице нужные регистры взаимодействия вход 1 — выход 1, вход 2 — выход 2 и т.д. расположены по диагонали. Это регистры 384, 393, 402, 411, 420, 429. В них надо записать значение 6:

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

Обратите внимание: изменение состояния реле происходят только при изменении состояния ввода.

Датчик протечки

Пусть датчик протечки подключен ко входу 1, а реле 1 и 2 управляют приводами шаровых кранов. Реле 3 управляет сигнальной лампой или зуммером. При смачивании датчика протечки реле 1 и реле 2 замыкаются и приводы закрывают шаровые краны. Реле 3 замыкается и включает зуммер. Вход 2 запрограммируем для сброса тревоги и открытия шаровых кранов.

Очистим mapping-матрицу:

modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x10 -r384 $(printf ' 0%.0s' {1..64})

Применим в нашем случае режим, когда состояние входа повторяется каждые 20 минут, для этого запишем в регистр 9 значение 5 (управлять в соответствии с mapping-матрицей, через 20 минут повторно имитировать состояние ввода), а в остальные — значение 4 (управлять в соответствии с mapping-матрицей).

modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x10 -r9 5 4 4 4 4 4

Для входа датчика протечки (вход 1) используем режим 1000 (8) — включать при замыкании. Mm 1000.png
Для входа кнопки сброса (вход 2) используем режим 0100 (4) — выключить при замыкании. Mm 0100.png

По карте mapping-регистров определяем, что для входа 1 надо записать значение 8 в регистры 384, 385, 386, а для входа 2 — записать значение 4 в регистры 392, 393, 394:

modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x10 -r384 8 8 8
modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x10 -r392 4 4 4


Проверка: замкнем вход 1 и iGND и оставим его замкнутым. Должны включиться реле 1, 2 и 3. Затем замкнем и разомкнем вход 2 — все три реле реле выключились. Ждем 20 минут. Поскольку вход 1 остается замкнутым (протечка не устранена), через 20 минут реле 1, 2 и 3 снова включатся.

Оставляя вход 1 замкнутым, выключим и включим питание реле: через 20 минут реле 1, 2 и 3 снова включатся.