Sensors Modbus Management: различия между версиями
Kilpio (обсуждение | вклад) |
|||
(не показаны 122 промежуточные версии 9 участников) | |||
Строка 1: | Строка 1: | ||
{{DISPLAYTITLE:Управление датчиками Wirenboard по протоколу Modbus}} | |||
== Параметры Modbus == | |||
=== Modbus-адрес === | |||
[[Файл:Sensor_address.png|150px|thumb|left|Modbus-адрес, установленный на производстве]] | |||
Modbus-адрес устройств Wiren Board легко определить — он нанесен на наклейке (адрес указан в десятичном формате). Новый адрес устройства записывается командой WRITE_SINGLE_REGISTER в регистр хранения (holding register) с адресом 128 (0x80). Подробно о том, как определить (если адрес был изменен) или изменить Modbus-адрес модуля, написано на странице [[Определение и изменение Modbus-адреса устройств Wirenboard]]. | |||
=== Команды Modbus, поддерживаемые устройством === | |||
Датчики Wirenboard поддерживают все основные команды Modbus. Подробнее смотрите здесь: [[Протокол Modbus#Коды функций чтения и записи регистров|Коды функций чтения и записи регистров]]. | |||
=== Карта регистров хранения (Holding Registers)=== | === Карта регистров хранения (Holding Registers)=== | ||
Регистры, связанные с ИК-управлением, описаны в статье [[WB-MSx_Consumer_IR_Manual]]. | |||
{| border="1" class="wikitable" style="text-align:center" | {| border="1" class="wikitable" style="text-align:center" | ||
! | !Регистр/ адрес | ||
! | !тип | ||
! | !чтение/ запись | ||
! | !значение по умолчанию | ||
! | !формат | ||
! | !назначение | ||
! | ! rowspan="3"|Поддерживается в | ||
! | ! модель WB-MS | ||
! WB-MSW | |||
! WB-MSW2 | |||
!WB-MSW | |||
!WB-MSW2 | |||
|- | |- | ||
| 0 || input || R || 0x7FFF ||°C × 10 (signed)||Температура с встроенного датчика | | 0 || input || R || 0x7FFF ||°C × 10 (signed)||Температура с встроенного датчика | ||
| T | | T | ||
| - | | - | ||
| + | | + | ||
|- | |- | ||
|1|| input || R || 0xFFFF ||<blockquote>%RH × 10 (signed)</blockquote>||Относительная влажность с встроенного датчика | |1|| input || R || 0xFFFF ||<blockquote>%RH × 10 (signed)</blockquote>||Относительная влажность с встроенного датчика | ||
|H | |H | ||
| + | | + | ||
| + | | + | ||
|- | |- | ||
|2 | |2 | ||
Строка 48: | Строка 41: | ||
|R | |R | ||
|<nowiki>-</nowiki> | |<nowiki>-</nowiki> | ||
| | |lux | ||
| | |Освещённость с встроенного датчика | ||
|L | |L, B | ||
| - | | - | ||
| - | | - | ||
|- | |- | ||
|3 | |3 | ||
Строка 61: | Строка 51: | ||
|R | |R | ||
|<nowiki>-</nowiki> | |<nowiki>-</nowiki> | ||
| | |dB | ||
|Уровень шума | |Уровень шума | ||
|S | |S | ||
| + | | + | ||
| | | + | ||
|- | |- | ||
|4 | |4 | ||
|input | |input | ||
|R | |R | ||
| | |<nowiki>-</nowiki> | ||
| | |<nowiki>-</nowiki> | ||
|<nowiki>-</nowiki> | |||
| | |||
| | |||
| - | | | ||
| | |||
| | |||
| | |||
|- | |- | ||
|5 | |5 | ||
Строка 87: | Строка 71: | ||
|R | |R | ||
|<nowiki>-</nowiki> | |<nowiki>-</nowiki> | ||
| | |<nowiki>-</nowiki> | ||
|<nowiki>-</nowiki> | |||
| | |||
| | |||
| - | | | ||
| | |||
| | |||
| | |||
|- | |- | ||
|6 | |6 | ||
Строка 103: | Строка 84: | ||
|Температура с внешнего датчика | |Температура с внешнего датчика | ||
| D | | D | ||
| - | | - | ||
| - | | - | ||
|- | |- | ||
|7 | |7 | ||
Строка 116: | Строка 94: | ||
|Температура с внешнего датчика | |Температура с внешнего датчика | ||
| D | | D | ||
| - | | - | ||
| - | | - | ||
|- | |- | ||
|8 | |8 | ||
|input | |input | ||
| R | | R | ||
| | | | ||
|PPM | |PPM | ||
|Концентрация CO2 | |Концентрация CO2 | ||
| - | | - | ||
| - | | - | ||
| + | | + | ||
|- | |- | ||
|90||holding||RW||20 (200 ms)||× 10 ms||Время усреднения освещённости | |90||holding||RW||20 (200 ms)||× 10 ms||Время усреднения освещённости | ||
Строка 210: | Строка 111: | ||
| - | | - | ||
| - | | - | ||
|- | |- | ||
|91||holding||RW||20 (200 ms)||× 10 ms | |91||holding||RW||20 (200 ms)||× 10 ms | ||
||Время усреднения шума | ||Время усреднения шума | ||
|S | |S | ||
| + | | + | ||
| + | | + | ||
|- | |- | ||
|100 | |100 | ||
||input | ||input | ||
||R|||||| | ||R||||raw_val * 16||Сырое усреднённое значение с АЦП микрофона | ||
|S | |S | ||
| + | | + | ||
| + | | + | ||
|- | |- | ||
| 110 || holding || RW || 96 || baud rate / 100 || скорость порта RS-485, '''делённая на 100'''. Допустимые скорости: 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 | |||
|colspan="3"|все | |||
| 110 || holding || RW || 96 || baud rate / 100 || скорость порта RS-485, '''делённая на 100'''. Допустимые скорости: 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 | |||
|colspan=" | |||
|- | |- | ||
| 111 || holding || RW || 0 || || настройка бита чётности порта RS-485. Допустимые значения: 0 - нет бита чётности (none), 1 - нечётный (odd), 2 - чётный (even) | | 111 || holding || RW || 0 || || настройка бита чётности порта RS-485. Допустимые значения: 0 - нет бита чётности (none), 1 - нечётный (odd), 2 - чётный (even) | | ||
|colspan=" | |colspan="3"|все | ||
|- | |- | ||
| 112 || holding || RW || 2 || || количество стоп-битов порта RS-485. Допустимые значения: 1, 2 | | 112 || holding || RW || 2 || || количество стоп-битов порта RS-485. Допустимые значения: 1, 2 | ||
|colspan=" | |colspan="3"|все | ||
|- | |- | ||
| 120 (0x78) || holding || RW || 0 || отличное от 0 || запись в регистр вызывает перезагрузку модуля без сохранения состояния | | 120 (0x78) || holding || RW || 0 || отличное от 0 || запись в регистр вызывает перезагрузку модуля без сохранения состояния | ||
|colspan=" | |colspan="3"|все | ||
|- | |- | ||
| 121 (0x79) || input || R || - || mV || текущее напряжение питания модуля | | 121 (0x79) || input || R || - || mV || текущее напряжение питания модуля | ||
|colspan=" | |colspan="3"|все | ||
|- | |- | ||
| 128 (0x80) || holding || RW || 1 || || Modbus-адрес устройства | | 128 (0x80) || holding || RW || 1 || || Modbus-адрес устройства | ||
|colspan=" | |colspan="3"|все | ||
|- | |- | ||
| 200-206 || input || R || см. [[#Сигнатура устройства|Сигнатура устройства]] || || сигнатура | | 200-206 || input || R || см. [[#Сигнатура устройства|Сигнатура устройства]] || || сигнатура | ||
|colspan=" | |colspan="3"|все | ||
|- | |- | ||
| 220-241 || input || R || || __date__ __time__|| дата сборки прошивки | | 220-241 || input || R || || __date__ __time__|| дата сборки прошивки | ||
|colspan=" | |colspan="3"|все | ||
|- | |- | ||
| 250-269 || input || R || || строка, null-terminated || версия прошивки | | 250-269 || input || R || || строка, null-terminated || версия прошивки | ||
|colspan=" | |colspan="3"|все | ||
|- | |- | ||
| 270-271 || input || R || || 32-bit unsigned int || уникальный идентификатор (S/N) | | 270-271 || input || R || || 32-bit unsigned int || уникальный идентификатор (S/N) | ||
|colspan=" | |colspan="3"|все | ||
|- | |- | ||
|} | |} | ||
===Карта регистров флагов (Coils)=== | |||
===Карта регистров флагов (Coils)=== | |||
Регистры, связанные с ИК-управлением, описаны в статье [[WB-MSx_Consumer_IR_Manual]]. | Регистры, связанные с ИК-управлением, описаны в статье [[WB-MSx_Consumer_IR_Manual]]. | ||
{| border="1" class="wikitable" style="text-align:center" | {| border="1" class="wikitable" style="text-align:center" | ||
!Начальный адрес || Количество || Назначение || В модификациях | !Начальный адрес || Количество || Назначение || В модификациях | ||
|- | |- | ||
| | | 0 || 1 || style="text-align:left" |Включение пищалки (buzzer) || WB-MSW2 | ||
|1 | |||
| style="text-align:left"|Включение | |||
|WB- | |||
|- | |- | ||
| | | 1 || 1 || style="text-align:left" | Принудительная калибровка встроенного датчика CO2. Включать после 20 минут работы при уровне CO2, равном 400 ppm || WB-MSW2 | ||
|- | |- | ||
| | | 2 || 1 || style="text-align:left" | Включение подогрева (heater) в микросхеме сенсора температуры и влажности HDC1080 (только с версии прошивки 3.2.0!) || WB-MS C (в серии 2017 г.), WB-MSW2 | ||
|- | |- | ||
|} | |} | ||
===Сигнатура устройства === | ===Сигнатура устройства === | ||
По адресу 200 хранится сигнатура модуля длиной 6 байт. Сигнатура уникальна для каждой модели устройств Wiren Board и позволяет идентифицировать модель по Modbus: | По адресу 200 хранится сигнатура модуля длиной 6 байт. Сигнатура уникальна для каждой модели устройств Wiren Board и позволяет идентифицировать модель по Modbus: | ||
{| class="wikitable" | {| class="wikitable" | ||
! style="font-weight: bold;" | Модуль | ! style="font-weight: bold;" | Модуль | ||
Строка 607: | Строка 187: | ||
| WB-MSW2 | | WB-MSW2 | ||
| WBMSW2 | | WBMSW2 | ||
|} | |} | ||
Для получения сигнатуры устройства нужно выполнить команду READ_HOLDING_REGISTERS по адресу 200 (длина 6 регистров). Запись в эту область памяти не поддерживается, при попытке записи в недопустимое место возвращается ошибка 3. Пустые места в тексте сигнатуры забиваются значением 0x00. | Для получения сигнатуры устройства нужно выполнить команду READ_HOLDING_REGISTERS по адресу 200 (длина 6 регистров). Запись в эту область памяти не поддерживается, при попытке записи в недопустимое место возвращается ошибка 3. Пустые места в тексте сигнатуры забиваются значением 0x00. | ||
Начиная с регистра 220 записана дата сборки прошивки, в формате "число'''x00'''время'''x00'''" в виде строки (пример: 'Jan 27 2017 17:01:13'). Длина записи — 21 регистр. | Начиная с регистра 220 записана дата сборки прошивки, в формате "число'''x00'''время'''x00'''" в виде строки (пример: 'Jan 27 2017 17:01:13'). Длина записи — 21 регистр. | ||
== Управление модулем из командной строки == | |||
Программное обеспечение контроллера 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> | |||
В результате выполнения команды получаем строку, например '''WBMS'''. Модуль WB-MS в примере имеет Modbus-адрес 1. | |||
</ | === Перезагрузка === | ||
В ряде случаев может потребоваться перезагрузка модуля. Для этого в регистр 120 (0x78) необходимо записать любое значение, отличное от нуля: | |||
<syntaxhighlight lang="bash"> | |||
modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a1 -t0x06 -r0x78 100 | |||
</syntaxhighlight> | |||
Такая перезагрузка равносильна сбросу по питанию и изменению адреса устройства на 0x01. |
Версия 13:37, 25 апреля 2017
Параметры Modbus
Modbus-адрес
Modbus-адрес устройств Wiren Board легко определить — он нанесен на наклейке (адрес указан в десятичном формате). Новый адрес устройства записывается командой WRITE_SINGLE_REGISTER в регистр хранения (holding register) с адресом 128 (0x80). Подробно о том, как определить (если адрес был изменен) или изменить Modbus-адрес модуля, написано на странице Определение и изменение Modbus-адреса устройств Wirenboard.
Команды Modbus, поддерживаемые устройством
Датчики Wirenboard поддерживают все основные команды Modbus. Подробнее смотрите здесь: Коды функций чтения и записи регистров.
Карта регистров хранения (Holding Registers)
Регистры, связанные с ИК-управлением, описаны в статье WB-MSx_Consumer_IR_Manual.
Регистр/ адрес | тип | чтение/ запись | значение по умолчанию | формат | назначение | Поддерживается в | модель WB-MS | WB-MSW | WB-MSW2 |
---|---|---|---|---|---|---|---|---|---|
0 | input | R | 0x7FFF | °C × 10 (signed) | Температура с встроенного датчика | T | - | + | |
1 | input | R | 0xFFFF |
|
Относительная влажность с встроенного датчика | H | + | + | |
2 | input | R | - | lux | Освещённость с встроенного датчика | L, B | - | - | |
3 | input | R | - | dB | Уровень шума | S | + | + | |
4 | input | R | - | - | - | ||||
5 | input | R | - | - | - | ||||
6 | input | R | 0x7FFF | °C × 16 (signed) | Температура с внешнего датчика | D | - | - | |
7 | input | R | 0x7FFF | °C × 16 (signed) | Температура с внешнего датчика | D | - | - | |
8 | input | R | PPM | Концентрация CO2 | - | - | + | ||
90 | holding | RW | 20 (200 ms) | × 10 ms | Время усреднения освещённости |
|
- | - | |
91 | holding | RW | 20 (200 ms) | × 10 ms | Время усреднения шума | S | + | + | |
100 | input | R | raw_val * 16 | Сырое усреднённое значение с АЦП микрофона | S | + | + | ||
110 | holding | RW | 96 | baud rate / 100 | скорость порта RS-485, делённая на 100. Допустимые скорости: 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 | все | |||
111 | holding | RW | 0 | все | |||||
112 | holding | RW | 2 | количество стоп-битов порта RS-485. Допустимые значения: 1, 2 | все | ||||
120 (0x78) | holding | RW | 0 | отличное от 0 | запись в регистр вызывает перезагрузку модуля без сохранения состояния | все | |||
121 (0x79) | input | R | - | mV | текущее напряжение питания модуля | все | |||
128 (0x80) | holding | RW | 1 | Modbus-адрес устройства | все | ||||
200-206 | input | R | см. Сигнатура устройства | сигнатура | все | ||||
220-241 | input | R | __date__ __time__ | дата сборки прошивки | все | ||||
250-269 | input | R | строка, null-terminated | версия прошивки | все | ||||
270-271 | input | R | 32-bit unsigned int | уникальный идентификатор (S/N) | все |
Карта регистров флагов (Coils)
Регистры, связанные с ИК-управлением, описаны в статье WB-MSx_Consumer_IR_Manual.
Начальный адрес | Количество | Назначение | В модификациях |
---|---|---|---|
0 | 1 | Включение пищалки (buzzer) | WB-MSW2 |
1 | 1 | Принудительная калибровка встроенного датчика CO2. Включать после 20 минут работы при уровне CO2, равном 400 ppm | WB-MSW2 |
2 | 1 | Включение подогрева (heater) в микросхеме сенсора температуры и влажности HDC1080 (только с версии прошивки 3.2.0!) | WB-MS C (в серии 2017 г.), WB-MSW2 |
Сигнатура устройства
По адресу 200 хранится сигнатура модуля длиной 6 байт. Сигнатура уникальна для каждой модели устройств Wiren Board и позволяет идентифицировать модель по Modbus:
Модуль | Сигнатура |
---|---|
WB-MS | WBMS,'0x00','0x00' |
WB-MSW | WBMSW,'0x00' |
WB-MSW2 | WBMSW2 |
Для получения сигнатуры устройства нужно выполнить команду READ_HOLDING_REGISTERS по адресу 200 (длина 6 регистров). Запись в эту область памяти не поддерживается, при попытке записи в недопустимое место возвращается ошибка 3. Пустые места в тексте сигнатуры забиваются значением 0x00. Начиная с регистра 220 записана дата сборки прошивки, в формате "числоx00времяx00" в виде строки (пример: 'Jan 27 2017 17:01:13'). Длина записи — 21 регистр.
Управление модулем из командной строки
Программное обеспечение контроллера 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'`
В результате выполнения команды получаем строку, например WBMS. Модуль WB-MS в примере имеет Modbus-адрес 1.
Перезагрузка
В ряде случаев может потребоваться перезагрузка модуля. Для этого в регистр 120 (0x78) необходимо записать любое значение, отличное от нуля:
modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a1 -t0x06 -r0x78 100
Такая перезагрузка равносильна сбросу по питанию и изменению адреса устройства на 0x01.