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.
Потік даних і команд (читання клієнтом)
- QML викликає метод у
cppManagerOpcUa(OpcUaManager). OpcUaManagerпересилає запит доOpcUaServiceчерез сигнал, поставлений у чергу.OpcUaServiceвиконує виклик OPC UA в робочому потоці.- Результат повертається як сигнал у черзі;
OpcUaManagerоновлює відповідну модель (OpcUaModel/DataAccessModel), до якої прив'язаний QML.
Налаштування та зберігання
AppPathsвирішує питання про встановлені проти портативних розташування та заповнює записуване сховище під час першого запуску.- Налаштування розташовані в INI-сховищі; клієнтські проєкти (
.uaproj) та серверні проєкти (.uaserver) — це JSON, що записується їхніми серіалізаторами атомарно. - Відстежувані вузли зберігаються в базі даних SQLite (
NodeDatabase). LocaleControllerвстановлює та перемикає наживо мову інтерфейсу.