Wiren Board Device Modbus Address: различия между версиями

Материал из Wiren Board
м
м (Переписал)
Строка 1: Строка 1:
<languages/>
<translate>
{{Draft}}
{{Draft}}
<!--T:1-->
{{DISPLAYTITLE: Modbus-адрес устройства Wiren Board}}
Смотрите также [[Special:MyLanguage/UART_Communication_Settings|Настройка параметров обмена данными по RS-485]].


== Определение текущего Modbus-адреса == <!--T:2-->
== Общая информация ==


[[Файл:modbus_address_mr14.png|300px|thumb|right|Modbus-адрес, установленный на производстве]]
[[Файл:modbus_address_mr14.png|300px|thumb|right|Modbus-адрес, установленный на производстве]]
Заводской адрес устройства можно узнать на наклейке, которая находится на корпусе устройства.


[[Файл:Status_flash_mr14.gif|300px|thumb|right|Светодиод Status мигает при обмене данными по RS-485 с модулем WB-MR14]]
Если заводской адрес был изменен, то можно воспользоваться одним из способов ниже. В них используется утилита [[Modbus-client |modbus_client]]. Перед её использованием нужно [[Modbus-client#Подготовка к работе | остановить драйвер wb-mqtt-serial]].
<!--T:3-->
Modbus-адрес устройств Wiren Board нанесен на наклейке (адрес указан в десятичном формате). Eсли устройство уже было в эксплуатации и адрес его оказался изменен, адрес необходимо каким-либо способом узнать. Программное обеспечение контроллера Wiren Board включает в себя утилиту modbus_client для работы с устройствами, подключенными к выходам RS-485, по протоколу Modbus (Modbus-адрес устройств Wiren Board хранится в регистре 0x80). Справку по команде можно получить, выполнив ее безо всяких параметров, подробное описание находится на странице [[Special:MyLanguage/Modbus-client|Modbus-client]]. Доступ к командной строке описан в статье [[Special:MyLanguage/SSH|SSH]].


'''Перед работой с портом из командной строки остановите драйвер wb-mqtt-serial:'''
Методы ниже хорошо работают если известны другие настройки подключения к устройству: скорость, четность, стоп-бит. Если эти параметры вам неизвестны, вы можете [[Restore factory settings | сбросить настройки устройства]].


<!--T:4-->
== Узнать адреса всех устройств на шине ==
<syntaxhighlight lang="bash">root@wirenboard:~# service wb-mqtt-serial stop</syntaxhighlight>
Если перебрать все доступные адреса и прочитать в ответивших устройствах регистр с адресом — можно получить список адресов всех устройств на шине с их сигнатурой:
Попробуем определить текущий адрес модуля. Для этого в командной строке выполним циклическую команду опроса регистра 0x80 устройств с адресами с 1 по 247:
# Откройте консоль контроллера по [[SSH]].
<syntaxhighlight lang="bash">root@wirenboard:~# for i in {1..247}; do echo -n "$i - "; D=`modbus_client -mrtu /dev/ttyRS485-1 --debug -a$i -t3 -o100 -r200 -s2 -c6 -pnone 2>/dev/null | grep Data: | awk 'gsub("Data:","")' | sed -e 's/0x00/\\\x/g' -e 's/\s//g'`; echo -e $D; done
# Если вы работаете с контроллера — остановите драйвер wb-mqtt-serial.
# Замените в скрипте порт <code>/dev/ttyRS485-1</code> на тот, к которому подключены устройства:
#:<syntaxhighlight lang="bash">
for i in {1..247}; do echo -n "$i - "; D=`modbus_client -mrtu /dev/ttyRS485-1 --debug -a$i -t3 -o100 -r200 -s2 -c6 -pnone 2>/dev/null | grep Data: | awk 'gsub("Data:","")' | sed -e 's/0x00/\\\x/g' -e 's/\s//g'`; echo -e $D; done
</syntaxhighlight>
# Скопируйте и вставьте измененный скрипт в консоль контроллера и нажмите '''Enter'''.
 
Скрипт переберет все адреса с 1 по 247 и выведет в консоль результат для каждого адреса:
<syntaxhighlight lang="bash">
~# for i in {1..247}; do echo -n "$i - "; D=`modbus_client -mrtu /dev/ttyRS485-1 --debug -a$i -t3 -o100 -r200 -s2 -c6 -pnone 2>/dev/null | grep Data: | awk 'gsub("Data:","")' | sed -e 's/0x00/\\\x/g' -e 's/\s//g'`; echo -e $D; done
1 -  
1 -  
2 -  
2 -  
Строка 24: Строка 29:
4 -  
4 -  
5 -  
5 -  
6 -  
6 - WBMWAC
7 -  
7 -  
8 -  
8 -  
9 -  
9 - WBMRGB
10 -  
10 -  
11 -  
11 -  
12 -  
12 -  
13 - MRPS6
...
...
</syntaxhighlight>
</syntaxhighlight>
Результат: найдено устройство WB-MRPS6 с адресом 13 (десятичным). Перебор всех адресов от 1 до 247 занимает чуть меньше минуты. В параметрах вызова команды modbus_client мы указываем 2 стоп-бита( -s2), отсутствие контроля четности ( -pnone), скорость 9600 бит/с устанавливается автоматически. Чтение выполняем командой READ_HOLDING_REGISTERS с кодом 3 (-t3) из регистра с адресом 0x80 ( -r0x80), адрес меняется в цикле от 1 до 247 ( -a$i).
На некоторых устройствах при обмене с ними данными мигает индикатор.


== Изменение Modbus-адреса == <!--T:5-->
== Изменить адрес широковещательным запросом ==
Если вам достаточно изменить адрес устройства, то вы можете сделать это отправив ему широковещательный запрос.
 
'''ВНИМАНИЕ:''' новый адрес будет установлен для всех устройств на шине, поэтому отключите те устройства, адреса которых вы не хотите менять.


<!--T:6-->
# Откройте консоль контроллера по [[SSH]].
Мы можем задать устройству адрес, который нам необходим (например, 1), командой
# Если вы работаете с контроллера — остановите драйвер wb-mqtt-serial.
<syntaxhighlight lang="bash">root@wirenboard:~# modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a0 -t0x06 -r0x80 1</syntaxhighlight>
# Замените в команде порт <code>/dev/ttyRS485-1</code> на тот, к которому подключены устройства и выполните её на контроллере:
Для записи адреса мы используем широковещательный адрес 0 ( -a0) и Modbus RTU-команду WRITE_SINGLE_REGISTER с кодом 6 ( -t0x06). В регистр 0x80 ( -r0x80) мы записываем значение 1.
#: <syntaxhighlight lang="bash">
modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a0 -t0x06 -r0x80 1
</syntaxhighlight>


<!--T:7-->
Так как команда отправляет данные по широковещательному адресу — сообщение об ошибке в ответе является нормой.
'''Использование адреса 0 сбросит все адреса всем устройствам на шине! Никогда не используете эту команду, если к порту RS-485 подключено больше одного устройства!'''


<!--T:8-->
Запишем всем устройствам на шине в регистр <code>128</code> новый адрес <code>1</code>
<syntaxhighlight lang="bash">root@wirenboard:~# modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a0 -t0x06 -r0x80 1
<syntaxhighlight lang="bash">
modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a0 -t0x06 -r0x80 1
Data to write: 0x1
Data to write: 0x1
Opening /dev/ttyRS485-1 at 9600 bauds (N, 8, 2)
Opening /dev/ttyRS485-1 at 9600 bauds (N, 8, 2)
Строка 56: Строка 63:
ERROR occured!
ERROR occured!
</syntaxhighlight>
</syntaxhighlight>
Сообщение об ошибке не должно пугать: устройства Modbus не отвечают на команды, отправленные на широковещательный адрес. Проверим, сохранился ли адрес в адресном регистре:
 
<syntaxhighlight lang="bash">root@wirenboard:~# modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x03 -r0x80
==  Полезные ссылки ==
Opening /dev/ttyRS485-1 at 9600 bauds (N, 8, 2)
* [[Restore factory settings | Сброс устройства к заводским настройками]]
[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
</syntaxhighlight>
Отлично, устройство с адресом 0x01 при чтении регистра 0x80 вернуло значение 1 (мы помним, что один регистр хранит два восьмибитных значения, поэтому вывод команды содержит четыре шестнадцатеричных цифры: 0x0001). Желтый светодиод снова моргнул при обращении к устройству.
</translate>

Версия 14:29, 27 мая 2021

Это черновик страницы. Последняя правка сделана 27.05.2021 пользователем A.Degtyarev.


Общая информация

Modbus-адрес, установленный на производстве

Заводской адрес устройства можно узнать на наклейке, которая находится на корпусе устройства.

Если заводской адрес был изменен, то можно воспользоваться одним из способов ниже. В них используется утилита modbus_client. Перед её использованием нужно остановить драйвер wb-mqtt-serial.

Методы ниже хорошо работают если известны другие настройки подключения к устройству: скорость, четность, стоп-бит. Если эти параметры вам неизвестны, вы можете сбросить настройки устройства.

Узнать адреса всех устройств на шине

Если перебрать все доступные адреса и прочитать в ответивших устройствах регистр с адресом — можно получить список адресов всех устройств на шине с их сигнатурой:

  1. Откройте консоль контроллера по SSH.
  2. Если вы работаете с контроллера — остановите драйвер wb-mqtt-serial.
  3. Замените в скрипте порт /dev/ttyRS485-1 на тот, к которому подключены устройства:
    for i in {1..247}; do echo -n "$i - "; D=`modbus_client -mrtu /dev/ttyRS485-1 --debug -a$i -t3 -o100 -r200 -s2 -c6 -pnone 2>/dev/null | grep Data: | awk 'gsub("Data:","")' | sed -e 's/0x00/\\\x/g' -e 's/\s//g'`; echo -e $D; done
    
  4. Скопируйте и вставьте измененный скрипт в консоль контроллера и нажмите Enter.

Скрипт переберет все адреса с 1 по 247 и выведет в консоль результат для каждого адреса:

~# for i in {1..247}; do echo -n "$i - "; D=`modbus_client -mrtu /dev/ttyRS485-1 --debug -a$i -t3 -o100 -r200 -s2 -c6 -pnone 2>/dev/null | grep Data: | awk 'gsub("Data:","")' | sed -e 's/0x00/\\\x/g' -e 's/\s//g'`; echo -e $D; done
1 - 
2 - 
3 - 
4 - 
5 - 
6 - WBMWAC
7 - 
8 - 
9 - WBMRGB
10 - 
11 - 
12 - 
...

Изменить адрес широковещательным запросом

Если вам достаточно изменить адрес устройства, то вы можете сделать это отправив ему широковещательный запрос.

ВНИМАНИЕ: новый адрес будет установлен для всех устройств на шине, поэтому отключите те устройства, адреса которых вы не хотите менять.

  1. Откройте консоль контроллера по SSH.
  2. Если вы работаете с контроллера — остановите драйвер wb-mqtt-serial.
  3. Замените в команде порт /dev/ttyRS485-1 на тот, к которому подключены устройства и выполните её на контроллере:
    modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a0 -t0x06 -r0x80 1
    

Так как команда отправляет данные по широковещательному адресу — сообщение об ошибке в ответе является нормой.

Запишем всем устройствам на шине в регистр 128 новый адрес 1

modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a0 -t0x06 -r0x80 1
Data to write: 0x1
Opening /dev/ttyRS485-1 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!

Полезные ссылки