Oscat_Basic.UTC_TO_LTIME mit Offset übersteigt INT?

Begonnen von TimoH, 20. März 2024, 14:39:57

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 3 Gäste betrachten dieses Thema.

TimoH

Hallo,
Besagter Baustein bietet eine Umrechnung meiner UTC Zeit zu meiner Lokalzeit sowie einen Sommer/Wintermodus.

tmp := TIME_ZONE_OFFSET * 60 + BOOL_TO_INT(DST_ENABLE AND DST(UTC)) * 3600;
IF tmp < 0 THEN
   tmp := ABS(tmp);
   UTC_TO_LTIME := DWORD_TO_DT(DT_TO_DWORD(UTC) -  INT_TO_DWORD(tmp));
ELSE
   UTC_TO_LTIME := DWORD_TO_DT(DT_TO_DWORD(UTC) +  INT_TO_DWORD(tmp));
END_IF;

So wie ich den Baustein verstehe kann ich einen Offset in Minuten dazurechnen sowie die Sommer/Winterzeit ein und ausschalten.
Das klappt auch soweit, aber ich habe das Problem, dass der Baustein den Offseteingang in Minuten hat und durch die Multiplikation mit 60 daraus die Sekunden bildet. Wenn ich aber eine Minutenzahl über 546 eingebe, dann sprengt die Rechnung den Maximalwert der internen INT Variable.
Nahe Neuseeland komme ich aber auf einen OFFSET von +/-13 Stunden zur UTC, also bis zu 780 Minuten.

Ich kann natürlich den Offset selber schreiben, aber vielleicht kann mir ja wer kurz erklären, wo mein Denkfehler ist, dass dieser Baustein tmp und den Offset als INT verwendet. Ich konnte nichts finden, dass dieser Bug irgendwo gemeldet ist.


peewit

#1
Hallo TimoH

UTC ist die Basis 0 (Weltweit) und es gibt Zeitoffsets von maximal -12h bis +12h
So wie du richtig erkannt hast ist der verwendete Integer nicht ausreichend um alle Zeitoffsets zu übergeben

ja, das sieht nach einen Fehler aus

Damit der Baustein nach außen unverändert bleibt (Kompatibilität) musste man intern die tmp var auf DINT umstellen und auch alle typebezogenen Aufrufe von int auf dint anpassen

Wenn du lust hast kannst du ja gerne eine Adaptierung durchführen und den Baustein hier als fehlerbereinigte Variante online stellen.

Vielen Dank fürs mitdenken !!

LG Peewit