Клиент и сервер Modbus с пересылкой сообщений - PullRequest
0 голосов
/ 03 октября 2018

Я работаю над устаревшей программой Modbus для промышленной системы SCADA.

В настоящее время программа c ++ действует как TCP-сервер и клиент Modbus.

enter image description here

Поведение клиента: Считывает данные с ряда ПЛК (серверов) поставщика на месте, выполняет вычисления и отправляет команды управлениявернуться к ПЛК на основе данных, полученных через сайт.

Поведение сервера: отвечает на различные запросы TCP на чтение и запись от веб-интерфейсов и ноутбуков на сайте.

До сих пор это работало нормально, но мы недавно установили в сети клиент ведения журнала, который очень часто опрашивает нашу программу (менее секунды), и это выявило проблемы с синхронизацией: программа потенциально может занять очень много времени.долгое время в своем клиентском цикле выполнял вычисления и считывал значения ПЛК, прежде чем действовать в качестве сервера и отвечать на входящие запросы.

Простым решением было бы разделить программы на сервер Modbus и экземпляр клиента и поддерживать их работу.на том же встроенном ПК.

Проблема, с которой я столкнулся, заключается в том, что удаленный веб-интерфейс (HMI) должен иметь возможность управлять поведением ПЛК производителя 2, а ПЛК 2 поставщика будет разрешать только одно соединение TCP со встроенного ПК.,В прошлом программа обрабатывала запросы на запись от ИЧМ, перенаправляя их в ПЛК 2 через открытый сокет.

Я бы с удовольствием собрался с мыслями о передовой практике.

enter image description here

Мое мышление: серверная программа Modbus должна будет отвечать на запросы HMI и каким-то образом хранить информацию, необходимую для ПЛК производителя 2, а также должна устанавливать статусзарегистрироваться, чтобы сообщить клиенту Modbus о наличии данных для ПЛК производителя 2. Клиентской программе Modbus потребуется прочитать регистр состояния (и данные) с сервера и передать его в ПЛК поставщика 2.

Am Iдвижется в правильном направлении?

1 Ответ

0 голосов
/ 22 ноября 2018

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

Итак, если мое предположение верно, вам нужнопереключиться на функцию «выбрать» и перепроектировать ваше программное обеспечение, чтобы оно было полностью асинхронным.Вы должны поместить все сокеты (как подключенные, так и принятые) в набор FD и ожидать события на них.

win32: https://docs.microsoft.com/en-us/windows/desktop/api/winsock2/nf-winsock2-select

linux: https://www.opennet.ru/cgi-bin/opennet/man.cgi?topic=select&category=2

Я написал то же самое приложение давным-давно на win32 (но без вычислений), и оно легко обработало около 200 ПЛК, работая на одной машине со SCADA.

...