Questo blocco funzione da eseguire in task Back, esegue la gestione dei dispositivi Milesight. Il FB si connette al gateway LoRaWAN tramite il FB MQTTClient.
Descrizione
Enable (BOOL) Attivandolo viene abilitata l’esecuzione del FB.
SpyOn (BOOL) Se attivo permette di spiare il funzionamento del FB (Vedi articolo).
MQTT (@MQTTClient_v3) Indirizzo allocazione FB MQTTClient di supporto.
DTopic (@STRING) Definizionme topic a cui il device appartiene (Es. application/1/device).
EUI (@STRING]) Definizione 64-bit (Extended Unique Identifier), identificativo univoco del dispositivo.
Timeout (TIME) Tempo controllo dispositivo attivo, se non si ricevono dati in questo tempo viene segnalato errore (Deve essere impostato almeno al doppio del valore di report interval).
Fault (BOOL) Attivo per un loop se errore esecuzione.
DInit (BOOL)Si attiva per un loop alla inizializzazione del dispositivo. E’ possibile eseguire l’invio di comandi in downlink di inizializzazione.
Active (BOOL) Attivo se dispositivo linkato.
OnError (BOOL) Attivo se dispositivo in errore.
RxOTrig (BOOL) Si attiva per un loop alla ricezione di un uplink dal dispositivo.
RSSI (REAL) (Received Signal Strength Indicator), indica la qualità del segnale ricevuto dal dispositivo (dBm).
SNR (REAL) (Signal-to-Noise Ratio), indica il livello del segnale rispetto al rumore di ambiente (dB).
Battery (USINT) Livello batteria (%).
ETime (TIME) Tempo trascorso da ultima ricezione uplink da dispositivo.
RxObject (@STRING) Se attivo RxOTrig ritorna dato ricevuto in uplink da dispositivo.
RxOLength (UDINT) Se attivo RxOTrig ritorna dimensione dato ricevuto in uplink da dispositivo.
RxOTrig (BOOL) Si attiva per un loop alla ricezione di un uplink dal dispositivo.
RxPkts (UDINT) Counter pacchetti dati ricevuti (Uplink) dal dispositivo.
TxPkts (UDINT) Counter pacchetti dati trasmessi (Downlink) al dispositivo.
Errors (UDINT) Counter errori comunicazione con dispositivo.

RSSI
Il Received Signal Strength Indicator RSSI indica la potenza del segnale ricevuto in milliwatt e viene misurata in dBm. Questo valore è utilizzato come misura della capacità di un ricevitore di “sentire” un segnale proveniente da un mittente. L’RSSI è un valore negativo e quanto più vicino allo 0, migliore è il segnale, i valori RSSI LoRa tipici sono:
- RSSI minimo = -120 dBm.
- Se RSSI=-30dBm: il segnale è forte.
- Se RSSI=-120dBm: il segnale è debole.
SNR
Il Signal-to-Noise Ratio SNR è il rapporto tra il segnale ricevuto ed il livello del rumore di fondo. Il rumore di fondo è costituito da tutte le sorgenti di segnale indesiderate che possono corrompere il segnale trasmesso che ne provocano la ritrasmissione. Se SNR è maggiore di 0, il segnale ricevuto opera al di sopra del rumore di fondo. Se SNR è inferiore a 0, il segnale ricevuto opera al di sotto del rumore di fondo. Anche se normalmente nelle trasmissioni radio il rumore di fondo è il limite fisico della sensibilità, LoRa funziona al di sotto del livello di rumore. I valori SNR LoRa tipici sono:
- Valore ottimali: SNR > 0 dB
- Valori in media: -5dB > SNR <= 0dB
- Valori che indicano un livello di segnale al di sotto del rumore di fondo: SNR < -5dB
Metodi disponibili
DeviceError
Questo metodo permette di segnalare al FB MlsDevice una condizione di errore.
Il metodo ritorna un (BOOL) TRUE.

DLinkValue
Questo metodo permette di inviare un payload al dispositivo vedi comandi di downlink. Nei dispositivi in classe A il comando verrà inviato solo in seguito alla ricezione di un uplink, nei dispositivi in classe C il comando viene subito inviato.
Name (@STRING) Definizione nome variabile da inserire nel payload.
VType (VR_TYPE) Tipo variabile da inserire nel payload (Vedi definizione).
VAddress (PVOID) Indirizzo variabile da inserire nel payload.
Il Il metodo ritorna un (BOOL) TRUE.

DLinkJSON
Questo metodo permette di inviare un payload al dispositivo vedi comandi di downlink. Nei dispositivi in classe A il comando verrà inviato solo in seguito alla ricezione di un uplink, nei dispositivi in classe C il comando viene subito inviato.
Payload (@STRING) Definizione payload in formato JSON da inviare in downlink al dispositivo.
Il Il metodo ritorna un (BOOL) TRUE.

