Schneider Unity Pro XL: Unix Zeitstempel in Datum/Zeit Format bringen

00.Schneider

Level-1
Beiträge
2
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich bekomme einen Zeitstempel als Unixzeit, z.B.: 1470211418

Wie kann ich diese Unixzeit in ein Format 'TT-MM-JJJJ hh:mm:ss' überführen.

Mit DATE_AND_TIME (DT) komme ich hier nicht weiter.

Gruß
 
Ein paar mehr Details wären nicht schlecht (Unity Version, welche Hardware, welche Programmiersprache etc.)
Bzw. wo ist das genaue Problem??
Weisst Du nicht wie Du die Zeit aus SPS ausliest? Hast Du die Zeit, weißt aber nicht wie Du sie konvertieren kannst?

Mit DT hast Du ja im Prinzip das Format JJJJ-MM-TT-hh:mm:ss (z.B. DT#1990-10-2-12:02:30 )
Mit der Funktion DT_TO_STRING kannst Du auch in eine Zeichenkette konvertieren.

Die aktuellen Werte der Echtzeituhr liegen in der Regel in Systemwörtern ab (z.B. %SW48 bis %SW53)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Koerg,

Version: Unity Pro XL Version 10.0
Hardware: TSX RKY 6EX, TSX PSY 2600M, TSX P57 5634M
Programmiersprache: ST

Ich will nicht die SPS-Zeit auslesen, sondern bekomme über Ethernet Datenaustausch einen Zeitstempel als Unixzeit (die Sekunden ab 01.01.1970 00:00:00).

Diesen versuche ich in ein lesbares Zeitformat zu konvertieren.
 
Hallo Schneider.
Erstmal ein paar Grundsätzliche Gedanken

Unixzeit beginnt am 01.01.1970 00:00:00 und endet am 19.01.2038 mit einer Zeitbasis von 1 Sekunde
Unityzeit beginnt am 01.01.1990 00:00:00 mit einer Zeitbasis von 1 Millisekunde
alle Rechenoperationen im Zusammenhang der Zeit in Unity enden mit einer Variable vom Type "TIME" (UDINT) In ihr sind maximal 49 Tage darstellbar.
Unity stellt nicht in allen Versionen und allen Plattformen einen LINT (64 bit zur Verfügung)

Da die Unix Zeit schon weit vorangeschritten ist, kannst du aber nicht mehr in DINT rechnen.
UnixZeit * 1000 (für mSek in DT) würde DINT überschreiten.

Eine Möglichkeit die mir eingefallen ist, ist die Berechnung einer Referenzzeit in Unix, so dass man auf vernünftige Zahlen kommt.
Diese Referenzzeit sollte nicht weiter als 49 Tage von der zu erwartenden Zeit von Unix entfernt sein.

Code:
1.  Auslesen der aktuellen DT (2016-08-04-15:30:00)
2.. Tag, Monat & Jahr merken
3. Referenzzeit basteln in DT (2016-08-01-00:00:00)
4. Von dieser Referenzzeit die UnixZeit bestimmen
[CODE]
2016 - 1970 = Anzahl Jahre (46)
Anzahl Jahre / 4 = Anzahl Schaltjahre (11)
Differenzzeit Jahre = Anzahl Jahre * 365 * 86400 (Ergibt die Differenz in Sekunden)
Differenz2 = (Anzahl Schaltjahre + Tag des Referenzdatums (1.8. = 213) ) * 86400 
(Ist  das aktuelle Jahr ein Schaltjahr und befindet sich das Referenzdatum  nach dem 29.02. muss der Tag mit berücksichtigt werden)
Unixreferenz = Differenz Jahre + Differenz2 (1470009600)

Unixdifferenz (=201818) = Unixzeit (=1470211418) - Unixreferenz (=1470009600)
Unixdifferenz * 1000 -> konvertiert nach Zeit = 2d_8h_3_m_38s -> Addiert zur Referenzzeit = 2016-08-03-08:03:38
Da die Unixzeit immer UTC ist noch 2h drauf für die Lokalzeit
[/CODE]
Bleibt noch das Jahr 2038 Problem

Holger
 
Ui, puh, also...

das ist tatsächlich nicht so trivial. So spontan gibt es dafür nichts in Unity.

Und eine Umrechnung ist tatsächlich nicht so einfach. Wenn man die Schaltjahre seit 1970, die verschiedenen Monatslängen generell, die UTC usw. berücksichtigen muss.

Die Idee von holgermaik mit der Referenzzeit könnte ein vielversprechender Ansatz sein, etwas einfacheres zu programmieren. Wenn man aber bedenkt das die Anlage ein paar Jahre laufen soll, wird das auch immer komplizierter oder man müsste mit mehreren Referenzzeiten arbeiten, die man sich vorher berechnet und im Programm als Konstanten quasi hinterlegt.

Hättest Du denn Einfluss auf die Gegenseite, die die Zeit über Ethernet sendet? Vielleicht ist es dort einfacher in DATE_AND_TIME (viele Plattformen können das in diese Richtung von haus aus) zu konvertieren und das dann als Array oder so per Ethernet zu senden..... Nur mal so als vielleicht pragmatischer Ansatz.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da mich das Problem interessiert hat, habe ich mal einen DFB gemacht. Für alle ohne Unity ist ein Ausdruck dabei.
Warum in FUP? - Weil es viele User gibt, die ausschließlich in FUP programmieren.

Holger
Anhang anzeigen 33594
 

Anhänge

  • FB_Unixzeit.zip
    4,1 KB · Aufrufe: 15
Zuletzt bearbeitet:
Zurück
Oben