SNTPRequest, envía una solicitud SNTP

Lista

Esta página es parte del Manual de programación IEC 61131-3. Ir al índice.

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
Círculo de información

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).

Imagen SNBRequest FB

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
DesencadenarDescripció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]
¿Le resultó útil este artículo?