Hallo Terminator95
Dein Problem mit LTIME_TO_UTC kann ich nachvollziehen !
Ich habe dir eine korrigierte version erstellt !
die alte hat nicht nur falsch gerechnet, sondern hat auch bei "DST" = True , das ganze jahr über die +1 Stunde für Sommerzeit mitgerechnet
die neue version prüft vorher ob bei LTIME überhaupt sommerzeit aktiv ist
und nicht vergessen time_offset wird in minuten angegeben
FUNCTION LTIME_TO_UTC : DT
VAR_INPUT
LTIME : DT;
DST_ENABLE : BOOL;
TIME_ZONE_OFFSET : INT;
END_VAR
VAR
tmp: INT;
tmp2: DWORD;
END_VAR
tmp := time_zone_offset * 60;
tmp2 := BOOL_TO_DWORD(DST_ENABLE AND DST(LTIME)) * 3600;
IF tmp < 0 THEN
tmp := ABS(tmp);
LTIME_TO_UTC := DWORD_TO_DT(DT_TO_DWORD(Ltime) + INT_TO_DWORD(tmp) - tmp2);
ELSE
LTIME_TO_UTC := DWORD_TO_DT(DT_TO_DWORD(Ltime) - INT_TO_DWORD(tmp) - tmp2);
END_IF;
Hallo,
ich hab noch was zum Thema beizurtagen, auch wenn es schon etwas älter ist. Hatte nämlich eben selbiges Problem:
Wozu der Aufwand, den halben Baustein umzuschreiben? Eigentlich hätte es doch gereicht in der ersten Zeile das Minus durch ein Plus zu ersetzen, so dass es so aussieht
Code:
tmp := time_zone_offset * 60 + BOOL_TO_INT(DST)*3600;
Habs gerade ausprobiert, sollte auch funktionieren. Jetzt werden nämlich im Sommer richtigerweise 2h und im Winter 1h von der Systemzeit abgezogen (wenn man sich in Deutschland befindet).
Wär natürlich klasse, wenn es in der nächsten Release aufgenommen wird. Ich vermute, es ist in der 3.10 schlicht vergessen worden Wink
Gruß
Thomas