Relay Module Modbus Management: различия между версиями
Matveevrj (обсуждение | вклад) |
Admin (обсуждение | вклад) |
||
(не показано 98 промежуточных версий 11 участников) | |||
Строка 1: | Строка 1: | ||
{{DISPLAYTITLE: | {{DISPLAYTITLE:Управление модулями реле Wirenboard по протоколу Modbus}} | ||
== | |||
== Параметры Modbus == | |||
{ | |||
=== Modbus-адрес === | |||
[[Файл:modbus_address_mr14.png|150px|thumb|left|Modbus-адрес, установленный на производстве]] | |||
Modbus-адрес устройств Wiren Board легко определить — он нанесен на наклейке (адрес указан в десятичном формате). Новый адрес устройства записывается командой WRITE_SINGLE_REGISTER в регистр хранения (holding register) с адресом 128 (0x80). Подробно о том, как определить или изменить Modbus-адрес модуля, написано на странице [[Определение и изменение Modbus-адреса устройств Wirenboard]]. | |||
=== Команды Modbus, поддерживаемые устройством === | |||
Релейные модули Wirenboard поддерживают все основные команды Modbus. Подробнее смотрите здесь: [[Протокол Modbus#Коды функций чтения и записи регистров|Коды функций чтения и записи регистров]]. | |||
=== Безопасный режим === | |||
В этом режиме при прекращении обмена данными по Modbus устройство отключает реле по прошествии заданного времени. | |||
Для включения безопасного режима (Safety timer) нужно записать значение, отличное от 0, в регистр хранения командой WRITE_SINGLE_REGISTER по адресу 8. Это значение — таймаут в секундах. Значение "0" отключает безопасный режим. | |||
=== Режим работы реле в случае отключении питания === | |||
В последних версиях прошивки (начина с 1.5.3) для устройств WB-MR появилась возможность запоминать состояние выхода при отключении питания. Режим контролируется Modbus-регистром 6. Если в регистре записано значение '0', то состояние выходов не сохраниться и при подаче питания все реле буду выключены. Если в регистре записана единица, то после возобновления питания все включенные до аварии реле включатся снова. | |||
=== Цифровые входы === | |||
Состояние входа можно получить чтением регистров Discrete Inputs 0—'''x''' (где x = '''(количество управляемых каналов - 1)'''). Если вход соединён с GND, значение регистра равно 1, если не соединён - 0. | |||
=== Режимы взаимодействия цифровых входов с релейными выходами === | |||
В релейном модуле можно включить прямое управление релейными выходами с цифровых входов. Есть три варианта такого управления: | |||
* Режим 0: управление выключателем без фиксации (кнопкой "с самостоятельным отжатием обратно"). Вы нажимаете на кнопку (замыкаете цифровой вход с GND), она сама "отжимается обратно", состояние реле переключается на противоположное. | |||
* Режим 1: управление выключателем с фиксацией. Реле всегда устанавливается в соответствии с положением выключателя. Если выключатель "включён" (замыкает цифровой вход с GND), реле тоже замкнуто. Если выключатель "выключен", реле разомкнуто. | |||
* Режим 3: управление релейным выходом с цифрового входа отключено. | |||
По умолчанию на устройствах установлен режим 0. Установить режим для всех каналов одновременно можно, записав соответствующее число в регистр хранения с адресом 5. | |||
Режим также можно установить отдельно для каждого канала. Для этого в регистре 5 должно находиться значение "0", а режим для каждого канала записывается в регистры хранения, начиная с адреса 9 для первого канала и т.д. | |||
=== Карта регистров модулей реле === | |||
В таблице: | |||
* '''x''' — количество релейных выходов; | |||
* '''y''' — количество цифровых входов. | |||
(для модулей WB-MRM2 карту регистров смотрите на странице описания [[WB-MRM2-mini|этого модуля]]) | |||
{| border="1" class="wikitable" style="text-align:center; width:1000px;" | |||
!Регистр / адрес | |||
!Тип | |||
!Чтение/запись | |||
!Значение по умолчанию | |||
!Формат | |||
!Назначение | |||
|- | |||
| 0 .. ('''x'''-1) || coil || RW || - || 1 или 0|| состояние реле с номером 1 .. '''x''' | |||
|- | |||
| 0 .. ('''y'''-1) || discrete || R || - || 1 или 0 | |||
|| состояние входа с номером 1 .. '''y''' | |||
|- | |||
| 5 | |||
| holding | |||
| RW | |||
| 0 | |||
| style="text-align:left;" | | |||
* '''0''': кнопки без фиксации | |||
* '''1''': выключатель с фиксацией | |||
* '''3''': отключить взаимодействие | |||
|| режим взаимодействия цифровых входов с релейными выходами. Регистры состояний входов и счётчик нажатий продолжают работать во всех режимах. | |||
|- | |||
| 6 | |||
(только в прошивках 1.5.3 и позднее) | |||
|| holding || RW || 0 | | |||
| style="text-align:left;" | | |||
* '''0''': не восстанавливать состояние реле после восстановления питания | |||
* '''1''': восстанавливать состояние реле после восстановления питания | |||
|| режим работы реле в случае отключении питания | |||
|- | |||
| 8 || holding || RW || 0 || секунды || таймаут для безопасного режима | |||
|- | |||
| 9 .. (9+'''x'''-1) || holding || RW || 0 | | |||
|style="text-align:left;" | | |||
* '''0''': кнопки без фиксации | |||
* '''1''': выключатель с фиксацией | |||
* '''3''': отключить взаимодействие | |||
|| режим взаимодействия отдельного цифрового входа с соответствующим релейным выходом; | |||
в регистре 5 должен быть записан "0" | |||
|- | |||
|16 | |||
|holding | |||
|RW | |||
| | |||
| | |||
* '''0''': кнопки без фиксации | |||
* '''1''': выключатель с фиксацией | |||
* '''3''': отключить взаимодействие | |||
|режим взаимодействия нулевого цифрового входа с релейными выходами; | |||
в регистре 5 должен быть записан "0" | |||
|- | |||
| 32 .. (32+'''y'''-1) || input || R || 0 || 16-bit unsigned int || счетчик срабатываний входа 1 .. '''y''' | |||
|- | |||
| 120 (0x78) || holding || RW || 0 || отличное от 0 || запись в регистр вызывает перезагрузку модуля без сохранения состояния | |||
|- | |||
| 121 (0x79) || holding || R || - || мВ || текущее напряжение питания модуля | |||
|- | |||
| 128 (0x80) || holding || RW || 1 || 1 — 247 | |||
|| Modbus-адрес устройства | |||
|- | |||
| 200-205 || holding || R || {'X','X','X','X','X','X'} || || сигнатура устройства (см. таблицу ниже) | |||
|- | |||
| 220-241 || holding || R || || __date__ __time__|| дата сборки прошивки | |||
|- | |||
|250-266 | |||
|input | |||
|R | |||
| | |||
|строка, null-terminated | |||
|версия прошивки | |||
|- | |||
|270-271 | |||
|input | |||
|R | |||
| | |||
|32-bit unsigned int | |||
|уникальный идентификатор (S/N) | |||
|- | |||
|} | |} | ||
{ | |||
В прошивках версии 1.6.0 и позднее поддерживаются дополнительные регистры настройки параметров обмена данными по RS-485: | |||
{| border="1" class="wikitable" style="text-align:center; width:1000px;" | |||
{ | !Регистр / адрес | ||
!Тип | |||
!Чтение/запись | |||
!Значение по умолчанию | |||
!Формат | |||
!Назначение | |||
|- | |||
| 110 || holding || RW || 96 || baud rate / 100 || скорость порта RS-485, '''делённая на 100'''. Допустимые скорости: 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 | |||
|- | |||
| 111 || holding || RW || 0 || || настройка бита чётности порта RS-485. Допустимые значения: 0 - нет бита чётности (none), 1 - нечётный (odd), 2 - чётный (even) | |||
|- | |||
| 112 || holding || RW || 2 || || количество стоп-битов порта RS-485. Допустимые значения: 1, 2 | |||
|- | |||
|} | |||
По адресу 200 лежит сигнатура релейного модуля длиной 6 байт. Сигнатура уникальна для каждой модели устройств Wiren Board и позволяет идентифицировать модель по Modbus: | |||
{| class="wikitable" | |||
! style="font-weight: bold;" | Модуль | |||
! style="font-weight: bold;" | Сигнатура | |||
|- | |||
|WB-MRPS6 | |||
|MRPS6 | |||
|- | |||
| WB-MR6C | |||
| WBMR6 | |||
|- | |||
| WB-MR3xV | |||
| WBMR3 | |||
|- | |||
| WB-MR6xV | |||
| WBMR6 | |||
|- | |||
| WB-MR14 | |||
| WBMR14 | |||
|- | |||
| WB-MR11 | |||
| WBMR11 | |||
|- | |||
| WB-MRM2 | |||
| WBMR2 | |||
WBMR2m | |||
|} | |} | ||
Для получения сигнатуры нужно выполнить команду READ_HOLDING_REGISTERS по адресу 200 (длина 6 регистров). Запись в эту область памяти не поддерживается, при попытке записи в недопустимое место возвращается ошибка 3. Пустые места в тексте сигнатуры забиваются значением 0x00. | |||
Начиная с регистра 220 записана дата сборки прошивки, в формате "число'''x00'''время'''x00'''" в виде строки (пример: 'Jan 27 2017 17:01:13'). Длина записи — 21 регистр. | |||
Значение состояния каждого реле хранится в регистрах флагов (coil). У 1-го реле адрес регистра 0, у 2-го — 1 и т.д. | |||
== Управление модулем из командной строки == | |||
Программное обеспечение контроллера Wiren Board включает в себя утилиту modbus_client для работы с устройствами, подключенными к выходам RS-485, по протоколу Modbus, подробное описание команды находится на странице [[Modbus-client]]. Доступ к командной строке описан в статье [[SSH]]. | |||
=== Пример чтения регистров === | |||
Проверим, верно ли, что мы подключились именно к модулю нужного типа. (Модуль wb-mqtt-serial должен быть предварительно остановлен). По адресу 200 хранится уникальная сигнатура длиной в 6 регистров. Прочтем 6 регистров, начиная с адреса 200, и преобразуем полученный шестнадцатеричный ответ в символьную строку: | |||
<syntaxhighlight lang="bash">echo -e `modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 \ | |||
-a1 -t0x03 -r200 -c 6 | \ | |||
grep Data | sed -e 's/0x00/\\\x/g' -e 's/Data://' -e 's/\s//g'` </syntaxhighlight> | |||
В результате выполнения команды получаем строку, например '''WBMR6'''. Релейный модуль WB-MR6 имеет Modbus-адрес 1. | |||
=== Выбор типа управления внешними входами === | |||
В релейных модулях предусмотрено два режима управления каналами реле: с помощью внешних входов и по протоколу RS-485. | |||
В релейных модулях можно выбрать режим 0, когда ко внешнему входу подключена кнопка (без фиксации), или режим 1, когда для управления используется обычный выключатель (с фиксацией). Режим 3 отключает внешнее управление, но при этом все равно сохраняется возможность управления по RS-485 и чтение состояния внешних входов. По умолчанию включен режим 0. | |||
В режиме внешнего управления реле срабатывает по падению логического уровня: к внешним входам подключены резисторы подтяжки к линии +5V и реле соответствующего канала срабатывает при соединении входа с GND. | |||
Состояние реле каждого канала хранится в памяти контроллера до перезагрузки, по умолчанию при включении питания все реле выключены. После инициализации модуля опрашиваются внешние входы и реле всех каналов переводятся в соответствующее состояние. | |||
Тип внешнего управления можно выбрать для каждого канала отдельно через регистры 9 — (9+x). Для этого в holding-регистре 5 должно быть записано значение 0: | |||
<syntaxhighlight lang="bash"> | |||
modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a1 -t0x06 -r5 0 | |||
</syntaxhighlight> | |||
Инициализировать регистр при старте можно и через настройки web-интерфейса, смотрите страницу [[RS-485:Настройка_через_веб-интерфейс]]. |
Версия 12:12, 18 июля 2018
Параметры Modbus
Modbus-адрес
Modbus-адрес устройств Wiren Board легко определить — он нанесен на наклейке (адрес указан в десятичном формате). Новый адрес устройства записывается командой WRITE_SINGLE_REGISTER в регистр хранения (holding register) с адресом 128 (0x80). Подробно о том, как определить или изменить Modbus-адрес модуля, написано на странице Определение и изменение Modbus-адреса устройств Wirenboard.
Команды Modbus, поддерживаемые устройством
Релейные модули Wirenboard поддерживают все основные команды Modbus. Подробнее смотрите здесь: Коды функций чтения и записи регистров.
Безопасный режим
В этом режиме при прекращении обмена данными по Modbus устройство отключает реле по прошествии заданного времени.
Для включения безопасного режима (Safety timer) нужно записать значение, отличное от 0, в регистр хранения командой WRITE_SINGLE_REGISTER по адресу 8. Это значение — таймаут в секундах. Значение "0" отключает безопасный режим.
Режим работы реле в случае отключении питания
В последних версиях прошивки (начина с 1.5.3) для устройств WB-MR появилась возможность запоминать состояние выхода при отключении питания. Режим контролируется Modbus-регистром 6. Если в регистре записано значение '0', то состояние выходов не сохраниться и при подаче питания все реле буду выключены. Если в регистре записана единица, то после возобновления питания все включенные до аварии реле включатся снова.
Цифровые входы
Состояние входа можно получить чтением регистров Discrete Inputs 0—x (где x = (количество управляемых каналов - 1)). Если вход соединён с GND, значение регистра равно 1, если не соединён - 0.
Режимы взаимодействия цифровых входов с релейными выходами
В релейном модуле можно включить прямое управление релейными выходами с цифровых входов. Есть три варианта такого управления:
- Режим 0: управление выключателем без фиксации (кнопкой "с самостоятельным отжатием обратно"). Вы нажимаете на кнопку (замыкаете цифровой вход с GND), она сама "отжимается обратно", состояние реле переключается на противоположное.
- Режим 1: управление выключателем с фиксацией. Реле всегда устанавливается в соответствии с положением выключателя. Если выключатель "включён" (замыкает цифровой вход с GND), реле тоже замкнуто. Если выключатель "выключен", реле разомкнуто.
- Режим 3: управление релейным выходом с цифрового входа отключено.
По умолчанию на устройствах установлен режим 0. Установить режим для всех каналов одновременно можно, записав соответствующее число в регистр хранения с адресом 5.
Режим также можно установить отдельно для каждого канала. Для этого в регистре 5 должно находиться значение "0", а режим для каждого канала записывается в регистры хранения, начиная с адреса 9 для первого канала и т.д.
Карта регистров модулей реле
В таблице:
- x — количество релейных выходов;
- y — количество цифровых входов.
(для модулей WB-MRM2 карту регистров смотрите на странице описания этого модуля)
Регистр / адрес | Тип | Чтение/запись | Значение по умолчанию | Формат | Назначение |
---|---|---|---|---|---|
0 .. (x-1) | coil | RW | - | 1 или 0 | состояние реле с номером 1 .. x |
0 .. (y-1) | discrete | R | - | 1 или 0 | состояние входа с номером 1 .. y |
5 | holding | RW | 0 |
|
режим взаимодействия цифровых входов с релейными выходами. Регистры состояний входов и счётчик нажатий продолжают работать во всех режимах. |
6
(только в прошивках 1.5.3 и позднее) |
holding | RW |
|
режим работы реле в случае отключении питания | |
8 | holding | RW | 0 | секунды | таймаут для безопасного режима |
9 .. (9+x-1) | holding | RW |
|
режим взаимодействия отдельного цифрового входа с соответствующим релейным выходом;
в регистре 5 должен быть записан "0" | |
16 | holding | RW |
|
режим взаимодействия нулевого цифрового входа с релейными выходами;
в регистре 5 должен быть записан "0" | |
32 .. (32+y-1) | input | R | 0 | 16-bit unsigned int | счетчик срабатываний входа 1 .. y |
120 (0x78) | holding | RW | 0 | отличное от 0 | запись в регистр вызывает перезагрузку модуля без сохранения состояния |
121 (0x79) | holding | R | - | мВ | текущее напряжение питания модуля |
128 (0x80) | holding | RW | 1 | 1 — 247 | Modbus-адрес устройства |
200-205 | holding | R | {'X','X','X','X','X','X'} | сигнатура устройства (см. таблицу ниже) | |
220-241 | holding | R | __date__ __time__ | дата сборки прошивки | |
250-266 | input | R | строка, null-terminated | версия прошивки | |
270-271 | input | R | 32-bit unsigned int | уникальный идентификатор (S/N) |
В прошивках версии 1.6.0 и позднее поддерживаются дополнительные регистры настройки параметров обмена данными по RS-485:
Регистр / адрес | Тип | Чтение/запись | Значение по умолчанию | Формат | Назначение |
---|---|---|---|---|---|
110 | holding | RW | 96 | baud rate / 100 | скорость порта RS-485, делённая на 100. Допустимые скорости: 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 |
111 | holding | RW | 0 | настройка бита чётности порта RS-485. Допустимые значения: 0 - нет бита чётности (none), 1 - нечётный (odd), 2 - чётный (even) | |
112 | holding | RW | 2 | количество стоп-битов порта RS-485. Допустимые значения: 1, 2 |
По адресу 200 лежит сигнатура релейного модуля длиной 6 байт. Сигнатура уникальна для каждой модели устройств Wiren Board и позволяет идентифицировать модель по Modbus:
Модуль | Сигнатура |
---|---|
WB-MRPS6 | MRPS6 |
WB-MR6C | WBMR6 |
WB-MR3xV | WBMR3 |
WB-MR6xV | WBMR6 |
WB-MR14 | WBMR14 |
WB-MR11 | WBMR11 |
WB-MRM2 | WBMR2
WBMR2m |
Для получения сигнатуры нужно выполнить команду READ_HOLDING_REGISTERS по адресу 200 (длина 6 регистров). Запись в эту область памяти не поддерживается, при попытке записи в недопустимое место возвращается ошибка 3. Пустые места в тексте сигнатуры забиваются значением 0x00. Начиная с регистра 220 записана дата сборки прошивки, в формате "числоx00времяx00" в виде строки (пример: 'Jan 27 2017 17:01:13'). Длина записи — 21 регистр.
Значение состояния каждого реле хранится в регистрах флагов (coil). У 1-го реле адрес регистра 0, у 2-го — 1 и т.д.
Управление модулем из командной строки
Программное обеспечение контроллера Wiren Board включает в себя утилиту modbus_client для работы с устройствами, подключенными к выходам RS-485, по протоколу Modbus, подробное описание команды находится на странице Modbus-client. Доступ к командной строке описан в статье SSH.
Пример чтения регистров
Проверим, верно ли, что мы подключились именно к модулю нужного типа. (Модуль wb-mqtt-serial должен быть предварительно остановлен). По адресу 200 хранится уникальная сигнатура длиной в 6 регистров. Прочтем 6 регистров, начиная с адреса 200, и преобразуем полученный шестнадцатеричный ответ в символьную строку:
echo -e `modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 \
-a1 -t0x03 -r200 -c 6 | \
grep Data | sed -e 's/0x00/\\\x/g' -e 's/Data://' -e 's/\s//g'`
В результате выполнения команды получаем строку, например WBMR6. Релейный модуль WB-MR6 имеет Modbus-адрес 1.
Выбор типа управления внешними входами
В релейных модулях предусмотрено два режима управления каналами реле: с помощью внешних входов и по протоколу RS-485. В релейных модулях можно выбрать режим 0, когда ко внешнему входу подключена кнопка (без фиксации), или режим 1, когда для управления используется обычный выключатель (с фиксацией). Режим 3 отключает внешнее управление, но при этом все равно сохраняется возможность управления по RS-485 и чтение состояния внешних входов. По умолчанию включен режим 0.
В режиме внешнего управления реле срабатывает по падению логического уровня: к внешним входам подключены резисторы подтяжки к линии +5V и реле соответствующего канала срабатывает при соединении входа с GND. Состояние реле каждого канала хранится в памяти контроллера до перезагрузки, по умолчанию при включении питания все реле выключены. После инициализации модуля опрашиваются внешние входы и реле всех каналов переводятся в соответствующее состояние.
Тип внешнего управления можно выбрать для каждого канала отдельно через регистры 9 — (9+x). Для этого в holding-регистре 5 должно быть записано значение 0:
modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a1 -t0x06 -r5 0
Инициализировать регистр при старте можно и через настройки web-интерфейса, смотрите страницу RS-485:Настройка_через_веб-интерфейс.