Для начала проведем небольшой анализ архитектурных подходов в системах АСУТП: от проприетарных SCADA к унифицированным стандартам OPC UA.
В сфере промышленной автоматизации (АСУТП) традиционный подход к выбору систем верхнего уровня управления, таких как SCADA (Supervisory Control And Data Acquisition), зачастую сводится к выбору решений, предлагаемых производителями аппаратных контроллеров. Типичная практика включает использование следующих проприетарных платформ:
-
Siemens: SIMATIC WinCC
-
Wonderware: InTouch
-
Schneider Electric: EcoStruxure
-
И другие аналогичные решения включая совсем не дешевые российские разработки.
На этапе проектирования, фокус нередко смещается на обеспечение функциональности сбора данных, в то время как вопросы последующей обработки, анализа и использования этой информации зачастую остаются без должного внимания.
Несмотря на широкое распространение, проприетарные SCADA-системы обладают рядом существенных ограничений, которые снижают их применимость по сравнению с более гибкими решениями, такими как ручное заполнение форм Microsoft Excel (в контексте аналитики и отчетности):
-
Высокая стоимость лицензирования программного обеспечения.
-
Значительные затраты и длительные сроки разработки "под ключ", включая конфигурирование, программирование и интеграцию.
-
Избыточный объем встроенных компонентов и функционала, что приводит к увеличению размера установочных пакетов (например, 10-20 ГБ для решений Siemens), не всегда полностью используемого в конкретных проектах.
-
Закрытая архитектура, характеризующаяся ограниченной функциональностью и сложной интеграцией со сторонним программным обеспечением.
Стоимость разработки и внедрения таких комплексных SCADA-решений сопоставима с затратами на создание всей системы автоматизации первого уровня (полевого уровня). Это делает их доступными преимущественно для крупных промышленных предприятий с соответствующими бюджетами и ресурсами.
Для малых и средних предприятий возникает потребность в более легковесных и экономически эффективных решениях, ориентированных на следующие ключевые задачи:
-
Удаленный мониторинг производственных процессов.
-
Сбор, хранение и визуализация данных в виде графиков.
-
Логирование и учет производственных рецептов.
-
Автоматизированная загрузка рецептов на оборудование с верификацией данных.
Именно в этом контексте стандарт OPC UA (Unified Architecture) приобретает все большее значение в промышленной автоматизации, предлагая унифицированный и открытый подход к интеграции.
Система автоматизированного управления технологическими процессами (АСУТП) на основе OPC UA (Open Platform Communications Unified Architecture) представляет собой современное решение, обеспечивающее интеграцию и взаимодействие различных компонентов автоматизации. В данном контексте, SCADA-система получает непосредственный доступ к контроллерам, что значительно упрощает управление и мониторинг процессов.
Основные компоненты разработанной системы АСУТП СКАДА на OPC UA:
-
Контроллеры, такие как Siemens Simatic S7-1200 и S7-1500, поддерживают OPC UA, что позволяет им напрямую обмениваться данными с SCADA-системой. Это обеспечивает низкую задержку и высокую надежность передачи данных.
-
OPC UA - Это протокол для обмена данными, который обеспечивает безопасность, оперативность и масштабируемость. Поддерживает разнообразные типы данных и позволяет интегрировать устройства от разных производителей.
-
СКАДА -система: Программа написанная на Visual С++ по технологии MFC в системах с операционной средой Windows
Немного про забытый стандарт разработки Microsoft Foundation Class (MFC) — это мощная библиотека, разработанная для упрощения создания настольных приложений под операционную систему Windows. Она предоставляет объектно-ориентированную обертку над многими API Win32, Win64 и COM, что значительно облегчает разработку программного обеспечения. Давайте подробнее рассмотрим ключевые аспекты MFC:
-
Объектно-ориентированная библиотека: MFC использует принципы объектно-ориентированного программирования, что позволяет разработчикам создавать более структурированные и поддерживаемые приложения.
-
Упрощение разработки: MFC сокращает время разработки, предоставляя готовые классы и функции для выполнения распространенных задач, таких как обработка окон, управление событиями и работа с графикой.
-
Поддержка Windows API: Библиотека оборачивает Win32 API в удобные для использования C++ классы, что позволяет разработчикам сосредоточиться на логике приложения, а не на низкоуровневых деталях.
-
Интеграция с Visual Studio: MFC полностью интегрирована с Microsoft Visual Studio, что обеспечивает удобные инструменты для разработки, отладки и тестирования приложений.
-
Гибкость и расширяемость: MFC позволяет разработчикам создавать как простые, так и сложные приложения, включая поддержку различных интерфейсов, таких как диалоговые окна, меню и панели инструментов.
Для обеспечения полноценного функционирования SCADA-системы (Supervisory Control And Data Acquisition) требуется комплексное решение, включающее интеграцию с реляционной базой данных SQL Server и использование современного протокола связи OPC UA.
1. Интеграция с Базой Данных SQL Server:
SCADA-система должна осуществлять взаимодействие с SQL Server для извлечения и хранения критически важных конфигурационных и операционных данных. Ключевые наборы данных, получаемые из базы, включают:
-
I. Список контроллеров для связи и параметры их подключений: Эта информация управляется структурой
StrDBCP, которая содержит:-
iNom: Уникальный идентификатор записи. -
iNOMEQ: Ссылка на соответствующую запись в базе данных оборудования. -
strADRESS: Сетевой адрес контроллера (IP-адрес или hostname). -
iType: Тип подключаемого оборудования. -
bStartOnLine: Флаг автоматического запуска подключения при старте системы. -
bOnLine: Текущий статус подключения (онлайн/офлайн). -
UA_Client* g_clientOnline: Указатель на объект клиента OPC UA, используемый для установления соединения. -
UA_UInt32 g_subscriptionId: Идентификатор активной подписки на данные OPC UA. -
UA_StatusCode uStatus: Код статуса последней операции с подпиской. -
DWORDLONG* arrayValue: Указатель на массив для хранения получаемых данных. -
UINT sizearray: Размер массива для хранения данных.
-
-
II. Список данных для чтения из контроллера: Структура
StrDBINIопределяет параметры для чтения данных с контроллеров:-
iNom: Уникальный идентификатор записи. -
iTYPECPU: Идентификатор контроллера, к которому относится данная запись. -
iID: Идентификатор тега или переменной в пакете данных контроллера. -
iIDUA: Идентификатор узла (NodeId) в адресном пространстве OPC UA. -
iTYPEID: Тип данных переменной (например, целочисленный, вещественный, булев). -
bSaveDb: Флаг, указывающий, следует ли логировать данное значение в базу данных. -
iEQ: Идентификатор оборудования, к которому относится данный параметр. -
iLine: Столбец в интерфейсе SCADA для отображения данного параметра.
-
-
III. Список сохраненных данных: Структура
StrDBVALиспользуется для хранения исторических значений переменных:-
iNom: Уникальный идентификатор записи. -
CTime timeVal: Временная метка записи. -
iNOMEQ: Идентификатор оборудования, к которому относится значение. -
iItem: Идентификатор переменной (тега). -
iVal: Значение переменной.
-
-
IV. Подключение к данным верхней MES-системы: Для обеспечения комплексного управления и мониторинга, SCADA-система должна интегрироваться с MES (Manufacturing Execution System). Полной структуры MES мы приводить не будем (большой объем), ключевые сущности, с которыми осуществляется взаимодействие, включают:
-
StrDBEQ: Список оборудования. -
StrDBCFG: Конфигурация рецептов. -
StrDBSTATUS: Статусы оборудования. -
StrDBPRODUCT: Список производимых продуктов. -
StrDBPART: Список партий продукции. -
StrDBUser: Список пользователей с правами доступа. -
StrDBMAT: Список материалов, используемых в рецептах. -
StrDBREC: Список рецептов, связанных с продуктами.
-
2. Механизм подключения к контроллерам по протоколу OPC UA:
Подключение к контроллерам реализуется с использованием библиотеки open62541 (https://github.com/open62541/open62541), высокоуровневого клиента OPC UA.
-
Интеграция библиотеки: Для использования функционала OPC UA, в проект необходимо включить соответствующие заголовочные файлы:
Код С++ -
Конфигурация безопасности: Поддерживаются различные политики безопасности для установления защищенных соединений:
-
Функция подключения
CMainFrame::ConnectCPUOnline: Эта функция инициализирует клиент OPC UA, настраивает параметры соединения (включая URL конечной точки сервера, URI приложения и политику безопасности) и устанавливает соединение с контроллером. В приведенном примере кода используется политикаSECURITYPOLICY_NONEдля установления соединения.
bool CMainFrame::ConnectCPUOnline(UINT iAdr)
{
UA_StatusCode uStatus = UA_STATUSCODE_GOOD;
UA_ClientConfig* cc;
UA_Int32 command;
UA_Boolean issecure;
CT2A ascii(StrCPUADR[iAdr].strADRESS);
//Initialize Client and Configuration
StrCPUADR[iAdr].g_clientOnline = UA_Client_new();
cc = UA_Client_getConfig(StrCPUADR[iAdr].g_clientOnline);
/* set logging level (the demo logger interprets the context pointer as min. level) */
/* cc->logger.context = (void*)UA_LOGLEVEL_TRACE; */
cc->logger.context = (void*)UA_LOGLEVEL_ERROR;
UA_ClientConfig_setDefault(cc);
cc->securityMode = UA_MESSAGESECURITYMODE_NONE;
cc->endpoint.endpointUrl = UA_String_fromChars(ascii.m_psz);
cc->clientDescription.applicationUri = UA_String_fromChars(APPLICATIONURI);
cc->securityPolicyUri = g_psChosenSecurityProfileUri;
/********************************************************************
Establish the connection to the server
********************************************************************/
uStatus = UA_Client_connect(StrCPUADR[iAdr].g_clientOnline, ascii.m_psz);
if (uStatus != UA_STATUSCODE_GOOD) {
return false;
}
else
{
return true;
}
}
-
Создание подписки и мониторинг данных: После успешного подключения, создается подписка на данные, и затем настраивается мониторинг для каждого требуемого тега.
// Создание подписки
UA_CreateSubscriptionRequest request = UA_CreateSubscriptionRequest_default();
/* Create Subscription ***/
UA_CreateSubscriptionResponse response = UA_Client_Subscriptions_create(StrCPUADR[iAdr].g_clientOnline, request, NULL, NULL, NULL);
if (response.responseHeader.serviceResult == UA_STATUSCODE_GOOD)
StrCPUADR[iAdr].g_subscriptionId = response.subscriptionId;
else
return false;
int iCount = 0;
UA_MonitoredItemCreateRequest monRequest = UA_MonitoredItemCreateRequest_default(g_NodeId_Variable);
UA_MonitoredItemCreateRequest dataItem;
UA_MonitoredItemCreateRequest_init(&dataItem);
dataItem.monitoringMode = UA_MONITORINGMODE_REPORTING;
dataItem.itemToMonitor.attributeId = UA_ATTRIBUTEID_VALUE;
UA_MonitoredItemCreateResult monResponse;
UA_MonitoredItemCreateResult_init(&monResponse);
for (UINT ini = 0; ini < m_iLoadDataIni; ini++)
{
if (StrCPUADR[iAdr].iNOMEQ == StrCPUINI[ini].iTYPECPU)
{
g_NodeId_Variable = UA_NODEID_NUMERIC(NAMESPACEINDEX_S7, StrCPUINI[ini].iIDUA);
dataItem.itemToMonitor.nodeId = g_NodeId_Variable;
monResponse = UA_Client_MonitoredItems_createDataChange(StrCPUADR[iAdr].g_clientOnline, StrCPUADR[iAdr].g_subscriptionId, UA_TIMESTAMPSTORETURN_BOTH, dataItem, NULL, UaServer_DataChangedCallback, NULL);
if (monResponse.statusCode != UA_STATUSCODE_GOOD)
{
break;
}
iCount++;
}
}
-
Цикл обработки данных в отдельных потоках: Для обеспечения непрерывного опроса контроллеров и обработки поступающих данных, используется отдельный поток выполнения. Пример такого потока представлен ниже.
UINT OnLoadTreadOnline(LPVOID pParam)
{
CMainFrame* pFrame = (CMainFrame*)pParam;
while (pFrame->m_bOnline)
{
for (UINT all = 0; all < pFrame->m_iLoadDataAdr; all++)
{
if (pFrame->StrCPUADR[all].bOnLine)
pFrame->StrCPUADR[all].uStatus = UA_Client_run_iterate(pFrame->StrCPUADR[all].g_clientOnline, 500);
}
Sleep(500);
}
return 0;
}
Этот поток периодически (с интервалом 500 мс) вызывает UA_Client_run_iterate для каждого активного клиента OPC UA, что обеспечивает получение обновленных данных от контроллеров.
Реализация функционала управления рецептурами и их версионирования на контроллерах
Для обеспечения гибкости производственных процессов и возможности воспроизводимости, SCADA-система включает функционал управления рецептурами, включая их загрузку на контроллеры и детальное логирование каждой операции загрузки.
Загрузка рецептуры на контроллер включает следующие этапы:
-
Извлечение данных рецептуры: SCADA-система запрашивает данные рецептуры из SQL Server, используя структуры
StrDBRECиStrDBCFG. -
Формирование набора данных для загрузки: На основе извлеченных данных, SCADA-система формирует пакет значений, соответствующих параметрам рецептуры, которые необходимо записать в контроллер.
-
Установление соединения с контроллером: Используется ранее описанный механизм подключения через OPC UA клиент (
UA_Client* g_clientOnline) с применением соответствующей политики безопасности. -
Запись данных в контроллер: Для каждого параметра рецептуры, SCADA-система выполняет операцию записи (write) в соответствующий тег (NodeId) контроллера, используя OPC UA. Это реализовано путем вызова функций типа
UA_Client_write. -
Верификация загруженных данных: После выполнения операции записи обязательно проводится верификация. Чтение записанных значений обратно из контроллера и сравнение их с исходными значениями рецептуры.
-
Логирование операции загрузки: Это критически важный этап, обеспечивающий прослеживаемость и аудит. Каждая успешная (или неуспешная) операция загрузки рецептуры фиксируется.
Номер артикула, номер партии, даты загрузок. Проверенные данные отмечены синей галочкой.
Итоговое резюме:
-
Программное решение было разработано с применением эффективных методологий управления проектами, что позволило достичь исключительно короткого цикла разработки. В частности, полная реализация всего функционала заняла всего 3 месяца. Этот результат был достигнут благодаря высокой квалификации и продуктивности единственного разработчика, который продемонстрировал глубокое понимание предметной области и техническое мастерство.
-
Программное решение демонстрирует исключительную гибкость в плане развертывания, будучи разработанным как нативное приложение для операционной системы Windows. Его исполняемый образ имеет минимальный размер — всего 6 Мб. Это достигается за счет отсутствия зависимостей от высокоуровневых фреймворков, таких как .NET. Таким образом, программа функционирует непосредственно на уровне операционной системы, начиная с Windows XP 64-bit и вплоть до современных версий, включая Windows 11. Такая архитектура обеспечивает высокую производительность, низкое потребление системных ресурсов и предсказуемое поведение в различных средах эксплуатации, минимизируя риски, связанные с версионными несовместимостями фреймворков.
-
Механизм установления связи с целевыми контроллерами реализован с использованием параллельной обработки данных. Применение многопоточной архитектуры для инициализации каждого соединения позволяет достичь сверхбыстрого времени подключения — порядка 3 секунд для подключения всех контроллеров. Такой подход обеспечивает эффективное использование вычислительных ресурсов и значительно сокращает начальные задержки при запуске системы или при восстановлении связи после сбоев. Каждый поток управляет жизненным циклом одного соединения, что гарантирует изоляцию процессов и предотвращает взаимное влияние при возникновении ошибок на уровне отдельных подключений.
-
Эффективное управление памятью и интеграция с СУБД: Несмотря на скромный объем оперативной памяти, занимаемый самим исполняемым кодом и данными (20 Мб), программа активно взаимодействует с SQL Server. Такая конфигурация достигается за счет стратегического кэширования части данных непосредственно в оперативной памяти приложения, в виде блоков данных. Это позволяет минимизировать количество обращений к дисковой подсистеме СУБД, ускоряя доступ к часто используемой информации и снижая нагрузку на сервер базы данных. Такой подход обеспечивает оптимальный баланс между скоростью доступа к данным и потреблением оперативной памяти, делая решение эффективным даже в условиях ограниченных ресурсов.
-
Пропускная способность канала связи и масштабируемость: Программа демонстрирует высокую эффективность использования пропускной способности сетевого канала при работе с промышленными контроллерами. При одновременном чтении 30 параметров с 5 контроллеров (150 параметров), общий объем трафика составляет всего 16 Кбайт. Масштабируемость решения подтверждается линейным увеличением потребления трафика: при работе с 50 контроллерами (1500 параметров) трафик возрастает до 160 Кбайт. Это свидетельствует о высокой степени оптимизации протокола передачи данных и позволяет успешно применять решение в системах с большим количеством подключаемых устройств без существенного увеличения нагрузки на сетевую инфраструктуру.
Обмен с контроллерами -
Программное решение предоставляет единую, высокоинформативную панель управления (dashboard), предназначенную для динамической визуализации операционного статуса всего парка промышленного оборудования.
-
Продвинутый механизм архивирования, парсинга и экспорта исторических данных для аналитики: Система располагает сложным модулем для сбора, обработки и анализа исторических данных, который обеспечивает глубокую детализацию информации о работе оборудования. Этот модуль выполняет комплексный парсинг сохраненных потоков данных, фиксируя каждое событие и изменение состояния с высокой временной точностью. Данные сохраняются в виде структурированных временных рядов, что позволяет проводить всесторонний анализ производительности, выявлять закономерности и аномалии.
Основной отчет о работе оборудования -
Формирования регламентированной отчетности. Интеграция с Microsoft Excel посредством прямого экспорта данных предоставляет пользователям максимальную гибкость в дальнейшем исследовании информации, позволяя применять любые инструменты анализа, доступные в офисных приложениях, и создавать кастомизированные отчеты для руководства и технических специалистов.
Он же выгруженный в Excel -
Отображать на графике данные по нескольким параметрам одновременно, обеспечивая корреляционный анализ и выявление взаимосвязей между различными показателями. Эта функция является неоценимым активом для инженеров по эксплуатации и технологов, предоставляя им возможность детально изучать историю работы оборудования, выявлять причины проблем и оптимизировать производственные циклы на основе объективных данных.
График работы оборудования -
Реализация рецептур с хранением каждой загрузки на контроллер потребовало комплексного подхода, включающего работу с базами данных, протоколом OPC UA, а также разработку механизмов логирования и верификации для обеспечения надежности и прослеживаемости производственных процессов.
Рецепт включает в себя более 50 параметров
Итог. Система АСУТП на базе OPC UA с непосредственным доступом SCADA к контроллерам Siemens представляет собой мощное решение для автоматизации процессов, обеспечивая высокую эффективность, безопасность и гибкость при минимальной стоимости разработки.
Автор: DADCorp
