Hab das grad mal getestet: Die Variable "next_check" hat jetzt das richtige Datum, die Sommerzeit wird aber erst nach dem nächsten Check zur vollen Stunde gesetzt, wegen der Reihenfolge im Programm. Wenn man die init-Verzweigung weglässt, funktioniert das Ganze, weiss nur nicht wie das performancemäßig aussieht, die Verzweigung war ja sicher nicht umsonst drin. Kann man aber bei den Aufrufen im Stundentakt sicher verschmerzen. So sähe das aus:
----------------------------------------------------------------
IF utc > next_check OR next_check > (utc+T#2h) THEN
local_dt := utc + time_zone_offset;
next_check := DWORD_TO_DT(DT_TO_DWORD(utc) / 3600 * 3600 +3600);
DST_on := DST(local_dt, time_zone_offset);
IF DST_on AND dst_enable THEN time_adder := time_zone_offset + T#1h; ELSE time_adder := time_zone_offset; END_IF;
END_IF;
local_dt :=utc + time_adder;
wday := weekday(DT_TO_DATE(local_dt));
----------------------------------------------------------------
Man könnte auch statt "local_dt" eine andere Hilfsvariable beim Check für verwenden, der Übersichtlichkeit halber.
----------------------------------------------------------------
IF utc > next_check OR next_check > (utc+T#2h) THEN
temp_dt := utc + time_zone_offset;
next_check := DWORD_TO_DT(DT_TO_DWORD(utc) / 3600 * 3600 +3600);
DST_on := DST(temp_dt, time_zone_offset);
IF DST_on AND dst_enable THEN time_adder := time_zone_offset + T#1h; ELSE time_adder := time_zone_offset; END_IF;
END_IF;
local_dt :=utc + time_adder;
wday := weekday(DT_TO_DATE(local_dt));
----------------------------------------------------------------
Bei mir funktioniert's, oder hab ich was übersehen? Was sagst du dazu, Hugo?