Questo blocco funzione da eseguire in task Back, acquisisce da un server di tempo il valore di UTC. Attivando Query viene eseguita la richiesta del valore di tempo dal server il cui URL o indirizzo IP è passato in NTPServer sulla porta definita in Port. L’FB interroga il server e se riceve risposta corretta si attiva per un loop Ok ed in in UTCTime è ritornato il valore di tempo UTC in Epoch.
Terminata l’esecuzione si attiva l’uscita Done, per effettuare una nuova lettura di tempo occorre disattivare e poi riattivare l’ingresso Query. In RTDelay è ritornato il tempo necessario all’invio della richiesta ed alla ricezione della risposta dal server NTP.
Approfondimenti
- In questo articolo come attivare un server NTP su PC.
- In questo articolo informazioni sulla sincronizzazione orario tra sistemi.
- In questo topic un programma di esempio utilizzo del precedente blocco funzione SNTPRequest ora nella libreria eLLabObsoleteLib.
Descrizione
Query (BOOL) Comando attivazione richiesta. Per rieseguire il comando disabilitare e poi riabilitare l’ingresso.
SpyOn (BOOL) Se attivo permette di spiare il funzionamento della FB.
Port (UINT) Definizione porta a cui inviare la richiesta su server, default 123.
NTPServer (ARRAY[0..1] OF @STRING) Pointer definizione server NTP. Può essere definito sia l’IP che l’URL E’ possibile definire 1 o 2 diversi servers di riferimento.
Done (BOOL) Si attiva al termine della esecuzione comando.
Ok (BOOL) Attivo per un loop di programma se query eseguita correttamente.
Fault (BOOL) Attivo per un loop se errore esecuzione comando.
RTDelay (TIME) Round trip delay, tempo per inviare la richiesta e ricevere la risposta dal server.
NTPPacket (NTPv4_PACKET) Messaggio NTP ricevuto da server (Descrizione).
UTCTime (LDATE_AND_TIME) Data/Ora in UTC espressa in Epoch time.
Requests (UDINT) Numero di richieste eseguite, si incrementa solo se ricevuto risposta corretta.
Errors (UDINT) Numero di errori esecuzione.

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 | Tx: Invio richiesta al server. |
| 16#00000002 | Rx: Ricezione risposta dal server. |
| 16#10000000 | Lg: Messaggio di log. |
| 16#40000000 | Er: Errore esecuzione. |
Esempi
ST_SNTPClient: Esegue aggiornamento clock di sistema, se clock non aggiornato la richiesta viene ripetuta frequentemente. Se clock aggiornato la richiesta viene eseguita con meno frequenza.
LogicLab (Ptp192, ST_SNTPClient)
PROGRAM ST_SNTPClient
VAR
ClockSync : BOOL; (* Clock syncronized *)
TimeBf : UDINT; (* Time buffer (mS) *)
SetDTime : DATE_AND_TIME; (* Set Date/Time *)
STrig : R_TRIG; (* Sync trigger *)
SNTPReq : SNTPClient; (* SNTP request *)
END_VAR
// *****************************************************************************
// PROGRAM "ST_SNTPClient"
// *****************************************************************************
// At every defined sends a NTP request and updates system clock.
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
// INITIALIZATION
// -------------------------------------------------------------------------
// Program initializations.
IF (SysFirstLoop) THEN
SNTPReq.SpyOn:=TRUE; //Spy On
SNTPReq.Port:=123; //NTP server port
SNTPReq.NTPServer[0]:=ADR('ntp1.inrim.it'); //NTP server
SNTPReq.NTPServer[1]:=ADR('0.it.pool.ntp.org'); //NTP server
TimeBf:=SysTimeGetMs(); //Time buffer (mS)
END_IF;
// -------------------------------------------------------------------------
// TIME SYNCRONIZATION
// -------------------------------------------------------------------------
// If system clock not synchronized executes the request faster.
IF NOT(ClockSync) THEN
IF ((SysTimeGetMs()-TimeBf) > TO_UDINT(T#30s)) THEN TimeBf:=SysTimeGetMs(); SNTPReq.Query:=TRUE; END_IF;
END_IF;
// Normally, synchronization is performed every hour; however, to prevent
// time updates due to RTC drift from causing changes in the minute, hour,
// or other time fields, the synchronization is executed at the 30th second.
STrig(CLK:=(MOD(SysTimeGetMs()/1000, 3630) = 0)); //Sync trigger
IF (STrig.Q) THEN SNTPReq.Query:=TRUE; END_IF;
// On execution done, if Ok update the real time clock.
SNTPReq(); //NTP request
IF NOT(SNTPReq.Done) THEN RETURN; END_IF;
SNTPReq.Query:=FALSE; //Query On
IF NOT(SNTPReq.Ok) THEN RETURN; END_IF;
SetDTime:=TO_DATE_AND_TIME(TO_UDINT(TO_ULINT(SNTPReq.UTCTime)/ULINT#1000000000)); //Set Date/Time
IF SysDateSetS(TO_UDINT(SetDTime)) THEN ClockSync:=TRUE; END_IF;
// [End of file]