How Can We Help?

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