UTC zeit

Zuviel Werbung?
-> Hier kostenlos registrieren
Doch deine Antwort hat mir weitergeholfen. Nur brauche ich jetzt nicht die aktuelle Zeit, sondern die vergangenen Sekunden seit 01.01.1970. Evt gibt es hierfür ja eine Funktion. Ich könnte zwar aus der aktuellen Zeit die UTC-Zeit berechnen, dies ist allerdings sehr aufwendig.
 
Da fällt mir nur ein, dass du das Datum zu Hilfe nimmst. Das basierst auf dem 01.01.1990. Dies multiplizierst du mit 86400 (Sekunden pro Tag) und rechnest noch einmal die 20 Jahre bis 1970 in Sekunden darauf ...

Gruß
LL
 
Da fällt mir nur ein, dass du das Datum zu Hilfe nimmst. Das basierst auf dem 01.01.1990. Dies multiplizierst du mit 86400 (Sekunden pro Tag) und rechnest noch einmal die 20 Jahre bis 1970 in Sekunden darauf ...
Also wenn ich dich richtig verstanden habe, gibt es eine Funktion die mir die vergangenen Tage seit 01.01.1990 liefert? Wie heißt diese Funktion?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
die kommt auf dem gleichen Weg wie die Systemzeit ... die steckt in dem DATE_TIME-Array mit drin ... sind nur die restlichen Bytes.

