Zpět na domů

OPC UA v MFC: integrace open62541

Článek popisuje technickou implementaci klienta OPC UA v aplikaci MFC v C++ s použitím open62541. Jsou zvážena připojení k řídicím jednotkám Siemens S7, nastavení předplatného, bezpečnost, práce s SQL Server a specifika integrace do Windows GUI.

OPC UA v MFC: technická příručka pro vývojáře
Advertisement 728x90

OPC UA v MFC aplikacích: integrace open62541 pro průmyslové SCADA na Windows

Průmyslové automatizační systémy stále častěji opouštějí monolitická proprietární SCADA ve prospěch flexibilních, bezpečných a multiplatformních řešení založených na OPC UA. V tomto kontextu se vývoj lehkého SCADA systému na bázi Microsoft Foundation Classes (MFC) s integrací open62541 stává technicky ospravedlněnou volbou pro střední podniky — zejména při potřebě kompatibility s legacy Windows infrastrukturami a při striktních požadavcích na nízké latence komunikace s kontroléry Siemens S7-1200/S7-1500.

Architektonický posun: od proprietárních SCADA k OPC UA orientované integraci

Tradiční SCADA platformy (WinCC, InTouch, EcoStruxure) jsou postaveny kolem uzavřených protokolů a vendor-lock-in. Jejich nasazení vyžaduje licencování, dlouhou konfiguraci a často vedou k nadbytečnému softwaru — instalační balíčky dosahují až 20 GB, přičemž reálně se využívá jen 15–20 % funkcionality. Pro malé a střední firmy je to ekonomicky neopodstatněné.

OPC UA řeší tři systémové problémy:

Google AdInline article slot
  • Interoperabilita: jednotné adresní prostor (NodeId), typizované proměnné a jednotný mechanismus odběrů umožňují agregaci dat z zařízení různých výrobců bez nutnosti meziprotokolových brán.
  • Bezpečnost „ze škatulky“: podpora X.509 certifikátů, bezpečnostní politiky (None, Basic128Rsa15, Basic256Sha256), kanály s šifrováním a autentizací na úrovni protokolu.
  • Flexibilita nasazení: klient může být nativní Windows aplikace (MFC/Win32), webový servis nebo mikroservis na Linuxu — bez změny serverové logiky.

V průmyslové praxi to znamená možnost nahradit drahé SCADA vlastním řešením, které se přímo připojuje k kontrolérům přes OPC UA, integruje se s SQL Serverem pro ukládání receptur a historických dat a zajišťuje vzdálený monitoring prostřednictvím grafů a stavů zařízení.

Integrace open62541 do MFC: technické specifikace a omezení

open62541 je C99-kompatibilní, zero-dependency knihovna s otevřeným zdrojákem zaměřená na embedded i desktopové systémy. Její použití v MFC projektu vyžaduje dodržení několika podmínek:

  • Projekt musí být kompilován v režimu /MD (dynamiční odkaz na CRT), protože open62541 využívá standardní C knihovnu.
  • Při použití zabezpečených politik je nutná explicitní inicializace TLS/SSL stěku — ve Windows to zahrnuje Wincrypt.h + CryptInitialize().
  • Všechny objekty UA_Client, UA_CreateSubscriptionRequest, UA_MonitoredItemCreateRequest musí být řízeny ručně: alokace paměti, volání UA_Client_disconnect(), uvolnění UA_Client_delete().

Kritickou vlastností je absence vestavěného poolu vláken. V MFC aplikaci s GUI vláknem musí být všechny volání UA_Client_* prováděny v samostatném pracovním vlákně (AfxBeginThread) nebo prostřednictvím PostMessage/WM_USER aby nedošlo k blokování rozhraní. Přímé volání UA_Client_connect() v CMainFrame::OnInitialUpdate() by vedlo k zablokování okna.

Google AdInline article slot

Implementace připojení a odběrů v C++/MFC

Funkce CMainFrame::ConnectCPUOnline() demonstruje minimálně životaschopný scénář připojení k OPC UA serveru. Inicializuje klienta, nastavuje konfiguraci a navazuje spojení. Klíčové momenty:

  • Použití UA_String_fromChars() pro převod CT2A řetězce na UA_String — povinný požadavek API open62541.
  • Nastavení cc->securityMode = UA_MESSAGESECURITYMODE_NONE je přípustné pouze v izolovaných sítích; v reálných projektech je nutné zvolit UA_MESSAGESECURITYMODE_SIGNANDENCRYPT a načíst certifikáty prostřednictvím UA_ClientConfig_setDefaultEncryption().
  • Logování na úrovni UA_LOGLEVEL_ERROR — optimální rovnováha mezi diagnostikou a výkonem v produkci.

