Define and change addresses of Wirenboard Modbus devices

Материал из Wiren Board
Версия от 17:43, 4 июня 2019; RomanKulibaba (обсуждение | вклад) (Новая страница: «'''Using address 0 will reset all addresses to all devices on the bus! Never use this command if more than one device is connected to the RS-485 port!'''»)

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

See alsoUART_Communication_Settings.

Сurrent Modbus address resolution

Modbus address of the Wiren Board devices is printed on the label (the address is in decimal format). If the device has already been in use and its address has been changed, the address must be found in some way. The Wiren Board controller software includes the modbus_client utility to work with devices connected to RS-485 outputs via the Modbus Protocol (the Modbus address of the Wiren Board devices is stored in the 0x80 register). Help on the command can be obtained by running it without any parameters, a detailed description is on the Modbus-client. Access to the command line is described in the SSH article.

The Modbus address set by manufacturer

Stop the wb-mqtt-serial driver before working with the port from the command line:

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

Let's try to determine the current address of the module. To do this, at the command line, run a cyclic command to poll the register of 0x80 devices with addresses from 1 to 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

Result: the address of the connected device is 0x0072, i.e. 114. It takes a little more than 2 minutes to search all addresses from 1 to 247. In the parameters of the modbus_client command call, we specify 2 stop bits( -s2), no parity ( -pnone), the speed of 9600 bit/s is set automatically. Read the command READ_HOLDING_REGISTERS with code 3 (-t3) from the register with the address 0x80 ( -r0x80), the address changes in the cycle from 1 to 247 ( -a$i). On some devices, the led blinks when communicating with them.

Status led blinks when communication via RS-485 module WB-MR14


Modbus address change

We can set the device address we need (for example, 1) with the command

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

We use the broadcast address 0 ( -a0) and Modbus RTU command WRITE_SINGLE_REGISTER with code 6 ( -t0x06) to write the address. In register 0x80 ( -r0x80) we write the value 1.

Using address 0 will reset all addresses to all devices on the bus! Never use this command if more than one device is connected to the RS-485 port!

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