Skip to content

ru Architecture

SEB103 edited this page Sep 21, 2026 · 1 revision

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 устанавливает и переключает вживую язык интерфейса.
English
Deutsch
Français
Italiano
Русский
Українська

Clone this wiki locally