У меня есть два скрипта Python, которым нужно получать данные с одного и того же сервера Modbus.
Однако они не могут быть одновременно подключены к одному и тому же серверу Modbus, поэтому я ищу программное обеспечение «прокси».
Затем этот прокси будет последовательно передавать запросы Modbus на сервер Modbus. Решение должно работать на Debian 11 lite. Спасибо!
Предполагая, что вы имеете дело с Modbus TCP, вы можете попробовать modbus-proxy:
Многие устройства Modbus поддерживают только одного или очень мало клиентов. Этот прокси действует как мост между клиентом и устройством Modbus. Может быть рассматривается как обратный прокси-сервер уровня 7. Это позволяет нескольким клиентам обмениваться данными с одним и тем же устройством Modbus.
Когда подключено несколько клиентов, перекрестные сообщения избегаются за счет сериализация связи в порядке очереди REQ/REP.
Обновлено: Согласно вашему комментарию ниже:
... это RTU через файловый дескриптор linux /dev/ttyS1
Мне кажется, это не очень прямолинейный способ сказать, что вы имеете дело с последовательной связью.
Если это так, боюсь, вам нужно вернуться на физический уровень.
Если у вас есть последовательное соединение «точка-точка» (независимо от уровней напряжения, они могут быть TTL 3,3 В постоянного тока или RS-232), вы не сможете подключить более одного клиента Modbus к одному и тому же серверу.
Для последовательной связи, чтобы иметь более двух устройств (например, два или несколько клиентов, отправляющих запросы на сервер Modbus), вам нужен способ, чтобы устройства могли контролировать шину, когда они обмениваются данными, и отпускать ее, когда они простаивают. . Многоточечная последовательная линия RS-485 является наиболее частым решением этой проблемы.
Если вы перейдете по ссылке, вы найдете много ресурсов и документации. Это может быть немного сложно, но на самом деле это очень просто: вместо подключения RX к TX, как для обычного последовательного порта, у вас будет два кабеля для каждого устройства (они называются A и B или D+ и D-). которые вы можете собрать. И вам нужно всего лишь добавить приемопередатчик TTL в RS-485 между каждым устройством и шиной (или RS-232 в RS-485, в зависимости от ваших устройств).
Есть пара нюансов:
Наиболее полным справочником по всем этим темам, которые я знаю, является книга Яна Аксельсона Serial Port Complete. Он немного устарел (последнее издание было выпущено в 2007 году), но все еще очень актуален. И вы можете найти старые издания подержанными почти бесплатно. Если вам нужно работать с последовательными портами, эта книга будет очень ценным помощником.
Последнее замечание: если вы не можете или не хотите возиться с физическим слоем, вы, конечно, можете найти другие решения, которые более приемлемы. Например, вы можете внедрить программу пересылки для приема запросов от ваших клиентов и преобразования их в Modbus RTU для отправки на ваш сервер. Pymodbus включает в себя пример, но, поскольку вы не особо разобрались, я не уверен, что он будет полезен в вашей ситуации.
Теперь это совершенно новый зверь, но посмотрите, поможет ли мой отредактированный ответ.
У меня были те же проблемы раньше, и я остановился на мостовом решении Modbus-MQTT, потому что у каждого протокола есть свои ограничения, Modbus предназначен для опроса ведущий-ведомый в природе, а MQTT хорош для нескольких клиентов/подписчиков.
Modbus + MQTT, такая комбинация просто хороша и может быть очень эффективной в современных приложениях IoT. Вы можете попробовать modpoll, который представляет собой инструмент Modbus на основе Python и может работать как мост Modbus-to-MQTT в вашем случае.
спасибо, к сожалению, это RTU поверх файлового дескриптора linux /dev/ttyS1. Я попробовал инкапсулировать RTU в TCP, но это не сработало с программным обеспечением modbus-proxy.