Avendo visto come scrivere un server OPC UA, oggi ci concentriamo nella sua controparte e analizziamo come sviluppare un client OPC UA usando le stesse librerie .NET della OPC Foundation.

Avviamo il Server OPC UA

Per cominciare, avviamo il nostro server OPC UA.

Se hai seguito la mia serie di articoli, questo si traduce nell’eseguire il progetto che abbiamo discusso nell’articolo dedicato.

Una volta in esecuzione, l’endpoint da usare per collegarci sarà visibile nella console, nel mio caso:

Copy to Clipboard

A questo punto, avviamo un client OPC UA e usiamo l’endpoint per collegarci al server. Questo ci servirà tra poco per recuperare alcune informazioni utili alla scrittura del nostro client.

Sempre seguendo quanto visto nell’articolo precedente, farò uso di UaExpert. Per i dettagli sul suo utilizzo ti rimando a questa pagina.

Prima di procedere ad analizzare il codice del progetto, è necessario preparare l’ambiente di sviluppo.

Per gli step di installazione delle librerie OPC UA in Visual Studio, fai riferimento al paragrafo Setup dell’Ambiente dello scorso articolo.

Il Client OPC UA

Possiamo cominciare l’analisi del progetto client che puoi scaricare da questo link.

Specificare il Tipo di Applicazione

Innanzitutto partiamo dal definire il tipo di applicazione che vogliamo sviluppare.

Copy to Clipboard

Nelle righe 2 e 3 specifichiamo che la nostra applicazione sarà di tipo client. Lo step successivo è quello di caricare un file XML dove sono contenuti alcuni parametri di funzionamento che ci serviranno più avanti.

Puoi ovviamente visionare l’XML, scaricando il progetto dal link che ti ho menzionato all’inizio del paragrafo.

Creazione della Sessione

Siamo pronti per creare la sessione con il server OPC UA.

Copy to Clipboard

Le righe 3-6 generano l’endpoint di connessione prendendo in input sia l’URL del server e sia un booleano che specifica se vogliamo effettuare una connessione sicura (riga 3). Trattandosi di un test e non gestendo la parte di cifratura della connessione tra client e server, ci disinteressiamo di quest’ultimo parametro.

L’istruzione dalla riga 9 alla 17, si occupa infine di effettuare la connessione al server OPC UA restituendo un oggetto session che verrà utilizzato, come vedrai, per le prossime operazioni.

Lettura e Scrittura

Proseguiamo con due tipi di operazioni molto comuni: la lettura e la scrittura di una variabile.

A tal proposito, usando il client UaExpert presentato prima, selezioniamo il nodo Speed dell’oggetto Conveyor dall’albero dei nodi in basso a sinistra.

La selezione appena fatta ci permetterà di capire quali sono gli estremi per puntare al nodo in questione che in OPC UA prendono il nome di namespace e identifier.

Con questa informazione, possiamo ora effettuare una lettura del valore della Speed.

Copy to Clipboard

Il metodo ReadValue prende in input un NodeId che è caratterizzato dai valori recuperati poco fa.

In output otteniamo il valore contenuto dalla variabile Speed, output che provvediamo poi a stampare a schermo.

Per quanto riguarda la scrittura, abbiamo bisogno di qualche istruzione in più:

Copy to Clipboard

In primis, nella riga 2, creiamo una Collection di valori in scrittura.

Questa lista viene subito riempita nella riga 9 da un elemento costituito nelle righe 4-8.

L’elemento in questione è un WriteValue che viene fatto puntare al nodo Speed sempre attraverso il solito namespace e identifier (riga 5).

Il valore da scrivere nella variabile viene specificato nella riga 8.

La scrittura vera e propria avviene infine nella righe 15-18.

Chiamata a Metodo

L’ultima cosa che ci resta da discutere sono le chiamate a metodi remoti.

L’idea è quella di effettuare una chiamata al metodo Start dell’oggetto Conveyor.

Similmente a quanto fatto per la lettura e scrittura di una variabile, usando UaExpert, andiamo a selezionare l’oggetto Conveyor e poi il metodo Start.

In entrambi i casi annotiamo a parte il namespace e l’identifier: questi saranno necessari per eseguire la chiamata remota.

A questo punto, possiamo procedere con la seguente istruzione:

Copy to Clipboard

La chiamata prevede di specificare due parametri di input:

  1. Namespace (2) e identifier (96) del nodo Conveyor.
  2. Namespace (2) e identifier (103)  del metodo Start.

In output si ottengono gli eventuali elementi restituiti dal metodo chiamato.

Test Finale

Una volta scaricato il progetto, compiliamolo. Prima di eseguirlo, usiamo UaExpert per verificare il corretto funzionamento del nostro client.

A tal proposito, selezioniamo l’attributo Speed del nodo Conveyor e trasciniamolo nella finestra centrale di UaExpert.

Così facendo potremo vedere il valore della velocità.

E’ possibile usare UaExpert per scrivere il valore, è sufficiente fare doppioclick sulla cella relativa alla colonna value e inserire il valore numerico desiderato. Premendo invio, si finalizza la scrittura.

A questo punto, procediamo con l’esecuzione del nostro client.

Il risultato sarà, in sequenza:

  • La lettura della velocità del nodo Conveyor che risulterà essere 0 o il valore da noi inserito con UaExpert.
  • La scrittura dello stesso nodo, imponendo il valore 7; il nuovo dato sarà visibile da UaExpert.
  • La chiamata del metodo Start che, lato server, stamperà a schermo la stringa “Conveyor started.”.

Conclusioni

In questo articolo abbiamo analizzato da vicino come funzionano le librerie .NET della OPC Foundation.

Nello specifico abbiamo sviluppato un semplice client OPC UA dimostrativo che dialoga con il server scritto nello scorso articolo.

Puoi scaricare il progetto completo a questo link.

Per ulteriori esempi, ti raccomando di dare un’occhiata al repository github ufficiale, in particolare a questo indirizzo potrai trovare diversi progetti da cui trarre spunto.