SNTPRequest, trimite o solicitare SNTP

Listă

Această pagină face parte din Manual de programare IEC 61131-3. Mergeți la index.

Acest bloc funcțional de la rulați în sarcina Înapoi, primește valoarea UTC de la un server de timp, în acest articol este explicat cum se activează serverul pe un computer. activare Query cererea de valoare a timpului se face de pe serverul a cărui adresă URL sau adresă IP este transmisă NTPServer. FB-ul interogează serverul și, dacă primește un răspuns corect, revine la acesta UTCTime valoarea timpului UTC în Epoch. în Offset este returnată diferența în mS dintre valoarea UTC returnată și ceasul de referință NTP.

La sfârșitul execuției, ieșirea este activată Done, pentru a efectua o nouă citire a timpului, intrarea trebuie dezactivată și apoi reactivată Query. În RTDelay timpul necesar trimiterii cererii și primirii răspunsului de la serverul NTP a revenit.

Lista de servere NTP

Un server NTP este capabil să estimeze și să compenseze erorile sistematice ale ceasului hardware al sistemului, există mai multe servere NTP la care vă puteți conecta pentru a actualiza ceasul sistemului. Proiectul pool.ntp.org este unul dintre ele, se prezintă ca un grup virtual mare de servere de timp care oferă un serviciu NTP fiabil și ușor de utilizat pentru milioane de utilizatori. Este posibil să configurați oricare dintre aceste servere, numele 0, 1, 2 și 3.pool.ntp.org ele indică un set de server aleatoriu care se schimbă la fiecare oră.

  • 0.pool.ntp.org
  • 1.pool.ntp.org
  • 2.pool.ntp.org
  • 3.pool.ntp.org
Cercul de informații

Blocarea funcției

CODESYS: Indisponibil

LogicLab: eLLabNetworkLib

Descriere

Query (BOOL) Solicitați comanda de activare. Pentru a reexecuta comanda, dezactivați și apoi reactivați intrarea.
SpyOn (BOOL) Dacă este activ, vă permite să spionați funcționarea FB.
NTPServer (@STRING) Indicator pentru definirea serverului NTP. Pot fi definite atât IP, cât și URL.
Done (BOOL) Se activează la sfârșitul execuției comenzii.
Ok (BOOL) Activ pentru o buclă de program dacă interogarea are succes.
Fault (BOOL) Activ pentru o buclă dacă eroare de execuție a comenzii.
RTDelay (REAL) Întârziere dus-întors, timp pentru trimiterea cererii și primirea răspunsului de la server (mS).
UTCTime (UDINT) Data/Ora în UTC exprimată în timp Epoch.
Offset (REAL) Diferența dintre valoarea UTC returnată și ceasul de referință NTP (mS).

Imagine SNBequest FB

Declanșatorul spionului

Se SpyOn activ, puteți utiliza consola spion pentru a verifica funcționarea FB. Există diferite niveluri de declanșatoare.

Niveluri de declanșare
trăgaciDescriere
16 # 00000001Tx: Se trimite cererea către server.
16 # 00000002Rx: Primirea răspunsului de la server.
16 # 20000000Lg: Mesaj jurnal.
16 # 40000000Er: Eroare de execuție.

Exemple

Cum se utilizează exemplele.
ST_SNTPRequest: Trimiteți o solicitare către serverul NTP la fiecare 30 de secunde 0.pool.ntp.org iar dacă răspunsul este corect, ceasul în timp real este actualizat.

ST_SystemClockSync: Când programul pornește, actualizează ceasul sistemului. Dacă cererea este greșită, cererea se repetă rapid. În fiecare oră efectuează o actualizare.

LogicLab (Ptp119, ST_SNTRequest)
PROGRAM ST_SNTPRequest
VAR
    i : UDINT; (* Auxiliary variable *)
    TimeBf : UDINT; (* Time buffer (mS) *)
    SNTPReq : SNTPRequest; (* NTP request *)
    CheckDate : ARRAY[0..1] OF DATE_AND_TIME; (* To check Date/Time *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_SNTPRequest"
// *****************************************************************************
// At every 30 seconds it's a NTP request is sent and the real time clock is
// updated.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // INITIALIZATION
    // -------------------------------------------------------------------------
    // Program initializations.

    IF (SysFirstLoop) THEN
        SNTPReq.SpyOn:=TRUE; //Spy On
        SNTPReq.NTPServer:=ADR('0.pool.ntp.org'); //NTP server
    END_IF;

    // -------------------------------------------------------------------------
    // TIME SYNCRONIZATION
    // -------------------------------------------------------------------------
    // Check if time threshold to perform synchronization (Every 30 Sec).
    // Program initializations.

    IF ((SysTimeGetMs()-TimeBf) > TO_UDINT(T#30s)) THEN
        TimeBf:=SysTimeGetMs(); //Time buffer (mS)
        SNTPReq.Query:=TRUE; //Query On
    END_IF;

    // Manage the NTP request to the server.

    SNTPReq(); //NTP request

    // Execution done, if Ok update the real time clock.

    IF (SNTPReq.Done) THEN
        SNTPReq.Query:=FALSE; //Query On
        CheckDate[0]:=TO_DATE_AND_TIME(SysDateGetS()); //System Date/Time
        CheckDate[1]:=TO_DATE_AND_TIME(SNTPReq.UTCTime); //NTP Date/Time
        IF (SNTPReq.Ok) THEN i:=SysDateSetS(SNTPReq.UTCTime); END_IF;
    END_IF;

// [End of file]
LogicLab (Ptp181, ST_SystemClockSync)
PROGRAM ST_SystemClockSync
VAR
    i : UDINT; (* Auxiliary variable *)
    ClockSync : BOOL; (* Clock syncronized *)
    TimeBf : UDINT; (* Time buffer (mS) *)
    SNTPReq : SNTPRequest; (* NTP request *)
END_VAR

// *****************************************************************************
// PROGRAM "SystemClockSync"
// *****************************************************************************
// Sends a NTP request to synchronize the system clock
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // INITIALIZATION
    // -------------------------------------------------------------------------
    // Program initializations.

    IF (SysFirstLoop) THEN
        ClockSync:=FALSE; //Clock syncronized
        SNTPReq.Query:=TRUE; //Query On
        SNTPReq.SpyOn:=FALSE; //Spy On
        SNTPReq.NTPServer:=ADR('0.pool.ntp.org'); //NTP server
    END_IF;

    // -------------------------------------------------------------------------
    // TIME SYNCRONIZATION
    // -------------------------------------------------------------------------
    // If system clock not synchronized executes the request faster.
    // If synchronized executes it slowly.

    IF NOT(ClockSync) THEN
        IF ((SysTimeGetMs()-TimeBf) > TO_UDINT(T#30s)) THEN TimeBf:=SysTimeGetMs(); SNTPReq.Query:=TRUE; END_IF;
    ELSE
        IF ((SysTimeGetMs()-TimeBf) > TO_UDINT(T#1h)) THEN TimeBf:=SysTimeGetMs(); SNTPReq.Query:=TRUE; END_IF;
    END_IF;

    // On execution done, if Ok update the real time clock.

    SNTPReq(); //NTP request
    IF (SNTPReq.Done) THEN
        SNTPReq.Query:=FALSE; //Query On
        IF (SNTPReq.Ok) THEN i:=SysDateSetS(SNTPReq.UTCTime); ClockSync:=TRUE; END_IF;
    END_IF;

// [End of file]
A fost util acest articol?