Подключение от Linux к приборам по протоколу ModBUS с помощью утилиты mbpoll

Решил поделиться своим опытом подключения приборов по ModBUS к Linux, так как сбор всей информации занял продолжительное время.
Операционная система - Debian 11.7. (На raspbian эти же команды прекрасно работают)
Для подключения по ModBUS RTU RS485 использовал преобразователь ОВЕН АС4. Определяется как Silicon Labs CP210x UART Bridge.
Использую приборы «ОВЕН», так как на приборах этого производителя собрано много устройств, и много информации и инструкций есть на сайте производителя.
Установка утилиты (более подробно на https://github.com/epsilonrt/mbpoll) :
sudo apt install mbpoll
добавляем пользователя в группу dialout
sudo adduser (имя пользователя) dialout
(имя пользователя без скобок) есть смысл перезагрузить компьютер.
Подключение по ModBUS RTU RS485
Подключал программируемое реле ПР200 «ОВЕН». В OwenLogic сделал простую программу для обмена.
Использовал интерфейс RS485 с настройками «по умолчанию» - RS484, Слот 1, Slave; Сам, 16 : Скорость - 9600, Четность - Нет, Число стоп-бит - 1, Биты данных - 8.
Cоздал две сетевые переменные а1, и а2 с адресами регистров 512, 513.
Две переменные для вывода на дисплей «от компа», " к компу". Связал их с а1 и а2 соответственно. Чтобы различать переменные, в ПР200 происходит умножение а2=а1*10.
Вывел на дисплей ПР200 эти переменные.
Теперь можно подключить ПР200 к преобразователю АС4 и в терминале ввести команду для обмена с прибором:
mbpoll -1 -a16 -b 9600 -p none -o1 -t 4 -r 512 /dev/ttyUSB0 5
Здесь 9600 - скорость обмена, 16 - адрес прибора, 512 - адрес регистра, -t 4 - тип регистра (запись), в который передаем целочисленное значение 5.
для чтения 513 регистра используем команду:
mbpoll -1 -a16 -b 9600 -p none -o1 -t 3 -r 513 /dev/ttyUSB0
-t 3 - тип регистра (чтение)
Cинтаксис для обмена более подробно описан в репозитории mbpoll на гитхабе.
Подключение по 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).
Теперь можем в терминале вводить команды для обмена
mbpoll -a 1 -t 3 -r 51 -0 -1 192.168.1.99
-a 1 - это адрес слэйва
-r 51 - адрес регистра,
-0 - для корректного обмена с нашим прибором
Для включения выходов команда
mbpoll -a 1 -t 4 -r 470 -0 -1 192.168.1.99 1
включится первый выход, для побитной передачи использую преобразование от двоичного кода в dec, нужно учесть что передается старшим байтом вперед, то есть если хотим включить 1 выход то передаем данные 00000001, если хотим последний, то передаем 10000000 то есть число 128
mbpoll -a 1 -t 4 -r 470 -0 -1 192.168.1.99 128
Для чтения состояния выходов:
mbpoll -a 1 -t 3 -r 470 -0 -1 192.168.1.99
Резюме:
Можно без труда подключаться к приборам из ОС Linux по протоколу ModBUS RTU RS485, ModBUS TCP.
Управление подключением из терминала с помощью утилиты mbpoll дает возможность создания кроссплатформенных программ обмена данными с приборами, создания SCADA-систем на Linux.