Questo blocco funzione da eseguire in task Back, permette di gestire la connessione ad un server utilizzando il protocollo MQTT (Message Queuing Telemetry Transport) di IBM che l’Organization for the Advancement of Structured Information Standards (OASIS) ha dichiarato come lo standard di riferimento per la comunicazione per l’Internet delle Cose. Il protocollo adotta un meccanismo di pubblicazione e sottoscrizione per scambiare messaggi tramite un appostivo “message broker” che fa da server. Il FB permette sia di pubblicare che di sottoscrivere topics sul broker. Collegando direttamente all’ingresso File l’uscita del FB SysTCPClient si gestirà una connessione non crittografata, inserendo il FB SysTLSClient verrà gestita la crittografia.
Questo è un blocco funzione protetto per utilizzarlo occorre richiedere il codice di protezione, vedi protezione funzioni e blocchi funzione. E’ comunque possibile utilizzarlo liberamente su tutti i broker che non richiedono autenticazione (Username e Password non definiti). Sui broker autenticati il FB funziona in modo test per 30 Min.
Con il comando Enable si forza la connessione al Server (Message broker), se la connessione và a buon fine si attiva l’uscita Connected. A connessione avvenuta ogni 50% del tempo definito in KeepAlive viene inviato un comando di ping per mantenere la connessione. Se il broker non riceve il ping nel tempo definito in KeepAlive ritiene la connessione terminata.
Il comando di Publish permette di pubblicare sul broker il TxTopic indicato con relative TxValue, TxFlags e TxQoS. Se la pubblicazione và a buon fine si attiva per un loop l’uscita Published.
Il comando di Subscribe permette di sottoscrivere sul broker il TxTopic indicato. Se la sottoscrizione và a buon fine si attiva per un loop l’uscita Subscribed. Ad ogni sottoscrizione del valore di un topic sul broker, il broker ne invia il valore a tutti i client che lo hanno sottoscritto.
Alla ricezione di un topic si attiva per un loop l’uscita Received ed in uscita avremo in RxTopic, RxTLength, RxValue ed RxVLength gli indirizzi e la dimensione del nome e del valore del topic ricevuto (Sono validi solo nel loop in cui è attivo Received). Se si setta TRxLock non sono ricevuti altri topics ed i dati ricevuti che resteranno validi sino al reset del bit.
In CTime è ritornato il tempo di comunicazione con broker, rilevato alla connessione ed a ogni esecuzione di ping. O sulla pubblicazione di topic solo se TxQoS è 1. In caso di errore viene eseguita una disconnessione e riconnessione al broker e si attiva per un loop l’uscita Fault.
Approfondimenti
- In questo articolo informazioni sul protocollo MQTT.
- In questo articolo come inviare dati alla piattaforma cloud Beebotte.
Upgrade list
- Se l’oggetto aggiornato non è nell’ultima versione del package, vedi capitolo “Aggiornamento librerie” in questo articolo.
- Gli oggetti obsoleti sono inseriti nella libreria eLLabObsoleteLib fare riferimento al relativo manuale ed al manuale programmazione in formato pdf.
MQTTClient_v1
Per poter gestire la connessione in TLS è stata eliminata la gestione della connessione TCP, ora deve essere gestita esternamente ed occorre passare al FB lo stream di comunicazione nel parametro File.
MQTTClient_v2
Gestita allocazione automatica memoria in base a dimensione messaggio, ora il limite della dimensione è dato solo dalla memoria rilocabile a disposizione. Ritornati in uscita anzichè passati in ingresso, indirizzo di allocazione e dimensione del nome e valore del topic, i valori devono essere acquisiti su attivazione di Received.
MQTTClient_v3
Eliminati i parametri Publish, Subscribe, TxFlags, TxQoS, TxTopic, TxValue, TxVLength, Published, Subscribed, ora per la pubblicazione dei topics si utilizza il metodo Publish che si appoggia ad un registro FIFO. Parametro KeepAlive ora è di tipo TIME, inserito parametro Delay per impostazione tempo attesa invio dati al broker.
Descrizione
Enable (BOOL) Comando abilitazione connessione al broker, tutte le sottoscrizioni definite in TSData vengono sottoscritte.
SpyOn (BOOL) Se attivo permette di spiare il funzionamento della FB (Vedi articolo).
TRxLock (BOOL) Comando blocco topic ricevuto. Se attivato i dati nei buffers RxTopic e RxValue restano validi e non viene ricevuto nessun altro topic. Non può restare attivo per un tempo superiore al Timeout.
FIFOFile (@FIFOFile_v1) Indirizzo allocazione FB FIFOFile di supporto.
File (eFILEP) Stream di comunicazione con broker.
CFlags (BYTE) Flags trasmesse su connessione.
ClientID (@STRING) Puntatore stringa definizione identificativo client (1). Se eNULL viene generata una stringa univoca di 8 caratteri ricavata dall’UniqueID del sistema.
Username (@STRING) Puntatore stringa definizione nome utente (2). Può essere eNULL.
Password (@STRING) Puntatore stringa definizione password accesso (2). Può essere eNULL.
KeepAlive (TIME) Tempo vita connessione, viene inviato al broker. Se tempo impostato diverso da 0 ogni metà tempo impostato viene inviato automaticamente un messaggio di ping (3).
Delay (TIME) tempo attesa invio pacchetti al broker.
TSData (@MQTT_TS_DATA) Occorre indicare l’indirizzo dell’array strutture MQTT_TS_DATA di definizione sottoscrizioni. eNULL se non è prevista alcuna sottoscrizione.
TSNumber (UDINT) Occorre indicare il numero di elementi dell’array strutture MQTT_TS_DATA. 0 se non è prevista alcuna sottoscrizione.
Connect (BOOL) Forza la connessione al server MQTT.
Connected (BOOL) Si attiva se connessione al server MQTT avvenuta.
Fault (BOOL) Attivo per un loop se errore esecuzione.
Received (BOOL) Attivo per un loop su ricezione di un topic dal server.
RxQoS (USINT) Quality of Service topic ricevuto da broker.
RxTopic (@STRING) Puntatore nome topic ricevuto da broker.
RxTLength (UDINT) Dimensione nome topic ricevuto da broker.
RxValue (PVOID) Puntatore buffer valore topic ricevuto da broker.
RxVLength (UDINT) Dimensione valore topic ricevuto da broker.
CTime (REAL) Tempo di comunicazione con il broker (S).
TxPkts (UDINT) Contatore frames inviati al server MQTT.
RxPkts (UDINT) Contatore frames ricevuti dal server MQTT.
Errors (UDINT) Contatore errori di gestione.
Enable (BOOL) Comando abilitazione connessione al broker, tutte le sottoscrizioni definite in TSData vengono sottoscritte.
SpyOn (BOOL) Se attivo permette di spiare il funzionamento della FB (Vedi articolo).
FIFOFile (@FIFOFile_v1) Indirizzo allocazione FB FIFOFile di supporto.
File (eFILEP) Stream di comunicazione con broker.
CFlags (BYTE) Flags trasmesse su connessione.
ClientID (@STRING) Puntatore stringa definizione identificativo client (1). Se eNULL viene generata una stringa univoca di 8 caratteri ricavata dall’UniqueID del sistema.
Username (@STRING) Puntatore stringa definizione nome utente (2). Può essere eNULL.
Password (@STRING) Puntatore stringa definizione password accesso (2). Può essere eNULL.
KeepAlive (TIME) Tempo vita connessione, viene inviato al broker. Se tempo impostato diverso da 0 ogni metà tempo impostato viene inviato automaticamente un messaggio di ping (3).
Delay (TIME) tempo attesa invio pacchetti al broker.
TSData (@MQTT_TS_DATA) Occorre indicare l’indirizzo dell’array strutture MQTT_TS_DATA di definizione sottoscrizioni. eNULL se non è prevista alcuna sottoscrizione.
TSNumber (UDINT) Occorre indicare il numero di elementi dell’array strutture MQTT_TS_DATA. 0 se non è prevista alcuna sottoscrizione.
Connect (BOOL) Forza la connessione al server MQTT.
Connected (BOOL) Si attiva se connessione al server MQTT avvenuta.
Fault (BOOL) Attivo per un loop se errore esecuzione.
Received (BOOL) Attivo per un loop su ricezione di un topic dal server.
RxQoS (USINT) Quality of Service topic ricevuto da broker.
RxTopic (@STRING) Puntatore nome topic ricevuto da broker.
RxTLength (UDINT) Dimensione nome topic ricevuto da broker.
RxValue (PVOID) Puntatore buffer valore topic ricevuto da broker.
RxVLength (UDINT) Dimensione valore topic ricevuto da broker.
CTime (REAL) Tempo di comunicazione con il broker (S).
TxPkts (UDINT) Contatore frames inviati al server MQTT.
RxPkts (UDINT) Contatore frames ricevuti dal server MQTT.
PJunked (UDINT) Contatore records da pubblicare scartati.
Errors (UDINT) Contatore errori di gestione.

