Print

Come gestire automaticamente l’ora legale nell’HMI usando una macro?

 

In questo post, vi mostreremo come gestire automaticamente l’ora legale nell’HMI usando una macro.

Il cambio dell’ora è stato applicato per la prima volta nel 1916. Dal 2002, il cambio dell’ora viene effettuato in modo uniforme in tutti gli Stati membri dell’Unione europea:

  • il passaggio all’ora legale avviene la notte dell’ultimo sabato di marzo
  • il passaggio all’ ora invernale avviene la notte dell’ultimo sabato di ottobre

Come promemoria, i paesi dell’UE sono attualmente divisi in tre fusi orari:

  • Europa occidentale (GMT): Irlanda e Portogallo
  • Europa centrale (GMT+1): Austria, Belgio, Croazia, Repubblica Ceca, Danimarca, Francia, Germania, Ungheria, Italia, Lussemburgo, Malta, Paesi Bassi, Polonia, Slovacchia, Slovenia, Spagna e Svezia
  • Europa orientale (GMT+2): Bulgaria, Cipro, Estonia, Finlandia, Grecia, Lettonia, Lituania e Romania.

Con HMI-Tool

Nel Macro Editor, aggiungere una nuova macro e copiarla.

#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!
}
}

Aggiungere la macro nella lista “global Macro

E imposta la sua frequenza di esecuzione a 60000 ms (1 minuto) per aggiornare l’orologio ogni minuto.

Come funziona

Per l’ora legale, l’ultima domenica di marzo, tra le 03:00:00 e le 03:00:59, lo script cambierà l’ora alle 04:00:xx. I secondi non cambieranno.

Per l’ora invernale, l’ultima domenica di ottobre, tra le 03:00:00 e le 03:00:59, lo script cambierà l’ora in 02:00:xx. I secondi non cambieranno.

Nel Bit LB65535 avete lo stato di questa ora legale: Inverno=1, Estate=0.

Potete scaricare qui il progetto HMI-Tool (V7.0) se volete provarlo.

 

Vedi anche Come impostare e sincronizzare l’orologio del PLC ACE con l’HMI usando una macro