SCADA C#.Net - Architettura e design

assistenza informatica

Obiettivo principale di – SCADA C# con Microsoft.Net –

L’obiettivo principale di SCADA per C# è quella di sviluppare un ambiente per la creazione di sistemi SCADA tale che la stesura delle interfacce grafiche sia semplice al pari di come è semplice con sistemi tradizionali commerciali tipo WinCC Flexible e altri dove non è necessario programmare nessuna animazione per gli oggetti grafici presenti sulle pagine.
In pratica, dall’editor grafico, si compone una pagina di sinottico selezionando un controllo da una toolbox, si definirà poi un campo proprietà in cui si specificherà la variabile di processo associata e quindi NON si scriverà alcun codice per l’animazione.
L’infrastruttura implementa in modo semplice tutti i meccanismi di dinamicizzazione in modo del tutto trasparente.

Esempio pratico - puoi scaricare il progetto da Github

Aprendo il progetto con VS2019, selezionare la “Form1” di progetto. Ora, dalla toolbox, seleziona e inserisci un nuovo controllo di tipo TagLabel oppure TagProgressBar. Nella casella delle proprietà associa ad esso un valore al campo “TagName” con una delle variabili di processo configurate nel driver di collegamento al PLC.
PS: La versione di software prevede al momento tre sole variabili di processo che simulano i valori da PLC e hanno nome “@VAR1”, “@VAR2” e “@VAR3”. Quindi inserisci uno di questi nome come TagName , senza virgolette nel campo di configurazione proprietà.
Compila ed esegui il programma. Come potrai notare l’animazione del nuovo controllo è integrata anche se non hai scritto alcun codice per esso, hai solo attribuito un valore valido alla proprietà del controllo.

La presentazione del progetto termina qui. Se vuoi estendere il progetto con altri controlli, secondo la tua fantasia, procedi pure alle sezioni seguenti dove cerco di descrivere come funziona il progetto secondo il suo criterio architetturale.

L’idea è rilasciare nelle prossime versioni un driver di comunicazione tipo OPC UA/DA ma anche driver dedicato tipo Siemens Ethernet per rendere lo scada funzionale a tutti gli effetti anche in contesti di produzione.

Altri obiettivi di – SCADA C#.Net –

Essere uno scada completo a tutti gli effetti :

  • acquisire dati da campo tramite OPC o drivers custom
  • gestione allarmi integrata
  • gestione data logging integrata verso databases
  • supporto a reportistica e grafici o trends
  • supporto per animazioni grafiche 3D sia per VR che AR

Nel caso fossi interessato, puoi contattarci all’indirizzo mail info@coarbri.it per informazioni e supporto di carattere consulenziale per la tua azienda. In generale sviluppiamo software per ogni esigenza in ambito automazione e controllo, oltre che applicazioni grafiche innovative sia desktop che smartphones e tablet.
Descrizione dell’architettura

Vista d’insieme – i componenti del progetto SCADA C#

Aprendo il progetto, si incontra Program.cs che contiene il codice main che prevede la chiamata ad una istanza di Simulator dove stanno le variabili di processo come singoli oggetti. Le variabili sono simulate variando ad intervalli regolari di tempo il loro contenuto di tipo numerico. Il codice è semplice all’interno della classe Simulator.
Viene poi istanziato ed attivato AsynchLoop il quale implementa un timer che ad intervalli regolari di tempo invoca il refresh della pagina Form1, o le altre che saranno in futuro.
L’ultima istanza è per TagManager che è la classe cuore del progetto e merita di essere descritta dal punto di vista progettuale piuttosto che da quello del codice implementato.

Il cuore TagManager

