Nello scorso articolo abbiamo avuto modo di introdurre l’OPC UA discutendo della sua storia e delle caratteristiche fondamentali.

Oggi facciamo un passo avanti verso lo sviluppo di un server OPC UA e, in particolare, ci concentriamo sulla definizione di un modello di dati che descriva una semplice linea produttiva composta da alcuni componenti industriali.

Al termine di questo articolo, avremo tutte le carte in regola per dedicarci alla creazione del nostro server OPC UA.

La Linea

Per cominciare bene il nostro viaggio, è necessario innanzitutto avere chiaro cosa si vuole andare a descrivere.
Nel nostro caso, immaginiamo di avere un semplice macchinario composto da un motore per muovere un nastro trasportatore, un sensore di temperatura e uno di prossimità:

Vogliamo descrivere questa architettura così da avere un modello usabile poi per sviluppare il nostro server.

Modellazione Dati

Per descrivere il modello appena presentato, secondo lo standard OPC, è necessario produrre un file XML denominato NodeSet2 che agisce da interfaccia ultima con i server OPC UA. Esistono diversi modi per raggiungere questo obiettivo:

  1. Produrre il file Nodeset2.xml manualmente;
  2. Utilizzare un tool grafico come ModelDesign;
  3. Utilizzare il tool UAModelCompiler fornito dalla OPC Foundation.

Partendo dal primo, non è da considerarsi una buona pratica quella di scrivere file NodeSet2.xml in autonomia, in quanto questo prevede una profonda conoscenza dello standard oltre ad essere un metodo soggetto ad errore.

L’utilizzo di tool grafici, quindi, potrebbe sembrare un ottimo compromesso, il problema è che al momento della scrittura di questo articolo non mi sento di poter dire che ne esistano di così evoluti da poter essere presi come riferimento.

Per completezza di informazione ti riporto i link dove poter scaricare i principali strumenti di sviluppo:

  • UAModeler: versione completa scaricabile previa registrazione al sito ufficiale.
  • UA Model eXcelerator Pro: versione free scaricabile previa registrazione al sito ufficiale.

Non ci resta quindi che approfondire il terzo punto che sarà inevitabilmente la nostra scelta.

L’OPC Foundation negli anni ha definito uno standard per la descrizione dei modelli chiamato Model Design.
Questo si basa sempre sulla redazione di un file XML molto più intuitivo, però, della controparte NodeSet2.

Per scrivere questo file, possiamo tranquillamente utilizzare un editor di testo. Una volta terminata la scrittura, potremo far uso del tool UAModelCompiler per compilare il modello e generare il file NodeSet2.xml insieme a tutta una serie di dati importanti quali classi C# e metadati necessari alla creazione del server.

XSD Editor Setup

Arrivati a questo punto vale però la pena soffermarsi un attimo per preparare alcuni tool che ci renderanno la vita più semplice. Possiamo pensare di scrivere il nostro XML senza alcun aiuto, ma quanto sarebbe meglio poter avere un editor che ci guidi durante la digitazione dei vari elementi?

A tal proposito, quando si parla di XML esiste uno standard che permette di estendere rapidamente le funzionalità dei più diffusi editor di sviluppo, ovvero i file XSD (XML Schema Definition).

Un file XSD non è altro che un insieme di regole che possono essere importate all’interno di un editor. Una volta fatto, sarà l’editor stesso a suggerirci i comandi da scrivere mentre sviluppiamo il nostro modello e a segnalarci eventuali errori commessi.

In questo articolo vediamo come importare l’XSD fornito dalla OPC Foundation in Visual Studio, l’editor che utilizzerò per sviluppare questo progetto. E’ ovviamente possibile importare questo file anche in altri editor quali IntelliJ, Notepad++ e altri.

Dunque, l’XSD di nostro interesse va copiato dal repository github ufficiale raggiungibile qui.

Una volta scaricato e salvato in locale (UAModelDesign.xsd), apriamo Visual Studio, scegliamo di proseguire senza codice:

Una volta aperto l’editor, clicchiamo su File -> Open -> File.

Nella finestra che si aprirà selezioniamo UAModelDesign.xsd e carichiamolo.

Creiamo adesso un nuovo file XML cliccando su File -> Nuovo -> File -> File XML.

A questo punto è possibile scrivere modelli in modo guidato.

OPC UA Model Design

Bene, abbiamo detto che vogliamo descrivere il modello precedentemente discusso.

Il Template

Un buon punto di partenza è il template che ti metto qui sotto e che rappresenta la base da cui cominciare qualsiasi sviluppo futuro.

Copy to Clipboard

Nel template, innanzitutto partiamo con la definizione del tipo di file (righe 1-9) che abbiamo già detto essere un XML.

Si passa poi a definire il namespace dell’applicazione, ovvero lo spazio di lavoro del nostro server, che come avrai visto chiameremo OPCUAServer. Ciò viene definito nelle righe 10-13.

