Vai al contenuto

MlsDOutput, Milesight digital output command

Vai all indice del manuale di programmazione
Tipo: Blocco Funzione
Libreria LogicLab: eLLabMQTTLib
Libreria Codesys: Non disponibile

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.

Immagine FB MlsDOutput

Esempi

Come utilizzare gli 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]
Was this article helpful?