Code:
  Stunde  := BCD_TO_INT (b_SPS_Datum_Uhrzeit [3]) ;
  Minute  := BCD_TO_INT (b_SPS_Datum_Uhrzeit [4]) ;
  Sekunde := BCD_TO_INT (b_SPS_Datum_Uhrzeit [5]) ;
  
  MilliSekunden_E := WORD_TO_INT (SHR (IN:=INT_TO_WORD (BCD_TO_INT (b_SPS_Datum_Uhrzeit [7])) , n:=4)) ;
  MilliSekunden := (BCD_TO_INT (b_SPS_Datum_Uhrzeit [6]) *10) + MilliSekunden_E ;
  UhrZeit_DINT := INT_TO_DINT(MilliSekunden) + (INT_TO_DINT(Sekunde) + INT_TO_DINT(Minute)*60 + INT_TO_DINT(Stunde)*3600) * 1000 ;
  UhrZeit_TOD  := DINT_TO_TOD(UhrZeit_DINT) ;
       UhrZeit := UhrZeit_TOD ;
  
  WochenTag := BCD_TO_INT (b_SPS_Datum_Uhrzeit [7] AND 2#0000_1111) ;
  IF (WochenTag <> SPS.Wochentag) OR (Stunde <> SPS.Stunde) THEN
     b_Jahr := BCD_TO_INT (b_SPS_Datum_Uhrzeit [0]) ; 
        IF b_Jahr < 90 THEN Jahr := 2000 + b_Jahr ; ELSE Jahr := 1900 + b_Jahr ; END_IF ;
     Monat  := BCD_TO_INT (b_SPS_Datum_Uhrzeit [1]) ;
     Tag    := BCD_TO_INT (b_SPS_Datum_Uhrzeit [2]) ;
     IF ((Jahr MOD 4) = 0) THEN Schaltjahr := 1 ; ELSE Schaltjahr := 0 ; END_IF ;
     //             Jahres-Tage            Schaltjahr-Tage
     Datum_DINT := ((INT_TO_DINT(Jahr) - 1990) * 365) + ((INT_TO_DINT(Jahr) - 1992) / 4) + Tag ;

schau dir das mal an ...
 
Für die Berechnung der UTC-Zeit (Zeit seit dem 01.01.1970 in Sekunden) kann man auch die Systemfunktion SFC 1 READ_CKL und die IEC-Funktionen FC 6 DT_DATE und FC 8 DT_TOD verwenden:

Code:
FUNCTION FC100 : VOID
 
NAME    : UTC
FAMILY  : SPSFORUM
AUTHOR  : KAI
VERSION : '1.0'
 
VAR_OUTPUT
    SPS_DATE : DATE;
    SPS_TOD  : TOD;
    SPS_UTC : DINT;
END_VAR
 
VAR_TEMP
    SPS_DT : DT;
    RETVAL : INT;
END_VAR
 
BEGIN
 
// SFC 1  READ_CLK
// Die Funktion SFC 1 liest die aktuelle Uhrzeit und das aktuelle Datum 
// im Datenformat DATE_AND_TIME (DT) aus der SPS aus.
 
// DATE_AND_TIME (DT)
// (DT#1990-1-1-0:0:0.0 bis DT#2089-12-31-23:59:59.999)
 
RETVAL := SFC1 (CDT := SPS_DT);
 
// FC 6  DT_DATE
// Die Funktion FC 6 liest das Datenformat DATE (D) aus dem Datenformat 
// DATE_AND_TIME (DT). 
 
// DATE (D)
// IEC-Datum in Schritten von 1 Tag 
// (D#1990-1-1 bis D#2168-12-31)  
 
SPS_DATE := FC6 (IN := SPS_DT); 
 
// FC 8  DT_TOD
// Die Funktion FC 8 liest das Datenformat TIME_OF_DAY (TOD) aus dem 
// Datenformat DATE_AND_TIME (DT).
 
// TIME_OF_DAY (TOD)
// Uhrzeit (Tageszeit) in Schritten von 1 Millisekunde 
// (TOD#0:0:0.0 bis TOD#23:59:59.999) 
 
SPS_TOD := FC8 (IN := SPS_DT);
 
// UTC-ZEIT
// Vergangene Zeit seit dem 01.01.1970 in Schritten von 1 Sekunde
 
// 1 Tag = 24 Stunden * 60 Minuten * 60 Sekunden = 86400 Sekunden
 
// 01.01.1970 -> 01.01.1990 = 7305 Tage * 86400 Sekunden = 631152000 Sekunden 
 
SPS_UTC := (DATE_TO_DINT(SPS_DATE) * 86400) + (TOD_TO_DINT(SPS_TOD) / 1000) + 631152000;
 
END_FUNCTION

Gruß Kai
 

Anhänge

  • OB1.pdf
    4,6 KB · Aufrufe: 48
  • FC100.pdf
    5,6 KB · Aufrufe: 46
  • VAT.jpg
    VAT.jpg
    145,1 KB · Aufrufe: 52
  • Utc.zip
    32,1 KB · Aufrufe: 40
Hier noch mal ein paar Erläuterungen zu den Datentypen DATE und TIME_OF_DAY:

DATE (D)

Eine Variabel mit dem Datentyp DATE (Datum) wird in einem Wort als vorzeichenlose Festpunktzahl abgelegt. Der Inhalt der Variablen entspricht der Anzahl der Tage seit dem 01.01.1990. Die Darstellung enthält die Angaben für das Jahr, den Monat und den Tag, jeweils getrennt durch einen Bindestrich.

Beispiele:

DATE#1990-01-01 (= HEX 0000)

D#2168-12-31 (= HEX FF62)

TIME_OF_DAY (TOD)

Eine Variable mit Datentyp TIME_OF_DAY (Tageszeit) wird in einem Doppelwort als vorzeichenlose Festpunktzahl abgelegt. Der Inhalt der Variablen entspricht der Anzahl der Millisekunden seit Tagesbeginn (0:00 Uhr). Die Darstellung enthält die Angaben für Stunden, Minuten und Sekunden, jeweils getrennt durch einen Doppelpunkt. Die Angabe der Millisekunden, im Anschluss an die Sekunden durch einen Punkt getrennt, kann entfallen.

Beispiele:

TIME_OF_DAY#00:00:00 (= HEX 0000_0000)

TOD#23:59:59:999 (= HEX 0526_5BFF)

Gruß Kai
 
Zurück
Oben