Wiren Board Device Modbus Address: различия между версиями

Материал из Wiren Board
(не показаны 84 промежуточные версии 7 участников)
Строка 1: Строка 1:
{{DISPLAYTITLE: Modbus-адрес устройства Wiren Board}}
<languages/>
== Общая информация ==
<translate>
<!--T:1-->
Смотрите также [[Special:MyLanguage/UART_Communication_Settings|UART_Communication_Settings]].


[[Файл:wb_modbus_address.png|300px|thumb|right|Modbus-адрес, установленный на производстве. Слева наклейка на верхней крышке устройства, справа — на боковой стенке]]
== Определение текущего Modbus-адреса == <!--T:2-->
Заводской Modbus-адрес устройства Wiren Board можно узнать на наклейках, которые находится на корпусе устройства:  
* сбоку, где так же указаны ревизия устройства, версия прошивки, серийный номер и QR-код с этими данными;
* на верхней крышке устройства.


Если заводской адрес был изменен, самый лучший способ узнать его - подключить устройство к контроллеру и выполнить [[Fast_Modbus#Сканирование_устройств_на_шине|сканирование]]. Или воспользоваться утилитой  [[Modbus-client |Modbus_client]], которая доступна для контроллеров Wiren Board и компьютеров с ОС Linux.
<!--T:3-->
Modbus-адрес устройств Wiren Board нанесен на наклейке (адрес указан в десятичном формате). Eсли устройство уже было в эксплуатации и адрес его оказался изменен, адрес необходимо каким-либо способом узнать. Программное обеспечение контроллера Wiren Board включает в себя утилиту modbus_client для работы с устройствами, подключенными к выходам RS-485, по протоколу Modbus (Modbus-адрес устройств Wiren Board хранится в регистре 0x80). Справку по команде можно получить, выполнив ее безо всяких параметров, подробное описание находится на странице [[Special:MyLanguage/Modbus-client|Modbus-client]]. Доступ к командной строке описан в статье [[Special:MyLanguage/SSH|SSH]].
[[Файл:modbus_address_mr14.png|150px|thumb|left|Modbus-адрес, установленный на производстве]]
'''Перед работой с портом из командной строки остановите драйвер wb-mqtt-serial:'''


Если у вас компьютер с ОС Windows, то вы можете [[#Восстановление доступа | восстановить доступ к устройству]].
<!--T:4-->
<syntaxhighlight lang="bash">root@wirenboard:~# service wb-mqtt-serial stop</syntaxhighlight>
Попробуем определить текущий адрес модуля. Для этого в командной строке выполним циклическую команду опроса регистра 0x80 устройств с адресами с 1 по 247:
<syntaxhighlight lang="bash">root@wirenboard:~# for i in {1..247}; do modbus_client -mrtu /dev/ttyRS485-1 --debug -a$i -t3 -r0x80 -s2 -pnone; done 2>/dev/null | grep Data:     
        Data: 0x0072</syntaxhighlight>
Результат: адрес подключенного устройства — 0x0072, то есть 114. Перебор всех адресов от 1 до 247 занимает чуть больше 2 минут. В параметрах вызова команды modbus_client мы указываем 2 стоп-бита( -s2), отсутствие контроля четности ( -pnone), скорость 9600 бит/с устанавливается автоматически. Чтение выполняем командой READ_HOLDING_REGISTERS с кодом 3 (-t3) из регистра с адресом 0x80 ( -r0x80), адрес меняется в цикле от 1 до 247 ( -a$i).
На некоторых устройствах при обмене с ними данными мигает индикатор.
[[Файл:Status_flash_mr14.gif|300px|thumb|left|Светодиод Status мигает при обмене данными по RS-485 с модулем WB-MR14]]


'''ВНИМАНИЕ:''' если вы выполняете команды на контроллере, то перед запуском утилиты ''Modbus-client'' [[Modbus-client#Подготовка к работе | остановите драйвер wb-mqtt-serial]], а после окончания — запустите снова.
== Изменение Modbus-адреса == <!--T:5-->


== Определение адресов всех устройств на шине ==
<!--T:6-->
===Сканирование шины в веб-интерфейсе===
Мы можем задать устройству адрес, который нам необходим (например, 1), командой
Функция сканирования шины. Она доступна в веб-интерфейсе контроллера на вкладке Настройки - Сканирование.
<syntaxhighlight lang="bash">root@wirenboard:~# modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a0 -t0x06 -r0x80 1</syntaxhighlight>
Убедитесь что все устройства подключены к шине и запустите сканирование.
Для записи адреса мы используем широковещательный адрес 0 ( -a0) и Modbus RTU-команду WRITE_SINGLE_REGISTER с кодом 6 ( -t0x06). В регистр 0x80 ( -r0x80) мы записываем значение 1.  
Если вы используете контроллер с устаревшим ПО воспользуйтесь инструкцией ниже.


===Определение адреса методом перебора===
<!--T:7-->
Если перебрать все доступные адреса и прочитать регистр с сигнатурой устройства — можно получить список устройств на шине:
'''Использование адреса 0 сбросит все адреса всем устройствам на шине! Никогда не используете эту команду, если к порту RS-485 подключено больше одного устройства!'''
# Подключите устройства по [[RS-485 | шине RS-485]] к контроллеру или другому оборудованию, где будете выполнять команды.
# Если вы выполняете команды на контроллере:
#:* откройте консоль контроллера по [[SSH]],
#:* [[Modbus-client#Подготовка к работе | остановите драйвер wb-mqtt-serial]].
# Замените в скрипте порт <code>/dev/ttyRS485-1</code> на тот, к которому подключены устройства, настройки соединения '''9600N2''' задаются параметрами <code>-b9600 -pnone -s2</code>:
#:<syntaxhighlight lang="bash">
for i in {1..247}; do echo -n "$i - "; D=`modbus_client -mrtu /dev/ttyRS485-1 --debug -b9600 -pnone -s2 -a$i -t3 -o100 -r200 -c6 2>/dev/null | grep Data: | awk 'gsub("Data:","")' | sed -e 's/0x00/\\\x/g' -e 's/\s//g'`; echo -e $D; done
</syntaxhighlight>
# Скопируйте и вставьте измененный скрипт в консоль контроллера, нажмите '''Enter'''.
 
Скрипт переберет все адреса с 1 по 247 и выведет в консоль результат для каждого адреса:
<syntaxhighlight lang="console">
# for i in {1..247}; do echo -n "$i - "; D=`modbus_client -mrtu /dev/ttyRS485-1 --debug -b9600 -pnone -s2 -a$i -t3 -o100 -r200 -c6 2>/dev/null | grep Data: | awk 'gsub("Data:","")' | sed -e 's/0x00/\\\x/g' -e 's/\s//g'`; echo -e $D; done
1 -
2 -
3 -
4 -
5 -
6 - WBMWAC
7 -
8 -
9 - WBMRGB
10 -
11 -
12 -
...
</syntaxhighlight>
 
Вариант скрипта с перебором не только адресов но и параметров связи: [[UART_Communication_Settings#unknown-params | Если параметры подключения неизвестны]]
 
== Изменение адреса устройству с известным адресом ==
Вы можете записать новый адрес в регистр <code>128(0x80)</code>:
# Подключите устройство по [[RS-485 | шине RS-485]] к контроллеру или другому оборудованию, где будете выполнять команды.
# Если вы выполняете команды на контроллере:
#:* откройте консоль контроллера по [[SSH]],
#:* [[Modbus-client#Подготовка к работе | остановите драйвер wb-mqtt-serial]].
# Чтобы назначить новый адрес <code>12</code> устройству с адресом <code>1</code> и подключенное к порту <code>/dev/ttyRS485-1</code> выполните команду:
#: <syntaxhighlight lang="bash">
modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyRS485-1 -a1 -t0x06 -r128 12
</syntaxhighlight>
 
Пример успешного выполнения команды:
<syntaxhighlight lang="console">
# modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyRS485-1 -a1 -t0x06 -r128 12
Data to write: 0xc
Opening /dev/ttyRS485-1 at 9600 bauds (N, 8, 2)
[01][06][00][80][00][0C][88][27]
Waiting for a confirmation...
<01><06><00><80><00><0C><88><27>
SUCCESS: written 1 elements!
</syntaxhighlight>
 
== Изменение адреса устройству с неизвестным адресом ==
С расширением Быстрый Modbus, изменить адрес устройства можно используя адресацию по его серийному номеру. В этом случае не нужно отключать другие устройства от шины. О там как это сделать читайте на странице про [[Fast_Modbus |Быстрый Modbus]].
Если вы используете устройство со старой версией прошивки используйте инструкцию ниже, а лучше обновите прошивку.


Если вам достаточно изменить адрес устройства, то вы можете сделать это отправив ему широковещательный запрос.
<!--T:8-->
 
<syntaxhighlight lang="bash">root@wirenboard:~# modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a0 -t0x06 -r0x80 1
'''ВНИМАНИЕ:''' новый адрес будет установлен для всех устройств на шине, поэтому отключите те устройства, адреса которых вы не хотите менять.
 
Чтобы изменить адрес, выполните шаги:
# Подключите устройство по [[RS-485 | шине RS-485]] к контроллеру или другому оборудованию, где будете выполнять команды.
# Если вы выполняете команды на контроллере:
#:* откройте консоль контроллера по [[SSH]],
#:* [[Modbus-client#Подготовка к работе | остановите драйвер wb-mqtt-serial]].
# Замените в команде порт <code>/dev/ttyRS485-1</code> на тот, к которому подключены устройства и выполните команду на контроллере:
#: <syntaxhighlight lang="bash">
modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyRS485-1 -a0 -t0x06 -r128 1
</syntaxhighlight>
 
Так как команда отправляет данные по широковещательному адресу — сообщение об ошибке в ответе является нормой.
 
Запишем всем устройствам на шине в регистр <code>128 (0x80)</code> новый адрес <code>1</code>:
<syntaxhighlight lang="console">
# modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyRS485-1 -a0 -t0x06 -r128 1
Data to write: 0x1
Data to write: 0x1
Opening /dev/ttyRS485-1 at 9600 bauds (N, 8, 2)
Opening /dev/ttyAPP1 at 9600 bauds (N, 8, 2)
[00][06][00][80][00][01][48][33]
[00][06][00][80][00][01][48][33]
Waiting for a confirmation...
Waiting for a confirmation...
Строка 103: Строка 39:
ERROR occured!
ERROR occured!
</syntaxhighlight>
</syntaxhighlight>
 
Сообщение об ошибке не должно пугать: устройства Modbus не отвечают на команды, отправленные на широковещательный адрес. Проверим, сохранился ли адрес в адресном регистре:
== Восстановление доступа ==
<syntaxhighlight lang="bash">root@wirenboard:~# modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a1 -t0x03 -r0x80
{{Anchor|restoring-access}}
Opening /dev/ttyAPP1 at 9600 bauds (N, 8, 2)
[[File:Bootloader.gif|300px|thumb|right|Индикация режима загрузчика]]
[01][03][00][80][00][01][85][E2]
Вы можете сбросить настройки приемопередатчика Modbus-устройства до заводских: скорость — 9600, чётность (parity) — N, количество стоп-бит — 2, Modbus-адрес — 1.
Waiting for a confirmation...
 
<01><03><02><00><01><79><84>
Это может быть полезно, если вам неизвестны все параметры подключения. Для сброса настроек используется утилита [[wb-mcu-fw-flasher]], которая доступна для контроллеров Wiren Board, а также компьютеров с ОС Linux и Windows.
SUCCESS: read 1 of elements:
 
        Data: 0x0001
# Подключите '''только одно устройство''' по [[RS-485 | шине RS-485]] к контроллеру или другому оборудованию, где будете выполнять команды.
# Если вы выполняете команды на контроллере:
#:* откройте консоль контроллера по [[SSH]],
#:* [[Modbus-client#Подготовка к работе | остановите драйвер wb-mqtt-serial]].
# Отключите питание устройства.
# Подайте питание на устройство и в течение двух секунд, пока устройство находится в [[Bootloader MOD | режиме загрузчика]], выполните команду, где <code>/dev/ttyRS485-1</code> (<code>COM1</code>) — порт, к которому подключено устройство:
#:* на контроллере или компьютере с ОС Linux:
#:<syntaxhighlight lang="bash">
wb-mcu-fw-flasher -d /dev/ttyRS485-1 -a0 -u
</syntaxhighlight>
</syntaxhighlight>
#:* на компьютере с ОС Windows перейдите в папку с утилитой, а потом выполните команду:
Отлично, устройство с адресом 0x01 при чтении регистра 0x80 вернуло значение 1 (мы помним, что один регистр хранит два восьмибитных значения, поэтому вывод команды содержит четыре шестнадцатеричных цифры: 0x0001). Желтый светодиод снова моргнул при обращении к устройству.
#:<syntaxhighlight lang="bash">
</translate>
wb-mcu-fw-flasher_1.0.3.exe -d COM1 -a0 -u
</syntaxhighlight>
# Прошейте устройство новой прошивкой, или перезапустите, для этого отключите и включите питание устройства.
 
Пример успешного сброса настроек приемопередатчика:
<syntaxhighlight lang="bash">
root@wirenboard-A4DTZKTB:~# wb-mcu-fw-flasher -d /dev/ttyRS485-1 -a0 -u
/dev/ttyRS485-1 opened successfully.
Send reset UART settings and modbus address command...
Ok.
Device is in Bootloader now! To flash FW run
wb-mcu-fw-flasher -d <port> -f <firmware.wbfw>
</syntaxhighlight>
 
==  Полезные ссылки ==
* [[UART_Communication_Settings | Настройка параметров обмена данными по RS-485 для modbus-устройств Wiren Board]]
* [[WB Modbus Devices Firmware Update | Обновление прошивки Modbus-устройств Wiren Board]]
* [[Modbus-client | Описание утилиты modbus_client]]
* [[wb-mcu-fw-flasher | Сервисная утилита wb-mcu-fw-flasher]]
* [[Wb-mqtt-serial driver | Описание драйвера wb-mqtt-serial]]
* [[Fast_Modbus |Описание расширения Быстрый Modbus]]

Версия 15:06, 10 февраля 2020

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

Смотрите также UART_Communication_Settings.

Определение текущего Modbus-адреса

Modbus-адрес устройств Wiren Board нанесен на наклейке (адрес указан в десятичном формате). Eсли устройство уже было в эксплуатации и адрес его оказался изменен, адрес необходимо каким-либо способом узнать. Программное обеспечение контроллера Wiren Board включает в себя утилиту modbus_client для работы с устройствами, подключенными к выходам RS-485, по протоколу Modbus (Modbus-адрес устройств Wiren Board хранится в регистре 0x80). Справку по команде можно получить, выполнив ее безо всяких параметров, подробное описание находится на странице Modbus-client. Доступ к командной строке описан в статье SSH.

Modbus-адрес, установленный на производстве

Перед работой с портом из командной строки остановите драйвер wb-mqtt-serial:

root@wirenboard:~# service wb-mqtt-serial stop

Попробуем определить текущий адрес модуля. Для этого в командной строке выполним циклическую команду опроса регистра 0x80 устройств с адресами с 1 по 247:

root@wirenboard:~# for i in {1..247}; do modbus_client -mrtu /dev/ttyRS485-1 --debug -a$i -t3 -r0x80 -s2 -pnone; done 2>/dev/null | grep Data:      
        Data: 0x0072

Результат: адрес подключенного устройства — 0x0072, то есть 114. Перебор всех адресов от 1 до 247 занимает чуть больше 2 минут. В параметрах вызова команды modbus_client мы указываем 2 стоп-бита( -s2), отсутствие контроля четности ( -pnone), скорость 9600 бит/с устанавливается автоматически. Чтение выполняем командой READ_HOLDING_REGISTERS с кодом 3 (-t3) из регистра с адресом 0x80 ( -r0x80), адрес меняется в цикле от 1 до 247 ( -a$i). На некоторых устройствах при обмене с ними данными мигает индикатор.

Светодиод Status мигает при обмене данными по RS-485 с модулем WB-MR14

Изменение Modbus-адреса

Мы можем задать устройству адрес, который нам необходим (например, 1), командой

root@wirenboard:~# modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a0 -t0x06 -r0x80 1

Для записи адреса мы используем широковещательный адрес 0 ( -a0) и Modbus RTU-команду WRITE_SINGLE_REGISTER с кодом 6 ( -t0x06). В регистр 0x80 ( -r0x80) мы записываем значение 1.

Использование адреса 0 сбросит все адреса всем устройствам на шине! Никогда не используете эту команду, если к порту RS-485 подключено больше одного устройства!

root@wirenboard:~# modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a0 -t0x06 -r0x80 1
Data to write: 0x1
Opening /dev/ttyAPP1 at 9600 bauds (N, 8, 2)
[00][06][00][80][00][01][48][33]
Waiting for a confirmation...
ERROR Connection timed out: select
ERROR occured!

Сообщение об ошибке не должно пугать: устройства Modbus не отвечают на команды, отправленные на широковещательный адрес. Проверим, сохранился ли адрес в адресном регистре:

root@wirenboard:~# modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a1 -t0x03 -r0x80 
Opening /dev/ttyAPP1 at 9600 bauds (N, 8, 2)
[01][03][00][80][00][01][85][E2]
Waiting for a confirmation...
<01><03><02><00><01><79><84>
SUCCESS: read 1 of elements:
        Data: 0x0001

Отлично, устройство с адресом 0x01 при чтении регистра 0x80 вернуло значение 1 (мы помним, что один регистр хранит два восьмибитных значения, поэтому вывод команды содержит четыре шестнадцатеричных цифры: 0x0001). Желтый светодиод снова моргнул при обращении к устройству.