Wie können wir helfen?
Wie kann man die Sommerzeit in der HMI mit Hilfe eines Makros automatisch verwalten?
In diesem Beitrag zeigen wir Ihnen, wie Sie die Sommerzeit in der HMI mithilfe eines Makros automatisch verwalten können. Die Zeitumstellung wurde erstmals im Jahr 1916 vorgenommen. Seit 2002 wird die Zeitumstellung in allen Mitgliedstaaten der Europäischen Union einheitlich durchgeführt:
- die Umstellung auf die Sommerzeit erfolgt in der Nacht des letzten Samstags im März
- die Umstellung auf die Winterzeit erfolgt in der Nacht zum letzten Samstag im Oktober
Zur Erinnerung: Die EU-Länder sind derzeit in drei Zeitzonen eingeteilt:
- Westeuropa (GMT): Irland und Portugal
- Mitteleuropa (GMT 1): Österreich, Belgien, Kroatien, Tschechische Republik, Dänemark, Frankreich, Deutschland, Ungarn, Italien, Luxemburg, Malta, Niederlande, Polen, Slowakei, Slowenien, Spanien und Schweden
- Osteuropa (GMT 2): Bulgarien, Zypern, Estland, Finnland, Griechenland, Lettland, Litauen und Rumänien.
Mit HMI-Tool

Fügen Sie im Makro-Editor ein neues Makro hinzu und kopieren Sie es.
#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)
}
}
Fügen Sie das Makro in die Liste „Globales Makro“ ein und stellen Sie die Ausführungshäufigkeit auf 60000 ms (1 Minute), um die Uhr jede Minute zu aktualisieren.

Wie es funktioniert
Das Programm läuft jede Minute und liest die aktuelle Zeit (Minute, Stunde, Tag, Monat, Jahr, Wochentag) aus Registern aus.
Da alle Zeitwerte im BCD-Format gespeichert sind, werden sie zunächst in Dezimalzahlen umgewandelt.
Eine Hilfsfunktion berechnet die Anzahl der Tage im aktuellen Monat, einschließlich der Schaltjahre.
Um den letzten Sonntag des Monats zu ermitteln, prüft der Code: dayOfWeek == 7 (Sonntag) und day 7 > daysInMonth.
Wenn es der letzte Sonntag im März um genau 03:00 Uhr ist, wird die Uhr auf 04:00 Uhr vorgestellt (Sommerzeit).
Ein Flag-Bit (LocalBit[65535]) wird gesetzt, um die Sommerzeit anzuzeigen.
Wenn es der letzte Sonntag im Oktober um genau 03:00 Uhr ist, wird die Uhr auf 02:00 Uhr zurückgestellt (Winterzeit).
Das Flag-Bit wird auf Winterzeit gesetzt, um wiederholte Korrekturen zu verhindern.
Dadurch werden Endlosschleifen vermieden, in denen dieselbe Stunde mehrfach verarbeitet würde.
Das System hält also die Ortszeit automatisch mit den offiziellen Regeln der Sommerzeit synchronisiert.
Sie können LB65535 durch LB51999 ersetzen, um den Wert zu sichern(HMI-Registertypen: LB, LW, RWI und remanente/speichernde Register)
Siehe auch Einstellen und Synchronisieren der ACE PLC-Uhr mit der HMI mithilfe eines Makros