Vai al contenuto

Funzioni gestione tempo di sistema

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

Il sistema operativo gestisce un contatore di tempo che si autoincrementa dalla accensione del sistema, raggiunto il suo valore massimo (In base al tipo di ritorno desiderato) il valore riparte da 0. Esistono diverse funzioni in base al tipo di ritorno desiderato.

SysTimeGetMs, returns system time in mS

La funzione ritorna il tempo di sistema espresso in mS su una variabile a 32 bits, il valore massimo ritornato è 4.294.967.295 mS (49d 17h 02m 47s 295ms). Il valore di ritorno si autoincrementa ad ogni mS, raggiunto il massimo valore positivo riparte da 0.

Descrizione

La funzione ritorna una variabile (UDINT) con il valore di tempo di sistema espresso in mS.

Immagine F_SysTimeGetMs

SysTimeGetUs, returns system time in uS

La funzione ritorna il tempo di sistema espresso in uS su una variabile a 32 bits, il valore massimo ritornato è 4.294.967.295 uS (01h 11m 34s 967ms 295us). Il valore di ritorno si autoincrementa ad ogni uS, raggiunto il massimo valore positivo riparte da 0.

Descrizione

La funzione ritorna una variabile (UDINT) con il valore di tempo di sistema espresso in uS.

Immagine F_SysTimeGetUs

SysTimeGetNs, returns system time in nS

La funzione ritorna il tempo di sistema espresso in nS su una variabile a 64 bits, il valore massimo ritornato 18.446.744.073.709.551.615 ns (5.124.095 ore, 213.503 giorni). Il valore di ritorno si autoincrementa ad ogni nS, raggiunto il massimo valore positivo riparte da 0.

Descrizione

La funzione ritorna una variabile (ULINT) con il valore di tempo di sistema espresso in nS.

Immagine F_SysTimeGetNs

Esempi

Come utilizzare gli esempi.

ST_TimeFunctions: Nell’esempio viene gestito il lampeggio di una variabile BOOL e successivamente viene calcolato il tempo in cui la variabile rimane attiva.

ST_AccurateBaseTime: Sono messi a confronto tre modi per gestire una base tempi di 1 secondo. Utilizzando un timer, controllando la differenza con il tempo di sistema con e senza la correzione del tempo di esecuzione programma. Dall’esempio si deduce che solo applicando la correzione del tempo di esecuzione programma si ha una base tempi accurata.

LogicLab (Ptp116, ST_TimeFunctions)
PROGRAM ST_TimeFunctions
VAR
    BOut : BOOL; (* Blink output *)
    Pulse : BOOL; (* Pulse flag *)
    BTime : TIME; (* System time (mS) *)
    ATime : TIME; (* Variable active time *)
    TimeBf : ARRAY[0..1] OF UDINT; (* Time bufer (mS) *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_TimeFunctions"
// *****************************************************************************
// Use of time functions.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // TIME OPERATIONS
    // -------------------------------------------------------------------------
    // The "SysTimeGetMs" function returns the a value in the range
    // From 0 to 49d 17h 02m 47s 295ms

    // After conversion in TIME the range will be
    // From -24d 20h 31m 23s 648ms to 24d 20h 31m 23s 647ms

    BTime:=TO_TIME(SysTimeGetMs()); //System time (mS)

    // -------------------------------------------------------------------------
    // BLINKING A VARIABLE
    // -------------------------------------------------------------------------
    // Blinking a variable with defined On/Off time.

    IF ((SysTimeGetMs()-TimeBf[0]) >= TO_UDINT(T#1s500ms)) THEN
        TimeBf[0]:=SysTimeGetMs(); //Time bufer (mS)
        BOut:=NOT(BOut); //Blink output
    END_IF;

    // -------------------------------------------------------------------------
    // CALCULATE ACTIVATION TIME
    // -------------------------------------------------------------------------
    // Calculate the time during with the variable is active.

    IF (BOut <> Pulse) THEN
        IF NOT(BOut) THEN
            ATime:=TO_TIME(SysTimeGetMs()-TimeBf[1]); //Variable active time
        END_IF;

        TimeBf[1]:=SysTimeGetMs(); //Time bufer (mS)
        Pulse:=BOut; //Pulse flag
    END_IF;

// [End of file]
LogicLab (Ptp116, ST_AccurateBaseTime)
PROGRAM ST_AccurateBaseTime
VAR
    TimeDelay : UDINT; (* Time delay (uS) *)
    SysTimeuS : UDINT; (* System time (uS) *)
    TimeBf : ARRAY[0..1] OF UDINT; (* Time buffer (uS) *)
    SCounter : ARRAY[0..2] OF UDINT; (* Seconds counter *)
    TClock : TON; (* Timer clock *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_AccurateBaseTime"
// *****************************************************************************
// Considerations for generating a precise base time.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // INITILIZATION
    // -------------------------------------------------------------------------
    // Variable initialization.

    IF (SysFirstLoop) THEN
        TimeBf[0]:=SysTimeGetUs(); //Time buffer (uS)
        TimeBf[1]:=SysTimeGetUs(); //Time buffer (uS)
    END_IF;

    // -------------------------------------------------------------------------
    // AN EXAMPLE WITH TIMER
    // -------------------------------------------------------------------------
    // Using timers, program execution time generates progressive errors.

    TClock(IN:=NOT(TClock.Q), PT:=T#1s);
    IF (TClock.Q) THEN SCounter[0]:=SCounter[0]+1; END_IF;

    // -------------------------------------------------------------------------
    // AN EXAMPLE WITH SYSTEM TIME
    // -------------------------------------------------------------------------
    // Without execution time correction there are some progressive errors.

    IF ((SysTimeGetUs()-TimeBf[0]) >= 1000000) THEN
        TimeBf[0]:=SysTimeGetUs(); //Time buffer (uS)
        SCounter[1]:=SCounter[1]+1; //Seconds counter
    END_IF;

    // -------------------------------------------------------------------------
    // AN EXAMPLE WITH SYSTEM TIME WITH TIME CORRECTION
    // -------------------------------------------------------------------------
    // With execution time correction there are no errors.

    SysTimeuS:=SysTimeGetUs(); //System time (uS)
    TimeDelay:=SysTimeuS-TimeBf[1]; //Time delay (uS)
    IF (TimeDelay >= 1000000) THEN
        TimeBf[1]:=SysTimeuS-(TimeDelay-1000000); //Time buffer (uS)
        SCounter[2]:=SCounter[2]+1; //Seconds counter
    END_IF;

// [End of file]
Was this article helpful?