16 474
правки
Brainroot (обсуждение | вклад) |
м (Поправил текст.) |
||
Строка 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>. | ||
''' | |||
'''ВНИМАНИЕ:''' в примере используется широковещательный адрес <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 | Где <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, содержащие сигнатуру (модель) устройства | Прочтем регистры релейного модуля WB-MR14 с адресом <code>0x01</code>, содержащие сигнатуру (модель) устройства: WBMR14. Известно, что сигнатура хранится по адресу 200 и занимает 6 регистров. | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
Строка 169: | Строка 171: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
В ответе мы получили шесть 16-битных значений, в каждом из которых содержится код одного ASCII-символа. Преобразуем их, заменив начальные | В ответе мы получили шесть 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"> |