12 063
правки
(Подготовка страницы к переводу) |
(Отметить эту версию для перевода) |
||
Строка 2: | Строка 2: | ||
<translate> | <translate> | ||
== Общая информация == | == Общая информация == <!--T:1--> | ||
<!--T:2--> | |||
Утилита modbus-client используется для коммуникации по протоколам Modbus RTU и Modbus TCP из командной строки. Основная задача этой утилиты — использование в качестве отладочного средства или средства настройки Modbus-устройств. Утилита modbus-client поставляется вместе с набором ПО контроллера Wiren Board. Утилита написана на C и использует открытую библиотеку [https://github.com/stephane/libmodbus libmodbus]. Форк этой утилиты, поставляемый с устройствами Wiren Board, хранится [https://github.com/contactless/modbus-utils здесь]. | Утилита modbus-client используется для коммуникации по протоколам Modbus RTU и Modbus TCP из командной строки. Основная задача этой утилиты — использование в качестве отладочного средства или средства настройки Modbus-устройств. Утилита modbus-client поставляется вместе с набором ПО контроллера Wiren Board. Утилита написана на C и использует открытую библиотеку [https://github.com/stephane/libmodbus libmodbus]. Форк этой утилиты, поставляемый с устройствами Wiren Board, хранится [https://github.com/contactless/modbus-utils здесь]. | ||
<!--T:3--> | |||
'''ВАЖНО: поскольку на функционирующем контроллере Wiren Board запущен драйвер modbus, его необходимо останавливать перед работой с modbus-client — вместе они не могут использовать один и тот же порт RS-485.''' | '''ВАЖНО: поскольку на функционирующем контроллере Wiren Board запущен драйвер modbus, его необходимо останавливать перед работой с modbus-client — вместе они не могут использовать один и тот же порт RS-485.''' | ||
<!--T:4--> | |||
Команды для остановки сервиса: | Команды для остановки сервиса: | ||
* для Wiren Board 5 и позднее: <syntaxhighlight lang="bash">service wb-mqtt-serial stop</syntaxhighlight> | * для Wiren Board 5 и позднее: <syntaxhighlight lang="bash">service wb-mqtt-serial stop</syntaxhighlight> | ||
Строка 14: | Строка 17: | ||
== Вызов и аргументы командной строки == | == Вызов и аргументы командной строки == <!--T:5--> | ||
<!--T:6--> | |||
Вызов modbus_client без аргументов выдает краткое описание возможных аргументов команды: | Вызов modbus_client без аргументов выдает краткое описание возможных аргументов команды: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
Строка 37: | Строка 41: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<!--T:7--> | |||
Значения параметров (адрес, таймаут, тип функции и т.д.) можно указывать как в шестнадцатеричном (0x**), так и в десятичном виде. | Значения параметров (адрес, таймаут, тип функции и т.д.) можно указывать как в шестнадцатеричном (0x**), так и в десятичном виде. | ||
<!--T:8--> | |||
* Первый аргумент '''--debug''' — произвольный. Он может указываться в любой позиции и включает отладку, выводя на экран шестнадцатеричные коды отправляемых и принимаемых данных. | * Первый аргумент '''--debug''' — произвольный. Он может указываться в любой позиции и включает отладку, выводя на экран шестнадцатеричные коды отправляемых и принимаемых данных. | ||
* Следующий аргумент '''-m'''. Он должен указываться первым в командной строке, или вторым, если первый аргумент — '''--debug''' или имя файла порта RS-485. Аргумент определяет тип используемого протокола '''-mrtu''' — Modbus RTU, '''-mtcp''' — Modbus TCP. | * Следующий аргумент '''-m'''. Он должен указываться первым в командной строке, или вторым, если первый аргумент — '''--debug''' или имя файла порта RS-485. Аргумент определяет тип используемого протокола '''-mrtu''' — Modbus RTU, '''-mtcp''' — Modbus TCP. | ||
Строка 48: | Строка 54: | ||
* Аргумент '''-0''' (ноль) уменьшает на единицу адрес, задаваемый аргументом -r. Это может быть полезным при работе с устройствами с нестандартной адресацией, например, с диапазоном адресов 1 — 65536 вместо привычного 0 — 65535. | * Аргумент '''-0''' (ноль) уменьшает на единицу адрес, задаваемый аргументом -r. Это может быть полезным при работе с устройствами с нестандартной адресацией, например, с диапазоном адресов 1 — 65536 вместо привычного 0 — 65535. | ||
<!--T:9--> | |||
Затем указываются специфические параметры протокола (Modbus RTU или Modbus TCP). Несмотря на информацию, выводимую в подсказке, эти параметры также начинаются со знака '-' (минус). | Затем указываются специфические параметры протокола (Modbus RTU или Modbus TCP). Несмотря на информацию, выводимую в подсказке, эти параметры также начинаются со знака '-' (минус). | ||
<!--T:10--> | |||
Для Modbus RTU: | Для Modbus RTU: | ||
<!--T:11--> | |||
* '''-b''' — скорость передачи данных по последовательной линии (по умолчанию — 9600). | * '''-b''' — скорость передачи данных по последовательной линии (по умолчанию — 9600). | ||
* '''-d''' — количество передаваемых бит данных (7 или 8, по умолчанию — 8). | * '''-d''' — количество передаваемых бит данных (7 или 8, по умолчанию — 8). | ||
Строка 57: | Строка 66: | ||
* '''-p''' — контроль четности ('''-p none''' — нет проверки, '''-p even''' — передается бит контроля на четность, '''-p odd''' — передается бит контроля на нечетность). По умолчанию передается бит контроля на четность(E). | * '''-p''' — контроль четности ('''-p none''' — нет проверки, '''-p even''' — передается бит контроля на четность, '''-p odd''' — передается бит контроля на нечетность). По умолчанию передается бит контроля на четность(E). | ||
<!--T:12--> | |||
Для Modbus TCP: | Для Modbus TCP: | ||
<!--T:13--> | |||
* '''-p''' — номер TCP-порта устройства, с которым взаимодействует контроллер. | * '''-p''' — номер TCP-порта устройства, с которым взаимодействует контроллер. | ||
<!--T:14--> | |||
Далее следует имя файла порта RS-485 или адрес хоста, а в конце (факультативно, только для функций записи) — данные. | Далее следует имя файла порта RS-485 или адрес хоста, а в конце (факультативно, только для функций записи) — данные. | ||
Строка 68: | Строка 80: | ||
<span id="примеры-использования в modbus rtu"></span> | <span id="примеры-использования в modbus rtu"></span> | ||
<translate> | <translate> | ||
== Примеры использования в Modbus RTU == | == Примеры использования в Modbus RTU == <!--T:15--> | ||
<!--T:16--> | |||
Приведем несколько примеров, иллюстрирующих возможности данной утилиты. | Приведем несколько примеров, иллюстрирующих возможности данной утилиты. | ||
<!--T:17--> | |||
---- | ---- | ||
1. Запись нового адреса устройства WB-MR14 в регистр 0x80, используя функцию 0x06 (Write Single Register). | 1. Запись нового адреса устройства WB-MR14 в регистр 0x80, используя функцию 0x06 (Write Single Register). | ||
<!--T:18--> | |||
<syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a0x00 -t0x06 -r0x80 0x02</syntaxhighlight> | <syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a0x00 -t0x06 -r0x80 0x02</syntaxhighlight> | ||
Где 0x02 - адрес, который нужно задать. | Где 0x02 - адрес, который нужно задать. | ||
Строка 86: | Строка 101: | ||
ERROR occured!</syntaxhighlight> | ERROR occured!</syntaxhighlight> | ||
<!--T:19--> | |||
Сообщение об ошибке возникает всегда, когда запись производится на специальный адрес 0 (-a0x00). Теперь к устройству нужно обращаться по адресу 0x02. | Сообщение об ошибке возникает всегда, когда запись производится на специальный адрес 0 (-a0x00). Теперь к устройству нужно обращаться по адресу 0x02. | ||
<!--T:20--> | |||
Пример '''неправильного''' использования команды: | Пример '''неправильного''' использования команды: | ||
<syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a0x00 -t0x06 -r0x80</syntaxhighlight> | <syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a0x00 -t0x06 -r0x80</syntaxhighlight> | ||
Здесь не указан адрес, который нужно задать устройству и устройство получит неизвестный адрес. Для исправления, нужно обратиться к устройству по специальному адресу 0x00 (см. первую команду). | Здесь не указан адрес, который нужно задать устройству и устройство получит неизвестный адрес. Для исправления, нужно обратиться к устройству по специальному адресу 0x00 (см. первую команду). | ||
<!--T:21--> | |||
---- | ---- | ||
2. Проверка: читаем содержимое регистра 0x80 (теперь уже с устройства с адресом 0x02) с помощью функции 0x03 (Read Holding Registers). Заметим, что в устройствах Wiren Board функции 0x03 и 0x04 взаимозаменяемы и приводят к одному и тому же результату. | 2. Проверка: читаем содержимое регистра 0x80 (теперь уже с устройства с адресом 0x02) с помощью функции 0x03 (Read Holding Registers). Заметим, что в устройствах Wiren Board функции 0x03 и 0x04 взаимозаменяемы и приводят к одному и тому же результату. | ||
<syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a2 -t0x03 -r0x80</syntaxhighlight> | <!--T:22--> | ||
<syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a2 -t0x03 -r0x80</syntaxhighlight> | |||
Ответ: | Ответ: | ||
<syntaxhighlight lang="bash">Opening /dev/ttyAPP1 at 9600 bauds (N, 8, 2) | <syntaxhighlight lang="bash">Opening /dev/ttyAPP1 at 9600 bauds (N, 8, 2) | ||
Строка 104: | Строка 123: | ||
Data: 0x0002</syntaxhighlight> | Data: 0x0002</syntaxhighlight> | ||
<!--T:23--> | |||
---- | ---- | ||
3. Прочтем регистры релейного модуля WB-MR14 с адресом 0x01, содержащие сигнатуру устройства, WBMR14. Известно, что сигнатура хранится по адресу 200 и занимает 6 регистров. | 3. Прочтем регистры релейного модуля WB-MR14 с адресом 0x01, содержащие сигнатуру устройства, WBMR14. Известно, что сигнатура хранится по адресу 200 и занимает 6 регистров. | ||
<!--T:24--> | |||
<syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a1 -t0x03 -r200 -c 6</syntaxhighlight> | <syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a1 -t0x03 -r200 -c 6</syntaxhighlight> | ||
Ответ: | Ответ: | ||
Строка 116: | Строка 137: | ||
Data: 0x0057 0x0042 0x004d 0x0052 0x0031 0x0034 </syntaxhighlight> | Data: 0x0057 0x0042 0x004d 0x0052 0x0031 0x0034 </syntaxhighlight> | ||
<!--T:25--> | |||
В ответе мы получили 6 16-битных значений, в каждом из которых содержится код одного ASCII-символа. Преобразуем их, заменив начальные '''0x00''' на '''/x''' и удалив пробелы, к виду \x57 и т.д., который понятен команде echo, и выведем на экран получившееся: | В ответе мы получили 6 16-битных значений, в каждом из которых содержится код одного ASCII-символа. Преобразуем их, заменив начальные '''0x00''' на '''/x''' и удалив пробелы, к виду \x57 и т.д., который понятен команде echo, и выведем на экран получившееся: | ||
<syntaxhighlight lang="bash">echo -e `modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 \ | <syntaxhighlight lang="bash">echo -e `modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 \ | ||
Строка 123: | Строка 145: | ||
<syntaxhighlight lang="bash">WBMR14</syntaxhighlight> | <syntaxhighlight lang="bash">WBMR14</syntaxhighlight> | ||
<!--T:26--> | |||
В старых версиях прошивки <syntaxhighlight lang="bash">| xxd -r -p</syntaxhighlight> не было нужно. | В старых версиях прошивки <syntaxhighlight lang="bash">| xxd -r -p</syntaxhighlight> не было нужно. | ||
<!--T:27--> | |||
---- | ---- | ||
4. Определим текущий адрес устройства, подключенного к Wiren Board. Адрес нам неизвестен и мы не хотим его менять. | 4. Определим текущий адрес устройства, подключенного к Wiren Board. Адрес нам неизвестен и мы не хотим его менять. | ||
Строка 134: | Строка 158: | ||
Результат: адрес подключенного устройства — 0x0072, то есть 114. Перебор всех адресов от 1 до 247 занимает чуть больше 2 минут. | Результат: адрес подключенного устройства — 0x0072, то есть 114. Перебор всех адресов от 1 до 247 занимает чуть больше 2 минут. | ||
<!--T:28--> | |||
---- | ---- | ||
5. На модуле WB-MR14 включим реле с номером 6 (адреса регистрв флагов начинаются с нуля, помним об этом!). Используем для этого команду 0x05 (Write Single Coil): | 5. На модуле WB-MR14 включим реле с номером 6 (адреса регистрв флагов начинаются с нуля, помним об этом!). Используем для этого команду 0x05 (Write Single Coil): | ||
Строка 145: | Строка 170: | ||
SUCCESS: written 1 elements!</syntaxhighlight> | SUCCESS: written 1 elements!</syntaxhighlight> | ||
<!--T:29--> | |||
Обратите внимание, утилита modbus_client при записи заменила 1 на 0x00FF, поскольку именно это значение служит для включения реле. Любое ненулевое значение будет заменено на 0x00FF, поэкспериментируйте. | Обратите внимание, утилита modbus_client при записи заменила 1 на 0x00FF, поскольку именно это значение служит для включения реле. Любое ненулевое значение будет заменено на 0x00FF, поэкспериментируйте. | ||
<!--T:30--> | |||
---- | ---- | ||
6. Включим все нечетные реле и выключим все четные. Для этого используем функцию 15 (Write Multiple Coils). В модуле всего 14 реле, так что мы должны передать значения для 14 регистров с 0 по 13. | 6. Включим все нечетные реле и выключим все четные. Для этого используем функцию 15 (Write Multiple Coils). В модуле всего 14 реле, так что мы должны передать значения для 14 регистров с 0 по 13. | ||
<!--T:31--> | |||
<syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a1 -t0x0f -r0x00 -c 14 0x00FF 0x0000 0x00FF 0x0000 0x00FF 0x0000 0x00FF 0x0000 0x00FF 0x0000 0x00FF 0x0000 0x00FF 0x0000</syntaxhighlight> | <syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a1 -t0x0f -r0x00 -c 14 0x00FF 0x0000 0x00FF 0x0000 0x00FF 0x0000 0x00FF 0x0000 0x00FF 0x0000 0x00FF 0x0000 0x00FF 0x0000</syntaxhighlight> | ||
Ответ: | Ответ: | ||
Строка 160: | Строка 188: | ||
<!--T:32--> | |||
Обратите внимание на структуру данных запроса: | Обратите внимание на структуру данных запроса: | ||
<!--T:33--> | |||
*[01] — адрес | *[01] — адрес | ||
*[0F] — код функции Write Multiple Coils | *[0F] — код функции Write Multiple Coils | ||
Строка 170: | Строка 200: | ||
*[1A][97] — CRC16 | *[1A][97] — CRC16 | ||
<!--T:34--> | |||
А так же на структуру ответа: | А так же на структуру ответа: | ||
<!--T:35--> | |||
*<01> — адрес | *<01> — адрес | ||
*<0F> — код функции Write Multiple Coils | *<0F> — код функции Write Multiple Coils | ||
Строка 178: | Строка 210: | ||
*<D4><0F> — CRC16 | *<D4><0F> — CRC16 | ||
<!--T:36--> | |||
Подробнее описание структуры данных запросов и ответов можно найти на странице [[Special:MyLanguage/Протокол Modbus|Протокол Modbus]]. | Подробнее описание структуры данных запросов и ответов можно найти на странице [[Special:MyLanguage/Протокол Modbus|Протокол Modbus]]. | ||
</translate> | </translate> |
правки