Según altos estándares industriales

Busca en nuestro Blog. Encontrarás múltiples aplicaciones, soluciones, ejemplos de código. Navega utilizando la nube de etiquetas o busca utilizando criterios específicos

Sincronizar el reloj RTC con el servidor NTP (PLC Arduino)

Actualizar el reloj de tiempo real periódicamente con un servidor de protocolo de tiempo de red

servidor de protocolo de tiempo de red

Introducción


Con el RTC incluido por algunas de las familias de PLC de Industrial Shields, se pueden obtener medidas de tiempo en las unidades temporales que usamos a diario (Segundos, Minutos, Horas, Días, ...).

The RTCs that the industrial Arduino PLCs from Industrial Shields incorporate are formed by a crystal resonator integrated with the electronics necessary to count the passage of time correctly. RTC electronics take into account the peculiarities of our way of measuring time, such as the sexagesimal system, months with different days, or leap years.


Los RTC brindan la ventaja de reducir el consumo de energía, brindar mayor precisión y liberar a la CPU del PLC de tener que realizar el conteo del tiempo. Además, los chips RTC integrados incorporan una batería de litio que mantiene el valor del tiempo en caso de pérdida de energía.

Requerimientos


Controladores lógicos programables (PLC) de Industrial Shields con el hardware necesario:

- Familia de controladores Ethernet PLC >>

- Familia de controladores GPRS y GSM >>

- Familia de controladores WiFi y Bluetooth >>


Industrial Shields' Boards:

- Instalación de las placas de Industrial Shields en Arduino IDE (actualizado) >>


Problemas al usar el RTC

  

El uso del RTC es muy útil en determinados proyectos de automatización industrial donde se requiera un registro de la transmisión de datos, donde se requiera activar determinadas señales en determinados momentos u otras aplicaciones donde sea necesario el uso de los horarios y horarios.

Pero el uso del RTC tiene los siguientes problemas:

  • Las variaciones de temperatura que afectan la medición del tiempo de los cristales resonadores dan como resultado errores en un retraso acumulativo. Esto hace que el RTC sufra un retraso temporal, que puede ser de unos 5-7 segundos al día.

  • En muchos países existe una práctica llamada DST (horario de verano), que consiste en mover el horario una hora en verano en comparación con el invierno.

    El RTC no está programado para cambiar su hora actual en los dos días del cambio de hora por año.


Sincronizar el RTC con el NTP resuelve estos problemas e implica mejoras en los siguientes aspectos:


  • It is a very accurate matter. Because you can select the best source for synchronization, it has a theorical resolution in a nanosecond range of 2-32 seconds (that is, 0.233 nanoseconds).

  • Puede resolver problemas temporales de conexión a la red. Para hacer esto, el protocolo utiliza la información almacenada para determinar la hora actual o las desviaciones.

 
NTP


NTP usa UDP como su capa de transporte, por lo que necesitaremos usar un puerto UDP en el boceto.

A continuación, puede ver la descripción del formato de paquete NTP / SNTP versión 4 (32 bits), que sigue a los encabezados IP y UDP:

description of the NTP / SNTP version 4 package format (32 bits)


    Partes del paquete


LI (indicador de salto)


Código de 2 bits utilizado para indicar que se agregará / eliminará un segundo en el último minuto de este día.

LIValorOperación
000Sin modificación
011el último minuto tiene 61 segundos
102el último minuto tiene 59 segundos
113condición de alarma (reloj no sincronizado)

VN (número de versión)

Entero de 3 bits que indica el número de versión. La versión 3 indica la versión 3 (solo IPv4) y 4 para la versión 4 (IPv4, IPv6 y OSI). Si es necesario distinguir entre IPv4, IPv6 y OSI, se debe examinar el contexto encapsulado.

Modo

Entero de tres bits utilizado para indicar el modo, definido de la siguiente manera:

ModeOperación
0Reservado
1Simétrica activa
2Pasivo simétrico(masculino)
3cliente
4servidor
5transmitir
6reservado para mensajes de control NTP
7reservado para uso privado

