Hallo,
nach Wechsel auf die Sommerzeit bleibt der Sonnenaufgang und der Sonnenuntergang in der gleichen schönen Folge wie in den letzten Tagen der Winterzeit:
Log-Werte:
25.03.2016 00:00:00: Neuberechnung: Sonnenuntergang: 1849
26.03.2016 00:00:00: Neuberechnung: Sonnenuntergang: 1851
27.03.2016 00:00:00: Neuberechnung: Sonnenuntergang: 1853
28.03.2016 00:00:00: Neuberechnung: Sonnenuntergang: 1854
28.03.2016 09:48:03: Neuberechnung: Sonnenuntergang: 1856 hier sollte spätestens 1956 stehen (oder?)
Das Programm:
var
SONNENSTAND: SUN_TIME;
Time_Zone_Verschiebung:WORD:=60; (* 60 Minuten Verschiebung ist der Unterschied von Greenwich-Time zu Berliner Zeit (Zeitzone) ,
nur so stimmen Sonnenauf und Untergang mit der Praxis bei Winterzeit überein *)
DT_Sonnenuntergang:DT;
DT_Sonnenaufgang:DT;
DT_Sonnenuntergang_DST:DT;
DT_Sonnenaufgang_DST:DT;
heute:DATE; (*Local time *)
heute_utc: DT; (* Weltzeit *)
end_var
....
heute:=DT_TO_DATE(ActDateAndTime); (* ActDateAndTime wird in PLC_DaylightSaving (extra Task) ermittelt *)
heute_utc:=LTIME_TO_UTC(LTIME:=ActDateAndTime,DST:=Sommerzeit,TIME_ZONE_OFFSET:=60);
SONNENSTAND( H:=hoehe, Latitude:=50.7, Longitude:=12.58, UTC:=DT_TO_DATE(heute_utc) );
(* Nachfolgend bringt DST_ENABLE keinen Unterschied ob true oder false eingestellt, wohl aber der Time_Zone_Offset *)
DT_Sonnenuntergang:=DATE_TO_DT(heute) + DT_TO_TIME(UTC_TO_LTIME
(UTC:=TOD_TO_DT(SONNENSTAND.SUN_SET),DST_ENABLE:=FALSE,Time_Zone_Offset:=Time_Zone_Verschiebung));
DT_Sonnenaufgang := DATE_TO_DT(heute) + DT_TO_TIME(UTC_TO_LTIME
(UTC:=TOD_TO_DT(SONNENSTAND.SUN_RISE),DST_ENABLE:=FALSE,Time_Zone_Offset:=Time_Zone_Verschiebung));
(* Nachfolgend bringt DST_ENABLE keinen Unterschied ob true oder false eingestellt (Sommerzeit zur Zeit TRUE),
wohl aber der Time_Zone_Offset *)
DT_Sonnenuntergang_DST:=DATE_TO_DT(heute) + DT_TO_TIME(UTC_TO_LTIME
(UTC:=TOD_TO_DT(SONNENSTAND.SUN_SET),DST_ENABLE:=Sommerzeit,Time_Zone_Offset:=Time_Zone_Verschiebung));
DT_Sonnenaufgang_DST := DATE_TO_DT(heute) + DT_TO_TIME(UTC_TO_LTIME
(UTC:=TOD_TO_DT(SONNENSTAND.SUN_RISE),DST_ENABLE:=Sommerzeit,Time_Zone_Offset:=Time_Zone_Verschiebung));
Die Sommerzeit ist der Umrechnung DT_TO_TIME vollkommen egal (siehe Anhang).
Hat jemand eine Idee ??
Viele Grüße
Thomas
[gelöscht durch Administrator]
hallo
deine herumrechnerei verwirrt mich etwas.... ich ignoriere das nun einfach mal
der sun_time baustein benötigt nur ein Datum und somit ist die uhrzeit nicht relevant !
das eingangs datum und auch alle ergebnisse sind sind vom typ weltzeit
es ist auch nicht von vorteil wenn deine sps-uhr auf lokalzeit läuft und du dann immer zurück auf weltzeit rechnest
und auf lokalzeit
das beste ist man stellt die sps-zeit auf weltzeit (sommerzeitumschaltung deaktivieren !)
diese sps-zeit ist dann deine ausgangsbasis für alle berechnungen
und daraus machst du dir deine eigenen lokalzeit
------------------------------------------
alternativ kannst du die ganze arbeit dem baustein "calendar_calc" überlassen
du musst nur den xcal datenstruktur mit den werte befüllen
der baustein berechnet dann automatisch alle wichtigen eckdaten
in dem beispiel habe ich die RTC_2 (Soft_clock) genommen
das brauchst du in echt dann nicht -> da gehört erstzt durch deine UTC - SPS Zeit
Siehe anhang "calendar_calc"
Siehe bild im anhang
[gelöscht durch Administrator]
Hallo,
vielen Dank für die schnelle Antwort. Ja , ich bin langsam auch verwirrt und werde die ganze Rechnerei für mein Projekt noch mal neu bauen. Ich bin nur auf die vielen Zeitumrechnungen (UTC, LTime usw.) gekommen, weil einfach kein Unterschied zwischen Winterzeit und Sommerzeit entstehen will.
Vielleicht hat es gar nichts mit SUN_TIME zu tun, sondern eher mit UTC_TO_LTIME. Es muss doch einen Unterschied beim Sonnenuntergang geben zwischen Sommer- und Winterzeit.
Wenn die Umrechnung UTC_TO_LTIME noch nicht funktioniert , hilft mir auch nicht, wenn die SPS auf UTC ohne Sommerzeit läuft (siehe Bildchen).
Viele Grüße
Thomas
[gelöscht durch Administrator]
Zitat von: grauerwolf in 29. März 2016, 10:11:36
Hallo,
vielen Dank für die schnelle Antwort. Ja , ich bin langsam auch verwirrt und werde die ganze Rechnerei für mein Projekt noch mal neu bauen. Ich bin nur auf die vielen Zeitumrechnungen (UTC, LTime usw.) gekommen, weil einfach kein Unterschied zwischen Winterzeit und Sommerzeit entstehen will.
Vielleicht hat es gar nichts mit SUN_TIME zu tun, sondern eher mit UTC_TO_LTIME. Es muss doch einen Unterschied beim Sonnenuntergang geben zwischen Sommer- und Winterzeit.
Wenn die Umrechnung UTC_TO_LTIME noch nicht funktioniert , hilft mir auch nicht, wenn die SPS auf UTC ohne Sommerzeit läuft (siehe Bildchen).
Viele Grüße
Thomas
Der Sonneauf/untergang wird absolut zur Einheitszeit (UTC) berechnet
aber.....
du machst UTC_TO_LTIME(UTC:TOD_TO_DT(xxxxxxxx
das bedeutet das du eine tageszeit (TOD) zu einem DT (Datum + Uhrzeit) machst
woher soll denn nun das korrekte Datum kommen...
Es wird automatisch das datum mit wert 0 vorbelegt und das ist 1.1.1970
dadurch gibt es auch keine korrekte auswertung auf sommerzeit Ja/Nein
ohne korrektes Datum bei UTC_TO_LTIME kann man keine sommerzeit bestimmen
Noch dazu machst du vorher auch DATE_TO_DT(Heute) + DT_TO_TIME(yyyy)
DT hat einheit sekunden und TIME hat einheit millisekunden
sollte es zu einer korrekten rechnung kommen dann nur weil codesys ein automatisches cast (typenanpassung) noch macht.
du spielst mit dem feuer.....
für dich wäre es das einfachste wenn du den baustein "calender_calc" benutzt
Danke,
ich hatte ja schon gesagt, ich werde das Ganze überarbeiten - vielleicht auch mit calender_calc.
Allerdings werde ich mir auch die Umrechnerei mit UTC_to_LTIME zur Brust nehmen. Ich habe nämlich eine innere Wut >:(, wenn ich weiß, daß es funktionieren müsste, es aber nicht tut. Deine Hinweise sind da sehr hilfreich, denn die Manuals setzen oft voraus, das man schon Experte ist.
Also auf ein Neues ...
Viele Grüße
Thomas