Можно ли реализовать ведущее устройство Modbus на основе libmodbuspp, которое использует RTU поверх TCP для связи с ведомыми устройствами RTU за шлюзом TCP/RTU?
Я разрабатываю приложение Modbus на C++, которое уже использует библиотеку libmodbuspp для реализации устройства Modbus Master для запроса ведомых устройств Modbus в режимах TCP или RTU (соответственно для устройств, подключенных через сеть Ethernet или последовательные каналы RS-232/485). Он уже работает нормально, но недавно было установлено новое требование, согласно которому это приложение также должно реализовывать RTU через TCP, чтобы оно могло обмениваться данными через TCP со шлюзом, который имеет множество подчиненных устройств RTU Modbus, подключенных к его многочисленным последовательным портам (шлюз просто пересылает пакеты RTU на соответствующие идентификаторы ведомого устройства, установленные в них). В основном это означает, что наше приложение должно отправлять PDU Modbus RTU через TCP/IP соединение вместо последовательного порта.
Для быстрого и грязного решения (может помочь кому-то другому) я использовал socat для создания виртуального последовательного порта с исходящим TCP-соединением с целевым TCP-шлюзом, благодаря чему мое приложение просто работало в обычном режиме RTU (виртуальный последовательный порт был/dev/ttyS4
и конечная точка шлюза TCP 192.168.0.10:8000
):
socat -d -d pty,link=/dev/ttyS4,raw,echo=0 tcp-connect:192.168.0.10:8000
но для конечного приложения я хотел что-то более чистое, независимо от внешних приложений.
Мне было интересно, могу ли я использовать слой virtual-rtu libmodbuspp для достижения этой цели. Хотя документация libmodbuspp очень хороша, кажется, что это новая функция, поэтому мне она еще не так понятна. Документы и примеры показывают, что он работает только для приема RTU через TCP через сервер или маршрутизатор (специализированный сервер), который, в свою очередь, может достигать ведомых устройств RTU, связанных с этими объектами, но мне нужно прямо противоположное: возможность подключаться к конечную точку TCP в качестве клиента, но отправив ей Modbus RTU вместо дейтаграмм Modbus TCP.
Поскольку библиотека libmodbuspp на самом деле является оболочкой C++ для хорошо известной библиотеки Modbus C libmodbus, существует также возможность использовать эту ветвь libmodbus, которая добавила поддержку RTU через TCP, но мне бы не пришлось повторно реализовывать поддержку в C++. библиотека-оболочка libmodbuspp, если она каким-то образом уже поддерживает ее (но, возможно, не полностью - не в клиентском соединении). Может быть, кто-нибудь, более знакомый с кодовой базой libmodbuspp, может дать мне здесь несколько указателей? Спасибо!