Estrato

Es un entero de 8 bits sin signo que indica el nivel (estrato) del servidor local, los valores definidos son los siguientes:

StratumSignificado
0no especificado o no disponible
1referencia primaria (ej., radio clock)
2-15referencia secundaria (vía NTP o SNTP)
16-255reservado

Intervalo de encuesta

Es un entero de 8 bits con signo que indica el intervalo de tiempo máximo entre dos mensajes sucesivos, expresado en segundos y como las 2 potencias más cercanas. La mayoría de las aplicaciones utilizan el rango de 6 bits (64 ") a 10 (1024")

Precisión

Es un entero con signo que indica la precisión del reloj local expresada en segundos a la potencia 2 más cercana.


Ejemplo

En este ejemplo, nos conectamos a través del es.ntp.pool.org NTP server (NTP Server in Spain). Puede buscar un servidor NTP público en su país mediante following this link

/*
   Copyright (c) 2019 Boot&Work Corp., S.L. All rights reserved

   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU Lesser General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

 #include <Ethernet.h>
 #include <RTC.h>

uint8_t mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(10, 10, 10, 6);
IPAddress nameServer(8, 8, 8, 8);
IPAddress gateway(10, 10, 10, 1);
IPAddress netmask(255, 255, 255, 0);
IPAddress server(147, 156, 7, 26); // es.ntp.pool.org

unsigned int udpPort = 2390;
EthernetUDP udp;

const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message
byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets

////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
  Serial.begin(9600L);

  Ethernet.begin(mac, ip, nameServer, gateway, netmask);
  Serial.print("IP address: ");
  Serial.println(Ethernet.localIP());

  udp.begin(udpPort);

  Serial.println("rtc-from-ntp started");

  sendRequest();
}

////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
  if (udp.parsePacket()) {
    udp.read(packetBuffer, NTP_PACKET_SIZE);

    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
    unsigned long secsSince1900 = highWord << 16 | lowWord;
    const unsigned long seventyYears = 2208988800UL;
    unsigned long epoch = secsSince1900 - seventyYears;

    Serial.print("timestamp: ");
    Serial.println(epoch);

    RTC.setTime(epoch);
    RTC.write();

    char datetime[50];
    sprintf(datetime, "%04d-%02d-%02d %02d:%02d:%02d",
        RTC.getYear(), RTC.getMonth(), RTC.getMonthDay(),
        RTC.getHour(), RTC.getMinute(), RTC.getSecond());

    Serial.print("time: ");
    Serial.println(datetime);
  }

  delay(1);
}

////////////////////////////////////////////////////////////////////////////////////////////////////
unsigned long sendRequest() {
  memset(packetBuffer, 0, NTP_PACKET_SIZE);

  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  packetBuffer[12] = 49;
  packetBuffer[13] = 0x4E;
  packetBuffer[14] = 49;
  packetBuffer[15] = 52;

  Serial.println("Send request");

  if (!udp.beginPacket(server, 123)) {
    Serial.println("Begin packet error");
  } else {
    udp.write(packetBuffer, NTP_PACKET_SIZE);
    if (!udp.endPacket()) {
      Serial.println("End packet error");
    }
  }
}


Artículos Relacionados

 Sistema de comunicación entre M-Duino y módulo WiFi >>


 Servidor HTTP en un M-Duino (Activar / Desactivar salidas a través de un sitio web) >>


 Solicitud HTTP a un servidor usando un PLC basado en Arduino >>


 Cómo crear un servidor web para leer una tarjeta SD con nuestros PLC Ethernet >> 


 Cómo implementar un servidor web Arduino >>

Como crear un servidor HTTP en un PLC M-Duino

 
 

¿Estás buscando tu PLC ideal?

Mira esta comparativa con otros controladores industriales

Comparamos entradas, salidas, comunicaciones y otras características con las de algunas de las marcas relevantes


Comparación de controladores PLC industriales >>

¿Quieres más información? 

¡Solo llena el formulario! 

¡Quiero saber más!  Por favor, llene el formulario correctamente.