Node-RED il noto tool di flow-based programming per l’Internet of Things, nasce con l’obiettivo di dare a tutti, anche a chi non è esperto di programmazione, la possibilità di realizzare sistemi altamente integrati e complessi in modo semplice ed intuitivo. In questo articolo vedremo come in un sistema SlimLine basato su Raspberry interfacciare un programma Node-RED con un programma PLC sviluppato con LogicLab.
Nel programma Node-RED viene creata una semplice dashboard con i comandi in scambio con il programma PLC, per poter realizzare la dashboard occorre avere il modulo node-red-dashboard installato (Menù Manage palette -> install -> node-red-dashboard).
Interfaccia tra Node-RED e programma LogicLab
Per l'interfacciamento si è scelto di utilizzare il protocollo HTTP realizzando una connessione di tipo REST. All'interno di Node-RED ci viene in aiuto il nodo http request, mentre nel programma in LogicLab utilizzeremo il FB HTTPServer (Vedi articolo). La scrittura del programma in Node-RED si effettua direttamente da browser, ecco di seguito il programma sviluppato per l'esempio.
Dashboard
Nel programma Node-RED è possibile costruire dashboard che permettono di interagire facilmente con il programma, in questo esempio ho realizzato una semplicissima dashboard con due lampade di visualizzazione stato ingressi digitali e due selettori per il comando delle uscite digitali.
Anche la dashboard è visualizzabile tramite browser, come si vede dalla foto agendo sui due selettori si comanderanno le due uscite sul modulo CPU mentre le due lampade visualizzano lo stato degli ingressi del modulo CPU.
Come abbiamo detto la comunicazione tra i due programmi avviene in HTTP, il programma Node-RED che agisce da client si collega al sistema SlimLine che agisce da server. Il client invia i comandi di attivazione delle 2 uscite del modulo CPU in un oggetto JSON del tipo {"Do00":false, "Do01":true} e riceve in risposta lo stato dei 2 ingressi digitali del modulo CPU in un oggetto JSON del tipo {"Di00":true, "Di01":true}. In questo esempio i dati scambiati in JSON tra i due sistemi sono estremamente ridotti ma in realtà è possibile scambiare una grande quantità di dati.
Programma SlimLine
E' possibile eseguire il download del programma che contiene il programma LogicLab ed il flusso Node-RED.
PROGRAM RESTServer
VAR
i : UDINT; (* Auxiliary variable *)
DoCmd : ARRAY[ 0..1 ] OF BOOL; (* Digital outputs command *)
DiSts : ARRAY[ 0..1 ] OF BOOL; (* Digital inputs status *)
DInp : SysGetPhrDI; (* Digital input acquisistion *)
DOut : SysSetPhrDO; (* Digital output management *)
HTTPSv : HTTPServer; (* HTTP server *)
JEncode : JSONEncode_v1; (* JSON encode *)
JDecode : JSONDecode_v2; (* JSON decode *)
END_VAR
// *****************************************************************************
// PROGRAM "RESTServer"
// *****************************************************************************
// The program instatiate a HTTP server on defined port.
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
// INITIALIZATIONS
// -------------------------------------------------------------------------
// Initialize the HTTP server.
IF (SysFirstLoop) THEN
// Initialize the HTTP server.
HTTPSv.Enable:=TRUE; //Server enable
HTTPSv.SpyOn:=TRUE; //Spy active
HTTPSv.Port:=2000; //TCP Port
HTTPSv.AConnections:=2; //Accepted connections
HTTPSv.TCPBSize:=1024; //TCP buffer size
HTTPSv.HTTPBSize:=512; //HTTP buffer size
HTTPSv.HPath:=ADR('/home/pi/www/'); //Home path*)
HTTPSv.PDefault:=ADR('Home.htm'); //Default page
HTTPSv.Timeout:=2.0; //Execution timeout (S)
// Initialize the logic I/O management.
DInp.Address:=0; //Module address
DInp.Mode:=DI_I_8_LL; //Input mode
DOut.Address:=0; //Module address
DOut.Mode:=DO_8_LL; //Output mode
DOut.Mask:=16#00000003; //Output mask
END_IF;
// -------------------------------------------------------------------------
// LOGIC I/Os MANAGEMENT
// -------------------------------------------------------------------------
// Manage the logic I/Os.
DInp(); //Dgital inputs acquisition
DiSts[0]:=TO_BOOL(DInp.Value AND 16#01);
DiSts[1]:=TO_BOOL(DInp.Value AND 16#02);
DOut.Value:=0; //Output value
IF (DoCmd[0]) THEN DOut.Value:=DOut.Value OR 16#01; END_IF;
IF (DoCmd[1]) THEN DOut.Value:=DOut.Value OR 16#02; END_IF;
DOut(); //Digital output management
// -------------------------------------------------------------------------
// HTTP SERVER
// -------------------------------------------------------------------------
// Execute the HTTP server.
HTTPSv(); //HTTP server
HTTPSv.RAck:=FALSE; //Request acknowledge
HTTPSv.RNAck:=FALSE; //Request not acknowledge
IF NOT(HTTPSv.RRcvd) THEN RETURN; END_IF;
// -------------------------------------------------------------------------
// PAGE REQUEST
// -------------------------------------------------------------------------
// Checks if the "IOManage.cgi" page has been requested..
IF (SysStrFind(HTTPSv.pPage, ADR('IOManage.cgi'), FIND_DEFAULT) <> HTTPSv.pPage) THEN HTTPSv.RNAck:=TRUE; RETURN; END_IF;
// Decodes the digital outputs request received from Node-RED program.
JDecode(Object:=HTTPSv.pRxData, Name:=ADR('Do00'), VType:=VR_TYPE#BOOL_TYPE, VAddress:=ADR(DoCmd[0]), Count:=1);
JDecode(Object:=HTTPSv.pRxData, Name:=ADR('Do01'), VType:=VR_TYPE#BOOL_TYPE, VAddress:=ADR(DoCmd[1]), Count:=1);
// Returns the logic inputs status.
i:=Sysmemset(HTTPSv.pTxData, 0, HTTPSv.HTTPBSize); //Inizializzo buffer
JEncode(Object:=HTTPSv.pTxData, OSize:=HTTPSv.HTTPBSize, Name:=ADR('Di00'), VType:=VR_TYPE#BOOL_TYPE, VAddress:=ADR(DiSts[0]), Count:=1);
JEncode(Object:=HTTPSv.pTxData, OSize:=HTTPSv.HTTPBSize, Name:=ADR('Di01'), VType:=VR_TYPE#BOOL_TYPE, VAddress:=ADR(DiSts[1]), Count:=1);
// Sends data to client (Node-RED program).
HTTPSv.TxDSize:=Sysstrlen(HTTPSv.pTxData); //Answer data length
HTTPSv.RAck:=TRUE; //Request acknowledge
// [End of file]
Conclusioni
Questo è solo un semplice esempio delle potenzialità offerte grazie alla sinergia dell'ambiente Node-RED abbinato alla gestione PLC like programmabile con LogicLab. Questo permette di utilizzare il sistema SlimLine per la gestione di eventi real time e l'ambiente Node-RED per la visualizzazione/gestione dei dati raccolti.
Ad esempio è possibile acquisire i dati di produzione da impianti, dati che poi inviati a Node-RED grazie al supporto dell'enorme quantità di funzioni disponibili potranno essere visualizzati sulla dashoard e/o memorizzati su disco o in database. Ma sarà solo l'immaginazione di ognuno il limite che questa soluzione permette.