UART Communication Settings: различия между версиями
Fizikdaos (обсуждение | вклад) |
|||
(не показано 19 промежуточных версий 3 участников) | |||
Строка 1: | Строка 1: | ||
<languages/> | <languages/> | ||
<translate> | <translate> | ||
</translate> | |||
{{DISPLAYTITLE:Настройка параметров обмена данными по RS-485 для modbus-устройств Wiren Board}} | |||
<translate> | |||
== Регистры параметров обмена данными по RS-485 == <!--T:1--> | |||
<!--T:2--> | |||
В заводской конфигурации все устройства Wiren Board поставляются со следующими настройками RS-485: 9600 бит/с, бит чётности отсутствует (none), количество стоп-битов — 2. | |||
Однако в прошивках почти всех современных устройств Wiren Board поддерживаются дополнительные регистры настройки параметров обмена данными по RS-485: | |||
<!--T:3--> | |||
{| border="1" class="wikitable" style="text-align:center; width:1000px;" | |||
!Регистр / адрес | |||
!Тип | |||
!Чтение/запись | |||
!Значение по умолчанию | |||
!Формат | |||
!Назначение | |||
|- | |||
| 110 || holding || RW || 96 || baud rate / 100 || скорость порта RS-485, '''делённая на 100'''. Допустимые скорости: 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 | |||
|- | |||
| 111 || holding || RW || 0 || || настройка бита чётности порта RS-485. Допустимые значения: 0 - нет бита чётности (none), 1 - нечётный (odd), 2 - чётный (even) | |||
|- | |||
| 112 || holding || RW || 2 || || количество стоп-битов порта RS-485. Допустимые значения: 1, 2 | |||
|- | |||
|} | |||
=== | == Изменение параметров обмена данными == <!--T:4--> | ||
<!--T:5--> | |||
Чтобы иметь возможность обратиться к устройству, поддерживающем протокол modbus RTU по шине RS-485, необходимо знать его modbus-адрес, а так же установленные на устройстве скорость обмена данными, четность, количество стоп-битов. '''Важно: Перед выполнением команд, описанных ниже, остановите сервис wb-mqtt-serial: <code>service wb-mqtt-serial stop</code>''' | |||
<!--T:6--> | |||
Узнать текущие настройки параметров обмена данными, можно, прочитав значение указанных выше регистров, например: | |||
<!--T:7--> | |||
(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 | |||
<!--T:8--> | |||
9600 | |||
<!--T:9--> | |||
< | Подробнее смотрите описание команды [[Special:MyLanguage/Modbus-client|modbus_client]]. | ||
'''Важно: в примерах ниже используется порт /dev/ttyAPP1. Если устройство подключено к другому порту, необходимо заменить /dev/ttyAPP1 на название этого порта!''' | |||
<!--T:10--> | |||
Записать новое значение можно с помощью следующей команды: | |||
<!--T:11--> | |||
modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyAPP1 -a0x01 -t0x06 -r110 1152 | |||
modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ | |||
Теперь устройство | <!--T:12--> | ||
Теперь устройство передает и принимает данные на скорости 115200 бит/с. | |||
<!--T:13--> | |||
Записью в соответствующие регистры изменяется четность и количество стоп-битов. | |||
<!--T:14--> | <!--T:14--> | ||
При этом возникает парадоксальная ситуация: мы не можем узнать значение скорости, если мы заранее не укажем её значение при обращении к устройству! Поэтому стоит внимательно относиться к тому, какие коммуникационные параметры вы устанавливайте. Наклейте на устройство наклейку с новыми параметрами. В случае, если все коммуникационные параметры неизвестны, найти их можно только перебором: | |||
<!--T:15--> | |||
<syntaxhighlight lang="bash"> | |||
#!/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 | |||
</syntaxhighlight> | |||
<!--T:16--> | <!--T:16--> | ||
В этом [[Media:Perebor.sh.tar.gz|скрипте]] мы обращаемся к регистру 0x80, в котором во всех modbus-устройствах Wiren Board хранится modbus-адрес. Вывод скрипта будет содержать строки, подобные этим: | |||
Speed:9600 Stop bits:1 Parity:none Modbus address:0x0001 | Speed:9600 Stop bits:1 Parity:none Modbus address:0x0001 | ||
Speed:9600 Stop bits:2 Parity:none Modbus address:0x0001 | Speed:9600 Stop bits:2 Parity:none Modbus address:0x0001 | ||
<!--T:17--> | <!--T:17--> | ||
Для стоп-битов, скорее всего, вы получите два значения: 1 и 2. Уточнить настройку можно считав значение из регистра | Для стоп-битов, скорее всего, вы получите два значения: 1 и 2. Уточнить настройку можно считав значение из регистра 112 с уже известным адресом, скоростью, четностью: | ||
<!--T:18--> | <!--T:18--> | ||
Строка 91: | Строка 100: | ||
<!--T:22--> | <!--T:22--> | ||
Если при чтении из регистра 112 вы получаете ошибку | Если при чтении из регистра 112 вы получаете ошибку, то устройство не поддерживает установку коммуникационных параметров. В этом случае для коммуникации используется значение по умолчанию,2 стоп-бита. | ||
</translate> | </translate> |
Версия 14:17, 4 мая 2020
Регистры параметров обмена данными по RS-485
В заводской конфигурации все устройства Wiren Board поставляются со следующими настройками RS-485: 9600 бит/с, бит чётности отсутствует (none), количество стоп-битов — 2. Однако в прошивках почти всех современных устройств Wiren Board поддерживаются дополнительные регистры настройки параметров обмена данными по RS-485:
Регистр / адрес | Тип | Чтение/запись | Значение по умолчанию | Формат | Назначение |
---|---|---|---|---|---|
110 | holding | RW | 96 | baud rate / 100 | скорость порта RS-485, делённая на 100. Допустимые скорости: 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 |
111 | holding | RW | 0 | настройка бита чётности порта RS-485. Допустимые значения: 0 - нет бита чётности (none), 1 - нечётный (odd), 2 - чётный (even) | |
112 | holding | RW | 2 | количество стоп-битов порта RS-485. Допустимые значения: 1, 2 |
Изменение параметров обмена данными
Чтобы иметь возможность обратиться к устройству, поддерживающем протокол modbus RTU по шине RS-485, необходимо знать его modbus-адрес, а так же установленные на устройстве скорость обмена данными, четность, количество стоп-битов. Важно: Перед выполнением команд, описанных ниже, остановите сервис wb-mqtt-serial: service wb-mqtt-serial stop
Узнать текущие настройки параметров обмена данными, можно, прочитав значение указанных выше регистров, например:
(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
Подробнее смотрите описание команды modbus_client. Важно: в примерах ниже используется порт /dev/ttyAPP1. Если устройство подключено к другому порту, необходимо заменить /dev/ttyAPP1 на название этого порта!
Записать новое значение можно с помощью следующей команды:
modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyAPP1 -a0x01 -t0x06 -r110 1152
Теперь устройство передает и принимает данные на скорости 115200 бит/с.
Записью в соответствующие регистры изменяется четность и количество стоп-битов.
При этом возникает парадоксальная ситуация: мы не можем узнать значение скорости, если мы заранее не укажем её значение при обращении к устройству! Поэтому стоит внимательно относиться к тому, какие коммуникационные параметры вы устанавливайте. Наклейте на устройство наклейку с новыми параметрами. В случае, если все коммуникационные параметры неизвестны, найти их можно только перебором:
#!/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 стоп-бита.