Bei einer DST Änderung werden die Aufgang- und Untergangszeiten falsch kalkuliert, weil sie um Mitternacht berechnet werden. Sie sollten aber nach dem Zeitwechsel neu aktualisiert werden. Ich schlage folgende Lösung vor:
On DST change the sunrise and sunset times are wrong calculated, because they are computed at midnight. They should be updated after the local time change. I suggest following solution:
FUNCTION_BLOCK CALENDAR_CALC
...
VAR_TEMP
...
old_DST_ON : BOOL;
END_VAR
...
(* run once per hour *)
tmp := HOUR(txcal.LTOD);
IF tmp <> last_hour THEN
old_DST_ON := tXCAL.DST_ON;
tXCAL.DST_ON := DST(tXCAL.UTC) AND txcal.DST_EN;
IF tXCAL.DST_ON <> old_DST_ON THEN
// update sun times on DST change
tXCAL.SUN_RISE := DINT_TO_TOD(TOD_TO_DINT(sun.sun_rise) + tXCAL.OFFSET * 60000 + SEL(G:=tXCAL.DST_ON,IN0:=DINT#0,IN1:=3600000));
tXCAL.SUN_SET := DINT_TO_TOD(TOD_TO_DINT(sun.sun_set) + tXCAL.OFFSET * 60000 + SEL(G:=tXCAL.DST_ON,IN0:=DINT#0,IN1:=3600000));
tXCAL.SUN_MIDDAY := DINT_TO_TOD(TOD_TO_DINT(sun.MIDDAY) + tXCAL.OFFSET * 60000 + SEL(G:=tXCAL.DST_ON,IN0:=DINT#0,IN1:=3600000));
END_IF;
last_hour := tmp;
END_IF;
...
Ich benutze OSCAT schon länger und bei jedem DST Wechsel musste ich manuell eingreifen. Hoffentlich kann meine Änderung jemanden hilfreich sein.
I use OSCAT for a long time and at every DST change I had to take a manual action. Hopefully my change can be helpful for someone.