Старая mapping-матрица для управления по фронтам сигнала

Материал из Wiren Board
Это утверждённая версия страницы. Она же — наиболее свежая версия.


Общие сведения

В версиях прошивки до 1.19.0 была только одна mapping-матрица для управления по фронтам сигнала, она поддерживается и в новых версиях прошивки и находится в регистрах начиная с адреса 384, и содержит 64 регистра из расчета 8 входов / 8 выходов. В каждом регистре записан код действия входа на выход.

Регистры Выходы MR3-6
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

Если в устройстве количество входов и/или выходов меньше 8, то адреса регистров не меняются — просто строки/столбцы для отсутствующих регистров не учитываются. Исключение — устройства с 2 входами и выходами.

Регистры Выходы MR2
1 2
Входы 1 384 385
2 386 387

В ячейке на пересечении строки входа и столбца выхода — регистр действия входа на выход. В него записывается 16-битное слово 0b0000 0000 0000 yyxx, где биты yy описывают действия при замыкании входа (переход из 0 в 1, передний фронт), а биты xx — при размыкании (из 1 в 0, задний фронт).

Действия, в зависимости от битов:

  • 00 — ничего не делать
  • 01 — выключить
  • 10 — включить
  • 11 — инвертировать значение

Таким образом, можно запрограммировать реакцию каждого выхода на замыкание и размыкание любых входов.

Задний фронт
00 01 10 11
Передний
фронт
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)— Изменить состояние при замыкании и вернуться к исходному состоянию при размыкании
Биты xx — размыкание входа
00 01 10 11
Биты yy, замыкание входа 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) — Изменить состояние при замыкании
и вернуться к исходному состоянию
при размыкании

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

Чтение настроек

Зачастую перед настройкой имеет смысл считать содержимое регистров mapping-матрицы, сделать это можно одной командой.

Например, считаем с устройства с адресом 1 и работающего на скорости 9600 бит/с, 64 идущих подряд регистра, начиная с 384-го — это регистры классической mapping-матрицы реле:

# modbus_client -mrtu -b9600 -pnone -s2 /dev/ttyRS485-1 -a1 -t0x03 -r384 -c64
SUCCESS: read 64 of elements:
        Data: 0x0003 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0003 0x0003 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0003 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0003 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0003 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0003 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0001 0x0001 0x0001 0x0001 0x0001 0x0001 0x0000 0x0000

Адреса нужных регистров смотрите в Карте регистров модулей реле.

Далее надо разбить вывод комманды на 8 столбцов и мы получим в строках входы, а в столбцах — выходы:

Разбили вывод команды на 8 столбцов и добавили нумерацию

   1      2      3      4      5      6      7      8
1  0x0003 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
2  0x0003 0x0003 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
3  0x0003 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
4  0x0000 0x0000 0x0003 0x0000 0x0000 0x0000 0x0000 0x0000
5  0x0000 0x0000 0x0000 0x0003 0x0000 0x0000 0x0000 0x0000
6  0x0000 0x0000 0x0000 0x0000 0x0003 0x0000 0x0000 0x0000
7  0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
0  0x0001 0x0001 0x0001 0x0001 0x0001 0x0001 0x0000 0x0000


Заменили коды функций на действия, соответствия смотрите в описании маппинг-матриц 
   1      2      3      4      5      6      7      8
1  перекл ...... ...... ...... ...... ...... ...... ......
2  перекл перекл ...... ...... ...... ...... ...... ......
3  перекл ...... ...... ...... ...... ...... ...... ......
4  ...... ...... перекл ...... ...... ...... ...... ......
5  ...... ...... ...... перекл ...... ...... ...... ......
6  ...... ...... ...... ...... перекл ...... ...... ......
7  ...... ...... ...... ...... ...... ...... ...... ......
0  выкл   выкл   выкл   выкл   выкл   выкл   ...... ......

Прямая настройка входов

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

Чтобы перевести входы в режим «Выключатель с фиксацией», запишите в регистры настройки входов значение 1.

В примере мы изменим режим входов с 1 по 6 и аварийного входа 0 в устройстве с адресом 1:

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

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

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

Чтобы перевести все входы в режим «Выключатель без фиксации», запишите в регистры настройки входов значение 0.

В примере мы изменим режим входов с 1 по 6 и аварийного входа 0 в устройстве с адресом 1:

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

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

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

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

modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyRS485-1 -a1 -t0x10 -r9 3 3 3 3 3 3

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

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

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

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

Более сложные сценарии взаимодействия входов с реле можно реализовать с помощью mapping-матрицы. Для этого запишем в регистры настройки взаимодействия входов/выходов — значение 4:

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

Для настройки Mapping-матрицы нужно знать номер регистра, который отвечает за взаимодействие входа и выхода, и код, который нужно записать в этот регистр. Эту информацию можно найти на странице описания Mapping-матриц.

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

modbus_client --debug -mrtu -b9600 -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 -b9600 -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 -b9600 -pnone -s2 /dev/ttyRS485-1 -a1 -t0x06 -r$i 6; done

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

Обработка типов нажатий

Матрицы типов нажатий можно посмотреть на странице Mapping-матрица.

Чтобы понять принцип, рассмотрим пример. К входу 2 реле подключена кнопка и нам нужно настроить так, чтобы при двойном нажатии на эту кнопку включалось реле 5, а при коротком переключалось реле 3.

Запишем в регистр настройки взаимодействия входов/выходов входа 2 значение 6:

modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyRS485-1 -a1 -t0x06 -r10 6

Теперь запишем в соответствующий входу 2 и выходу 5 регистр из матрицы двойных нажатий действие «10 — включить» (dec = 2), а в соответствующий входу 2 и выходу 3 регистр из матрицы коротких нажатий действие «11 — инвертировать значение» (dec = 3):

modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyRS485-1 -a1 -t0x06 -r684 2
modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyRS485-1 -a1 -t0x06 -r554 3

Аналогично настраиваются другие типы нажатий.

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

ВНИМАНИЕ: используемый в примере режим 5 — восстановление состояния выхода через 20 минут, доступен только для WB-MWAC.

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

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

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

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

modbus_client --debug -mrtu -b9600 -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 -b9600 -pnone -s2 /dev/ttyRS485-1 -a1 -t0x10 -r384 8 8 8
modbus_client --debug -mrtu -b9600 -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 снова включатся.