Este bloque de funciones de ejecutar en tarea Atrás, obtiene el valor de UTC de un servidor horario, en este artículo Se explica cómo activar el servidor en una PC. activando Query la solicitud de valor de tiempo se realiza desde el servidor cuya URL o dirección IP se pasa NTPServer. El FB consulta al servidor y si recibe una respuesta correcta vuelve a UTCTime el valor del tiempo UTC en Epoch. en Offset se devuelve la diferencia en mS entre el valor UTC devuelto y el reloj NTP de referencia.
Al final de la ejecución, la salida se activa Done, para realizar una nueva lectura de tiempo, la entrada debe ser desactivada y luego reactivada Query. En RTDelay ha vuelto el tiempo necesario para enviar la solicitud y recibir la respuesta del servidor NTP.
Lista de servidores NTP
Un servidor NTP puede estimar y compensar los errores sistemáticos del reloj del hardware del sistema. Hay varios servidores NTP a los que puede conectarse para actualizar el reloj del sistema. El proyecto pool.ntp.org es uno de ellos, se presenta como un gran clúster virtual de servidores de tiempo que proporciona un servicio NTP confiable y fácil de usar para millones de usuarios. Es posible configurar cualquiera de estos servidores, los nombres 0, 1, 2 y 3.pool.ntp.org apuntan a un conjunto de servidores aleatorio que cambia cada hora.
- 0.pool.ntp.org
- 1.pool.ntp.org
- 2.pool.ntp.org
- 3.pool.ntp.org
Función de bloqueo
CÓDIGOS: indisponible
Laboratorio lógico: eLLabNetworkLib
Descripción
Query (BOOL) Solicitar comando de activación. Para volver a ejecutar el comando, deshabilite y luego vuelva a habilitar la entrada.
SpyOn (BOOL) Si está activo, te permite espiar el funcionamiento del FB.
NTPServer (@STRING) Puntero de definición de servidor NTP. Se pueden definir tanto IP como URL.
Done (BOOL) Se activa al final de la ejecución del comando.
Ok (BOOL) Activo para un bucle de programa si la consulta tiene éxito.
Fault (BOOL) Activo para un bucle si hay un error de ejecución del comando.
RTDelay (REAL) Retraso de ida y vuelta, tiempo para enviar la solicitud y recibir la respuesta del servidor (mS).
UTCTime (UDINT) Fecha/Hora en UTC expresada en tiempo de Época.
Offset (REAL) Diferencia entre el valor UTC devuelto y el reloj NTP de referencia (mS).
Disparador espía
Se SpyOn active puede utilizar la consola espía para comprobar el funcionamiento del FB. Hay varios niveles de factores desencadenantes.
Niveles de activación
Desencadenar | Descripción |
---|---|
16 00000001 # | Tx: Enviando solicitud al servidor. |
16 00000002 # | Rx: Recibiendo respuesta del servidor. |
16 20000000 # | Lg: Mensaje de registro |
16 40000000 # | Er: Error de ejecución |
Ejemplos
Cómo utilizar los ejemplos..
ST_SNTPRequest: Enviar una solicitud al servidor NTP cada 30 segundos 0.pool.ntp.org y si la respuesta es correcta, se actualiza el reloj en tiempo real.
ST_SystemClockSync: Cuando se inicia el programa, actualiza el reloj del sistema. Si la solicitud es errónea, la solicitud se repite rápidamente. Cada hora realiza una actualización.
Laboratorio lógico (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]
Laboratorio Lógico (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]