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

Материал из Wiren Board
(не показано 38 промежуточных версий 6 участников)
Строка 1: Строка 1:
<languages/>
{{DISPLAYTITLE:Настройки параметров обмена данными по RS-485 для устройств Wirenboard}}
{{DISPLAYTITLE:Настройка параметров подключения по RS-485 для Modbus-устройств Wiren Board}}
<translate>
== Введение ==
Устройства Wiren Board управляются по протоколу Modbus RTU и на физическом уровне подключаются через интерфейс [[RS-485]].
{{Wbincludes:Modbus Default Settings}}


== Изменение скорости обмена ==
== Регистры параметров обмена данными по RS-485 ==
{{Anchor|baud-rate}}
Для ускорения отклика устройств на шине RS485 рекомендуем поднять скорость обмена до 115 200 бит/с.


Отметим, что низкая скорость обмена прощает многие ошибки построения шины, но на высоких скоростях выполнение [[RS-485:Физическое подключение | рекомендаций по построению шины]] обязательно.
В заводской конфигурации все устройства Wiren Board поставляются со следующими настройками RS-485: 9600 бит/с, бит чётности отсутствует (none), количество стоп-битов — 2.
Однако во прошивках всех современных устройств Wiren Board поддерживаются дополнительные регистры настройки параметров обмена данными по RS-485:


=== Смена уровня доступа к веб-интерфейсу ===
{|  border="1" class="wikitable" style="text-align:center; width:1000px;"
{{Wbincludes:WebUI Change Access Level}}
!Регистр / адрес
!Тип
!Чтение/запись
!Значение по умолчанию
!Формат
!Назначение
|-
| 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
|-
|}


=== Настройка ===
== Изменение параметров обмена данными ==
{{YouTube
Чтобы иметь возможность обратиться к устройству, поддерживающем протокол modbus RTU по шине RS-485, необходимо знать его modbus-адрес, а так же установленные на устройстве скорость обмена данными, четность, количество стоп-битов.
|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 бит/с.
# Снова сохраните настройки. Теперь настройки устройств и порта совпадают, устройства должны начать отвечать.


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


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


Допустим, у нас есть Modbus-устройство Wiren Board с заводскими параметрами подключения, Modbus-адресом <code>1</code> и подключённое к порту <code>/dev/ttyRS485-1</code>.
Подробнее смотрите описание команды [[Modbus-client|modbus_client]].


Изменим адрес устройства, для этого запишем в регистр <code>128</code> новый адрес, например <code>12</code>:
Записать новое значение можно с помощью следующей команды:
<syntaxhighlight lang="bash">
modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyRS485-1 -a1 -t0x06 -r128 12
</syntaxhighlight>


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


Теперь устройство передаёт и принимает данные на скорости 115 200 бит/с.
Теперь устройство передает и принимает данные на скорости 115200 бит/с.


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


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


Крайний случай — [[Wiren_Board_Device_Modbus_Address#Восстановление доступа| сбросить настройки к заводским]].
    #/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


Если вы используете старое ПО контроллера, не поддерживающее сканирование, можно узнать настройки перебором, для этого загрузите на контроллер скрипт [[Media:Perebor.sh.tar.gz|Perebor.sh.tar.gz]] и выполните его. Если адрес, к которому подключено устройство отличается от <code>/dev/ttyRS485-1</code>, измените его в теле скрипта.


<!--T:16-->
Для стоп-битов, скорее всего, вы получите два значения: 1 и 2. Уточнить настройку можно считав значение из регистра 112 с уже известным адресом, скоростью, четностью:
Как это работает: мы обращаемся к регистру <code>128</code>, в котором во всех modbus-устройствах Wiren Board хранится modbus-адрес. Вывод скрипта будет содержать строки, подобные этим:
Speed:9600      Stop bits:1     Parity:none    Modbus address:0x0001
Speed:9600      Stop bits:2     Parity:none    Modbus address:0x0001


<!--T:17-->
modbus_client --debug -mrtu -b'''9600''' -p'''none''' -s'''2''' /dev/ttyAPP1 -a'''0x01''' -t0x03 -r112
Для стоп-битов, скорее всего, вы получите два значения: 1 и 2. Уточнить настройку можно считав значение из регистра <code>112</code> с уже известным адресом, скоростью, четностью:


<!--T:18-->
modbus_client --debug -mrtu -b'''9600''' -p'''none''' -s'''2''' /dev/ttyAPP1 -a'''0x01''' -t0x03 -r112
<!--T:19-->
или
или


  <!--T:20-->
  modbus_client --debug -mrtu -b'''9600''' -p'''none''' -s'''1''' /dev/ttyAPP1 -a'''0x01''' -t0x03 -r112
modbus_client --debug -mrtu -b'''9600''' -p'''none''' -s'''1''' /dev/ttyAPP1 -a'''0x01''' -t0x03 -r112


     <!--T:21-->
     SUCCESS: read 1 of elements:
SUCCESS: read 1 of elements:
     Data: 0x0002
     Data: 0x0002
<!--T:22-->
Если при чтении из регистра 112 вы получаете ошибку — устройство не поддерживает изменение параметров подключения. В этом случае для подключения используется значение по умолчанию,2 стоп-бита.
</translate>

Версия 17:21, 2 апреля 2018


Регистры параметров обмена данными по 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-адрес, а так же установленные на устройстве скорость обмена данными, четность, количество стоп-битов.

Узнать текущие настройки параметров обмена данными, можно, прочитав значение указанных выше регистров, например:

   (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 --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


Для стоп-битов, скорее всего, вы получите два значения: 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