Найти в Дзене
7-100

Подключение от Linux к приборам "ОВЕН" по протоколу ModBUS с помощью утилиты modbus_cli

Решил поделиться своим опытом подключения приборов по ModBUS к Linux, так как сбор всей информации занял продолжительное время. Существенно помогла начать двигаться в правильном направлении статья "У Павла!" https://psenyukov.ru/%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0%D0%BC%D0%B8-%D1%87%D0%B5%D1%80%D0%B5%D0%B7-%D0%BF%D1%80%D0%BE%D1%82%D0%BE/

Операционная система - Debian 11.7.

Для подключения по ModBUS RTU RS485 использовал преобразователь ОВЕН АС4. Определяется как Silicon Labs CP210x UART Bridge.

Использую приборы "ОВЕН", так как много устройств собрано на приборах этого производителя, и много информации и инстрикций есть на сайте производителя.

Для работы с устройствами по протоколу Modbus использовал консольную python-утилиту modbus-cli

Установка:

sudo apt install python3-pip
sudo pip3 install modbus_cli

В статье "У Павла!" (выше привел ссылку) есть описание, если не получилось установить с первого раза (у меня сразу все установилось).

Недавно устанавливал на Raspbian, и пришлось проделать то, что сказано в статье, Поэтому приведу команды

Создаем папку.

mkdir /root/.config/pip

Далее создаем файл pip.conf с содержимым.

nano /root/.config/pip/pip.conf

и вставляем содержимое:

[global]
break-system-packages = true

После этого устанавливаем modbus_cli

sudo pip3 install modbus_cli

Подключение по ModBUS RTU RS485

Подключал программируемое реле ПР200 "ОВЕН". В OwenLogic сделал простую программу для обмена.

Использовал интерфейс RS485 с настройками "по умолчанию" - RS484, Слот 1, Slave; Сам, 16 : Скорость - 9600, Четность - Нет, Число стоп-бит - 1, Биты данных - 8.

создал две сетевые переменные а1, и а2 с адресами регистров 512, 513.

две переменные для вывода на дисплей "от компа", " к компу". Связал их с а1 и а2 соответственно. Чтобы различать переменные, в ПР200 происходит умножение а2=а1*10.

вывел на дисплей ПР200 эти переменные.

Теперь можно подключить ПР200 к преобразователю АС4 и в терминале ввести команду для обмена с прибором:

modbus -b 9600 -s 16 -v /dev/ttyUSB0 512=5

9600 - скорость обмена, 16 - адрес прибора, 512 - адрес регистра, в который передаем целочисленное значение 5.

Если обмена нет, то скорее всего для обмена с АС4 нужно пользователя добавить в группу dialout и перезагрузить ОС ( Администрирование - Пользователи и группы - для своего пользователя ставите в Группах галочку около dialout)

или вводим:

sudo adduser (имя пользователя) dialout

(имя пользователя без скобок) есть смысл перезагрузить компьютер.

для чтения 513 регистра используем команду:

modbus -b 9600 -s 16 -v /dev/ttyUSB0 513

GitHub - favalex/modbus-cli: Command line tool to access Modbus devices

синтаксис для обмена более подробно описан в https://github.com/favalex/modbus-cli

Подключение по ModBUS TCP

Для подключения по ModBUS TCP использовал модуль дискретных входов и выходов МК210-311 ( Не самый лучший вариант для передачи переменных, но других приборов под рукой не оказалось)

Для подключения по ModBUS не нужно дополнительных преобразователей, просто настроить сетевое подключение.

По умолчанию IP-адрес МК210-311 - 192.168.1.99 и маска подсети 255.255.0.0. Настраиваем сетевой адаптер Linux компьютера, чтобы он был участником подсети: задаем адрес 192.168.1.XXX, маску подсети 255.255.0.0.

Номера регистров МК210-311: для чтения входов - 51, для чтения и записи выходов - 470 (Номера узнаем из инструкции на модуль МК210-311).

Теперь можем в терминале вводить команды для обмена

modbus -s 1 -v 192.168.1.99:502 51

-s 1 - это адрес слэйва

502 - порт ModBUS TCP

51 адрес регистра, (правильнее вводить i@51 для чтения).

Для включения выходов команда

modbus -s 1 -v 192.168.1.99:502 h@470=1

включится первый выход, для побитной передачи использую преобразование от двоичного кода в dec, нужно учесть что передается старшим байтом вперед, то есть если хотим включить 1 выход то передаем данные 00000001, если хотим последний, то передаем 10000000 то есть число 128

modbus -s 1 -v 192.168.1.99:502 h@470=128

для чтения состояния выходов используем команду:

modbus -s 1 -v 192.168.1.99:502 i@470

За один такт по ModBUS передается 16 бит информации, это нужно учитывать при обмене с модулями. Самый простой и однозначный обмен - передача и чтение целочисленных данных.

Резюме:

1. Можно без труда подключаться к приборам из ОС Linux по протоколу ModBUS RTU RS485, ModBUS TCP.

2. Управление подключением из терминала с помощью утилиты modbus-cli дает возможность создания кроссплатформенных программ обмена данными с приборами, создания SCADA-систем на Linux.