Wiren Board Device Modbus Address: различия между версиями
Kilpio (обсуждение | вклад) |
Kilpio (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
== Определение текущего Modbus-адреса == | == Определение текущего Modbus-адреса == | ||
Modbus-адрес устройств Wiren Board нанесен на наклейке (адрес указан в десятичном формате). Eсли устройство уже было в эксплуатации | Modbus-адрес устройств Wiren Board нанесен на наклейке (адрес указан в десятичном формате). Eсли устройство уже было в эксплуатации и адрес его оказался изменен, адрес необходимо каким-либо способом узнать. Программное обеспечение контроллера Wiren Board включает в себя утилиту modbus_client для работы с устройствами, подключенными к выходам RS-485, по протоколу Modbus (Modbus-адрес устройств Wiren Board хранится в регистре 0x80). Справку по команде можно получить, выполнив ее безо всяких параметров, подробное описание находится на странице [[Modbus-client]]. Доступ к командной строке описан в статье [[SSH]]. | ||
[[Файл:modbus_address_mr14.png|150px|thumb|left|Modbus-адрес, установленный на производстве]] | [[Файл:modbus_address_mr14.png|150px|thumb|left|Modbus-адрес, установленный на производстве]] | ||
'''Перед работой с портом из командной строки остановите драйвер wb-mqtt-serial:''' | '''Перед работой с портом из командной строки остановите драйвер wb-mqtt-serial:''' |
Версия 12:36, 15 декабря 2016
Определение текущего 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 modbus_client -mrtu /dev/ttyAPP1 --debug -a$i -t3 -r0x80 -s2 -pnone; done 2>/dev/null | grep Data:
Data: 0x0072
Результат: адрес подключенного устройства — 0x0072, то есть 114. Перебор всех адресов от 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/ttyAPP1 -a0 -t0x06 -r0x80 1
Для записи адреса мы используем широковещательный адрес 0 ( -a0) и Modbus RTU-команду WRITE_SINGLE_REGISTER с кодом 6 ( -t0x06). В регистр 0x80 ( -r0x80) мы записываем значение 1.
root@wirenboard:~# modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a0 -t0x06 -r0x80 1
Data to write: 0x1
Opening /dev/ttyAPP1 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/ttyAPP1 -a1 -t0x03 -r0x80
Opening /dev/ttyAPP1 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). Желтый светодиод снова моргнул при обращении к устройству.