In cet article nous avons vu comment il est possible de manière très simple d'implémenter des applications cloud avec nos systèmes SlimLine e Netsyst en utilisant l'architecture REST. Voyons maintenant à quel point il est simple de créer un site Web qui vous permet d’historique des données dans une base de données MySQL et de les afficher sous forme de tableau ou de graphique. Nous avons inclus un système dans le placard de notre centre de données Netsyst qui surveille la consommation au moyen d’un analyseur de réseau SDM120. Les données acquises sont affichées sur l'écran du produit et envoyées via REST à un serveur dans le cloud.
Le programme utilisant les FB pour gérer le compteur Eastron SDM120 effectue l'acquisition de données de consommation dans un programme FBD simple, qui, pris en charge par des variables globales, est affiché à l'écran et envoyé via REST au serveur cloud.
Le script PHP sur le serveur cloud reçoit les données dans le POST et les stocke dans une base de données, une page de consultation htm vous permet de visualiser les données reçues sur un tableau de bord. La bibliothèque open source est utilisée pour afficher le graphique Chart.js ce qui vous permet de créer des graphiques dans HTML5, voici comment il est présenté tableau de bord.
Exemple de programme
Comment utiliser les exemples.
Le projet est fourni RESTLogger (Télécharger l'intégralité du projet) avec le programme de démonstration qui gère le tableau de bord visible dans l'exemple. Le projet est composé de différents programmes, la liste des plus significatifs illustrant son fonctionnement est listée ci-dessous.
RESTLogger: Client s'exécutant sur un système SlimLine qui acquiert les données d'un compteur d'énergie Eastron et les envoie en REST au programme serveur.
RESTSvc: Script côté serveur exécuté sur un système LAMP qui insère les données reçues du programme client dans la base de données MySQL.
AjaxSvc: Le script côté serveur exécuté sur le même système LAMP où RESTSvc est exécuté, renvoie les données de la base de données MySQL pour afficher le tableau de bord avec les données mises à jour en temps réel.
PROGRAM RESTLogger
VAR
DSCmd : BOOL; (* Debug send command *)
i : UDINT; (* Auxiliary variable *)
Fp : eFILEP; (* File pointer *)
REST : RESTClient_v3; (* REST service client *)
HTTP : HTTPClient_v2; (* HTTP client *)
JDecode : JSONDecode_v2; (* JSON decode *)
JEncode : JSONEncode_v1; (* JSON encode *)
PageFile : STRING[ 32 ] := 'D:/Page.html'; (* Page file *)
RESTRequest : STRING[ 128 ]; (* REST request *)
FIFO : FIFOFile_v1; (* FIFO on file *)
FIFOIDx : ARRAY[0..1] OF UDINT; (* FIFO indexes *)
FIFOFile : STRING[ 32 ] := 'D:/REST.bin'; (* FIFO file *)
UTCDateTime : UDINT; (* UTC Date/Time *)
END_VAR
// *****************************************************************************
// PROGRAM "RESTLogger"
// *****************************************************************************
// Eseguo gestione servizio REST sul web.
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
// ESEGUO INIZIALIZZAZIONI
// -------------------------------------------------------------------------
// Eseguo inizializzazione variabili.
IF (SysFirstLoop) THEN
// Wear leveling, se i due indici sono uguali eseguo cancellazione
// file così viene ricreato in una nuova posizione sul disco.
IF (SysGetFileLen(ADR(FIFOFile)) <> -1) THEN
IF (FIFOIDx[0] = FIFOIDx[1]) THEN i:=SysFileRemove(ADR(FIFOFile)); FIFOIDx[0]:=0; FIFOIDx[1]:=0; END_IF;
END_IF;
// Configurazione REST client.
REST.SpyOn:=TRUE; //Spy On
REST.FIFOFile:=ADR(FIFO); //FIFO on file
REST.FIFOFilename:=ADR(FIFOFile); //Path and name of FIFO file
REST.FIFOSize:=1000; //FIFO file size
REST.FIFOIDx:=ADR(FIFOIDx); //FIFO indexes
REST.HostAddress:=ADR('192.168.1.15'); //Host address server REST
REST.HostName:=REST.HostAddress; //Host name server REST
REST.Page:=ADR('/RESTLogger/RESTSvc.php'); //Pagina server REST
REST.HostPort:=80; //Porta server REST
REST.HTTPClient:=ADR(HTTP); //HTTP Client
REST.HBitTime:=15; //Heartbeat time (S)
REST.BLength:=512; //REST Request/Answer buffers length
END_IF;
// -------------------------------------------------------------------------
// GESTIONE SERVIZIO REST
// -------------------------------------------------------------------------
// Eseguo gestione servizio REST.
REST(Enable:=TRUE); //Eseguo gestione servizio REST
// Se errore copio risposta su file per visualizzarla da browser.
IF (REST.SvcError AND (REST.PBuffer <> NULL)) THEN
i:=SysFileRemove(ADR(PageFile)); // Cancello file pagina
Fp:=SysFfopen(ADR(PageFile), ADR('a')); // File pointer
IF (Fp <> NULL) THEN
i:=Sysfwrite(REST.PBuffer, TO_INT(Sysstrlen(REST.PBuffer)), 1, Fp);
i:=Sysfclose(Fp); // Eseguo chiusura file
END_IF;
END_IF;
// -------------------------------------------------------------------------
// ACQUISIZIONE VALORE VARIABILI IN READ
// -------------------------------------------------------------------------
// IF (REST.SvcOk) THEN
// JDecode(Object:=REST.PBuffer, Name:=ADR('RVariable'), VType:=UDINT_TYPE, VAddress:=ADR(RVariable), VSize:=SIZEOF(RVariable));
// END_IF;
// -------------------------------------------------------------------------
// INVIO VALORI AL SERVER CLOUD
// -------------------------------------------------------------------------
// Eseguo temporizzazione invio.
IF (SysGetUTCDateTime(TRUE) <> UTCDateTime) THEN
UTCDateTime:=SysGetUTCDateTime(TRUE); //UTC Date/Time
IF ((MOD(UTCDateTime, 60) = 0) OR (DSCmd)) THEN
DSCmd:=FALSE; //Debug send command
// Eseguo compilazione dati da inviare al server in JSON.
i:=Sysmemset(ADR(RESTRequest), 0, SIZEOF(RESTRequest)); //REST request
JEncode(Object:=ADR(RESTRequest), OSize:=SIZEOF(RESTRequest), Name:=ADR('Frequency'), VType:=REAL_TYPE, VAddress:=ADR(Frequency));
JEncode(Object:=ADR(RESTRequest), OSize:=SIZEOF(RESTRequest), Name:=ADR('Voltage'), VType:=REAL_TYPE, VAddress:=ADR(Voltage));
JEncode(Object:=ADR(RESTRequest), OSize:=SIZEOF(RESTRequest), Name:=ADR('AcPower'), VType:=REAL_TYPE, VAddress:=ADR(AcPower));
JEncode(Object:=ADR(RESTRequest), OSize:=SIZEOF(RESTRequest), Name:=ADR('PwFactor'), VType:=REAL_TYPE, VAddress:=ADR(PwFactor));
FIFO(In:=TRUE, Dp:=ADR(RESTRequest), Dls:=LEN(RESTRequest)); //Write record on FIFO
END_IF;
END_IF;
// [End of file]