Mi raccomando, copia il contenuto del template all’interno del file XML creato precedentemente in Visual Studio.

I Tipi Generici

Come detto nello scorso articolo, il modello di descrizione dei dati di OPC UA permette di trattare i dati con gli stessi concetti della programmazione ad oggetti.

Vogliamo quindi descrivere un tipo di sensore generico che possa fare da classe base per i sensori effettivamente installati nella nostra macchina.

Questo sensore padre, avrà un valore in sola lettura che rappresenterà il dato rilevato.

Copy to Clipboard

Aggiungere un tipo generico è un’operazione molto semplice. Si deve definire un ObjectType e specificarne poi il nome e la classe di appartenenza.

In OPCUA tutti gli oggetti derivano dal nodo base BaseObjectType.

Gli attributi di un nodo vengono specificati all’interno dei tag Children, in questo caso abbiamo una variabile in sola lettura di tipo double chiamata Value.

Ottimo, adesso possiamo passare a creare le due tipologie di sensori installati in macchina: temperatura e prossimità.

Copy to Clipboard

I Metodi Remoti

Terminiamo la definizione dei nostri nodi di partenza, definendo il motore che muoverà il nastro trasportatore.

In questo caso, ci piace poter sia leggere che scrivere la velocità con cui il motore sta ruotando, sia poterne comandare l’accensione e lo spegnimento.

Sarà dunque necessario aggiungere dei metodi remoti. Andiamo a vedere come si fa:

Copy to Clipboard

Questa volta, oltre alla classica notazione usata per creare un nodo con degli attributi, abbiamo sia specificato un livello di accesso in lettura e scrittura, sia aggiunto due metodi remoti visibili nelle righe 5 e 6.

Le Istanze

Ottimo, finora abbiamo definito dei tipi generici che descrivono dei possibili sensori e motori. Adesso, vogliamo creare un contenitore che rappresenterà la nostra macchina.

A differenza dei nodi precedenti, il BaseType di questo sarà un FolderType che verrà poi visualizzato nel nostro server come una cartella contenitore.

All’interno di questa cartella avremo i nostri sensori e il nostro motore. Andiamo a vedere come scrivere l’XML:

Copy to Clipboard

Dentro MachineType, abbiamo inserito 3 nodi di tipo Object che stavolta non sono più definizioni astratte di tipi, bensì sono delle verie e proprie istanze dei nodi prima definiti.

Nella riga 3 abbiamo creato un sensore di temperatura, nella 6 quello di prossimità e nella 9 il motore.

Tutti e tre hanno il campo SupportEvents impostato a true. Questo valore permette di associare degli eventi ogni qual volta uno degli attributi cambia.

Per terminare il nostro modello, è tempo adesso di creare un nodo generico che rappresenterà la nostra macchina ed, infine, il nodo da cui istanzieremo a cascata tutti gli oggetti finora definiti:

Copy to Clipboard

Con le righe dalla 1 alla 8, creiamo un nodo che rappresenterà il server una volta creato.

Il server sarà composto da una macchina di tipo MachineType (riga 4).

Definito ciò, nelle righe 10 e 11, creiamo finalmente un’istanza del nodo OPCUAServerType chiamata OPCUAServer1.

Infine nelle righe 12-17, linkiamo questa istanza alla cartella ObjectFolder del server OPC UA.

Puoi scaricare il modello XML appena discusso, a questo link.

UA-ModelCompiler

Adesso che abbiamo il modello pronto, non ci resta che compilarlo.

La compilazione ci permette sia di verificare che il modello sia corretto, sia di produrre i file necessari allo sviluppo successivo del server.

Come introdotto in precedenza, la compilazione del file XML è possibile grazie al tool della OPC Foundation chiamata UA-ModelCompiler.

Per poterlo utilizzare in Windows, è necessario innanzitutto clonare il codice dal repository ufficiale:

Copy to Clipboard

Se avete necessità di utilizzare il ModelCompiler in ambiente Linux o Mac, fate riferimento a questa guida.

Prima di aprire il progetto Visual Studio, dobbiamo scaricare ed installare due .NET Developer Pack:

Terminata l’installazione, apriamo il progetto UA-ModelCompiler dalla cartella precedentemente clonata, cliccando sul file ModelCompiler Solution.sln e procediamo al build della soluzione.

Perfetto, se tutto è andato a buon fine dovresti avere adesso un eseguibile nella cartella Debug o Release.

Apriamo una finestra di powershell in questa cartella e lanciamo il seguente comando:

Copy to Clipboard

Così facendo stiamo chiedendo al ModelCompiler ti prendere l’xml salvato nel path specificato come primo parametro (-d2), validarne la correttezza e creare i file nei percorsi di output specificati nei due parametri successivi.

Conclusioni

In questo articolo ci siamo soffermati su come creare un modello da compilare poi con il tool sviluppato dalla OPC Foundation.

L’output di questa fase sono una serie di file che ci serviranno per progettare, nel prossimo articolo, il nostro server.