UART Communication Settings: различия между версиями

Материал из Wiren Board
(не показано 20 промежуточных версий 4 участников)
Строка 1: Строка 1:
<languages/>
<languages/>
{{DISPLAYTITLE:Настройка параметров подключения по RS-485 для Modbus-устройств Wiren Board}}
<translate>
<translate>
== Введение ==
</translate>
Устройства Wiren Board управляются по протоколу Modbus RTU и на физическом уровне подключаются через интерфейс [[RS-485]].  
{{DISPLAYTITLE:Настройка параметров обмена данными по RS-485 для modbus-устройств Wiren Board}}
{{Wbincludes:Modbus Default Settings}}
<translate>
 
 
== Регистры параметров обмена данными по RS-485 == <!--T:1-->
 
<!--T:2-->
В заводской конфигурации все устройства Wiren Board поставляются со следующими настройками RS-485: 9600 бит/с, бит чётности отсутствует (none), количество стоп-битов — 2.
Однако в прошивках почти всех современных устройств Wiren Board поддерживаются дополнительные регистры настройки параметров обмена данными по RS-485:


== Изменение скорости обмена ==
<!--T:3-->
{{Anchor|baud-rate}}
{|  border="1" class="wikitable" style="text-align:center; width:1000px;"
Для ускорения отклика устройств на шине RS485 рекомендуем поднять скорость обмена до 115 200 бит/с.  
!Регистр / адрес
!Тип
!Чтение/запись
!Значение по умолчанию
!Формат
!Назначение
|-
| 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
|-
|}


Отметим, что низкая скорость обмена прощает многие ошибки построения шины, но на высоких скоростях выполнение [[RS-485:Физическое подключение | рекомендаций по построению шины]] обязательно.


=== Смена уровня доступа к веб-интерфейсу ===
== Изменение параметров обмена данными == <!--T:4-->
{{Wbincludes:WebUI Change Access Level}}


=== Настройка ===
<!--T:5-->
{{YouTube
Чтобы иметь возможность обратиться к устройству, поддерживающем протокол modbus RTU по шине RS-485, необходимо знать его modbus-адрес, а так же установленные на устройстве скорость обмена данными, четность, количество стоп-битов. '''Важно: Перед выполнением команд, описанных ниже, остановите сервис wb-mqtt-serial: <code>service wb-mqtt-serial stop</code>'''
|link= https://www.youtube.com/watch?v=d_olK15Xhkw
|text= Смена скорости устройства через веб-интерфейс (12:59)
|start=779
}}
[[Image: WebUI Change Baud Rate.png |250px|thumb|right| Выбор желаемой скорости обмена в настройках устройства ]]
Увеличим скорость обмена в Modbus-устройствах Wiren Board со значения по умолчанию до 115 200 бит/с:
# Подключите и настройте все устройства на скорости 9600 бит/с, которая стоит у них по умолчанию.
# Убедитесь, что все работает как надо: данные идут со всех устройств, каналы не горят красным, в системном журнале нет ошибок порта.
# Откройте [[Wiren_Board_Web_Interface | веб-интерфейс]] контроллера и перейдите '''Settings''' → '''Configs''' → '''Serial Device Driver Configuration'''.
# Выберите нужный порт, в параметрах устройства в группе '''General''' поставьте флажок '''Baud rate''' и выберите желаемую скорость обмена: 115 200 бит/с. Скорость порта пока оставьте прежней.
# Вверху страницы нажмите на кнопку '''Save''', это запустит запись нового значения скорости в устройство.  
# Как только новое значение будет записано, каналы устройства на вкладке '''Devices''' станут красными. Если вы меняли настройки нескольких устройств, дождитесь, пока они все не «покраснеют». Драйвер пишет новые значения не моментально, а по очереди во все устройства с соблюдением таймаутов. Если на шине много устройств, для надёжности можно подождать 2-3 минуты перед следующим шагом.
# Укажите в настройках порта ту же скорость, которую вы выбрали в настройках устройства: 115 200 бит/с.
# Снова сохраните настройки. Теперь настройки устройств и порта совпадают, устройства должны начать отвечать.


== Настройка параметров обмена ==
<!--T:6-->
Чтобы изменить параметры подключения, нам понадобится:
Узнать текущие настройки параметров обмена данными, можно, прочитав значение указанных выше регистров, например:
* знать текущие настройки подключения устройства;
* контроллер с утилитой [[modbus_client]] или компьютер с адаптером USB-RS485 и [[Working_with_WB_devices_without_a_controller | программой для работы с Modbus]];
* номера регистров, которые описаны в [[Common_Modbus_Registers | таблице общих регистров]].


