Comment pouvons-nous aider ?
Comment gérer automatiquement l’heure d’été dans l’IHM à l’aide d’une macro ?
Dans ce post, 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) : Allemagne, Autriche, Belgique, Croatie, Danemark, Espagne, France, Hongrie, Italie, Luxembourg, Malte, Pays-Bas, Pologne, République tchèque, Slovaquie, Slovénie et Suède
- Europe de l’Est (GMT 2) : Bulgarie, Chypre, Estonie, Finlande, Grèce, Lettonie, Lituanie et Roumanie.
Avec l’outil HMI

Dans l’éditeur de macros, ajoutez une nouvelle macro et copiez-la.
#include "MacroInit.h"
// Utility function: returns the number of days in a given month/year
int DaysInMonth(int month, int year)
{
switch(month)
{
case 1: return 31; // January
case 2: // February (check leap year)
if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0))
return 29;
else
return 28;
case 3: return 31; // March
case 4: return 30; // April
case 5: return 31; // May
case 6: return 30; // June
case 7: return 31; // July
case 8: return 31; // August
case 9: return 30; // September
case 10: return 31; // October
case 11: return 30; // November
case 12: return 31; // December
default: return 30; // fallback
}
}
void Macro_main(IN *p)
{
MarcoInit
// Automatic Daylight Saving Time (DST) / Winter Time switching
// This function must be called every minute
int minute = BCD2BIN(LocalWord[60001]); // Current minute (BCD → decimal)
int hour = BCD2BIN(LocalWord[60002]); // Current hour
int day = BCD2BIN(LocalWord[60003]); // Day of month
int month = BCD2BIN(LocalWord[60004]); // Month
int year = BCD2BIN(LocalWord[60005]); // Year
int dayOfWeek = BCD2BIN(LocalWord[60006]); // Monday=1 ... Sunday=7
int daysInMonth = DaysInMonth(month, year);
// --- Switch to Summer Time (DST) ---
// Condition: Last Sunday of March at 03:00 → clock jumps to 04:00
if ((month == 3) && (dayOfWeek == 7) && (day + 7 > daysInMonth) && (hour == 3) && (minute == 0))
{
LocalWord[60002] = 4; // Set hour = 04
LocalBit[65535] = 0; // Flag = Summer Time
}
// --- Switch to Winter Time ---
// Condition: Last Sunday of October at 03:00 → clock goes back to 02:00
if ((LocalBit[65535] == 0) && (month == 10) && (dayOfWeek == 7) && (day + 7 > daysInMonth) && (hour == 3) && (minute == 0))
{
LocalWord[60002] = 2; // Set hour = 02
LocalBit[65535] = 1; // Flag = Winter Time (prevents infinite loop)
}
}
Ajoutez 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-t-il ?
Le programme s’exécute toutes les minutes et lit l’heure actuelle (minute, heure, jour, mois, année, jour de la semaine) dans les registres.
Toutes les valeurs de l’heure sont stockées au format BCD, elles sont donc d’abord converties en décimales.
Une fonction d’aide calcule le nombre de jours du mois en cours, y compris les années bissextiles.
Pour détecter le dernier dimanche du mois, le code vérifie : dayOfWeek == 7 (dimanche) et day 7 > daysInMonth.
S’il s’agit du dernier dimanche de mars à exactement 03:00, l’horloge est avancée à 04:00 (heure d’été).
Un bit indicateur (LocalBit[65535]) est activé pour indiquer l’heure d’été.
S’il s’agit du dernier dimanche d’octobre à exactement 03:00, l’horloge est ramenée à 02:00 (heure d’hiver).
Le bit de drapeau est commuté pour indiquer l’heure d’hiver, ce qui évite des corrections répétées.
Cela permet d’éviter les boucles infinies où la même heure serait traitée plusieurs fois.
Le système maintient donc automatiquement l’heure locale synchronisée avec les règles officielles de l’heure d’été.
Vous pouvez remplacer LB65535 par LB51999 pour sauvegarder la valeur(types de registre IHM : LB, LW, RWI et registre de rétention/sauvegarde)
Voir aussi Comment régler et synchroniser l’horloge de l’automate ACE avec l’IHM à l’aide d’une macro