Я работаю над устаревшей программой Modbus для промышленной системы SCADA.
В настоящее время программа c ++ действует как TCP-сервер и клиент Modbus.
![enter image description here](https://i.stack.imgur.com/uaEiC.png)
Поведение клиента: Считывает данные с ряда ПЛК (серверов) поставщика на месте, выполняет вычисления и отправляет команды управлениявернуться к ПЛК на основе данных, полученных через сайт.
Поведение сервера: отвечает на различные запросы TCP на чтение и запись от веб-интерфейсов и ноутбуков на сайте.
До сих пор это работало нормально, но мы недавно установили в сети клиент ведения журнала, который очень часто опрашивает нашу программу (менее секунды), и это выявило проблемы с синхронизацией: программа потенциально может занять очень много времени.долгое время в своем клиентском цикле выполнял вычисления и считывал значения ПЛК, прежде чем действовать в качестве сервера и отвечать на входящие запросы.
Простым решением было бы разделить программы на сервер Modbus и экземпляр клиента и поддерживать их работу.на том же встроенном ПК.
Проблема, с которой я столкнулся, заключается в том, что удаленный веб-интерфейс (HMI) должен иметь возможность управлять поведением ПЛК производителя 2, а ПЛК 2 поставщика будет разрешать только одно соединение TCP со встроенного ПК.,В прошлом программа обрабатывала запросы на запись от ИЧМ, перенаправляя их в ПЛК 2 через открытый сокет.
Я бы с удовольствием собрался с мыслями о передовой практике.
![enter image description here](https://i.stack.imgur.com/a5oEi.png)
Мое мышление: серверная программа Modbus должна будет отвечать на запросы HMI и каким-то образом хранить информацию, необходимую для ПЛК производителя 2, а также должна устанавливать статусзарегистрироваться, чтобы сообщить клиенту Modbus о наличии данных для ПЛК производителя 2. Клиентской программе Modbus потребуется прочитать регистр состояния (и данные) с сервера и передать его в ПЛК поставщика 2.
Am Iдвижется в правильном направлении?