Wiren Board Device Modbus Address: различия между версиями
(не показано 80 промежуточных версий 6 участников) | |||
Строка 1: | Строка 1: | ||
<languages/> | |||
<translate> | |||
<!--T:1--> | |||
Смотрите также [[Special:MyLanguage/UART_Communication_Settings|Настройка параметров обмена данными по RS-485]]. | |||
== Определение текущего Modbus-адреса == <!--T:2--> | |||
[[Файл:modbus_address_mr14.png|300px|thumb|right|Modbus-адрес, установленный на производстве]] | |||
[[Файл:Status_flash_mr14.gif|300px|thumb|right|Светодиод Status мигает при обмене данными по RS-485 с модулем WB-MR14]] | |||
<!--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:''' | ||
<!--T:4--> | |||
<syntaxhighlight lang="bash">root@wirenboard:~# service wb-mqtt-serial stop</syntaxhighlight> | |||
Попробуем определить текущий адрес модуля. Для этого в командной строке выполним циклическую команду опроса регистра 0x80 устройств с адресами с 1 по 247: | |||
<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 -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> | |||
<syntaxhighlight lang=" | |||
# for i in {1..247}; do echo -n "$i - "; D=`modbus_client -mrtu /dev/ttyRS485-1 --debug | |||
1 - | 1 - | ||
2 - | 2 - | ||
Строка 37: | Строка 23: | ||
4 - | 4 - | ||
5 - | 5 - | ||
6 - | 6 - | ||
7 - | 7 - | ||
8 - | 8 - | ||
9 - | 9 - | ||
10 - | 10 - | ||
11 - | 11 - | ||
12 - | 12 - | ||
13 - MRPS6 | |||
... | ... | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Результат: найдено устройство WB-MRPS6 с адресом 13 (десятичным). Перебор всех адресов от 1 до 247 занимает чуть больше 2 минут. В параметрах вызова команды modbus_client мы указываем 2 стоп-бита( -s2), отсутствие контроля четности ( -pnone), скорость 9600 бит/с устанавливается автоматически. Чтение выполняем командой READ_HOLDING_REGISTERS с кодом 3 (-t3) из регистра с адресом 0x80 ( -r0x80), адрес меняется в цикле от 1 до 247 ( -a$i). | |||
На некоторых устройствах при обмене с ними данными мигает индикатор. | |||
== Изменение Modbus-адреса == <!--T:5--> | |||
== Изменение адреса | |||
<!--T:6--> | |||
Мы можем задать устройству адрес, который нам необходим (например, 1), командой | |||
<syntaxhighlight lang="bash">root@wirenboard:~# modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a0 -t0x06 -r0x80 1</syntaxhighlight> | |||
Для записи адреса мы используем широковещательный адрес 0 ( -a0) и Modbus RTU-команду WRITE_SINGLE_REGISTER с кодом 6 ( -t0x06). В регистр 0x80 ( -r0x80) мы записываем значение 1. | |||
modbus_client --debug -mrtu | |||
</syntaxhighlight> | |||
<!--T:7--> | |||
'''Использование адреса 0 сбросит все адреса всем устройствам на шине! Никогда не используете эту команду, если к порту RS-485 подключено больше одного устройства!''' | |||
<!--T:8--> | |||
<syntaxhighlight lang=" | <syntaxhighlight lang="bash">root@wirenboard:~# modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a0 -t0x06 -r0x80 1 | ||
# modbus_client --debug -mrtu | |||
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) | ||
Строка 101: | Строка 55: | ||
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) | |||
[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> | </syntaxhighlight> | ||
Отлично, устройство с адресом 0x01 при чтении регистра 0x80 вернуло значение 1 (мы помним, что один регистр хранит два восьмибитных значения, поэтому вывод команды содержит четыре шестнадцатеричных цифры: 0x0001). Желтый светодиод снова моргнул при обращении к устройству. | |||
</translate> | |||
</ | |||
Версия 01:22, 1 июня 2020
Смотрите также Настройка параметров обмена данными по RS-485.
Определение текущего Modbus-адреса
Modbus-адрес устройств Wiren Board нанесен на наклейке (адрес указан в десятичном формате). Eсли устройство уже было в эксплуатации и адрес его оказался изменен, адрес необходимо каким-либо способом узнать. Программное обеспечение контроллера Wiren Board включает в себя утилиту modbus_client для работы с устройствами, подключенными к выходам RS-485, по протоколу Modbus (Modbus-адрес устройств Wiren Board хранится в регистре 0x80). Справку по команде можно получить, выполнив ее безо всяких параметров, подробное описание находится на странице Modbus-client. Доступ к командной строке описан в статье SSH.
Перед работой с портом из командной строки остановите драйвер wb-mqtt-serial:
root@wirenboard:~# service wb-mqtt-serial stop
Попробуем определить текущий адрес модуля. Для этого в командной строке выполним циклическую команду опроса регистра 0x80 устройств с адресами с 1 по 247:
root@wirenboard:~# for i in {1..247}; do echo -n "$i - "; D=`modbus_client -mrtu /dev/ttyRS485-1 --debug -a$i -t3 -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 -
7 -
8 -
9 -
10 -
11 -
12 -
13 - MRPS6
...
Результат: найдено устройство WB-MRPS6 с адресом 13 (десятичным). Перебор всех адресов от 1 до 247 занимает чуть больше 2 минут. В параметрах вызова команды modbus_client мы указываем 2 стоп-бита( -s2), отсутствие контроля четности ( -pnone), скорость 9600 бит/с устанавливается автоматически. Чтение выполняем командой READ_HOLDING_REGISTERS с кодом 3 (-t3) из регистра с адресом 0x80 ( -r0x80), адрес меняется в цикле от 1 до 247 ( -a$i). На некоторых устройствах при обмене с ними данными мигает индикатор.
Изменение Modbus-адреса
Мы можем задать устройству адрес, который нам необходим (например, 1), командой
root@wirenboard:~# modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a0 -t0x06 -r0x80 1
Для записи адреса мы используем широковещательный адрес 0 ( -a0) и Modbus RTU-команду WRITE_SINGLE_REGISTER с кодом 6 ( -t0x06). В регистр 0x80 ( -r0x80) мы записываем значение 1.
Использование адреса 0 сбросит все адреса всем устройствам на шине! Никогда не используете эту команду, если к порту RS-485 подключено больше одного устройства!
root@wirenboard:~# 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!
Сообщение об ошибке не должно пугать: устройства Modbus не отвечают на команды, отправленные на широковещательный адрес. Проверим, сохранился ли адрес в адресном регистре:
root@wirenboard:~# modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x03 -r0x80
Opening /dev/ttyRS485-1 at 9600 bauds (N, 8, 2)
[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
Отлично, устройство с адресом 0x01 при чтении регистра 0x80 вернуло значение 1 (мы помним, что один регистр хранит два восьмибитных значения, поэтому вывод команды содержит четыре шестнадцатеричных цифры: 0x0001). Желтый светодиод снова моргнул при обращении к устройству.