CamiSCADA

Avevo iniziato con un precedente post su Processing e SCADA, ed ora la continuazione

L’INIZIO

Il progetto si chiama CamiSCADA perchè le prime righe di codice le ho scritte a Camignolo, presso la Scuola Media, in questa primavera.

In questo articolo descrivo più dettagliatamente il progetto, ma prima di tutto…a che serve?

Cosa si può fare con CamiSCADA

CamiSCADA è una applicazione scritta in linguaggio Java, o meglio in Processing, che si occupa di visualizzare l’andamento di controllori, quali PLC ed Arduini varii.

In pratica uno SCADA è una sorta di “cruscotto” che permette di avere la “visione d’insieme”.

La novità di CamiSCADA è…

CamiSCADA integra una interessante funzionalità: la modalità demo.

è possibile quindi simulare il funzionamento di un sistema facendolo apparire come se il tutto stesse funzionando: tank che si riempiono , valvole che si aprono e via dicendo.

Primo demo: birrificio

Il primo demo simula un birrificio ad una linea di maltatura e tre linee di fermentazione.

Per eseguire la demo “birrificio” basterà copiare (=sostituire) i due file “camiscada.dat” e “camiscada.ini” nella directory home di CamiSCADA.

Video esempio

Un video-esempio è stato caricato su Youtube: questo è il link.

Secondo demo: creazione filamenti

In questo caso si simula la produzione di filamenti polimerici per estrusione a bassa pressione.

Anche in questo caso per eseguire la demo basterà copiare (=sostituire) i due file “camiscada.dat” e “camiscada.ini” nella directory home di CamiSCADA.

Come installare

Scompattare il file zip ( cliccare qui per scaricarlo ) in una directory, per esempio “camiscada”. Verranno automaticamente create le sotto-directory relative.
Dopo l’installazione è già “in linea” la demo per il birrificio, quindi basterà avviare Processing e successivamente caricare lo script presente nella directory “som_lab50_10”: som_lab50_10.pde.

Requisiti

Processing richiede poche risorse, è parsimonioso. Unica nota è la versione di Processing che deve essere almeno la 5.3.

Codice

Il codice, o sorgente, di CamiSCADA, è diviso in due parti: oggetti e run-time.

Oggetti

Gli oggetti sono tipicamente delle macchine, per esempio un tank è un oggetto. allo stesso modo una saldatrice automatica è un oggetto, così come lo è una valvola.

Tra gli oggetti vi sono i diversi apparati che si possono incontrare in questi ambiti: tank, valvole e tubi.
Ogni oggetto è provvisto di “maniglie” per poter effettuare il legame con gli oggetti.

Struttura oggetti

Tutti gli oggetti di CamiSCADA, sono dotati di due tipi di attributi:

  • attuatori
  • sensori

I metodi principali sono:

  • mshow – per visualizzare graficamente
  • mgethole – per conoscere le coordinate delle “maniglie”
  • minfo – per visualizzare i testi

Sensori

I sensori inviano dei valori alla console SCADA. La tipologia ed il numero dei sensori possono variare da oggetto ad oggetto: per esempio un tank avrà tre tipi di sensori:

