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
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).
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âchette | Description |
---|---|
16 # 00000001 | Tx: Envoi de la demande au serveur. |
16 # 00000002 | Rx: Réception de la réponse du serveur. |
16 # 20000000 | Lg: Message du journal. |
16 # 40000000 | Er: 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]