Print

Comment gérer automatiquement l’heure d’été dans l’IHM à l’aide d’une macro ?

 

Dans ce billet, nous allons vous montrer comment gérer automatiquement l’heure d’été dans l’IHM à l’aide d’une macro.

Le changement d’heure a été appliqué pour la première fois en 1916. Depuis 2002, le changement d’heure s’effectue de manière uniforme dans tous les États membres de l’Union européenne :

  • le passage à l’heure d’été a lieu dans la nuit du dernier samedi de mars
  • le passage à l’heure d ‘hiver a lieu dans la nuit du dernier samedi d’octobre

Pour rappel, les pays de l’UE sont actuellement divisés en trois fuseaux horaires :

  • Europe occidentale (GMT) : Irlande et Portugal
  • Europe centrale (GMT+1) : Autriche, Belgique, Croatie, République tchèque, Danemark, France, Allemagne, Hongrie, Italie, Luxembourg, Malte, Pays-Bas, Pologne, Slovaquie, Slovénie, Espagne et Suède
  • Europe de l’Est (GMT+2) : Bulgarie, Chypre, Estonie, Finlande, Grèce, Lettonie, Lituanie et Roumanie.

Avec HMI-Tool

Dans l’éditeur de macros, ajoutez une nouvelle macro et copiez-la.

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

Ajouter la macro dans la liste « Macro globale »

Et définissez sa fréquence d’exécution à 60000 ms (1 minute) pour mettre à jour l’horloge toutes les minutes.

Comment cela fonctionne

Pour l’heure d’été, le dernier dimanche de mars, entre 03:00:00 et 03:00:59, le script changera l’heure en 04:00:xx. Les secondes ne changeront pas.

Pour l’heure d’hiver, le dernier dimanche d’octobre, entre 03:00:00 et 03:00:59, le script changera l’heure en 02:00:xx. Les secondes ne changeront pas.

Dans le Bit LB65535 vous avez l’état de cette heure d’été : Hiver=1, Eté=0.

Vous pouvez télécharger ici le projet HMI-Tool (V7.0) si vous souhaitez le tester.

 

Voir aussi Comment régler et synchroniser l’horloge de l’automate ACE avec l’IHM à l’aide d’une macro