Настройка параметров обмена данными по RS-485 для modbus-устройств Wiren Board
Внимание: Отображаемое название «Настройка параметров обмена данными по RS-485 для modbus-устройств Wiren Board» переопределяет ранее заданное отображаемое название «UART Communication Settings».
RS-485 data exchange parameters registers
In the factory configuration, all Wiren Board devices are supplied with the following RS-485 settings: 9600 bps, no parity bit (none), stop bit count — 2. However, the firmware of almost all modern Wiren Board devices supports additional registers, which set parameters of data exchange via RS-485:
Register / address | Type | Read/write | Value by default | Format | Function |
---|---|---|---|---|---|
110 | holding | RW | 96 | baud rate / 100 | RS-485 port speed, divided by 100. Permissible speeds: 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 |
111 | holding | RW | 0 | set the parity bit of the RS-485 port. Valid values: 0 - no parity bit (none), 1 - odd , 2 - even | |
112 | holding | RW | 2 | umber of stop bits of RS-485 port. Valid values: 1, 2 |
Changing data exchange settings
To be able to access the device that supports the modbus RTU Protocol over the RS-485 bus, it is necessary to know its modbus address, as well as the data exchange rate, parity, the number of stop bits installed on the device. Important: Before executing the commands below, stop the wb-mqtt-serial: service wb-mqtt-serial stop service
You can find out the current settings of the data exchange parameters by reading the value of the above registers, for example:
(echo -n '100 \* '; echo -e `modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyAPP1 -a0x01 -t0x03 -r110 | grep Data | sed -e 's/Data://' -e 's/s//g'` | xargs printf "%d") | xargs expr
9600
For details, see the description of the modbus_client command. Important: the examples below use the /dev/ttyAPP1 port. If the device is connected to another port, you must replace /dev/ttyAPP1 with the name of that port!
You can write a new value by using the following command:
modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyAPP1 -a0x01 -t0x06 -r110 1152
The device now transmits and receives data at 115200 bps.
Writing to the appropriate registers changes the parity and the number of stop bits.
In this case, a paradoxical situation arises: we can not know the value of the speed, if we do not specify its value in advance when referring to the device! Therefore, you should pay attention to what communication parameters you set. Stick a sticker with the new settings on the device. If all communication parameters are unknown, you can find them only by searching:
#/bin/bash for l in {1,2}; do for k in {none,odd,even}; do for j in {1200,2400,4800,9600,19200,38400,57600,115200}; do for i in {1..247}; do modbus_client -mrtu /dev/ttyAPP1 --debug -o 300 -a$i -t3 -r0x80 -b$j -s$l -p$k done 2>/dev/null | grep Data: | sed -e 's/ //g' -e 's/\n//' | xargs -I {} printf "Speed:$j\tStop bits:$l\tParity:$k\tModbus address:{}" | grep Data: | sed -e 's/Data://' done done done
В этом скрипте мы обращаемся к регистру 0x80, в котором во всех modbus-устройствах Wiren Board хранится modbus-адрес. Вывод скрипта будет содержать строки, подобные этим:
Speed:9600 Stop bits:1 Parity:none Modbus address:0x0001 Speed:9600 Stop bits:2 Parity:none Modbus address:0x0001
Для стоп-битов, скорее всего, вы получите два значения: 1 и 2. Уточнить настройку можно считав значение из регистра 112 с уже известным адресом, скоростью, четностью:
modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyAPP1 -a0x01 -t0x03 -r112
или
modbus_client --debug -mrtu -b9600 -pnone -s1 /dev/ttyAPP1 -a0x01 -t0x03 -r112
SUCCESS: read 1 of elements: Data: 0x0002
Если при чтении из регистра 112 вы получаете ошибку, то устройство не поддерживает установку коммуникационных параметров. В этом случае для коммуникации используется значение по умолчанию,2 стоп-бита.