Der Sonnenauf- und -untergang sind am Tag der Umstellung falsch, heute ist es wieder richtig.
Das ist gerade am Sonntag lästig, wenn die Jalousien falsch fahren.
Habe die Wago sogar resetet gehabt, nachdem ich die Bausteine neu gesetzt habe. Auch heute ist Sonnenuntergang bei kurz vor 19Uhr (wobei etwa gegen 20Uhr Sonnenuntergang ist).
@peewit: Oben im Screenshot ist eigentlich alles sichtbar. Mehr existiert in der Richtung nicht.
Ich habe mal schnell eine mögliche Änderung im Baustein calendar_cal eingebaut.
Bei einem Sommer/Winterzeitwechsel werden die 3 Funktionen mit dem zwischen 2 und 3 Uhr geänderten DST_ON erneut aufgerufen.
Ich habe die Änderungen mit (**************) gekennzeichnet.
Kann das so gehen?
FUNCTION_BLOCK CALENDAR_CALC
VAR_INPUT
SPE : BOOL;
H : REAL := -0.83333333333;
END_VAR
VAR_IN_OUT
XCAL : CALENDAR;
HOLIDAYS : ARRAY[0..29] OF HOLIDAY_DATA;
END_VAR
VAR
last : DT;
last_day : DINT;
holy : HOLIDAY;
sun : SUN_TIME;
last_hour: INT;
utod: TOD;
pos : SUN_POS;
plast: DT;
last_dst_on: BOOL; (**************)
END_VAR
VAR_TEMP
dtemp : DINT;
tmp : INT;
END_VAR
(*
version 1.6 6. apr. 2011
programmer hugo
tested by oscat
calendar_calc liest die weltzeit .UTC aus einer CALENDAR Struktur und berechnet die restlichen Werte der Struktur.
calendar_calc stellt sicher das die Werte fortlaufend aktualisiert werden und dabei funktionen nur dann aufgerufen werden wenn dies nötig ist.
calendar_calc will calculate sun position data when SPE = TRUE;
*)
(* @END_DECLARATION := '0' *)
IF xcal.UTC <> last THEN
(* run once per second *)
(* update utc last calculated *)
last := XCAL.UTC;
utod := DT_TO_TOD(xcal.UTC);
(* calculate ltc from utc *)
XCAL.LDT := UTC_TO_LTIME(XCAL.UTC, XCAL.DST_EN, XCAL.OFFSET);
XCAL.LDATE := DT_TO_DATE(XCAL.LDT);
XCAL.LTOD := DT_TO_TOD(XCAL.LDT);
dtemp := DAY_OF_DATE(XCAL.LDATE);
xcal.night := XCAL.LTOD < XCAL.SUN_RISE OR XCAL.LTOD > XCAL.SUN_SET;
(* run once per hour *)
tmp := HOUR(xcal.LTOD);
IF tmp <> last_hour THEN
XCAL.DST_ON := DST(XCAL.UTC) AND xcal.DST_EN;
last_hour := tmp;
END_IF;
(* run once per day *)
IF dtemp <> last_day THEN
last_day := dtemp;
(* a new day has started, recalculate daily events *)
XCAL.YEAR := YEAR_OF_DATE(XCAL.LDATE);
XCAL.MONTH := MONTH_OF_DATE(XCAL.LDATE);
XCAL.DAY := DAY_OF_MONTH(XCAL.LDATE);
XCAL.WEEKDAY := DAY_OF_WEEK(XCAL.LDATE);
HOLY(date_in := XCAL.LDATE, LANGU := xcal.LANGUAGE, HOLIDAYS := HOLIDAYS);
XCAL.HOLIDAY := HOLY.Y;
XCAL.HOLY_NAME := HOLY.NAME;
sun(latitude := XCAL.LATITUDE, longitude := xcal.LONGITUDE, utc := DT_TO_DATE(xcal.UTC), H := H);
XCAL.SUN_RISE := DINT_TO_TOD(TOD_TO_DINT(sun.sun_rise) + XCAL.OFFSET * 60000 + SEL(XCAL.DST_ON,DINT#0,3600000));
XCAL.SUN_SET := DINT_TO_TOD(TOD_TO_DINT(sun.sun_set) + XCAL.OFFSET * 60000 + SEL(XCAL.DST_ON,DINT#0,3600000));
XCAL.SUN_MIDDAY := DINT_TO_TOD(TOD_TO_DINT(sun.MIDDAY) + XCAL.OFFSET * 60000 + SEL(XCAL.DST_ON,DINT#0,3600000));
XCAL.SUN_HEIGTH := sun.sun_declination;
XCAL.WORK_WEEK := WORK_WEEK(XCAL.LDATE);
END_IF;
(* calculate the suns position every 10 seconds when SPE = TRUE *)
IF SPE AND xcal.UTC - plast >= t#25s THEN
plast := last;
pos(latitude := xcal.LATITUDE, longitude := xcal.LONGITUDE, utc := xcal.UTC);
xcal.SUN_HOR := pos.B;
xcal.SUN_VER := pos.HR;
END_IF;
(**************)
IF last_dst_on <> XCAL.DST_ON THEN
last_dst_on := XCAL.DST_ON;
XCAL.SUN_RISE := DINT_TO_TOD(TOD_TO_DINT(sun.sun_rise) + XCAL.OFFSET * 60000 + SEL(XCAL.DST_ON,DINT#0,3600000));
XCAL.SUN_SET := DINT_TO_TOD(TOD_TO_DINT(sun.sun_set) + XCAL.OFFSET * 60000 + SEL(XCAL.DST_ON,DINT#0,3600000));
XCAL.SUN_MIDDAY := DINT_TO_TOD(TOD_TO_DINT(sun.MIDDAY) + XCAL.OFFSET * 60000 + SEL(XCAL.DST_ON,DINT#0,3600000));
END_IF;
(**************)
END_IF;
nein, daß würde ja Global auch Auswirkungen auf die lokalen zeit habe. Die läuft aber korrekt.
in den settings wollte ich nichts umstellen. So hatte ich esse bisher, dann musste ich aber jedesmal halbe Jahre den haken wieder rausgefunden nehmen.
Grundsätzlich läuft ers ja jetzt prima. Ich nehme nur an, dass die Sommerzeit Verschiebung im Baustein bei der sonnenstandsberechnung nicht berücksichtigt wird, sofern DST_EN auf true steht.
@NigthWatcher
Ich glaube noch nicht, dass Du das Problem sauber gelöst hast. Ich vermute, dass Du im Herbst wieder ein Problem hast.
Wie peewit schrieb, sollte die SPS mit UTC arbeiten. Der Baustein calendar_calc funktioniert nur sauber, wenn Du die UTC anlegst und auch die Zeitzone XCAL.XOFFSET auf Deutschland einstellst.
Die Local-Zeit wird im Baustein mit
Ich kann mich erinnern, dass wir das Thema vor 6 Jahren schon hatten, als der calendar_calc entstand.
Ich hatte zwar auch immer mal wieder festgestellt, dass die Zeiten nicht passen. Da die aber nur bis 24Uhr falsch sind, hatte ich das nicht mehr weiter verfolgt.
Dank NightWatcher sind wir der Lösung wohl nah.
okay, ich hatte nen Gedankenfehler. Danke an kiar.
Ich habe den UTC Falsch gerechnet und war der Meinung, dass dieser korrekt sei (Dabei kam dieser schon mit 1 Stunde zuviel in der Wago an). Habe da nun eine Stunde abgezogen und den offset in CodeSys gesetzt. Nun passt alles.