uk Architecture - SEB103/QtOpcUaManager GitHub Wiki

English · Deutsch · Français · Italiano · Русский · Українська

Архітектура

Цей розділ дає новому розробникові швидке розуміння програми: основні модулі, як інтерфейс звертається до бекенду, межі потоків і процесів та як рухаються дані й команди. Кожен згаданий клас посилається на свою сторінку в OpcUaManager API Reference.

Цілі збирання

Застосунок збирається з трьох статичних бібліотек, двох виконуваних файлів і двох QML-модулів (див. Структура проєкту):

  • OpcUaCore — ядро OPC UA-клієнта, item-моделі, персистентність і шар клієнтського проєкту. Пов'язує Qt Core, Network, OpcUa та Sql.
  • ServerProjectCore — доменна модель серверного проєкту (.uaserver), серіалізатор, валідатор та ввід-вивід NodeSet2. Пов'язує лише Qt Core, щоб автономне середовище виконання могло повторно використовувати її без клієнтського стека.
  • OpcUaQmlApi — фасади, звернені до QML. Залежить від OpcUaCore та ServerProjectCore.
  • appOpcUaManager — виконуваний файл GUI (app/).
  • OpcUaServerRuntime — автономний виконуваний файл сервера на open62541 (runtime/).
  • QML-модулі OpcUaManager (екрани) та Base (повторно використовувані елементи керування).

Межа між QML та C++

C++-бекенд надається QML через контекстні властивості, а не через зареєстровані QML-типи. Рушій застосунку встановлює їх у кореневому контексті:

  • cppManagerOpcUa → OpcUaManager (операції клієнта та моделі)
  • cppServerStudio → ServerStudio (проєктування сервера та керування середовищем виконання)
  • cppProjectManager → фасад клієнтського проєкту
  • cppAppEngine → AppEngine (сервіси застосунку)
  • cppAppInfo → AppInfo, cppLocale → LocaleController, cppLicenseModel → LicenseModel, cppUpdate → UpdateController

Оскільки контекстні властивості не потребують імпорту, повторно використовувані компоненти Base лишаються вільними від будь-якого C++-імпорту; лише шар застосунку пов'язує їх із фасадами. У цьому коді навмисно немає QML-модулів Cpp.*.

OPC UA-клієнт: потік GUI проти робочого потоку

Клієнт розділений на два потоки, щоб інтерфейс лишався чутливим:

  • OpcUaManager працює в потоці GUI. Він володіє моделями (OpcUaModel, DataAccessModel, AttributesModel, TrendModel) і є єдиним об'єктом, з яким говорить QML.
  • OpcUaService працює в окремому робочому потоці, що його створює AppEngine. Він володіє QOpcUaClient і виконує виявлення, підключення/відключення, перегляд, читання, запис і підписки.

Обидва взаємодіють через сигнали, поставлені в чергу, тому робота з мережею та PKI ніколи не блокує відмальовування. Декодування структурованих (у стилі CODESYS) значень виконує помічник, що переглядає піддерево екземпляра.

OPC UA-сервер: два процеси

Спроєктований сервер працює як окремий процес, а не всередині GUI:

  • ServerStudio (GUI) володіє серверним проєктом у пам'яті та моделями редагування і керує середовищем виконання.
  • ServerRuntimeController володіє QProcess, що запускає OpcUaServerRuntime. Середовище виконання вбудовує open62541, будує адресний простір із проєкту, застосовує безпеку, симулює значення та виконує правила поведінки.
  • Обидва взаємодіють за простим контрактом: середовище виконання друкує рядок READY зі своєю кінцевою точкою в stdout і приймає STOP зі stdin. Окремий побічний канал діагностики QLocalSocket передає живий JSON про сеанси та час роботи.

Open in Client підключає вбудований клієнт до працюючого локального сервера, передаючи його URL виявлення до OpcUaManager.

Потік даних і команд (читання клієнтом)

  1. QML викликає метод у cppManagerOpcUa (OpcUaManager).
  2. OpcUaManager пересилає запит до OpcUaService через сигнал, поставлений у чергу.
  3. OpcUaService виконує виклик OPC UA в робочому потоці.
  4. Результат повертається як сигнал у черзі; OpcUaManager оновлює відповідну модель (OpcUaModel / DataAccessModel), до якої прив'язаний QML.

Налаштування та зберігання

  • AppPaths вирішує питання про встановлені проти портативних розташування та заповнює записуване сховище під час першого запуску.
  • Налаштування розташовані в INI-сховищі; клієнтські проєкти (.uaproj) та серверні проєкти (.uaserver) — це JSON, що записується їхніми серіалізаторами атомарно.
  • Відстежувані вузли зберігаються в базі даних SQLite (NodeDatabase).
  • LocaleController встановлює та перемикає наживо мову інтерфейсу.