Wiren Board Device Modbus Address: различия между версиями
(Отметить эту версию для перевода) |
|||
(не показано 7 промежуточных версий 4 участников) | |||
Строка 2: | Строка 2: | ||
<translate> | <translate> | ||
<!--T:1--> | <!--T:1--> | ||
Смотрите также [[Special:MyLanguage/UART_Communication_Settings| | Смотрите также [[Special:MyLanguage/UART_Communication_Settings|Настройка параметров обмена данными по RS-485]]. | ||
== Определение текущего Modbus-адреса == <!--T:2--> | == Определение текущего 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--> | <!--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]]. | 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:''' | '''Перед работой с портом из командной строки остановите драйвер wb-mqtt-serial:''' | ||
Строка 14: | Строка 17: | ||
<syntaxhighlight lang="bash">root@wirenboard:~# service wb-mqtt-serial stop</syntaxhighlight> | <syntaxhighlight lang="bash">root@wirenboard:~# service wb-mqtt-serial stop</syntaxhighlight> | ||
Попробуем определить текущий адрес модуля. Для этого в командной строке выполним циклическую команду опроса регистра 0x80 устройств с адресами с 1 по 247: | Попробуем определить текущий адрес модуля. Для этого в командной строке выполним циклическую команду опроса регистра 0x80 устройств с адресами с 1 по 247: | ||
<syntaxhighlight lang="bash">root@wirenboard:~# for i in {1..247}; do modbus_client -mrtu /dev/ | <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 | ||
1 - | |||
Результат: | 2 - | ||
3 - | |||
4 - | |||
5 - | |||
6 - | |||
7 - | |||
8 - | |||
9 - | |||
10 - | |||
11 - | |||
12 - | |||
13 - MRPS6 | |||
... | |||
</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--> | == Изменение Modbus-адреса == <!--T:5--> | ||
Строка 25: | Строка 40: | ||
<!--T:6--> | <!--T:6--> | ||
Мы можем задать устройству адрес, который нам необходим (например, 1), командой | Мы можем задать устройству адрес, который нам необходим (например, 1), командой | ||
<syntaxhighlight lang="bash">root@wirenboard:~# modbus_client --debug -mrtu -pnone -s2 /dev/ | <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. | Для записи адреса мы используем широковещательный адрес 0 ( -a0) и Modbus RTU-команду WRITE_SINGLE_REGISTER с кодом 6 ( -t0x06). В регистр 0x80 ( -r0x80) мы записываем значение 1. | ||
Строка 32: | Строка 47: | ||
<!--T:8--> | <!--T:8--> | ||
<syntaxhighlight lang="bash">root@wirenboard:~# modbus_client --debug -mrtu -pnone -s2 /dev/ | <syntaxhighlight lang="bash">root@wirenboard:~# modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a0 -t0x06 -r0x80 1 | ||
Data to write: 0x1 | Data to write: 0x1 | ||
Opening /dev/ | Opening /dev/ttyRS485-1 at 9600 bauds (N, 8, 2) | ||
[00][06][00][80][00][01][48][33] | [00][06][00][80][00][01][48][33] | ||
Waiting for a confirmation... | Waiting for a confirmation... | ||
Строка 41: | Строка 56: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Сообщение об ошибке не должно пугать: устройства Modbus не отвечают на команды, отправленные на широковещательный адрес. Проверим, сохранился ли адрес в адресном регистре: | Сообщение об ошибке не должно пугать: устройства Modbus не отвечают на команды, отправленные на широковещательный адрес. Проверим, сохранился ли адрес в адресном регистре: | ||
<syntaxhighlight lang="bash">root@wirenboard:~# modbus_client --debug -mrtu -pnone -s2 /dev/ | <syntaxhighlight lang="bash">root@wirenboard:~# modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x03 -r0x80 | ||
Opening /dev/ | Opening /dev/ttyRS485-1 at 9600 bauds (N, 8, 2) | ||
[01][03][00][80][00][01][85][E2] | [01][03][00][80][00][01][85][E2] | ||
Waiting for a confirmation... | Waiting for a confirmation... |
Версия 01:24, 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 -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 -
7 -
8 -
9 -
10 -
11 -
12 -
13 - MRPS6
...
Результат: найдено устройство WB-MRPS6 с адресом 13 (десятичным). Перебор всех адресов от 1 до 247 занимает чуть меньше минуты. В параметрах вызова команды 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). Желтый светодиод снова моргнул при обращении к устройству.