Po připojení se vytvoří odběr a nastaví monitorovací prvky. Níže je fragment vytvoření odběru a přidání prvního tagu:

// Vytvoření odběru
UA_CreateSubscriptionRequest request = UA_CreateSubscriptionRequest_default();
request.requestedPublishingInterval = 500.0; // ms
request.requestedMaxKeepAliveCount = 10;
request.requestedLifetimeCount = 30;

UA_CreateSubscriptionResponse response = UA_Client_Subscriptions_create(
    StrCPUADR[iAdr].g_clientOnline, request, NULL, NULL, NULL);

if (response.responseHeader.serviceResult != UA_STATUSCODE_GOOD) {
    return false;
}
StrCPUADR[iAdr].g_subscriptionId = response.subscriptionId;

// Nastavení monitoringu pro tag
UA_MonitoredItemCreateRequest monRequest = UA_MonitoredItemCreateRequest_default();
monRequest.itemToMonitor.nodeId = UA_NODEID_NUMERIC(0, StrDBINI[i].iIDUA);
monRequest.itemToMonitor.attributeId = UA_ATTRIBUTEID_VALUE;
monRequest.monitoringMode = UA_MONITORINGMODE_REPORTING;

UA_MonitoredItemCreateResult monResponse = UA_Client_MonitoredItems_createSingle(
    StrCPUADR[iAdr].g_clientOnline,
    StrCPUADR[iAdr].g_subscriptionId,
    &monRequest);

Všimněte si: iIDUA je NodeId kontroléra získaný z databáze (například ns=2;s=Channel1.Device1.Tag1). Musí přesně odpovídat adresnímu prostoru serveru. Chyby v NodeId vedou k UA_STATUSCODE_BADNODEIDUNKNOWN, ale nezpůsobí havarijní ukončení — kontrola monResponse.statusCode je povinná.

Google AdInline article slot

Práce s daty: od čtení až po logování do SQL Serveru

Systém využívá tři klíčové struktury pro správu dat:

  • StrDBCP — konfigurace připojení k kontrolérům: IP adresa, stav online/offline, ukazatel na UA_Client*, ID odběru a buffer arrayValue pro přijímání hodnot.
  • StrDBINI — metadata tagů: iIDUA (NodeId), iTYPEID (typ dat: UA_TYPES_INT32, UA_TYPES_DOUBLE, UA_TYPES_BOOLEAN), flag bSaveDb pro logování.
  • StrDBVAL — tabulka historických hodnot s časovou razítkem CTime, iNOMEQ, iItem a iVal.

Logika aktualizace hodnot je realizována v callback funkci UA_Client_DataChangeNotification. Při obdržení nové hodnoty probíhá:

  • Kontrola iTYPEID a bezpečné převedení typu prostřednictvím UA_Variant_getScalarCopy().
  • Zápis do arrayValue[i] s ohledem na sizearray.
  • Pokud bSaveDb == true, formuje se parametrizovaný INSERT do SQL Serveru prostřednictvím CDatabase::ExecuteSQL().

Důležité: všechny operace s arrayValue musí být chráněny kritickou sekcí (CCriticalSection), protože data přicházejí z fonového vlákna a GUI vlákno je současně schopno je vyžadovat pro vykreslování grafů.

Co je důležité

  • OPC UA v MFC aplikaci vyžaduje ruční řízení životního cyklu UA_Client: inicializace → připojení → odběr → čtení → odhlášení → vypnutí → smazání.
  • Bezpečnost není volbou: SECURITYPOLICY_NONE je přípustné pouze v testovacích prostředích; v průmyslových sítích jsou povinné X.509 certifikáty a SIGNANDENCRYPT.
  • open62541 neposkytuje asynchronní API pro Windows GUI — všechny síťové operace musí být prováděny v samostatném vlákně s následnou synchronizací prostřednictvím PostMessage.
  • Struktury StrDBCP, StrDBINI, StrDBVAL tvoří abstrakční vrstvu nad OPC UA, což umožňuje přepínat mezi různými kontroléry bez změny logiky práce s daty.
  • Podpora Siemens S7-1200/S7-1500 vyžaduje zapnutí OPC UA serveru v firmware kontroléru a správné nastavení User Access Control (UAC) v TIA Portalu.

— Editorial Team

Advertisement 728x90

Číst dál