SNTPRequest, envia uma solicitação SNTP

Lista

Esta página faz parte do Manual de Programação IEC 61131-3. Acesse o índice.

Este bloco de função de executar na tarefa Voltar, obtém o valor de UTC de um servidor de horário, em Neste artigo é explicado como ativar o servidor em um PC. ativando Query a solicitação de valor de tempo é feita a partir do servidor cujo URL ou endereço IP é passado em NTPServer. O FB consulta o servidor e se receber uma resposta correta retorna para UTCTime o valor da hora UTC na época. em Offset a diferença em mS entre o valor UTC retornado e o relógio NTP de referência é retornada.

Ao final da execução, a saída é ativada Done, para realizar uma nova leitura de tempo, a entrada deve ser desativada e reativada Query. em RTDelay retornou o tempo necessário para enviar a solicitação e receber a resposta do servidor NTP.

Lista de servidores NTP

Um servidor NTP é capaz de estimar e compensar erros sistemáticos do relógio do hardware do sistema, existem vários servidores NTP aos quais você pode se conectar para atualizar o relógio do sistema. O projeto pool.ntp.org é um deles, apresenta-se como um grande cluster virtual de servidores de tempo que fornecem um serviço NTP confiável e fácil de usar para milhões de usuários. É possível configurar qualquer um desses servidores, os nomes 0, 1, 2 e 3.pool.ntp.org eles apontam para um conjunto de servidores aleatórios que muda a cada hora.

  • 0.pool.ntp.org
  • 1.pool.ntp.org
  • 2.pool.ntp.org
  • 3.pool.ntp.org
Círculo de Informação

Bloqueio de função

CoDeSys: Indisponível

Laboratório de lógica: eLLabNetworkLib

descrição

Query (BOOL) Solicitar comando de ativação. Para reexecutar o comando, desative e reative a entrada.
SpyOn (BOOL) Se ativo, permite que você espione o funcionamento do FB.
NTPServer (@STRING) Ponteiro de definição do servidor NTP. Tanto o IP quanto o URL podem ser definidos.
Done (BOOL) É ativado ao final da execução do comando.
Ok (BOOL) Ativo para um loop de programa se a consulta for bem-sucedida.
Fault (BOOL) Ativo para um loop se houver erro na execução do comando.
RTDelay (REAL) Atraso de ida e volta, tempo para enviar a solicitação e receber a resposta do servidor (mS).
UTCTime (UDINT) Data/Hora em UTC expressa em Epoch time.
Offset (REAL) Diferença entre o valor UTC retornado e o relógio NTP de referência (mS).

Imagem do SNBRequest FB

Gatilho espião

Se SpyOn ativo, você pode usar o console espião para verificar o funcionamento do FB. Existem vários níveis de gatilhos.

Níveis de gatilho
Gatilhodescrição
16 00000001 #Tx: Enviando solicitação para o servidor.
16 00000002 #Rx: Recebendo resposta do servidor.
16 20000000 #Lg: Mensagem de log.
16 40000000 #Er: Erro de execução.

Exemplos

Como usar os exemplos.
ST_SNTPRequest: Envie uma solicitação ao servidor NTP a cada 30 segundos 0.pool.ntp.org e se a resposta estiver correta, o relógio em tempo real é atualizado.

ST_SystemClockSync: Quando o programa é iniciado, ele atualiza o relógio do sistema. Se a solicitação estiver errada, a solicitação será repetida rapidamente. A cada hora ele realiza uma atualização.

LogicLab (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]
Esse artigo foi útil?