Определение и изменение Modbus-адреса устройств Wirenboard

From Wiren Board
Jump to: navigation, search
Other languages:
English • ‎русский

Смотрите также 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/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). Желтый светодиод снова моргнул при обращении к устройству.