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.

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.

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.

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]