Questo blocco funzione da eseguire in task Back, esegue la gestione di un comando sui dispositivi Milesight.
Nel campo OName occore indicare il testo da inviare per gestire il comando desiderato sul dispositivo, il nome varia in base al programma di codifica Encoder utilizzato (Vedi capitolo Milesight payload codec in questo articolo). Di seguito le definizioni normalmente utilizzate:
L’uscita Synced si attiva solo dopo avere inviato il comando ed averne verificato lo stato, quindi se è attivo si è certi che il comando sul dispositivo si trovi nello stato settato in Out.
Retries è il contatore del numero di reinvii comando verso il dispositvo. Alla variazione di Out si invia il comando al dispositivo e si controlla il feedback ricevuto. Se non ricevuto o non corrisponde il comando viene reinviato ed il numero incrementato il valore non viene mai azzerato. Il FB dopo 5 ritrasmissioni consecutive attiva l’uscita OnError del FB di supporto MlsDevice per indicare errore nel dispositivo.
Gestione UC51x controllore di elettrovalvole
Questo dispositivo è disponibile in 2 versioni, vediamo le differenze:
UC511: Dotato di batteria e pannello solare può funzionare in classe A, B, C. Se configurato in classe C Il dispositivo è sempre in ricezione quindi naturalmente consuma più energia ma ha una latenza molto bassa quasi real time sulla gestione dei comandi. Preferire questa versione se si desidera gestire comandi ravvicinati.
UC512: Dotato di batteria può funzionare in classe A, B. Se configurato in classe A il dispositivo non è sempre in ascolto, può ricevere comandi solo dopo aver trasmesso qualcosa. Per ricevere i comandi anche se non ha nulla da trasmettere l’UC512 invia dei pacchetti “vuoti” (blank packets) ogni intervallo definito dal response time, così apre la finestra di ricezione. Se configurato in classe B il dispositivo apre la finestra di ricezione ogni intervallo definito dal response time.
Quando si utilizzano dispositivi in classe A e B occorre nella inizializzazione impostare il valore di response time, minore è il tempo e più veloce e la gestione dei comandi ma è maggiore anche il consumo di energia. In questa situazione il valore di TRetry deve essere maggiore del valore impostato in response time.
Descrizione
Out (BOOL) Comando uscita.
MDev (@MlsDevice) Indirizzo allocazione FB MlsDevice di supporto.
OName (@STRING) Definizione nome comando da inviare.
TRetry (TIME) Definizione tempo reinvio comando se non ricevuto feedback da dispositivo (S).
Fault (BOOL) Attivo per un loop se errore esecuzione.
Synced (BOOL) Attivo se stato uscita sincronizzato con comando. Se attivo il feedback ricevuto dal dispositivo ha confermato il comando Out inviato.
ETime (TIME) Tempo impiegato per gestire il comando.
Retries (UDINT) Counter reinvii effettuati. Numeratore progressivo inizializzato a 0 ad inizio esecuzione non viene mai resettato.

Esempi
Viene gestito un UC512 controllore di 2 elettrovalvole LoRaWAN della Milesight.
Questo dispositivo opera in classe A quindi non è sempre in ascolto, può ricevere comandi solo dopo aver trasmesso qualcosa. Per ricevere i comandi anche se non ha nulla da trasmettere l’UC512 invia dei pacchetti “vuoti” (blank packets) ogni intervallo definito dal response time, così apre la finestra di ricezione. Ecco perchè nella inizializzazione del dispositivo viene impostato il valore di response time.
LogicLab (Ptp208, MlsDOutput)
PROGRAM ST_MlsDOutput
VAR
i : UDINT; (* Auxiliary variable *)
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 *)
DOut : ARRAY[0..1] OF MlsDOutput; (* Milesight digital output *)
END_VAR
// *****************************************************************************
// PROGRAM "ST_MlsDOutput"
// *****************************************************************************
// Are managed the two digital output of a Milesight UC51x device.
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
// INITIALIZATION
// -------------------------------------------------------------------------
// Initialize the FB 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('24e124460d445153'); //Device EUI
MDev.Timeout:=T#5m; //Timeout
// Milesight UC51x digital outputs.
DOut[0].OName:=ADR('valve_1'); //Output name
DOut[1].OName:=ADR('valve_2'); //Output name
FOR i:=0 TO 1 DO DOut[i].MDev:=ADR(MDev); DOut[i].TRetry:=T#45s; END_FOR;
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)
eTO_JUNK(MDev.DLinkJSON(ADR('{"response_time":30}'))); //Set response time, 30 (S)
END_IF;
// Manage the device digital outputs.
FOR i:=0 TO 1 DO DOut[i](); END_FOR;
// [End of file]