Подготовка:
    <!--T:7-->
# Подключите устройство по [[RS-485 | шине RS-485]] к контроллеру или другому оборудованию, где будете выполнять команды.
(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
# Если вы выполняете команды на контроллере, вместо '''modbus_client''' можно использовать '''modbus_client_rpc''' — вторая утилита не требует остановки драйвера [[wb-mqtt-serial]]. Синтаксис утилит одинаков, просто добавьте <code>_rpc</code> к командам ниже.
# Можно менять настройки устройств.


Допустим, у нас есть Modbus-устройство Wiren Board с заводскими параметрами подключения, Modbus-адресом <code>1</code> и подключённое к порту <code>/dev/ttyRS485-1</code>.
    <!--T:8-->
9600


Изменим адрес устройства, для этого запишем в регистр <code>128</code> новый адрес, например <code>12</code>:
<!--T:9-->
<syntaxhighlight lang="bash">
Подробнее смотрите описание команды [[Special:MyLanguage/Modbus-client|modbus_client]].
modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyRS485-1 -a1 -t0x06 -r128 12
'''Важно: в примерах ниже используется порт /dev/ttyAPP1. Если устройство подключено к другому порту, необходимо заменить /dev/ttyAPP1 на название этого порта!'''
</syntaxhighlight>
 
<!--T:10-->
Записать новое значение можно с помощью следующей команды:


Теперь изменим скорость порта устройства с 9600 бит/с на 115 200 бит/с, для этого запишем в регистр <code>110</code> новое значение, формат которого можно посмотреть в таблице общих регистров:
    <!--T:11-->
<syntaxhighlight lang="bash">
modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyAPP1 -a0x01 -t0x06 -r110 1152
modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyRS485-1 -a12 -t0x06 -r110 1152
</syntaxhighlight>


Теперь устройство передаёт и принимает данные на скорости 115 200 бит/с.
<!--T:12-->
Теперь устройство передает и принимает данные на скорости 115200 бит/с.


Остальные параметры меняются аналогично: смотрите, в каком регистре хранится значение и записываете в него новое.
<!--T:13-->
Записью в соответствующие регистры изменяется четность и количество стоп-битов.


== Если параметры подключения неизвестны ==
{{Anchor|unknown-params}}
<!--T:14-->
<!--T:14-->
Если параметры подключения устройства неизвестны можно узнать их выполнив [[Fast_Modbus#Сканирование_устройств_на_шине |сканирование шины]] в веб-интерфейсе контроллера.
При этом возникает парадоксальная ситуация: мы не можем узнать значение скорости, если мы заранее не укажем её значение при обращении к устройству! Поэтому стоит внимательно относиться к тому, какие коммуникационные параметры вы устанавливайте. Наклейте на устройство наклейку с новыми параметрами. В случае, если все коммуникационные параметры неизвестны, найти их можно только перебором:


Крайний случай — [[Wiren_Board_Device_Modbus_Address#Восстановление доступа| сбросить настройки к заводским]].
<!--T:15-->
 
<syntaxhighlight lang="bash">
Если вы используете старое ПО контроллера, не поддерживающее сканирование, можно узнать настройки перебором, для этого загрузите на контроллер скрипт [[Media:Perebor.sh.tar.gz|Perebor.sh.tar.gz]] и выполните его. Если адрес, к которому подключено устройство отличается от <code>/dev/ttyRS485-1</code>, измените его в теле скрипта.
#!/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-->
Как это работает: мы обращаемся к регистру <code>128</code>, в котором во всех modbus-устройствах Wiren Board хранится modbus-адрес. Вывод скрипта будет содержать строки, подобные этим:
В этом [[Special:MyLanguage/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. Уточнить настройку можно считав значение из регистра <code>112</code> с уже известным адресом, скоростью, четностью:
Для стоп-битов, скорее всего, вы получите два значения: 1 и 2. Уточнить настройку можно считав значение из регистра 112 с уже известным адресом, скоростью, четностью:


  <!--T:18-->
  <!--T:18-->
Строка 90: Строка 102:


<!--T:22-->
<!--T:22-->
Если при чтении из регистра 112 вы получаете ошибку — устройство не поддерживает изменение параметров подключения. В этом случае для подключения используется значение по умолчанию,2 стоп-бита.
Если при чтении из регистра 112 вы получаете ошибку, то устройство не поддерживает установку коммуникационных параметров. В этом случае для коммуникации используется значение по умолчанию,2 стоп-бита.
</translate>
</translate>

Версия 16:48, 10 июня 2019

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



Регистры параметров обмена данными по 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 стоп-бита.