- Nota (1): I caratteri consentiti sono “0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ”. Il broker accetta ClientID di lunghezza compresa tra 1 e 23 caratteri. Può essere che alcuni accettino anche lunghezze superiori, se non accettato viene ritornato errore nel messaggio CONNACK. Il valore è univoco, non possono esserci più ClientID con la stessa definizione connessi al server.
- Nota (2): Se nella stringa è presente il carattere $, và indicato come $$ (Esempio Us$er diventa Us$$er).
- Nota (3): Per evitare che il client TCP di connessione al server chiuda la connessione si consiglia di settare con il tempo di LifeTime del client TCP o inferiore.
TxFlags
Con la connessione al broker (Comando CONNECT) è inviato anche il byte CFlags. I bits 7, 6 e 0 sono gestiti automaticamente dal FB.
+--------+--------+-----------+----+----+---------+-------------+--------+ |Username|Password|Will retain|Will QoS |Will flag|Clean session|Reserved| +--------+--------+-----------+----+----+---------+-------------+--------+
- [7] Username: Gestita utomaticamente.
- [6] Password: Gestita utomaticamente.
- [5] Will retain:
- [4, 3] Will Qos:
- [2] Will flag:
- [1] Clean session: Se non attivo il broker riprende le comunicazioni con il client in base alla sessione identificata dal ClientID. Se non esiste alcuna sessione ne crea una nuova. Se attivo il broker elimina la sessione precedente e ne crea una nuova.
- [0] Reserved: Sempre 0.
Sessione persistente e non
I client si connettono ai broker per pubblicare o sottoscrivere degli argomenti (Topics), un client può essere sia publisher che subscriber. I client non comunicano direttamente tra di loro, i messaggi sono pubblicati e consegnati ad un broker MQTT. Quando un client si connette ad un broker, la connessione può essere persistente o non persistente (sessione pulita).
- Sessione non persistente: Può essere utilizzata dai i client che pubblicano solo messaggi e non si sottoscrivono ad alcun argomento. Il broker non immagazzina alcuna informazione dei messaggi non consegnati ai client. Alla disconnessione si perdono le sottoscrizioni e un client deve sottoscriversi nuovamente quando si riconnette al broker. I client informano il broker delle loro intenzioni utilizzando il flag di sessione pulita, che indica se è richiesta una sessione persistente.
- Sessione persistente: Una sessione persistente viene identificata da un client ID e permette ai client che sono offline di ricevere i messaggi che vengono inviati mentre sono disconnessi.
Wildcards
Si possono sottoscrivere uno o più topic, nella sottoscrizione si può specificare il nome esatto del topic al quale ci si vuole sottoscrivere o in alternativa è possibile utilizzare le wildcards, ovvero caratteri speciali per sottoscrivere un insieme di topics. Le wildcards non sono accettate nella pubblicazione.
- Wildcard (+): Permette di sottoscrivere un singolo livello. Vediamo un esempio: sottoscrivendo il topic myhome/+/temperature si riceveranno tutti i topics che contengono una qualsiasi scritta al posto del wildcard, ad esempio myhome/bedroom/temperature, myhome/livingroom/temperature, myhome/kitchen/temperature, ecc.
- Wildcard (#): Permette di sottoscrivere un multilivello. Il carattere deve occupare sempre la posizione finale del topic e deve essere preceduto dal carattere /. Ad esempio sottoscrivendo il topic myhome/bedroom/# si riceveranno tutti itopics che iniziano con la definizione che precede il wildcard, ad esempio myhome/bedroom/temperature, myhome/bedroom/humidity, myhome/bedroom/airquality, ecc.
Metodi disponibili
Subscribe
Questo metodo permette di compilare la struttura dati MQTT_TS_DATA di sottoscrizione topic sul broker. Quando il valore del topic sul broker cambia viene automaticamente aggiornata la variabile definita. E’ possibile gestire un array di strutture dati, una per ogni topic, nel campo IDx indicare l’indice della struttura da compilare. Nel caso si desideri eseguire la sola sottoscrizione delegando la ricezione dei dati dal broker al programma utente occorre definire DBuffer:=eNULL e DBSize:=0.
IDx (UDINT) Indice struttura dati.
Topic (@STRING) Definizione topic da sottoscrivere.
DBuffer (PVOID) Definizione indirizzo buffer valore topic da aggiornare su ricezione da broker.
DBSize (UDINT) Dimensione buffer valore.
QoS (USINT) Quality of service
Il metodo ritorna un (BOOL) FALSE se errore esecuzione, TRUE se esecuzione corretta.

Publish
Permette di pubblicare un topic sul broker, il valore presente nel buffer PValue viene inserito nel registro FIFO di appoggio. Questo permette di pubblicare più topic contemporaneamente, il FB provvederà ad eseguire lo spool dei dati dal FIFO ed a eseguirne la pubblicazione in base alla disponibilità del broker. Se la pubblicazione di un record presente nel FIFO non và a buon fine dopo alcuni tentativi viene scartato continuando la pubblicazione dei records successivi. Le variabili sono pubblicate come array di bytes come sono presenti in memoria mantenendo l’endianness del sistema. Per pubblicare valori numerici occorre utilizzare variabili stringa.
Topic (@STRING) Definizione topic da sottoscrivere.
PValue (PVOID) Definizione indirizzo buffer valore topic da pubblicare sul broker.
PVLength (UDINT) Dimensione valore da pubblicare, non definire se variabile stringa (Massimo 512-lunghezza nome topic).
TRetain (BOOL) Retain topic
QoS (USINT) Quality of service pubblicazione topic. Valori accettati 0 e 1.
Il metodo ritorna un (BOOL) FALSE se errore esecuzione, TRUE se esecuzione corretta.

- QoS:=0: Il topic viene pubblicato senza alcuna risposta da parte del broker.
- QoS:=1: Alla pubblicazione del topic il broker risponde con un messaggio PUBACK di conferma. Se non ricevuto il FB esegue una nuova pubblicazione.
Trigger di spy
Se SpyOn attivo è possibile utilizzare utilizzare la console di spionaggio per verificare il funzionamento della FB. Sono previsti vari livelli di triggers.
Livelli di trigger
Trigger | Descrizione |
---|---|
16#00000001 | Tx: Frame comando inviati al server. |
16#00000002 | Rx: Frame dati ricevuti dal server. |
16#10000000 | Lg: Log esecuzione. |
16#40000000 | Er: Errore di esecuzione. |
Esempi
ST_MQTTClient: Abilitando da debug Enable il FB si connette al broker broker.mqttdashboard.com, un broker gratuito e senza autenticazione (Quindi il FB può essere usato gratuitamente), se la connessione và a buon file si attiva l’uscita Connected, ed esegue la sottoscrizione dei 3 topics definiti. Consiglio di modificare la radice ElsistTest per non interagire con altri utenti che eseguono il programma. Agendo da debug sulla variabile Publish verrà eseguita la pubblicazione dei 3 topics definiti che essendo stati anche sottoscritti il valore pubblicato verrà ricevuto dalla sottoscrizione. In questo articolo informazioni su come interagire con l’esempio da Smartphone.
ST_TLSMQTTClient: Stesso funzionamento del programma precedente ma con connessione criptata verso il broker mqtt-dashboard.com.
E’ possibile interagire con l’esempio dal Websocket client di MQTT Dashboard. Utilizzare il solo topic STRINGValue che è di tipo stringa. Potete modificare l’esempio aggiungendo altri topics di tipo stringa.
LogicLab (Ptp208, ST_MQTTClient)
PROGRAM ST_MQTTClient
VAR
Publish : BOOL; (* Publish command *)
BOOLValue : ARRAY[0..1] OF BOOL := [true, false]; (* BOOL value [Tx][Rx] *)
REALValue : ARRAY[0..1] OF REAL := [10.0, 0.0]; (* REAL value [Tx][Rx] *)
STRINGValue : ARRAY[0..1] OF STRING[ 16 ]; (* STRING value [Rx] *)
SPData : ARRAY[0..2] OF MQTT_TS_DATA; (* MQTT topic subscribe data *)
TCPClient : SysTCPClient; (* TCP client management *)
FIFO : FIFOFile_v1; (* FIFO on file *)
MQTT : MQTTClient_v3; (* MQTT client FB *)
END_VAR
// *****************************************************************************
// PROGRAM "ST_MQTTClient"
// *****************************************************************************
// This program connects to a free broker, it shows how to subscribe and
// publish topics on it.
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
// INITIALIZATION
// -------------------------------------------------------------------------
// Initialize the FBs parameters.
IF (SysFirstLoop) THEN
// Set FIFO parameters.
FIFO.FIFOFilename:=eNULL; //Path and name of FIFO file
FIFO.FIFOSize:=2048; //FIFO file size
FIFO.FIFOIDx:=eNULL; //FIFO indexes
// Set TCPClient parameters.
TCPClient.PeerAdd:=ADR('broker.mqttdashboard.com'); //Peer address
TCPClient.PeerPort:=1883; //Peer port
TCPClient.LocalAdd:=ADR('0.0.0.0'); //Local address
TCPClient.LocalPort:=0; //Local port
TCPClient.FlushTm:=0; //Flush time (mS)
TCPClient.LifeTm:=90; //Life time (S)
TCPClient.RxSize:=512; //Rx buffer size
TCPClient.TxSize:=512; //Tx buffer size
// Set MQTTClient parameters.
MQTT.SpyOn:=TRUE; //Spy active
MQTT.FIFOFile:=ADR(FIFO); //FIFO on file
MQTT.CFlags:=16#02; //Clean session
MQTT.Username:=eNULL; //Broker username
MQTT.Password:=eNULL; //Broker password
MQTT.ClientID:=eNULL; //Client identifier
MQTT.KeepAlive:=T#90s; //Keep alive time
MQTT.Delay:=T#2s; //Send delay time
MQTT.Timeout:=T#5s; //Execution timeout
// Topic subscribe definitions.
MQTT.TSData:=ADR(SPData); //Topic subscribe data
MQTT.TSNumber:=SIZEOF(SPData)/SIZEOF(SPData[0]); //Topic subscribe number
eTO_JUNK(MQTT.Subscribe(0, ADR('ElsistTest/BOOLValue'), ADR(BOOLValue[1]), SIZEOF(BOOLValue[1]), 0));
eTO_JUNK(MQTT.Subscribe(1, ADR('ElsistTest/REALValue'), ADR(REALValue[1]), SIZEOF(REALValue[1]), 0));
eTO_JUNK(MQTT.Subscribe(2, ADR('ElsistTest/STRINGValue'), ADR(STRINGValue[1]), 16, 0));
END_IF;
// -------------------------------------------------------------------------
// MQTT MANAGEMENT
// -------------------------------------------------------------------------
// FBs management.
TCPClient(Connect:=MQTT.Connect); //TCPClient management
MQTT(Enable:=TRUE, File:=TCPClient.File); //MQTTClient management
// To publish topics set by debug the "Publish" variable.
IF NOT(Publish) THEN RETURN; END_IF;
Publish:=FALSE; //Publish command
eTO_JUNK(MQTT.Publish(ADR('ElsistTest/BOOLValue'), ADR(BOOLValue[0]), SIZEOF(BOOLValue[0]), FALSE, 1));
eTO_JUNK(MQTT.Publish(ADR('ElsistTest/REALValue'), ADR(REALValue[0]), SIZEOF(REALValue[0]), FALSE, 1));
eTO_JUNK(SysVsnprintf(ADR(STRINGValue[0]), 16, ADR('%.3f'), REAL_TYPE, ADR(REALValue[0])));
eTO_JUNK(MQTT.Publish(ADR('ElsistTest/STRINGValue'), ADR(STRINGValue[0]), LEN(STRINGValue[0]), FALSE, 1));
// [End of file]
LogicLab (Ptp208, ST_TLSMQTTClient)
PROGRAM ST_TLSMQTTClient
VAR
Publish : BOOL; (* Publish command *)
BOOLValue : ARRAY[0..1] OF BOOL := [true, false]; (* BOOL value [Tx][Rx] *)
REALValue : ARRAY[0..1] OF REAL := [10.0, 0.0]; (* REAL value [Tx][Rx] *)
STRINGValue : ARRAY[0..1] OF STRING[ 16 ]; (* STRING value [Rx] *)
SPData : ARRAY[0..2] OF MQTT_TS_DATA; (* MQTT topic subscribe data *)
TCPClient : SysTCPClient; (* TCP client management *)
TLSClient : SysTLSClient; (* TLS client *)
FIFO : FIFOFile_v1; (* FIFO on file *)
MQTT : MQTTClient_v3; (* MQTT client FB *)
END_VAR
// *****************************************************************************
// PROGRAM "ST_MQTTSpool"
// *****************************************************************************
// This program connects to a free broker, it shows how to subscribe and
// publish topics on it.
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
// INITIALIZATION
// -------------------------------------------------------------------------
// Initialize the FBs parameters.
IF (SysFirstLoop) THEN
// Set FIFO parameters.
FIFO.FIFOFilename:=eNULL; //Path and name of FIFO file
FIFO.FIFOSize:=2048; //FIFO file size
FIFO.FIFOIDx:=eNULL; //FIFO indexes
// Set TCPClient parameters.
TCPClient.PeerAdd:=ADR('mqtt-dashboard.com'); //Peer address
TCPClient.PeerPort:=8883; //Peer port
TCPClient.LocalAdd:=ADR('0.0.0.0'); //Local address
TCPClient.LocalPort:=0; //Local port
TCPClient.FlushTm:=0; //Flush time (mS)
TCPClient.LifeTm:=90; //Life time (S)
TCPClient.RxSize:=512; //Rx buffer size
TCPClient.TxSize:=512; //Tx buffer size
// Set TLSClient parameters.
TLSClient.SpyOn:=FALSE; //Spy On
TLSClient.Mode:=TLS_MODE_TCP; //Connection mode
TLSClient.Server:=TCPClient.PeerAdd; //Server name
TLSClient.CipherSuites:=eNULL; //Cipher suites supported
TLSClient.Psk:=eNULL; //Preshared key
TLSClient.PskIdentity:=eNULL; //Preshared key identity
// Without server certification.
TLSClient.CAVerify:=TLS_CA_NONE; //Certificates verify type
TLSClient.CAFile:=eNULL; //CA file
// Set MQTTClient parameters.
MQTT.SpyOn:=TRUE; //Spy active
MQTT.FIFOFile:=ADR(FIFO); //FIFO on file
MQTT.CFlags:=16#02; //Clean session
MQTT.Username:=eNULL; //Broker username
MQTT.Password:=eNULL; //Broker password
MQTT.ClientID:=eNULL; //Client identifier
MQTT.KeepAlive:=T#90s; //Keep alive time
MQTT.Delay:=T#2s; //Send delay time
MQTT.Timeout:=T#5s; //Execution timeout
// Topic subscribe definitions.
MQTT.TSData:=ADR(SPData); //Topic subscribe data
MQTT.TSNumber:=SIZEOF(SPData)/SIZEOF(SPData[0]); //Topic subscribe number
eTO_JUNK(MQTT.Subscribe(0, ADR('ElsistTest/BOOLValue'), ADR(BOOLValue[1]), SIZEOF(BOOLValue[1]), 0));
eTO_JUNK(MQTT.Subscribe(1, ADR('ElsistTest/REALValue'), ADR(REALValue[1]), SIZEOF(REALValue[1]), 0));
eTO_JUNK(MQTT.Subscribe(2, ADR('ElsistTest/STRINGValue'), ADR(STRINGValue[1]), 16, 0));
END_IF;
// -------------------------------------------------------------------------
// MQTT SPOOLING MANAGEMENT
// -------------------------------------------------------------------------
// FBs management.
TCPClient(Connect:=MQTT.Connect); //TCPClient management
TLSClient(IFile:=TCPClient.File); //TLS client management
MQTT(Enable:=TRUE, File:=TLSClient.OFile); //MQTTClient management
// To publish topics set by debug the "Publish" variable.
IF NOT(Publish) THEN RETURN; END_IF;
Publish:=FALSE; //Publish command
eTO_JUNK(MQTT.Publish(ADR('ElsistTest/BOOLValue'), ADR(BOOLValue[0]), SIZEOF(BOOLValue[0]), FALSE, 1));
eTO_JUNK(MQTT.Publish(ADR('ElsistTest/REALValue'), ADR(REALValue[0]), SIZEOF(REALValue[0]), FALSE, 1));
eTO_JUNK(SysVsnprintf(ADR(STRINGValue[0]), 16, ADR('%.3f'), REAL_TYPE, ADR(REALValue[0])));
eTO_JUNK(MQTT.Publish(ADR('ElsistTest/STRINGValue'), ADR(STRINGValue[0]), LEN(STRINGValue[0]), FALSE, 1));
// [End of file]