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
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).
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
Gatilho | descriçã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]