Milesight payload codec
Il Milesight payload codec è un sistema per codificare e decodificare i dati scambiati con i sensori Milesight, progettato per:
- Ridurre al minimo le dimensioni dei dati: le reti LoRaWAN hanno limitazioni sulla quantità di dati inviati in un singolo messaggio (payload). Il codec comprime i dati in un formato più piccolo ed efficiente.
- Garantire l’integrità dei dati: il codec spesso include meccanismi per il rilevamento e la correzione degli errori, assicurando che i dati ricevuti siano corretti.
- Standardizzare il formato dei dati: fornisce una interfaccia JSON per i dati, rendendone più facile la gestione.
Il codec presente sul gateway esegue
- Decodifica (Decoder): Il sensore raccoglie i valori (ad esempio, temperatura, umidità, ecc), li codifica in formato binario e li invia in uplink al gateway. Il gateway decodifica i dati ricevuti ritornandoli al programma applicativo in formato JSON.
- Codifica (Encoder): Il programma applicativo invia i comandi al gateway in formato JSON, il gateway codifica i dati in formato binario e li invia in downlink al sensore che esegue il comando.
Molti codecs sono preinstallati di default nel gateway, è comunque possibile reperirne altri in rete in questa pagina. Anche se è possibile utilizzare i codecs standard, per ottenere il massimo delle prestazioni con il nostro FB è possibile scaricare dal ns sito codecs ottimizzati per i dispositivi più utilizzati.
Comandi di downlink
Il comando di downlink da inviare varia in base al programma di codifica Encoder utilizzato, di seguito le definizioni normalmente utilizzate:
Dispositivo | Comando |
---|---|
EM300 | report_interval: Permette di impostare il tempo di reporting (S) |
UC300 | report_interval: Permette di impostare il tempo di reporting (S) |
UC51x | report_interval: Permette di impostare il tempo di reporting (S) response_time: Permette di impostare il tempo di response (S) |
Valori in uplink
uplink ritornato varia in base al programma di decodifica Decoder utilizzato, di seguito le definizioni normalmente utilizzate:
Dispositivo | Valore |
---|---|
EM300 | temperature: Valore di temperatura (°C) humidity: Valore di umidita (%) |
UC300 | gpio_output_1: Stato uscita logica DO_1 gpio_output_2: Stato uscita logica DO_2 |
UC51x | valve_1: Stato solenoide valvola OUT1 valve_2: Stato solenoide valvola OUT2 |
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 | Rx: Dato ricevuto in uplink. |
16#00000002 | Tx: Dato trasmesso in downlink. |
16#10000000 | Lg: Log di esecuzione. |
16#40000000 | Er: Errore di esecuzione. |
Esempi
Gestione EM300-TH sensore temperatura ed umidità LoRaWAN della Milesight.
LogicLab (Ptp208, ST_MlsDevice)
PROGRAM ST_MlsDevice
VAR
Temperature:REAL; (* Temperature (°C) *)
Humidity:REAL; (* Humidity (%) *)
SPData : MQTT_TS_DATA; (* MQTT topic subscribe data *)
TCPClient : SysTCPClient; (* TCP client management *)
FIFO : FIFOFile_v1; (* FIFO on file *)
MQTT : MQTTClient_v3; (* MQTT client FB *)
MDev : MlsDevice; (* Milesight device manager *)
END_VAR
// *****************************************************************************
// PROGRAM "ST_MlsDevice"
// *****************************************************************************
// Is managed a EM300-TH temperature and humidity sensor.
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
// 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('192.168.1.150'); //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:=1512; //Rx buffer size
TCPClient.TxSize:=512; //Tx buffer size
// Set MQTTClient parameters.
MQTT.SpyOn:=FALSE; //Spy active
MQTT.FIFOFile:=ADR(FIFO); //FIFO on file
MQTT.CFlags:=16#02; //Clean session
MQTT.Username:=ADR('loraadm'); //Broker username
MQTT.Password:=ADR('URloraadm123456'); //Broker password
MQTT.ClientID:=eNULL; //Client identifier
MQTT.KeepAlive:=T#90s; //Keep alive time
MQTT.Delay:=T#1s; //Send delay time
MQTT.Timeout:=T#5s; //Execution timeout
// Topic subscribe definitions.
// Subscribe to all applications and all devices rx data.
MQTT.TSData:=ADR(SPData); //Topic subscribe data
MQTT.TSNumber:=1; //Topic subscribe number
eTO_JUNK(MQTT.Subscribe(0, ADR('application/+/device/+/rx'), eNULL, 0, 0));
// Milesight device definitions.
MDev.Enable:=TRUE; //FB enable
MDev.SpyOn:=TRUE; //Spy On
MDev.MQTT:=ADR(MQTT); //MQTT client
MDev.DTopic:=ADR('application/1/device'); //Device topic
MDev.EUI:=ADR('24e124136e313438'); //Device EUI
MDev.Timeout:=T#10m; //Timeout
END_IF;
// -------------------------------------------------------------------------
// FBs EXECUTION
// -------------------------------------------------------------------------
// FBs execution.
TCPClient(Connect:=MQTT.Connect); //TCPClient management
MQTT(Enable:=TRUE, File:=TCPClient.File); //MQTTClient management
// Device management, send the init downlink settings.
MDev(); //Milesight device manager
IF (MDev.DInit) THEN
eTO_JUNK(MDev.DLinkJSON(ADR('{"report_interval":120}'))); //Set reporting interval, 120 (S)
END_IF;
// Not needed, is just to show how to spy the complete uplink message.
// IF (MDev.RxOTrig) THEN eTO_JUNK(SysWrSpyData(SPY_ASCII, 0, 16#00000001, ADR('----'), MQTT.RxValue)); END_IF;
// The managed device is a EM300-TH so acquire its measures.
IF NOT(MDev.RxOTrig) THEN RETURN; END_IF;
eTO_JUNK(JSONDecoder(MDev.RxObject, ADR('temperature'), REAL_TYPE, ADR(Temperature), 1, 0));
eTO_JUNK(JSONDecoder(MDev.RxObject, ADR('humidity'), REAL_TYPE, ADR(Humidity), 1, 0));
// [End of file]