Vai al contenuto

SNTPClient, invia richiesta SNTP

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

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

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.

Immagine FB SNTPClient

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