How Can We Help?

Print

¿Cómo gestionar automáticamente el horario de verano en la HMI mediante una macro?

 

En este post, le mostraremos cómo gestionar automáticamente el horario de verano en el HMI mediante una macro.

El cambio de hora se aplicó por primera vez en 1916. Desde 2002, el cambio de hora se realiza de manera uniforme en todos los Estados miembros de la Unión Europea:

  • el cambio al horario de verano tiene lugar la noche del último sábado de marzo
  • el cambio al horario de invierno tiene lugar la noche del último sábado de octubre

A modo de recordatorio, los países de la UE se dividen actualmente en tres husos horarios:

  • Europa Occidental (GMT): Irlanda y Portugal
  • Europa Central (GMT+1): Alemania, Austria, Bélgica, Croacia, Dinamarca, Eslovaquia, Eslovenia, España, Francia, Hungría, Italia, Luxemburgo, Malta, Países Bajos, Polonia, República Checa y Suecia
  • Europa del Este (GMT+2): Bulgaria, Chipre, Estonia, Finlandia, Grecia, Letonia, Lituania y Rumanía.

Con la herramienta HMI

En el editor de macros, añada una nueva macro y cópiela.

#include "MacroInit.h"
void Macro_main(IN *p)
{
MarcoInit
// Daylight / Time change Summer Winter
// < ! > Call this script every minute
// The changeover to summer time takes place on the night of the last Saturday in March;
// the changeover to winter time takes place on the night of the last Saturday to Sunday in October.
int minute=BCD2BIN(LocalWord[60001]); // All are in BCD format. Convert in decimal.
int hour=BCD2BIN(LocalWord[60002]);
int day=BCD2BIN(LocalWord[60003]);
int month=BCD2BIN(LocalWord[60004]);
int dateofweek=BCD2BIN(LocalWord[60006]); // Monday=1
// The changeover to SUMMER time takes place on the night of the last Saturday in March. Sunday morning at 03:00:xx am, it's 04:00:xx am
if ((month==3) && (day>=25) && (dateofweek==7) && (hour==03) && (minute==00)) // March & 25th or more & Sunday & 03:00 pm ?
{
LocalWord[60002]=4; // New hour
LocalBit[65535]=0; // False=Summer time. (Necessary only for winter time)
}
// The changeover to WINTER time takes place on the night of the last Saturday to Sunday in October. Sunday morning at 03:00:xx am, it's 02:00:xx am
if ((LocalBit[65535]==0) && (month==10) && (day>=25) && (dateofweek==7) && (hour==03) && (minute==00)) // October & 25th or more & Sunday & 03:00 pm ?
{
LocalWord[60002]=2; // New hour
LocalBit[65535]=1; // True=Winter. Avoid a loop with an infinite change at every 3am because at 3am, it is 2am!
}
}

Añadir la macro en la lista «global Macro»

Y establece su frecuencia de ejecución a 60000 ms (1 minuto) para actualizar el reloj cada minuto.

Cómo funciona

Para el horario de verano, el último domingo de marzo, entre las 03:00:00 y las 03:00:59, el script cambiará la hora a 04:00:xx. Los segundos no cambiarán.

Para el horario de invierno, el último domingo de octubre, entre las 03:00:00 y las 03:00:59, el script cambiará la hora a 02:00:xx. Los segundos no cambiarán.

En el Bit LB65535 tiene el estado de este horario de verano: Invierno=1, Verano=0.

Puede descargar aquí el proyecto HMI-Tool (V7.0) si desea probarlo.

 

Véase también Cómo ajustar y sincronizar el reloj del PLC ACE con la HMI mediante una macro