TIA UTC in Local time konvertieren

Ralle

Super-Moderator , User des Jahres 2006-2007
Teammitglied
Beiträge
15.416
Reaktionspunkte
4.044
Zuviel Werbung?
-> Hier kostenlos registrieren
Bausteine wie Getalarm, geben einem ja einen Timestamp zurück. Der scheint in UTC abgelegt zu sein.
Gibt es irgendeine Möglichkeit im TIA (1500-er), diese Zeit in die Local Time zu konvertieren?
Man kann ja mit RD_LOC_T die Local Time auslesen, aber mit dem Zeitstempel hat man ja schon eine Zeit vorliegen.

PS: Enthält diese UTC bereits Sommer-/Winterzeit? Dann müßte man ecvtl. nur die aktuelle Zeitzone rausbekommen (geht das im TIA?) und die Zeitdifferenz abziehen/addieren.

Oder sollte man RD_LOC_T und RD_SYS_T für eine Differenzbildung nutzen? Irgendwo in der SPS muß doch die aktuell eingestellte Zeitzone auszulesen sein...
 
Wenn du im Startup OB SET_TIMEZONE ausgeführt hast kannst du dir die verwendeten Werte auch dazu nutzen die die Lokalzeit zu berechnen.
Schau dir mal die Hilfe zu der Funktion SET_TIMEZONE an da gibt es den Datentyp TimeTransformationRule in dem alle Werte der Zeitzone und Sommer/Winterzeit stehen.

Gruß

Jens
 
@DOD666

Yep, das wollte ich mit ersparen, komisch, das man nicht auch ein GET_TIMEZONE hat. Warum macht Siemens alles immer nur halb?
 
komisch, das man nicht auch ein GET_TIMEZONE hat.
Vermutlich weil man ohne SET_TIMEZONE noch keine Zeitzohne in der PLC hat, sondern nur eine Zeitdifferenz.
Z.B. +2 zur UTC kann Mitteleuropa im Sommer oder Osteuropa im Winter sein.
Und nach SetTimezone kann man auch direkt an die Quelle gehen.


Oder sollte man RD_LOC_T und RD_SYS_T für eine Differenzbildung nutzen?
Dein eigener Ansatz ist ja auch nicht wirklich aufwendig:
attachment.php



PS:
Ist doch aufwendiger, als ich dachte, da T_Add anscheinend nicht mit negativen Zeiten zum Addieren klarkommt.
:(
 

Anhänge

  • Timezone.jpg
    Timezone.jpg
    58,1 KB · Aufrufe: 175
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
@hucki

Ich hab es mit RD_LOC_T und RD_SYS_T gemacht.
Zeitzone und Sommerzeitstart/-ende kann man in der Konfiguration der SPS vorgeben.
Damit funktioniert das auch.
Das Ergebnis ist im Format Time und kann direkt verwendet werden mit UTC, jedenfalls wird nun alles korrekt angezeigt.

Code:
//Calculate Difference between UTC and Locale Time 
    #nReturn_SYS := RD_SYS_T(#datSYS_Time);
    #nReturn_LOC := RD_LOC_T(#datLOC_Time);
    #tDiff := #datSYS_Time - #datLOC_Time + t#1h; //muß in der SPS wohl doch nochmal die Timezone ändern :-)
"DB_Test".ldtTimeStamp := "Info_Internal".Alarms[0].TimeStamp - #tDiff;
 
Zuletzt bearbeitet:
Ich hätte die Sys- von der Lokalzeit abgezogen, um als Differenz bei uns z.B. die monentanen +2h (anstatt -2h) zu erhalten. Also den Wert, den man üblicherweise auch bei der Zeitzone angibt.
Die Differenz müsste man dann natürlich zum Zeitstempel addieren (statt subtrahieren).

Das oben war eher ein Test mit einem Baustein aus der Siemens-Bibliothek LGF, der die Funktionen zu Systemzeit, Lokalzeit und Zeitzone in einem Baustein zusammenfasst, ob dieser vlt. die Zeitzone auslesen kann, ohne sie vorher zu setzen.
Ein Forums-Kollege (und ich selbst auch) hatte eine solche Funktion vermisst. Leider war der Test in dieser Richtung erfolglos. :(


Durch diesen schnellen Test war ich dann auch in KOP "gefangen". (Das Vorgehen ist ja ansonsten das Gleiche wie bei Dir in SCL.)
Beim anschließenden KOP-Zeit-Addieren einer negativen Differenz kam bei mir (unerwarteterweise) ein fehlerhaftes Ergebnis heraus. (Warum eigentlich?)
Ich müsste so daher (im Gegensatz zum Bild oben) die Zeitdifferenz auf >=0 oder <0 unterscheiden, die Differenz entsprechend unterschiedlich bestimmen und dann (nur positiv) Addieren oder Subtrahieren:
Timezone.jpg



Da Du ja sicher schon getestet hast - funktioniert das in SCL mit nur einer Rechnung sowohl für positive als auch negative Zeitdifferenzen, wie man's eigentlich auch erwartet, oder muss man da auch eine Fallunterscheidung einbringen wie in KOP?
 
Zuletzt bearbeitet:
Zurück
Oben