LINUX.ORG.RU

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

 , modbus-cli, modbus rtu, modbus tcp,


1

3

Решил поделиться своим опытом подключения приборов по 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 бит информации, это нужно учитывать при обмене с модулями. Самый простой и однозначный обмен - передача и чтение целочисленных данных.

Резюме:

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

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



Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 3)

Приветствую тебя, камрад! Я использую библиотеку libmodbus в си для связи по modbus RTU и TCP.

Демон на си, опрашивает приборы(в некоторые, вроде СМИ2 ещё и передаёт данные), затем функция усреднения и запись в MySQL.

Самописный веб интерфейс тягает данные из базы и рисует, что нужно.

Знаю, что велосипед и подобный функционал можно реализовать в любой скаде, но мой вариант реализует лишь необходимый мне и коллегам функционал, на любимом дистрибутиве Linux, без кучи лишнего и на минимальной конфигурации железа, даже на малине всё поедет, но у меня на полноценном серваке, ибо там ещё много всего прикручено.

UPD немного подумав… Всё таки нет, есть в моём интерфейсе то, что ни одна из SCADA-систем, которые я встречал, делать не умеет… Скрины на публику выкладывать не буду, ибо продакшен, для внутреннего использования. Могу при личном общении поделиться.

sucosoft
()
Последнее исправление: sucosoft (всего исправлений: 5)

А зачем понадобилось использовать питоноподелие, да ещё и ломать пипом систему управления пакетами несчастного Debian’а, если есть микроскопический mbpoll + libmodbus который может всё то же самое, не съедая кучу памяти и процессора в одноплатнике?

Stanson ★★★★★
()

Совет по установке совсем негодный - в современных дистрибутивах это делается через «pipx install modbus_cli» и никакой возни с создание папок и ломанием системных пакетов не понадобится.

zabbal ★★★★★
()

За один такт по ModBUS передается 16 бит информации

Только в протухших реализациях, не понимающих функций для работы с multiple registers (0x10 и 0x17). 0x17 - вообще швейцарский нож, у меня на работе делали модули, которые только его и понимают (оверхед на скорости 460800 всё равно пренебрежимо мал).

alegz ★★★★★
()
Последнее исправление: alegz (всего исправлений: 1)
Ответ на: комментарий от Stanson

Всегда рад дельным советам, тем более по оптимизации, я не очень хорошо понимаю структуру Linux. Создаю проекты у себя на работе и они работают. Многие проекты давно забыл как работают, но они прекрасно работают, просто делаю бэкапы систем, на случай, если грохнется. Делюсь своими наработками, так как сам сделал проекты собирая знания из таких же статей. Думаю другим людям будут полезны. Очень буду рад ссылке на статью по работе с mbpoll+libmodbus. На данный момент собираю контроллер на малинке, думаю было бы очень полезно.

victorsemv
() автор топика
Ответ на: комментарий от sucosoft

Большое спасибо за отзыв, я выложил в первую очередь, чтобы кому то помочь. Но если получится еще и улучшить работу данной связки, то это вообще будет здорово. Мне очень нравится делать веб интерфейс программируя в php. Еще два текста выложу на днях по этой теме. На данный момент делаю контроллер на малинке, система управления исполнительными устройствами на ПР103; интерфейс, архивы, рецепты и др. на малинке, думаю такая связка будет прекрасно работать. Результаты конечно же тоже выложу. Функционал, о котором пишете вы, конечно же будет прекрасным дополнением. Для личного общения почту прислать?

victorsemv
() автор топика
Ответ на: комментарий от alegz

Очень рад большому количеству дельных наставлений. Я собираю автоматику на приборах ОВЕН и для моих задач простейший синхронный обмен вполне достаточен. Но эти особенности явно мне еще нужно освоить.

victorsemv
() автор топика
Ответ на: комментарий от victorsemv

Мне стыдно выкладывать своё поделие в общий доступ, многие вещи реализованы на костылях и подпорках, по принципу: «работает же», хотя оно могло кому-то пригодиться и обратная связь была бы ещё и с конструктивной критикой, так, что я подумаю над тем, что бы опубликоваться.

У меня тоже web интерфейс php рисует.

Я тоже использую для ответственных узлов управления промышленные ПЛК, а для сбора данных и визуализации малинки и прочий самопал.

Связь можно в телеге: DonBaton85

sucosoft
()
Ответ на: комментарий от Stanson

Большое спасибо, установил, поработал.

mbpoll -a 4 -b 9600 -P none -t 3 -r 2 /dev/ttyUSB0

не понял, как сделать, чтобы только один раз опрос шел, по требованию. И еще не смог подключиться по ModBUS TCP. Очень помог бы пример команды подключения по TCP. По инструкции из GitHub все варианты приходится пробовать, чтобы получить то, что нужно. P.S. надеюсь можно будет выложить здесь же примеры работы, чтобы другим было легче искать. Скажу честно, сам постоянно своим статьями пользуюсь, чтобы синтаксис вспоминать.

victorsemv
() автор топика
Ответ на: комментарий от victorsemv

не понял, как сделать, чтобы только один раз опрос шел

Вот же:

-1 Poll only once only

Beewek ★★★
()
Ответ на: комментарий от victorsemv

Там же mbpoll -h вполне нормальный и абсолютно понятный хелп показывает.

Для TCP всё то же самое, просто вместо девайса указываешь хост. По дефорлту порт 502 очевидно. Порт можно поменять опцией -p 1234

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

Большое спасибо, что, указали правильный путь. Команду -1 не сразу заметил. Для сравнения загруженности процессора запустил программу опроса датчиков с браузера на modbus-cli и mbpoll, На modbus-cli температура была около 60 град., на mbpoll 53 градуса (малинка без вентилятора). Загруженность процессора также меньше на mbpoll. По Ethernet так и не получается опросить, в интернете примеры не нашел. Буду пробовать дальше.

victorsemv
() автор топика
Последнее исправление: victorsemv (всего исправлений: 1)
Ответ на: комментарий от Stanson

в моем девайсе ОВЕН МК210-311 нужно было применить параметр -0

mbpoll -a 1 -t 3 -r 51 -0 -1 193.2.2.99

Заменил в самодельной SCADA, в командах modbus-cli на mbpoll и теперь процессор малинки не перегревается, даже отключил вентилятор. Очень рад, что выложил эту статью, и нашлись люди с очень полезными советами. Теперь придется написать статью о работе с mbpoll, и в этой статье сделаю дополнения с рекомендациями.

victorsemv
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.