ru 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устанавливает и переключает вживую язык интерфейса.