SNTPRequest, envoie une requête SNTP

Liste

Cette page fait partie de la Manuel de programmation CEI 61131-3. Aller à l'index.

Ce bloc fonction de exécuter dans la tâche Retour, obtient la valeur de UTC à partir d'un serveur de temps, dans cet article il est expliqué comment activer le serveur sur un PC. activer Query la demande de valeur de temps est effectuée à partir du serveur dont l'URL ou l'adresse IP est passée dans NTPServer. Le FB interroge le serveur et s'il reçoit une réponse correcte il revient sur UTCTime la valeur de temps UTC dans Epoch. en Offset la différence en mS entre la valeur UTC renvoyée et l'horloge NTP de référence est renvoyée.

A la fin de l'exécution, la sortie est activée Done, pour effectuer une nouvelle lecture de l'heure, l'entrée doit être désactivée puis réactivée Query. En RTDelay le temps nécessaire pour envoyer la requête et recevoir la réponse du serveur NTP est revenu.

Liste des serveurs NTP

Un serveur NTP est capable d'estimer et de compenser les erreurs systématiques de l'horloge matérielle du système. Il existe plusieurs serveurs NTP auxquels vous pouvez vous connecter pour mettre à jour l'horloge système. Le projet pool.ntp.org est l'un d'eux, il se présente comme un grand cluster virtuel de serveurs de temps qui fournit un service NTP fiable et facile à utiliser pour des millions d'utilisateurs. Il est possible de configurer n'importe lequel de ces serveurs, les noms 0, 1, 2 et 3.pool.ntp.org ils pointent vers un ensemble de serveurs aléatoire qui change toutes les heures.

  • 0.pool.ntp.org
  • 1.pool.ntp.org
  • 2.pool.ntp.org
  • 3.pool.ntp.org
Cercle d'informations

Verrouillage de fonction

CODESYS : indisponible

LogicLab : eLLabNetworkLib

Description

Query (BOOL) Demander la commande d'activation. Pour réexécuter la commande, désactivez puis réactivez l'entrée.
SpyOn (BOOL) S'il est actif, il permet d'espionner le fonctionnement du FB.
NTPServer (@STRING) Pointeur de définition de serveur NTP. IP et URL peuvent être définis.
Done (BOOL) Il est activé à la fin de l'exécution de la commande.
Ok (BOOL) Actif pour une boucle de programme si la requête aboutit.
Fault (BOOL) Actif pour une boucle si erreur d'exécution de la commande.
RTDelay (REAL) Délai aller-retour, temps d'envoi de la requête et de réception de la réponse du serveur (mS).
UTCTime (UDINT) Date / Heure en UTC exprimée en heure d'époque.
Offset (REAL) Différence entre la valeur UTC renvoyée et l'horloge NTP de référence (mS).

SNBRequest FB image

Déclencheur d'espion

Se SpyOn actif, vous pouvez utiliser la console espion pour vérifier le fonctionnement du FB. Il existe différents niveaux de déclencheurs.

Niveaux de déclenchement
GâchetteDescription
16 # 00000001Tx: Envoi de la demande au serveur.
16 # 00000002Rx: Réception de la réponse du serveur.
16 # 20000000Lg: Message du journal.
16 # 40000000Er: Erreur d'exécution.

Exemples

Comment utiliser les exemples.
ST_SNTPRequest: Envoyer une requête au serveur NTP toutes les 30 secondes 0.pool.ntp.org et si la réponse est correcte, l'horloge en temps réel est mise à jour.

ST_SystemClockSync: Lorsque le programme démarre, il met à jour l'horloge système. Si la requête est erronée, la requête est répétée rapidement. Toutes les heures, il effectue une mise à jour.

Laboratoire logique (Ptp119, ST_SNTPRequest)
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]
Cet article a-t-il été utile?