SUN_TIME und die Sommerzeit

Begonnen von grauerwolf, 28. März 2016, 20:59:09

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 2 Gäste betrachten dieses Thema.

grauerwolf

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]

peewit

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

grauerwolf

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]

peewit

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

grauerwolf

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