Repository navigation
ru Architecture
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 (переиспользуемые элементы управления).
C++-бэкенд предоставляется QML через контекстные свойства, а не через зарегистрированные QML-типы. Движок приложения устанавливает их в корневом контексте:
-
cppManagerOpcUa→OpcUaManager(операции клиента и модели) -
cppServerStudio→ServerStudio(проектирование сервера и управление средой исполнения) -
cppProjectManager→ фасад клиентского проекта -
cppAppEngine→AppEngine(сервисы приложения) -
cppAppInfo→AppInfo,cppLocale→LocaleController,cppLicenseModel→LicenseModel,cppUpdate→UpdateController
Поскольку контекстные свойства не требуют импорта, переиспользуемые компоненты Base остаются свободными от любого C++-импорта; только слой приложения связывает их с фасадами. В этом коде намеренно нет QML-модулей Cpp.*.
Клиент разделён на два потока, чтобы интерфейс оставался отзывчивым:
-
OpcUaManagerработает в потоке GUI. Он владеет моделями (OpcUaModel,DataAccessModel,AttributesModel,TrendModel) и является единственным объектом, с которым говорит QML. -
OpcUaServiceработает в отдельном рабочем потоке, создаваемомAppEngine. Он владеетQOpcUaClientи выполняет обнаружение, подключение/отключение, просмотр, чтение, запись и подписки.
Оба взаимодействуют через сигналы, поставленные в очередь, поэтому работа с сетью и PKI никогда не блокирует отрисовку. Декодирование структурированных (в стиле CODESYS) значений выполняет помощник, просматривающий поддерево экземпляра.
Спроектированный сервер работает как отдельный процесс, а не внутри 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устанавливает и переключает вживую язык интерфейса.
OpcUaManager 1.3.1 · generated from doc/manual/ · Project home