Dopo aver fatto una breve introduzione al protocollo e aver visto come generare un modello di dati di un semplice impianto industriale è giunto il momento di creare il nostro server OPC UA.
OPC UA .NET Stack
Sebbene esistano diverse implementazioni OPC UA su piattaforma .NET, la più conveniente, a mio avviso, è quella proposta dalla OPC Foundation stessa: l’organismo che da sempre controlla e sviluppa il protocollo.
L’obiettivo della fondazione è quello di manutenere questa libreria affinchè sia sempre allineata con gli standard da loro stessi definiti.
L’UA .NET Standard Stack è sviluppato interamente in C# usando la .NET StandardLibrary. Ciò implica che le applicazioni basate su di esso possono essere eseguite su diverse piattaforme (Windows, Linux e Mac).
E’ una delle poche, per non dire l’unica, implementazione open source rilasciata con licenza GPL 2.0.
E’ dunque possibile contribuire al suo sviluppo e utilizzarla liberamente, con l’unico vincolo di non poterne fare uso in applicazioni commerciali. In caso si volesse sviluppare un’applicazione commerciale, è necessario aderire alla fondazione diventando Corporate Member.
Setup dell’Ambiente
Cominciamo creando un nuovo progetto Visual Studio.
Per la natura cross platform dello stack OPC UA, siamo liberi di scegliere sia una Console App (.NET Framework) sia una Console Application basata su .NET Core.
Una volta aperto, carichiamo il pacchetto Nuget dello Stack OPC cliccando su Tools -> NuGet Package Manager -> Package Manager Console.
Nella console che si viene ad aprire, eseguiamo il seguente comando:
Compilazione del Modello
A questo punto, creiamo la cartella Model e salviamo al suo interno il modello sviluppato nello scorso articolo (ModelDesign.xml).
Proseguiamo poi con il creare la cartella Data. Qui dentro andiamo a salvarci il file di configurazione dove sono esplicitati i parametri di funzionamento del nostro server.
Per motivi di brevità, nell’articolo mostro solo le parti più importanti dei file. A questo link puoi scaricare il progetto completo di tutto quello che discuteremo da qui in avanti.
Salviamo il file all’interno della cartella Data con il nome OPCUAServer.Config.xml.
Qui saranno specificati alcuni dettagli sul funzionamento del server come:
- Il nome e l’URI del server;
- Le directory dove trovare i certificati di sicurezza;
- I parametri di funzionamento.
Adesso non ci resta che compilare, come abbiamo già fatto nel precedente articolo, il modello ModelDesign.xml.
Per fare questo, raggiungiamo la cartella dove abbiamo l’eseguibile di UA ModelCompiler, apriamo una console di Windows e lanciamo il seguente comando:
Questo non farà altro che generare tutti i file necessari al nostro server nella cartella Data del progetto.
Alcune Configurazioni
Prima di procedere alla stesura del codice vero e proprio, è utile fare alcuni settaggi sui 2 file che saranno utilizzati dal server:
- OPCUAServer.Config.xml.
- OPCUAServer.PredefinedNodes.uanodes, che è stato generato nella cartella Data dal comando lanciato prima.
Dal Solution Explorer di Visual Studio, clicchiamo con il tasto destro su uno dei 2 file e selezioniamo Properties.
Nel menù che si apre, selezioniamo l’opzione Copy if newer relativa alla voce Copy to Output Directory.
Replichiamo l’operazione anche per il secondo file.
Così facendo, quando compileremo il nostro server, Visual Studio provvederà a copiare questi 2 file nella directory di output.
NodeManager
NodeManager è una classe fondamentale in quanto in essa andremo a scrivere i metodi per gestire le chiamate agli oggetti esposti dal server.
Il fulcro è rappresentato da due metodi:
- LoadPredefinedNodes: in cui si caricano i nodi specificati nel modello generato (righe 4-7):
- CreateAddressSpace: in cui, dopo aver caricato i nodi predefiniti (riga 5), recuperiamo l’oggetto generato dall’UA Model Compiler contenente i vari elementi della nostra linea (righe 12-13) e poi agganciamo ai metodi Start e Stop del Conveyor 2 callback (righe 19-20).
Vediamo come esempio com’è strutturata la callback OnStart che gestisce la chiamata al metodo Start dell’oggetto Conveyor:
Quando un client invierà una chiamata per eseguire il metodo Start del Conveyor, il server stamperà sulla console la stringa “Conveyor started.”
Test Finale
Per verificare che tutto funzioni a dovere, facciamo un test.
Prima di tutto, lanciamo il server OPC compilando il progetto ed eseguendolo.
Se tutto è andato a buon fine, dovresti vedere una finestra riportante l’endpoint dove il server sta girando, nel mio caso:
A questo punto, è necessario scaricare un client per poterci connettere e verificare i nodi esposti.
Un buon software free è UaExpert che è scaricabile registrandosi gratuitamente al sito.
Una volta installato ed eseguito, clicchiamo su Server -> Add.
Nella finestra che si apre, inseriamo l’endpoint del nostro server e diamo un nome alla connessione:
Clicchiamo su OK.
Sulla finestra principale dovresti vedere ora la struttura del server OPC UA che abbiamo creato.
Interagendo con i vari elementi è possibile leggerne il valore o effettuare delle chiamate ai metodi del Conveyor.
Uno dei punti di forza dell’OPC UA è proprio la possibilità di effettuare chiamate remote.
Se, anzichè UAExpert, usassimo un client OPC UA di un PLC, potremmo di fatto lanciare metodi scritti in C#!
Questo ci permette di estendere le potenzialità di strumenti di automazione classici quali il PLC.
Conclusioni
In questo articolo abbiamo discusso come creare un server OPC UA partendo da un modello XML e dalle librerie della OPC Foundation.
Puoi scaricare il progetto completo a questo link.
Usando poi un client come UAExpert, abbiamo dato uno sguardo alla struttura del server che è composto da nodi, valori e metodi.
Nel prossimo articolo, andremo a vedere come creare un client OPC UA sempre partendo dalle librerie .NET.
Scrivi un commento