if ( match(wparm[0], "CAP") != null  ) {
  this.wfiller=float(wparm[1]);
}
if ( match(wparm[0], "TEM") != null  ) {
  this.wtempc=float(wparm[1]);
}
if ( match(wparm[0], "BAR") != null  ) {
  this.wpress=float(wparm[1]);

dove TEM è una sonda termica, BAR per la pressione e CAP per il livello.

Struttura camiscada.ini

è il file che contiene l’elenco degli oggetti e la loro disposizione (layout). Si tratta di un file di testo, strutturato e diviso in due sezioni.
Nella prima sezione troviamo gli oggetti, menre nella seconda i collegamenti.
Una riga della prima sezione ha la forma:


TANK;p1b1d1m1c1;90;50;HLT


dove “TANK” è il tipo di oggetto (ed è definito all’interno del programma), poi “p1b1d1m2c1” è il codice di questo tank. La coppia di numeri identifica il punto da dove verrà disegnato il tank, nel formato x e y. Ultimo “HLT” è il nome col quale verrà visualizzato il tank.

Per la seconda sezione, i raccordi la struttura è un po’ diversa:


PIPE;p1b1d1m4c6;p1b1d1m1c3;DX;p1b1d1m3c6;SX;to_pump3a

anche qui “PIPE” è il tipo di oggetto, “p1b1d1m4c6” è il nome del raccordo.
La coppia “p1b1d1m1c3;DX” indica che il raccordo partirà dalla maniglia DX dell’oggetto “p1b1d1m1c3” e si raccorderà alla SX di “p1b1d1m3c6”.
Infine “to_pump3a” è il nome che verrà visualizzato.

Denominazione dispositivi

Per assegnare un codice ai diversi dispositivi ho utilizzato una codifica già presente: la DNP3. In sintesi una stringa “p1b1d1m1c1” significa:

  • p1 = impianto
  • b1 = building, edificio
  • d1 = department, settore
  • m1= machine
  • c1 = component, parte della macchina, sensore o attuatore.

Ovviamente il numero è un progressivo quindi un nome possibile potrebbe essere: p1b4d2m21c5.

Struttura camiscada.dat

Questo file è opzionale in quanto contiene i comandi che l’applicazione riceve e che dovrà visualizzare.

La posizione di questo file è la stessa dalla quale viene avviata l’applicazione ovvero dove si trova il file som_lab50_10.pde.

è possibile inserire dei commenti all’interno del file, tramite il simbolo “#” posto all’inizio della riga.

# camiscada demo brewery
# 2019
 p1b1d1m1c1;CAP=10
 p1b1d1m1c1;CAP=20
 p1b1d1m1c1;CAP=30
 p1b1d1m1c1;CAP=40
 p1b1d1m1c1;CAP=50
 p1b1d1m1c1;CAP=60
 p1b1d1m1c1;CAP=70
 p1b1d1m1c1;CAP=80
 p1b1d1m1c1;CAP=90
# tank HLT al max

Collegamento con Arduino

Il collegamento con Arduino avviene attraverso porta USB. Il formato dell’informazione è quello già descritto in camiscada.dat, quindi il modulo Arduino dovrà rispettare il protocollo utilizzando la corretta sintassi:

Serial.println("p1b1d1m1c1;CAP=90");

In questo caso il codice del dispositivo (p1b1d1m1c1) è cablato nello sketch di Arduino. In alternativa è possibile associare il codice dispositivo ad una specifica porta USB.

Conclusione

Per usare Processing è necessaria una seppur minima conoscenza di Java e programmazione ad oggetti.

Il vantaggio di utilizzare una libreria consiste nel fatto che molto del lavoro è già stato fatto e si tratta solo di adattamenti.

Il discorso cambia quando è necessario creare un nuovo oggetto: in questo caso basterà duplicarne uno già esistente ed apportare le necessarie variazioni.

L’argomento sulla modifica degli oggetti verrà affrontato in un articolo successivo.

Supporto smartphone per fare video

ovvero molto più semplicemente come realizzare un supporto per smartphone da abbinare al treppiede…passando dalla stampa 3D…

TANTI SMARTPHONE

L’offerta dei telefoni cellulari o meglio smartphone è oggi molto varia.

Anche se i formati degli schermi sono standard, meno standard sono le dimensioni. Ovviamente si tratta di pochi millimetri di differenza però’ in qualche caso fa la differenza.

SUPPORTO PER TREPPIEDE

Volendo riutilizzare un vecchio treppiede, da abbinare allo smartphone, mi si è presentato il problema dell’ancoraggio del telefono al cavalletto.

Oramai , telefono e treppiede è quasi lo standard per i neofiti del videomaking.

IN COMMERCIO…

Ovviamente in commercio, specie on-line, si trova di tutto e per tutte le misure. Però tra il tempo pe ordinare, essere sicuri che l’oggetto sia quello giusto e non volerlo per forza nero (uffa, un po’ di fantasia!), bene, dopo tutto, mi conviene disegnarlo e stamparlo.

Bene , detto e fatto. Con la differenza che il progettino, che chiamerò “SmartVideo 3D”, prevede due parti ed è quindi modulare od adattabili a diversi telefoni. E poi è colorato.

CAD CAE E CAM

Per disegnare ho usato Sketchup, passando poi per Netfabb ed infine su Cura (versione CreateBot)

Cliccando qui puoi scaricare i sorgenti.

STAMPA E MONTAGGIO

La stampa è stata fatta con filamento HIPS: simile all’ABS , ma più pratico. Per il montaggio un goccio di silicone oppure colla specifica per plastica.

Come modificare la password di MediaWiki

Anche in MediaWiki, come per tutti i sistemi, può capitare di dover resettare la password.

La classica soluzione è quella di ricevere una email con un “token” o stringa per poter inserire una nuova password.

Ma se manca l’email…

Se il nostro account è su una installazione di MediaWiki locle o priva di connessione ad un server di posta allora l’unico modo è quello di agire sul database.

MySql, database di MediaWiki

Per “lavorare” sul database di MediaWiki avremo bisogno di uno strumento un po’ più comodo del classico mysql (binario). La soluzione migliore è MySql Workbench scaricabile da www.mysql.com. Per brevità lo chiameremo MYSQLWB.

L’installazione è semplice e chiederà al termine di potersi connettere ad una istanza di MySql. Ovviamente dovremo fornire a Workbench le credenziali di root. Se non abbiamo la password di MySql bisognerà prima resettarla con apposita procedura.

Quale utente?

Una volta aperto l’editor di MYSQLWB dobbiamo collegarci al database di MediaWiki e poi conoscere l’utente che vogliamo modificare.

use bitnami_mediawiki;

quindi

SELECT * FROM user;

avremo un “resultset” simile:

notare che diversi valori sono in formato LOB (Large OBject) e quindi basterà cliccare sul campo “user_name” e col tasto destro cliccare su “Open Value in editor”.

Apparirà la username per la riga che è stata selezionata. Se non è il nome che cerchiamo e se i nomi non sono trippi basterà ripetere l’operazione con gli altri campi “user name”.

Una volta individuato il nome creeremo un DML simile alla seguente:

UPDATE user SET user_password = CONCAT(':B:1234:', MD5(CONCAT('1234-', MD5('miapassword')))) WHERE user_name = 'Mauro109';

dove al posto di “miapassword” inseriremo la password voluta. è importante ricordare che username e password sono case sensitive e quindi bisognerà rispettare il formato.

Per finire dare il comando di salvataggio:

COMMIT;

E ora accedere

A questo punto eseguire il normale accesso: non verrà chiesto di modificare la password e tutto funzionarà come se quella password non fosse mai stata cambiata.

SCADA con Processing

Fare automazione con Arduino è possibile ed abbastanza facile.

Anche integrare Arduino con il PC è facile: Processing è lo strimento adatto.

E se volessimo realizzare un quadro sinottico? magari di un impianto idraulico? Certo, con Processing possiamo crare gli oggetti grafici, ma è tedioso!

Un sistema SCADA è un sistema che integra e riassume il funzionamento di diversi controller, tra i quali Arduino o simili.

SCADA

I dati di funzionamento vengono visualizzati ed è possibile anche inviarli a sistemi di controllo.

LIBRERIA

Cercando in Rete una libreria per SCADA su Processing, non ho trovato gran che, e quindi ho deciso di scriverne una direttamente. Da questo articolo vedremo come realizzare una libreria e un sistema SCADA con incluso il modulo PLANT-MGMT (che corrisponde al livello 5 della piramide CIM).

CLASSI

Il primo passo è descrivere le classi dibase che saranno utilizzate. Per farlo ho iniziato dal settore dei liquidi: tank e valvole.

CODICE

Questa è una prima versione che sarà estesa. Ecco la prima parte:

/*
fablabway.com
file: som_lab50_00.pde
progetto: lab50 - SCADA con Processing
descrizione: SCADA con Processing
author: Mauro Rossolato
licenza: Creative Commons BY-NC-ND
when who what

16.04.2019 mr creates
*/
// import
import processing.serial.*;
// global vars
short portIndex = 0;
// objects
Serial wport;
MTANK wtank1;
MTANK wtank2;
MVALVE wvalve1;
class MVALVE {
float wpx, wpy;
String wname, wdvcid;
MVALVE (String pdvcid, float ppx, float ppy, String pname) {
wdvcid = pdvcid;
wpx = ppx;
wpy = ppy;
wname = pname;
}
void mshow() {
stroke(127);
fill(200);
rect(wpx, wpy, ((20/1.41)2), 20); fill(0); fill(0x19BC0E); triangle(wpx, wpy, wpx+(20/1.41), wpy+(20/2), wpx, wpy+20); triangle( wpx+(20/1.41), wpy+(20/2), wpx+((20/1.41)2), wpy,
wpx+((20/1.41)*2), wpy+20);
textSize(18);
text(wname, wpx, wpy);
}
void maction (int pstatus) { // 0=chiusa
color wcolverde= color(43, 182, 8);
color wcolrosso= color(238, 29, 15);
if (pstatus==0) fill(wcolverde);
else fill(wcolrosso);
triangle(wpx, wpy, wpx+(20/1.41), wpy+(20/2), wpx, wpy+20);
triangle( wpx+(20/1.41), wpy+(20/2),
wpx+((20/1.41)2), wpy, wpx+((20/1.41)2), wpy+20);
}
}
class MTANK {
float wpx, wpy;
float wsizex = 50;
float wsizey = 100;
float wfiller;
float wplugxdx =wpx+wsizex;
float wplugydx= wpy+(wsizey/2);
String wname, wdvcid;
MTANK(String pdvcid, float ppx, float ppy, String pname) {
wpx = ppx;
wpy = ppy;
wdvcid = pdvcid;
wname = pname;
}
void mshow() {
stroke(255);
fill(0);
rect(wpx, wpy, wsizex, wsizey);
}
void minfo() {
fill(255);
textSize(14);
text(wname, wpx, wpy);
textSize(16);
text(wfiller+"%", wpx, wpy+wsizey+20);
}
void mfiller(float pfiller) {
color wcolblu= color(15, 32, 188);
wfiller=pfiller;
fill(wcolblu);
float wfilly = (wsizey*(1-(wfiller/100)));
fill(wcolblu);
rect(wpx, wpy+wfilly, wsizex, wsizey-wfilly);
}
}
void setup() {
colorMode(RGB);
background(51, 0, 0);
size(600, 300);
wtank1 = new MTANK("abc", 20, 30, "tank 1");
wvalve1 = new MVALVE("dec", 200, 70, "valve 1");
wtank2 = new MTANK("qwe", 360, 30, "tank 2");
}
void draw() {
// wport.readstring();
// while (wport.available() > 0) {
// String wbuffer = wport.readString();
// if (wbuffer != null) {
// println(wbuffer);
// }
// }
mrefresh();
delay(2000);
}
void mrefresh () {
wtank1.mshow();
wtank1.mfiller(70);
wvalve1.mshow();
wtank2.mshow();
wvalve1.maction(1);
wtank2.mfiller(20);
wtank1.minfo();
wtank2.minfo();
}
//}
/*
print (wfiller +";wpy=");
print (wpy);
print (";");
print ("wsizey=");
print (wsizey);
print (";");
println(wfilly);
*/

il risultato saranno due contenitori e una valvola. I tank hanno la gestione del riempimento e la valvola il controllo di apertura.