it Architecture - SEB103/QtOpcUaManager GitHub Wiki
English · Deutsch · Français · Italiano · Русский · Українська
Architettura
Questo capitolo offre a un nuovo sviluppatore un rapido modello mentale del programma: i moduli principali, il modo in cui l’interfaccia raggiunge il backend, i confini di thread e processo e come fluiscono dati e comandi. Ogni classe nominata rimanda alla sua pagina nel OpcUaManager API Reference.
Target di build
L’applicazione è costruita a partire da tre librerie statiche, due eseguibili e due moduli QML (vedi Struttura del progetto):
- OpcUaCore — il nucleo del client OPC UA, i modelli di elementi, la persistenza e il livello del progetto client. Collega Qt Core, Network, OpcUa e Sql.
- ServerProjectCore — il modello di dominio del progetto server (
.uaserver), il serializzatore, il validatore e l’I/O NodeSet2. Collega solo Qt Core affinché il runtime headless possa riutilizzarlo senza lo stack client. - OpcUaQmlApi — le facciate rivolte a QML. Dipende da OpcUaCore e ServerProjectCore.
- appOpcUaManager — l’eseguibile dell’interfaccia (
app/). - OpcUaServerRuntime — l’eseguibile server open62541 headless (
runtime/). - i moduli QML OpcUaManager (schermate) e Base (controlli riutilizzabili).
Il confine QML/C++
Il backend C++ è esposto a QML tramite proprietà di contesto, non tramite tipi QML registrati. Il motore dell’applicazione le imposta sul contesto radice:
cppManagerOpcUa→OpcUaManager(operazioni client e modelli)cppServerStudio→ServerStudio(progettazione del server e controllo del runtime)cppProjectManager→ la facciata del progetto clientcppAppEngine→AppEngine(servizi dell’applicazione)cppAppInfo→AppInfo,cppLocale→LocaleController,cppLicenseModel→LicenseModel,cppUpdate→UpdateController
Poiché le proprietà di contesto non richiedono alcun import, i componenti riutilizzabili Base restano privi di qualsiasi import C++; solo il livello applicativo li collega alle facciate. In questo codice sorgente non esistono deliberatamente moduli QML Cpp.*.
Client OPC UA: thread dell’interfaccia e thread di lavoro
Il client è suddiviso su due thread per mantenere reattiva l’interfaccia:
OpcUaManagerviene eseguito sul thread dell’interfaccia. Possiede i modelli (OpcUaModel,DataAccessModel,AttributesModel,TrendModel) ed è l’unico oggetto con cui QML dialoga.OpcUaServiceviene eseguito su un thread di lavoro dedicato creato daAppEngine. Possiede ilQOpcUaCliented esegue discovery, connessione/disconnessione, navigazione, letture, scritture e sottoscrizioni.
I due comunicano tramite segnali in coda, così il lavoro rivolto a rete e PKI non blocca mai il rendering. La decodifica dei valori strutturati (in stile CODESYS) è gestita da un helper che esplora il sottoalbero di istanza.
Server OPC UA: due processi
Il server progettato viene eseguito come processo separato, non all’interno dell’interfaccia:
ServerStudio(interfaccia) possiede il progetto server in memoria e i modelli di editing e pilota il runtime.ServerRuntimeControllerpossiede unQProcessche esegue OpcUaServerRuntime. Il runtime integra open62541, costruisce lo spazio degli indirizzi dal progetto, applica la sicurezza, simula i valori ed esegue regole di comportamento.- I due comunicano tramite un contratto semplice: il runtime stampa una riga
READYcon il proprio endpoint su stdout e accettaSTOPsu stdin. Un canale laterale di diagnosticaQLocalSocketseparato trasmette in streaming il JSON di sessione/tempo di attività in tempo reale.
Open in Client connette il client integrato al server locale in esecuzione passando il suo URL di discovery a OpcUaManager.
Flusso di dati e comandi (lettura client)
- QML chiama un metodo su
cppManagerOpcUa(OpcUaManager). OpcUaManagerinoltra la richiesta aOpcUaServicetramite un segnale in coda.OpcUaServiceesegue la chiamata OPC UA sul thread di lavoro.- Il risultato torna come segnale in coda;
OpcUaManageraggiorna il modello interessato (OpcUaModel/DataAccessModel), a cui QML è collegato.
Configurazione e archiviazione
AppPathsdecide le posizioni installato/portable e inizializza l’archiviazione scrivibile alla prima esecuzione.- Le impostazioni risiedono in un archivio INI; i progetti client (
.uaproj) e i progetti server (.uaserver) sono in JSON, scritti in modo atomico dai loro serializzatori. - I nodi monitorati sono conservati in un database SQLite (
NodeDatabase). LocaleControllerinstalla e cambia in tempo reale la lingua dell’interfaccia.