|
|
(не показана 91 промежуточная версия 8 участников) |
Строка 1: |
Строка 1: |
| {{DISPLAYTITLE: Modbus-адрес устройства Wiren Board}}
| | == Определение текущего Modbus-адреса == |
| == Общая информация ==
| |
|
| |
|
| [[Файл:wb_modbus_address.png|300px|thumb|right|Modbus-адрес, установленный на производстве. Слева наклейка на верхней крышке устройства, справа — на боковой стенке]] | | Modbus-адрес устройств Wiren Board нанесен на наклейке (адрес указан в десятичном формате). Eсли устройство уже было в эксплуатации и адрес его оказался изменен, адрес необходимо каким-либо способом узнать. Программное обеспечение контроллера Wiren Board включает в себя утилиту modbus_client для работы с устройствами, подключенными к выходам RS-485, по протоколу Modbus (Modbus-адрес устройств Wiren Board хранится в регистре 0x80). Справку по команде можно получить, выполнив ее безо всяких параметров, подробное описание находится на странице [[Modbus-client]]. Доступ к командной строке описан в статье [[SSH]]. |
| Заводской Modbus-адрес устройства Wiren Board можно узнать на наклейках, которые находится на корпусе устройства:
| | [[Файл:modbus_address_mr14.png|150px|thumb|left|Modbus-адрес, установленный на производстве]] |
| * сбоку, где так же указаны ревизия устройства, версия прошивки, серийный номер и QR-код с этими данными;
| | '''Перед работой с портом из командной строки остановите драйвер wb-mqtt-serial:''' |
| * на верхней крышке устройства.
| |
|
| |
|
| Если заводской адрес был изменен, самый лучший способ узнать его - подключить устройство к контроллеру и выполнить [[Fast_Modbus#Сканирование_устройств_на_шине|сканирование]]. Или воспользоваться утилитой [[Modbus-client |Modbus_client]], которая доступна для контроллеров Wiren Board и компьютеров с ОС Linux.
| | <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/ttyAPP1 --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]] |
|
| |
|
| Если у вас компьютер с ОС Windows, то вы можете [[#Восстановление доступа | восстановить доступ к устройству]].
| | == Изменение Modbus-адреса == |
|
| |
|
| '''ВНИМАНИЕ:''' если вы выполняете команды на контроллере, то перед запуском утилиты ''Modbus-client'' [[Modbus-client#Подготовка к работе | остановите драйвер wb-mqtt-serial]], а после окончания — запустите снова.
| |
|
| |
|
| == Определение адресов всех устройств на шине ==
| | Мы можем задать устройству адрес, который нам необходим (например, 1), командой |
| ===Сканирование шины в веб-интерфейсе=== | | <syntaxhighlight lang="bash">root@wirenboard:~# modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a0 -t0x06 -r0x80 1</syntaxhighlight> |
| {{Wbincludes:WebUI Scan Devices}}
| | Для записи адреса мы используем широковещательный адрес 0 ( -a0) и Modbus RTU-команду WRITE_SINGLE_REGISTER с кодом 6 ( -t0x06). В регистр 0x80 ( -r0x80) мы записываем значение 1. |
|
| |
|
| ===Определение адреса методом перебора===
| | '''Использование адреса 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]].
| |
| Если вы используете устройство со старой версией прошивки используйте инструкцию ниже, а лучше обновите прошивку.
| |
|
| |
|
| Если вам достаточно изменить адрес устройства, то вы можете сделать это отправив ему широковещательный запрос.
| | <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... |
Строка 101: |
Строка 30: |
| 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">
| |
| 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]]
| |
Определение текущего 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/ttyAPP1 --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). Желтый светодиод снова моргнул при обращении к устройству.