Решил поделиться своим опытом подключения приборов по ModBUS к Linux, так как сбор всей информации занял продолжительное время.
Существенно помогла начать двигаться в правильном направлении статья на сайте «У Павла!».
Операционная система - 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.
Cоздал две сетевые переменные а1, и а2 с адресами регистров 512, 513.
Lве переменные для вывода на дисплей «от компа», " к компу". Связал их с а1 и а2 соответственно. Чтобы различать переменные, в ПР200 происходит умножение а2=а1*10.
Dывел на дисплей ПР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
Cинтаксис для обмена более подробно описан в репозитории 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 бит информации, это нужно учитывать при обмене с модулями. Самый простой и однозначный обмен - передача и чтение целочисленных данных.
Резюме:
-
Можно без труда подключаться к приборам из ОС Linux по протоколу ModBUS RTU RS485, ModBUS TCP.
-
Управление подключением из терминала с помощью утилиты modbus-cli дает возможность создания кроссплатформенных программ обмена данными с приборами, создания SCADA-систем на Linux.