TagManager funge da “message dispatcher”, ossia da notificatore, che richiede l’aggiornamento dei controlli associati alle variabili dal momento che una variazione è avventuta in una variabile da campo.
Esso si ispira, secondo il pattern Observer, ad essere l’osservatore, ossia l’oggetto che riceve la richiesta da tutti i subscribers di essere notificati nel caso in cui il valore della variabile sottesa necessita di essere rinfrescato.
Nel nostro caso specifico, gli oggetti di tipo sottoscrittori, sono praticamente tutti i controlli grafici presenti sulle pagine video.
Questo è proprio quello che succede quando una nuova pagina grafica viene istanziata. La pagina, tramite introspezione, itera tutti i controlli grafici che sono collegati a qualche tag e nel caso affermativo , invia a TagManager la lista dei controlli che hanno esigenza di essere notificati per variazione valori o aggiornamento. In questo caso, TagManager che contiene ora la lista di tutti i controlli oggetto di notifica, invia una sorta di chiamata a funzione che a livello logico corrisponde ad un evento di aggiornamento (onNewValue) per il controllo il quale provvederà ad aggiornare la visualizzazione allineando il valore visualizzato a quello contenuto nel PLC(o simulatore).

Ricapitolando dal punto di vista pratico SCADA C#:
TagManager è globale al progetto e pronto a ricevere “addTag” come controllo che sottoscrive alla notifica.
Quando viene aperta una form, questa invia la lista di tutti i Controlli animati come “addTag” a TagManager.
TagManager detiene ora sotto forma di lista, l’elenco di tutti i controlli sottoscrittori da aggiornare.
Al momento ciclicamente, AsynchLoop chiama TagManager invocando la richiesta di rinfrescare la visualizzazione di tutti i controlli in elenco, uno per uno.
TagManager itera tutti i controlli registrati, subscribers secondo il paradigma Observer, invocando il loro metodo onNewValue() che scatena l’aggiornamento della visualizzazione.
Quando la form viene scaricata tramite unload, TagManager viene aggiornato tramite RemoveTag di rimuovere il controllo dalla scansione al fine di mantenere la coda delle notifiche snella.

Questa è la descrizione dell’infrastruttura di sistema e l’interazione tra i componenti.

Per dare un dettaglio esaustivo del sistema è necessario descrivere altri due meccanismi e relativi componenti: “interfaccia ITag” e “classe derivata TagWindowsForm”.

Dietro le quinte delle finestre TagWindowsForm

La classe TagWindowsForm eredita ed estende WindowsForm includendo il supporto per TagManager. TagWindowsForm infatti prevede, al caricamento pagina, l’iterazione di tutti i controlli oggetto di notifica depositati sulla pagina tramite loop e chiamata a TagManager.AddTag(controllo), inserendolo cosi in modo trasparente nella classe che si occupa della notifica.
Esegue allo stesso modo il RemoveTag quando unload della pagina. In sostanza il progetto prevederà l’uso della classe estesa TagWindowsForms per le nuove pagine, cosi che tutta l’animazione resti integrata in modo trasparente non richiedendo codice ridondante.

Il polimorfismo dei controlli tramite ITag

L’altro componente importante è l’interfaccia “ITag” che di per se definisce un solo metodo evento onNewValue() secondo il principio di implementare un comportamento polimorfico per ogni controllo integrato. I controlli grafici implementati estendono le proprietà di controlli preesistenti , es. TagLabel che estende il controllo standard Label, in più aggiunge l’implementazione di “ITag”. Il comportamento polimorfico si ottiene ridefinendo onNewValue per il controllo attuale come si può vedere nelle differenze che ci sono per l’evento in TagLabel rispetto TagProgressBar. Allo stesso modo è offerta la possibilità a chi sfrutterà questa architettura di implementare i propri controlli secondo le sue esigenze specifiche.
In pratica, per avere un nuovo controllo, copierà il modello TagLabel ed implementerà il solo metodo onNewValue(). Questo è quanto. Perfino banale direi.

Una volta realizzata una piccola libreria di controlli standard, l’implementazione di interfacce HMI risulterà semplice e molto meno dispendiosa in termini economici rispetto a tradizionali ambienti commerciali, offrendo inoltre un supporto esteso come .Net può fare.


informazioni di contatto:

☎ +(39) 347 4618653

✉ info@coarbri.it