S7 und UNIX-Timestamp

argv_user

Level-1
Beiträge
968
Reaktionspunkte
122
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich will die S7-Systemzeit in den zugehörigen Unix-Zeitstempel umwandeln.

Auslesen mit SFC 1 ist klar. Bleibt die leidige Rechnerei.
Das dürfte zwar kein großes Problem sein (FC), aber ich
bin heute himmelfahrtsfaul.

Deshalb die Frage: Gibt es da bereits etwas fertiges ?
 
Hallo!

Nit so faul sein! ;)

Schau dir mal die Oscat library an. Vielleicht findest dort was brauchbares.

godi
 
Aus gegebenem Anlass hier meine, zugegebenermaßen bescheiden dokumentierte Lösung Nummer 2:

Code:
FUNCTION FC 112 : VOID
TITLE =DWORD Get_Unix_Timestamp 
//Die Funktion errechnet aus der BCD-codierten Systemzeit einer S7-CPU (300,400)
//den zugehörigen Unix-Zeitstempel (Sekunden seit 1.1.1970)
//
//Rueckgabewerte: Unix-Timestamp
//          oder: 0, falls SFC1 einen Fehler meldet
AUTHOR : Emig
NAME : UNIXTIME
VERSION : 1.0


VAR_OUTPUT
  timestamp : DWORD ;    //Rueckgabewert: Unix-Timestamp oder 0
END_VAR
VAR_TEMP
  s7clock : DATE_AND_TIME ;    
  s7clock_retval : INT ;    
  datum : DATE ;    
  zeit : TIME_OF_DAY ;    
  sum : DWORD ;    
END_VAR
BEGIN
NETWORK
TITLE =Systemuhr auslesen mit Systemfunktion 1

      L     0; 
      T     #timestamp; 

      CALL "READ_CLK" (
           RET_VAL                  := #s7clock_retval,
           CDT                      := #s7clock);
// Error check
      L     #s7clock_retval; 
      L     0; 
      <>D   ; 
      BEB   ; 

      CALL "DT to DATE" (
           IN                       := #s7clock,
           RET_VAL                  := #datum);
      CALL "DT to TOD" (
           IN                       := #s7clock,
           RET_VAL                  := #zeit);

      L     #datum; // Datum in Sekunden wandeln
      L     L#86400; 
      *D    ; 
      T     #sum; 

      L     #zeit; // Zeit in Sekunden wandeln
      L     L#1000; 
      /D    ; 
      L     #sum; 
      +D    ; 
      L     DW#16#259E8160; // UTC(1.1.1990,0:0:0)
      +D    ; 
      T     #timestamp; 


END_FUNCTION
Der eigentliche Trick steckt IMHO nur in der Ermittlung der Konstanten, die zum Schluss noch addiert wird.
Viel Spaß noch damit.

Gerald
 
Zuletzt bearbeitet:
Zurück
Oben