Interfacciare Node-RED a SlimLine in REST

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.

LogicLab (Ptp159)
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]
LogicLab (Ptp159)

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.

Was this article helpful?