Passa al contenuto principale

SNTPClient, invia richiesta SNTP

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.

I gestori di server NTP NON garantiscono che l'IP rimanga invariato per sempre, quindi è sempre preferibile configurare il nome DNS invece dell'IP. Se vuoi utilizzare l'IP puoi utilizzare "193.204.114.232" che corrisponde all'Istituto Nazionale di Ricerca Metrologica ntp1.inrim.it.

Approfondimenti

Descrizione​

Immagine FB SNTPClient

ParametroTipoDescrizione
QueryBOOLComando attivazione richiesta. Per rieseguire il comando disabilitare e poi riabilitare l'ingresso.
SpyOnBOOLSe attivo permette di spiare il funzionamento della FB.
PortUINTDefinizione porta a cui inviare la richiesta su server, default 123.
NTPServerARRAY\[0..1\] OF @STRINGPointer definizione server NTP. Può essere definito sia l'IP che l'URL E' possibile definire 1 o 2 diversi servers di riferimento.
DoneBOOLSi attiva al termine della esecuzione comando.
OkBOOLAttivo per un loop di programma se query eseguita correttamente.
FaultBOOLAttivo per un loop se errore esecuzione comando.
RTDelayTIMERound trip delay, tempo per inviare la richiesta e ricevere la risposta dal server.
NTPPacketNTPv4_PACKETMessaggio NTP ricevuto da server.
UTCTimeLDATE_AND_TIMEData/Ora in UTC espressa in Epoch time.
RequestsUDINTNumero di richieste eseguite, si incrementa solo se ricevuto risposta corretta.
ErrorsUDINTNumero 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

TriggerDescrizione
16#00000001Tx: Invio richiesta al server.
16#00000002Rx: Ricezione risposta dal server.
16#10000000Lg: Messaggio di log.
16#40000000Er: Errore esecuzione.

Esempi​

Come utilizzare gli 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]