I/O Mapping Matrix: различия между версиями
Kt315 (обсуждение | вклад) |
Kilpio (обсуждение | вклад) |
||
(не показано 80 промежуточных версий 11 участников) | |||
Строка 1: | Строка 1: | ||
{{DISPLAYTITLE: | {{DISPLAYTITLE: I/O Mapping Matrix}} | ||
'''СТАТЬЯ В ПРОЦЕССЕ РЕДАКТИРОВАНИЯ''' | |||
[[ | [[File:WB-MWAC-FRONT.png|300px|thumb|right| Модуль учета водопотребления и контроля протечек WB-MWAC]] | ||
=== Назначение === | |||
Начиная с версии '''1.9.0''' для устройств серии '''WB-MR''' и [[WB-MWAC]] в прошивке реализована поддержка матрицы отображения значений входов на значения выходов. Данная дополнительная функциональность позволяет максимально гибко настраивать реакцию конкретных выходов устройства в зависимости от состояния его входов. | |||
== | == Устройство и принцип работы mapping-матрицы == | ||
Матрица действий над выходами по изменению состояний входов (mapping-матрица) находится в регистрах хранения устройства, начиная с адреса 384, и содержит 64 регистра из расчета 8 входов / 8 выходов. | |||
В каждом регистре записано одно из числовых значений, которыми кодируется взаимодействие одного из входов с одним из выходов. | |||
Строки описывают действия при изменении соответствующего входа, столбцы — соответствующие выходы. | |||
Таким образом в ячейке на пересечении сроки входа и столбца выхода содержится значение, задающее работу выхода при изменении соответствующего входа. | |||
Действие описывается значением младших четырех бит шестнадцатибитного слова '''0b0000 0000 0000 yyxx''', хранящегося в регистре. | |||
Биты '''yy''' описывают действия при переходе значения входа из 0 в 1 (передний фронт), а биты '''xx''' — из 1 в 0 (задний фронт). | |||
Каждая комбинация из двух бит описывает четыре возможных действия: | |||
*00 — ничего не делать | |||
*01 — выключить | |||
*10 — включить | |||
*11 — инвертировать значение | |||
Таким образом, можно запрограммировать реакцию каждого выхода на включение и отключение любых входов. | |||
<!-- | |||
{| class="wikitable" | |||
! !! !! ! colspan="4" |Задний фронт | |||
{| class="wikitable" | |||
! | |||
|- | |- | ||
! | ! | ||
| || | | || 00 || 01 || 10 || 11 | ||
|- | |- | ||
!rowspan=" | ! rowspan="4"|Передний<br>фронт | ||
| | | 00 | ||
| 0000 (0) — Вход отключен, не управляет выходами | |||
| 0001 (1)— Выключить при размыкании | |||
| 0010 (2) — Включить при размыкании | |||
| 0011 (3) — Изменить состояние выхода при размыкании | |||
|- | |- | ||
| | | 01 | ||
| 0100 (4) — Выключить при замыкании | |||
| 0101 (5)— Всегда выключать | |||
| 0110 (6) — Работать как инвертированный выключатель с фиксацией | |||
| 0111 (7) — Выключить при размыкании, потом изменять состояние при переключении | |||
|- | |- | ||
| | | 10 || 1000 (8) — Включить при замыкании || 1001 (9) — Работать как выключатель с фиксацией (повторять вход) || 1010 (10, 0x0A)— Всегда включать || 1011 (11, 0x0B) — Включить, потом изменять состояние при размыкании | ||
|- | |- | ||
| | | 11 || 1100 (12, 0x0C) — Изменить состояние выхода при замыкании (выключатель без фиксации) || 1101 (13, 0x0D) — Изменить состояние, потом выключить при размыкании || 1110 (14, 0x0E) — Изменить состояние, потом включить при размыкании || 1111 (15, 0x0F)— Изменить состояние при замыкании и вернуться к исходному состоянию при размыкании | ||
|} | |} | ||
--> | |||
{| class="wikitable" | {| class="wikitable" | ||
! | ! !! !! ! colspan="4" |Задний фронт | ||
|- | |- | ||
! | ! | ||
| || ''' | | || style="text-align:center;"| '''00''' || style="text-align:center;"| '''01''' || style="text-align:center;"| '''10''' || style="text-align:center;"| '''11''' | ||
|- | |- style="vertical-align:center;" | ||
!rowspan=" | ! rowspan="4"|Передний<br>фронт | ||
| '''1''' || | | '''00''' | ||
|- | | style="text-align:center;vertical-align:bottom;" | [[File:Mm_0000.png|frameless|270px]]<br>(0) — Вход отключен, не управляет выходами | ||
| ''' | | style="text-align:center;vertical-align:bottom;" | [[File:Mm_0001.png|frameless|270px]]<br>(1) — Выключить при размыкании | ||
|- | | style="text-align:center;vertical-align:bottom;" | [[File:Mm_0010.png|frameless|270px]]<br>(2) — Включить при размыкании | ||
| style="text-align:center;vertical-align:bottom;" | [[File:Mm_0011.png|frameless|270px]]<br>(3) — Изменить состояние выхода при размыкании | |||
|- style="vertical-align:center;" | |||
| '''01''' | |||
| style="text-align:center;vertical-align:bottom;" | [[File:Mm_0100.png|frameless|270px]]<br>(4) — Выключить при замыкании | |||
| style="text-align:center;vertical-align:bottom;" | [[File:Mm_0101.png|frameless|270px]]<br>(5) — '''Всегда выключать''' | |||
| style="text-align:center;vertical-align:bottom;" | [[File:Mm_0110.png|frameless|270px]]<br>(6) — Работать как инвертированный <br>выключатель с фиксацией | |||
| style="text-align:center;vertical-align:bottom;" | [[File:Mm_0111.png|frameless|270px]]<br>(7) — Выключить при размыкании, потом <br>изменять состояние при переключении | |||
|- style="vertical-align:center;" | |||
| '''10''' | |||
| style="text-align:center;vertical-align:bottom;" | [[File:Mm_1000.png|frameless|270px]]<br>(8) — Включить при замыкании | |||
| style="text-align:center;vertical-align:bottom;" | [[File:Mm_1001.png|frameless|270px]]<br>(9) — Работать как '''выключатель с фиксацией''' <br>(повторять вход) | |||
| style="text-align:center;vertical-align:bottom;" | [[File:Mm_1010.png|frameless|270px]]<br>(10, 0x0A)— Всегда включать | |||
| style="text-align:center;vertical-align:bottom;" | [[File:Mm_1011.png|frameless|270px]]<br>(11, 0x0B) — Включить, потом изменять <br>состояние при размыкании | |||
|- style="vertical-align:center;" | |||
| '''11''' | |||
| style="text-align:center;vertical-align:bottom;" | [[File:Mm_1100.png|frameless|270px]]<br>(12, 0x0C) — Изменить состояние выхода <br>при замыкании<br>('''выключатель без фиксации''') | |||
| style="text-align:center;vertical-align:bottom;" | [[File:Mm_1101.png|frameless|270px]]<br>(13, 0x0D) — Изменить состояние, потом <br>выключить при размыкании | |||
| style="text-align:center;vertical-align:bottom;" | [[File:Mm_1110.png|frameless|270px]]<br>(14, 0x0E) — Изменить состояние, потом <br>включить при размыкании | |||
| style="text-align:center;vertical-align:bottom;" | [[File:Mm_1111.png|frameless|270px]]<br>(15, 0x0F) — Изменить состояние при замыкании<br>и вернуться к исходному состоянию<br>при размыкании | |||
|} | |} | ||
== | ==Карта регистров mapping-матрицы == | ||
{| class="wikitable" | |||
{| class="wikitable" | ! Регистры !! !! colspan="8"| Выходы | ||
! Регистры !! !! colspan="8"| Выходы | |||
|- | |- | ||
! | ! | ||
| || ''' | | || '''0''' || '''1''' || '''2''' || '''3''' || '''4''' || '''5''' || '''6''' || '''7''' | ||
|- | |- | ||
!rowspan="8" |Входы | !rowspan="8" |Входы | ||
| ''' | | '''0''' || 384 || 385 || 386 || 387 || 388 || 389 || 390 || 391 | ||
|- | |- | ||
| ''' | | '''1''' || 392 || 393 || 394 || 395 || 396 || 397 || 398 || 399 | ||
|- | |- | ||
| ''' | | '''2''' || 400 || 401 || 402 || 403 || 404 || 405 || 406 || 407 | ||
|- | |- | ||
| ''' | | '''3''' || 408 || 409 || 410 || 411 || 412 || 413 || 414 || 415 | ||
|- | |- | ||
| ''' | | '''4''' || 416 || 417 || 418 || 419 || 420 || 421 || 422 || 423 | ||
|- | |- | ||
| ''' | | '''5''' || 424 || 425 || 426 || 427 || 428 || 429 || 430 || 431 | ||
|- | |- | ||
| ''' | | '''6''' || 432 || 433 || 434 || 435 || 436 || 437 || 438 || 439 | ||
|- | |- | ||
| ''' | | '''7''' || 440 || 441 || 442 || 443 || 444 || 445 || 446 || 447 | ||
|} | |} | ||
=== | == Предыдущая версия настройки взаимодействия входов и выходов релейных модулей == | ||
В новых прошивках также сохранился механизм управления связями вход-выход из предыдущих прошивок. Holding-регистр 5 описывает поведение всех входов, а регистры с 9 по 9+x-1 (x — число реле в модуле) и регистр 16 (нулевой вход) — поведение каждого отдельного входа. | |||
Регистры могут содержать следующие управляющие значения: | |||
{| class="wikitable" | {| class="wikitable" | ||
! | ! Значение регистра !! Режим работы входов !! Примечание | ||
|- | |- | ||
| | | 0 || Кнопки без фиксации || | ||
|- | |- | ||
| | | 1 || Выключатель с фиксацией || | ||
|- | |- | ||
| 2 || Отключать все реле при нажатии || с прошивки 1.9.0 | |||
| | |||
|- | |- | ||
| 3 || Отключить взаимодействие входов и выходов || | |||
| | |||
|- | |- | ||
| | | 4 || Управлять в соответствии с Mapping-матрицей || с прошивки 1.9.0 | ||
|- | |- | ||
| | | 5 || Управлять в соответствии с Mapping-матрицей, <br>через 20 минут повторно имитировать состояние ввода || с прошивки 1.9.0 | ||
|- | |||
|} | |} | ||
Настройка управления режима отдельных входов возможно, только если в holding-регистре 5 записано значение 0. В последних прошивках в заводской поставке все регистры режима входов содержат 0, кроме регистра 16 — в нем записано значение 2, что обеспечивает работу входа 0 как "аварийного" — при нажатии на кнопку без фиксации, подсоединенную к этому входу, все реле выключатся. Повторное нажатие оставит все реле выключенными. | |||
== | == Примеры программирования взаимодействия входов и выходов == | ||
Рассмотрим несколько примеров программирования программирования взаимодействия входов и выходов на примере релейного модуля WB-MR6C с прошивкой 1.9.4. Модуль имеет 7 входов типа "сухой контакт" и 6 релейных выходов. Вход 0 по умолчанию используется для отключения всех реле модулей, а кнопки 1 — 6 для управления модулями реле. | |||
В примерах ориентируемся на заводские настройки параметров коммуникации модуля, Modbus-адрес — 1. Модуль подключен к первому порту контроллера Wiren Board 6. | |||
=== | === Выключатели с фиксацией === | ||
Запишем в регистр 5 значение 1: | |||
<pre>modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x06 -r5 1</pre> | |||
Теперь все входы модуля функционируют как входы для выключателей с фиксацией. | |||
Недостаток: Вход 0 перестает функционировать. | |||
Чтобы сохранить "аварийный" режим входа 0 вернем в регистр 5 значение 0, а в регистры 9, 10, 11, 12, 13, 14 запишем 1: | |||
<pre>modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x06 -r5 0</pre> | |||
<pre>modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x10 -r9 1 1 1 1 1 1</pre> | |||
Теперь все входы функционируют в режиме выключателей с фиксацией, а кратковременное нажатие на кнопку, подключенную ко входу 0, выключит все реле. | |||
=== Отключить взаимодействие входов и реле === | |||
Для отключения взаимодействия входов и реле (например, если мы хотим управлять реле только через движок правил контроллера) запишем в регистр 5 значение 0, а в регистры 9, 10, 11, 12, 13, 14 запишем значение 3: | |||
<pre>modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x06 -r5 0</pre> | |||
<pre>modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x10 -r9 3 3 3 3 3 3</pre> | |||
Теперь нажатия на кнопки или переключение выключателей не будет изменять состояние реле: ими можно управлять только программно, по Modbus. | |||
При этом функция аварийного входа 0 сохраняется: кратковременное нажатие на кнопку, подключенную ко входу 0, выключит все реле. | |||
Если мы хотим отключить и вход 0, то запишем значение 3 в регистр 16: | |||
<pre>modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x06 -r16 3</pre> | |||
=== Использование Mapping-матрицы === | |||
Более сложные сценарии взаимодействия входов с реле можно реализовать с помощью Mapping-матрицы. | |||
Для использования Mapping-матрицы запишем в holding-регистр 5 значение 0: | |||
<pre>modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x06 -r5 4</pre> | |||
А в регистры настройки взаимодействия входов/выходов — значение 4: | |||
<pre>modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x10 -r9 4 4 4 4 4 4</pre> | |||
<pre>modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x06 -r16 4</pre> | |||
В заводской поставке Mapping-матрица заполнена нулями. Если вы не уверены в этом и хотите стереть всю матрицу, запишите 0 в каждый из 64 holding-регистров, начиная с 384: | |||
<pre>modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x10 -r384 $(printf ' 0%.0s' {1..64})</pre> | |||
==== Вход 0 включает и выключает все реле ==== | |||
Запрограммируем матрицу таким образом, чтобы вход 0, работая в режиме кнопки (выключателя без фиксации) последовательно включал и отключал все реле модуля при замыкании. | |||
Для этого обратимся к карте регистров mapping-матрицы и увидим, что входу 0 соответствуют регистры 384, 385, 386, 387, 388, 389, 390, 391. Причем за взаимодействие со входами 1 — 6 отвечают регистры 385 — 390. | |||
Мы хотим, чтобы вход работал, как выключатель без фиксации и срабатывал при нажатии (по переднему фронту), а при размыкании ничего бы не происходило. При каждом нажатии состояние всех реле должно инвертироваться. Это соответствует комбинации 11 00: (12, 0x0C) — Изменить состояние выхода при замыкании: | |||
[[File:Mm_1100.png|frameless|270px]] | |||
| | |||
| |
Версия 17:40, 2 апреля 2019
СТАТЬЯ В ПРОЦЕССЕ РЕДАКТИРОВАНИЯ
Назначение
Начиная с версии 1.9.0 для устройств серии WB-MR и WB-MWAC в прошивке реализована поддержка матрицы отображения значений входов на значения выходов. Данная дополнительная функциональность позволяет максимально гибко настраивать реакцию конкретных выходов устройства в зависимости от состояния его входов.
Устройство и принцип работы mapping-матрицы
Матрица действий над выходами по изменению состояний входов (mapping-матрица) находится в регистрах хранения устройства, начиная с адреса 384, и содержит 64 регистра из расчета 8 входов / 8 выходов. В каждом регистре записано одно из числовых значений, которыми кодируется взаимодействие одного из входов с одним из выходов.
Строки описывают действия при изменении соответствующего входа, столбцы — соответствующие выходы. Таким образом в ячейке на пересечении сроки входа и столбца выхода содержится значение, задающее работу выхода при изменении соответствующего входа. Действие описывается значением младших четырех бит шестнадцатибитного слова 0b0000 0000 0000 yyxx, хранящегося в регистре. Биты yy описывают действия при переходе значения входа из 0 в 1 (передний фронт), а биты xx — из 1 в 0 (задний фронт).
Каждая комбинация из двух бит описывает четыре возможных действия:
- 00 — ничего не делать
- 01 — выключить
- 10 — включить
- 11 — инвертировать значение
Таким образом, можно запрограммировать реакцию каждого выхода на включение и отключение любых входов.
Карта регистров mapping-матрицы
Регистры | Выходы | ||||||||
---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ||
Входы | 0 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 |
1 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | |
2 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | |
3 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | |
4 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | |
5 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | |
6 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | |
7 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 |
Предыдущая версия настройки взаимодействия входов и выходов релейных модулей
В новых прошивках также сохранился механизм управления связями вход-выход из предыдущих прошивок. Holding-регистр 5 описывает поведение всех входов, а регистры с 9 по 9+x-1 (x — число реле в модуле) и регистр 16 (нулевой вход) — поведение каждого отдельного входа.
Регистры могут содержать следующие управляющие значения:
Значение регистра | Режим работы входов | Примечание |
---|---|---|
0 | Кнопки без фиксации | |
1 | Выключатель с фиксацией | |
2 | Отключать все реле при нажатии | с прошивки 1.9.0 |
3 | Отключить взаимодействие входов и выходов | |
4 | Управлять в соответствии с Mapping-матрицей | с прошивки 1.9.0 |
5 | Управлять в соответствии с Mapping-матрицей, через 20 минут повторно имитировать состояние ввода |
с прошивки 1.9.0 |
Настройка управления режима отдельных входов возможно, только если в holding-регистре 5 записано значение 0. В последних прошивках в заводской поставке все регистры режима входов содержат 0, кроме регистра 16 — в нем записано значение 2, что обеспечивает работу входа 0 как "аварийного" — при нажатии на кнопку без фиксации, подсоединенную к этому входу, все реле выключатся. Повторное нажатие оставит все реле выключенными.
Примеры программирования взаимодействия входов и выходов
Рассмотрим несколько примеров программирования программирования взаимодействия входов и выходов на примере релейного модуля WB-MR6C с прошивкой 1.9.4. Модуль имеет 7 входов типа "сухой контакт" и 6 релейных выходов. Вход 0 по умолчанию используется для отключения всех реле модулей, а кнопки 1 — 6 для управления модулями реле.
В примерах ориентируемся на заводские настройки параметров коммуникации модуля, Modbus-адрес — 1. Модуль подключен к первому порту контроллера Wiren Board 6.
Выключатели с фиксацией
Запишем в регистр 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 4
А в регистры настройки взаимодействия входов/выходов — значение 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 соответствуют регистры 384, 385, 386, 387, 388, 389, 390, 391. Причем за взаимодействие со входами 1 — 6 отвечают регистры 385 — 390.
Мы хотим, чтобы вход работал, как выключатель без фиксации и срабатывал при нажатии (по переднему фронту), а при размыкании ничего бы не происходило. При каждом нажатии состояние всех реле должно инвертироваться. Это соответствует комбинации 11 00: (12, 0x0C) — Изменить состояние выхода при замыкании: