Sommer / Winterzeit

Begonnen von NightWatcher, 30. März 2015, 15:57:52

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 4 Gäste betrachten dieses Thema.

NightWatcher

Heute war es mal wieder soweit, dass ich mir das Script angesehen habe, da mir die halbjährliche Umstellung auf den Keks geht.

die Oscat Lib hat ja nen tollen Baustein für die Uhrumstellung. Klappt auch soweit.

Leider habe ich gesehen, dass die Zeiterfassung für den Sonnenstand nach UTC rechnet, ich aber intern LDT verwende (wegen Lokaler Uhrzeiten).

Müsste nicht der xcal Baustein eigentlich den Sonnenstand auch mit LDT am Eingang rechnen?

Vielleicht ist mein Verständnis auch falsch. Habe mal nen Screenshot angehangen.

SUN_RISE müsste eigentlich bei etwa 7:17 Uhr stehen
SUN_SET bei etwa 19:54 Uhr

Screenshot ist um 15:55Uhr gemacht worden (LDT stimmt also).

[gelöscht durch Administrator]

kiar

#1
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.

peewit

der grund liegt wahrscheinlich darin das die sonnenzeiten nur einmal am tag berechnet werden
ziemlich sicher 1 sekunde nach mitternacht

diese zeiten sind aber weltzeit
somit ist es nicht relevant ob sommer oder winterzeit

da müsste man sich mal deine lösung ansehen was du wie verschalten hast

NightWatcher

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.

kiar

@NigthWatcher
Du musst für Deutschland (Zeitzone Berlin) bei

.xoffset = 60
eintragen.

peewit

schau mal nach ob du bei der wago rtc die sommerzeitumschaltung eingeschalten hast

ich würde sowieso die sps uhr auf weltzeit laufen lassen so dass hier keine sommerzeit umschaltung vorkommt

die sommerzeitumschaltung macht du dann selber im sps programm wie auch die lokale zeit


ob das jetzt dein problem entschärft weiss ich nicht

kiar

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;


NightWatcher

Zitat von: kiar in 31. März 2015, 13:24:28
@NigthWatcher
Du musst für Deutschland (Zeitzone Berlin) bei

.xoffset = 60
eintragen.
nein, daß würde ja Global auch Auswirkungen auf die lokalen zeit habe. Die läuft aber korrekt.

Zitat von: peewit in 31. März 2015, 13:28:48
schau mal nach ob du bei der wago rtc die sommerzeitumschaltung eingeschalten hast

ich würde sowieso die sps uhr auf weltzeit laufen lassen so dass hier keine sommerzeit umschaltung vorkommt

die sommerzeitumschaltung macht du dann selber im sps programm wie auch die lokale zeit


ob das jetzt dein problem entschärft weiss ich nicht

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.

kiar

@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
XCAL.LDT := UTC_TO_LTIME(XCAL.UTC, XCAL.DST_EN, XCAL.OFFSET);
berechnet. XCAL.OFFSET ist die Zeitzonenverschiebung. XCAL.DST_EN muß TRUE sein, damit der Baustein eine Sommer-/Winterzeitumschaltung berücksichtigt.

Die lokalen Aufgangs-/Untergangszeiten und die Zeit des höchsten Sonnenstandes werden ebenfalls mit XCAL.OFFSET in die gewünschte Zeitzone verschoben.
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));


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.

NightWatcher

Hi kiar, danke schon mal für die ausführliche Erklärung.

Ich muss gestehen, dass ich noch keinen zeit hatte, den Code des Bausteins zu studieren.

Hätte insgeheim aber auch gehofft, dass ich nun Fehler mache (was sich ja nun evtl auch herauskristallisiert).

Morgen werde ich das mal alles verarbeiten und durchspielen. Gibt dann auf jeden Fall ein Update von mir.

NightWatcher

Guten Morgen,

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.

Ich danke euch.