Define and change addresses of Wirenboard Modbus devices

Материал из Wiren Board
Версия от 16:50, 27 мая 2021; FuzzyBot (обсуждение | вклад) (FuzzyBot переименовал страницу Определение и изменение Modbus-адреса устройств Wirenboard/en в Wiren Board Device Modbus Address/en без оставления перенаправления: Часть переводимой страницы Определение и изменение Modbus-адреса устройств Wirenboard.)

(разн.) ← Предыдущая | Подтверждённая версия (разн.) | Текущая версия (разн.) | Следующая → (разн.)
Другие языки:

See also UART_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!

The error message should not be frightening: Modbus devices do not respond to commands sent to the broadcast address. Check if the address is still in the address register:

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

Fine, the device with address 0x01 returned value 1 when reading register 0x80 (we remember that one register stores two eight-bit values, so the output of the command contains four hexadecimal digits: 0x0001). The yellow led blinked again when referring to the device.