Working with WB devices without a controller: различия между версиями

м
Поправил текст.
м (Поправил текст.)
Строка 108: Строка 108:
===Проверка подключения к устройству и считывание адреса===
===Проверка подключения к устройству и считывание адреса===


Все устройства Wiren Board с протоколом Modbus RTU хранят адрес в регистре 0x80 — его удобно считывать для проверки подключения.
Все устройства Wiren Board с протоколом Modbus RTU хранят адрес в регистре <code>0x80</code> — его удобно считывать для проверки подключения.


Читаем содержимое регистра 0x80 с устройства с адреса 2 с помощью функции 0x03 (Read Holding Registers):
Читаем содержимое регистра <code>0x80</code> с устройства с адреса 2 с помощью функции <code>0x03 (Read Holding Registers)</code>:


<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
Строка 127: Строка 127:
===Запись нового адреса===
===Запись нового адреса===


Записываем новый адреса устройства в регистр 0x80, используя функцию 0x06 (Write Single Register):
Записываем новый адреса устройства в регистр <code>0x80</code>, используя функцию <code>0x06 (Write Single Register)</code>.
'''Внимание!''' в команде ниже используется широковещательный адрес "0". Использование в таком виде на порту, к которому подключено несколько устройств изменить адреса на '''всех'''.
 
'''ВНИМАНИЕ:''' в примере используется широковещательный адрес <code>0x00</code>. Использование примера в таком виде '''изменит адрес на всех устройствах Wiren Board''', подключенных к порту <code>/dev/ttyRS485-1</code>. Чтобы этого не произошло — отключите другие устройства от шины.
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a0x00 -t0x06 -r0x80 0x02
modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a0x00 -t0x06 -r0x80 0x02
</syntaxhighlight>
</syntaxhighlight>
Где 0x00 - широковещательный адрес, а 0x02 — адрес, который нужно задать.
Где <code>0x00</code> — широковещательный адрес, а <code>0x02</code> — адрес, который нужно задать.
 
Ответ:
Ответ:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
Строка 143: Строка 145:
</syntaxhighlight>  
</syntaxhighlight>  


Сообщение об ошибке возникает всегда, когда запись производится на специальный (широковещательный) адрес 0 (-a0x00). Теперь к устройству нужно обращаться по адресу 0x02.
Сообщение об ошибке возникает всегда, когда запись производится на специальный (широковещательный) адрес <code>0 (-a0x00)</code>. Теперь к устройству нужно обращаться по адресу <code>0x02</code>.


Пример '''неправильного''' использования команды:
Пример '''неправильного''' использования команды:
Строка 154: Строка 156:
===Чтение сигнатуры устройства===
===Чтение сигнатуры устройства===


Прочтем регистры релейного модуля WB-MR14 с адресом 0x01, содержащие сигнатуру (модель) устройства, WBMR14. Известно, что сигнатура хранится по адресу 200 и занимает 6 регистров.
Прочтем регистры релейного модуля WB-MR14 с адресом <code>0x01</code>, содержащие сигнатуру (модель) устройства: WBMR14. Известно, что сигнатура хранится по адресу 200 и занимает 6 регистров.


<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
Строка 169: Строка 171:
</syntaxhighlight>
</syntaxhighlight>


В ответе мы получили шесть 16-битных значений, в каждом из которых содержится код одного ASCII-символа. Преобразуем их, заменив начальные '''0x00''' на '''/x''' и удалив пробелы, к виду <code>\x57</code> и т.д., который понятен команде echo, и выведем на экран получившееся:
В ответе мы получили шесть 16-битных значений, в каждом из которых содержится код одного ASCII-символа. Преобразуем их, заменив начальные <code>0x00</code> на <code>/x</code> и удалив пробелы, к виду <code>\x57</code> и т.д., который понятен команде <code>echo</code>, и выведем на экран получившееся:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
echo  -e `modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 \
echo  -e `modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 \
Строка 198: Строка 200:
===Включение реле релейного модуля===
===Включение реле релейного модуля===


На модуле WB-MR14 включим реле с номером 6 (адреса регистров флагов начинаются с нуля, помним об этом!). Используем для этого команду 0x05 (Write Single Coil):
На модуле WB-MR14 включим реле с номером 6 (адреса регистров флагов начинаются с нуля, помним об этом!). Используем для этого команду <code>0x05 (Write Single Coil)</code>:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x05 -r0x05 0x01
modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x05 -r0x05 0x01
Строка 213: Строка 215:
</syntaxhighlight>
</syntaxhighlight>


Обратите внимание, утилита modbus_client при записи заменила 1 на 0x00FF, поскольку именно это значение служит для включения реле. Любое ненулевое значение будет заменено на 0x00FF, поэкспериментируйте.
Обратите внимание, утилита modbus_client при записи заменила 1 на <code>0x00FF</code>, поскольку именно это значение служит для включения реле. Любое ненулевое значение будет заменено на <code>0x00FF</code>, поэкспериментируйте.


===Одновременное включение нескольких реле===
===Одновременное включение нескольких реле===


Включим все нечетные реле и выключим все четные. Для этого используем функцию 15 (Write Multiple Coils). В модуле всего 14 реле, так что мы должны передать значения для 14 регистров с 0 по 13.
Включим все нечетные реле и выключим все четные. Для этого используем функцию <code>15 (Write Multiple Coils)</code>. В модуле всего 14 реле, так что мы должны передать значения для 14 регистров с 0 по 13.


<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">