# Zeit Messen?!



## MikeJ (7 Mai 2010)

Hallo zusammen

wie kann ich denn eine einfache Zykluszeit-Messung realisieren (Maschinenzeit, nicht CPU-Zyklus)?!
Alle Timer-Funktionen laufen ja rückwärts und nicht vorwärts 

PS: Die Suche hab ich natürlich benutzt - gibt aber keine Ergebnisse, wahrscheinlich bin ich der einzige der das nicht weiß 


Viele Grüße
Mike


----------



## Verpolt (7 Mai 2010)

Hallo,

Voreingestellte Zeit - abgelaufene Zeit = deine Zeit

ähh. abgelaufene Zeit passt doch?


----------



## Thomas_v2.1 (7 Mai 2010)

Und die Start- und Stop-Zeiten je nach gewünschter Genauigkeit mit SFC1 (REAL_CLK) oder SFC64 (TIME_TCK) auslesen.


----------



## SBC-User (7 Mai 2010)

speichern des systemcounters am prozesseintritt
speichern des systemcounters am prozesaustritt

speicher austritt - speicher eintritt = zykluszeit prozess (und zumeißt auch maschine)


----------



## BPlagens (7 Mai 2010)

Ich zitiere mal die Siemens Hilfe von Step7:


> Beschreibung
> 
> Mit der SFC 64 "TIME_TCK" (time tick) lesen Sie die Systemzeit der CPU. Die Systemzeit ist ein "Zeitzähler", der von 0 bis max. 2147483647 ms zählt. Bei einem Überlauf der Systemzeit wird wieder ab 0 gezählt. Das Zeitraster und die Genauigkeit der Systemzeit betragen bei S7-400 und bei der CPU 318 1 ms, bei allen anderen CPUs der S7-300 10 ms. Die Systemzeit wird nur von den Betriebszuständen der CPU beeinflußt.
> 
> ...


----------



## SKg (7 Mai 2010)

BPlagens schrieb:


> Ich zitiere mal die Siemens Hilfe von Step7:


 
Entspricht doch genau meiner Signatur!

Gruß


----------



## Manfred Stangl (7 Mai 2010)

Ich addiere die Zykluszeiten der CPU auf.


----------



## rostiger Nagel (7 Mai 2010)

BPlagens schrieb:


> Ich zitiere mal die Siemens Hilfe von Step7:
> 
> Zitat:
> Beschreibung
> ...


 


Ab Firmware 2.6.1 bei den 300er ist das so:



> SFC 64 "TIME_TCK" mit 1 ms Granularität *


----------



## ukofumo (7 Mai 2010)

Hallo



MikeJ schrieb:


> wie kann ich denn eine einfache Zykluszeit-Messung realisieren (Maschinenzeit, nicht CPU-Zyklus)?!



Da hier explizit nach einer einfachen Methode gesucht wird... denke ich das ales mit SFC64 etc. wohl ein wenig oversize is... 

Die einfachste Möglichkeit m.E.:
Einfach ein Signal suchen welches einmal pro Maschinenzyklus aufgerufen wird, mit diesem die Zykluszeitmessung starten...
Mit hilfe eines Taktmerkers (vorzugsweise 1 sec) dann ein Datenwort hochzählen...
Am ende des Maschinenzyklus den Inhalt dieses Datenwortes in ein anderes Datenwort umspeichern und und das Datenwort zum zählen wieder auf Null setzen usw. usw.

Gruß ukofumo


----------



## Manfred Stangl (7 Mai 2010)

Na dann muß ich mal fragen, wie lange dauert der Maschinenzyklus durchschnittlich? Wie genau soll die Zeitmessung sein?


----------



## Larry Laffer (7 Mai 2010)

@Manfred:
das sehe ich genauso wie du ...

@ukofumo:
wenn dir die Lösung mit der Systemzeit zu oversized ist, dann wäre tatsächlich der Vorschlag von Manfred nicht nur die sainnvollste sondern auch die praktikabelste Lösung - ich arbeite dabei nämlich nicht mit einer Annahme sondern mit dem, was wirklich ist (innerhalb der Genauigkeit der SPS-Zykluszeit-Angabe).

Gruß
LL


----------



## MikeJ (7 Mai 2010)

Hi zusammen,

ich hatte eigentlich Hoffnung, dass es so was einfaches wie die Timer gibt mit "vorwärts-zählen" 

Da dem nicht so ist, und ich wegen eines Timers heute (Freitag) keinen Aufstand mehr betreiben will, habe ich mich für die Methode von "verpolt" entschieden. - Ist zwar nicht schön bzw genau, aber wenn man dann noch passend abrundet schafft man sogar die vorgegebene Taktzeit 


Viele Grüße
Mike


PS: die Sache mit den SFC´s werde ich mir mal in Ruhe ansehen...


----------



## MikeJ (7 Mai 2010)

Hi zusammen,

ich hatte eigentlich Hoffnung, dass es so was einfaches wie die Timer gibt mit "vorwärts-zählen" 

Da dem nicht so ist, und ich wegen eines Timers heute (Freitag) keinen Aufstand mehr betreiben will, habe ich mich für die Methode von "verpolt" entschieden. - Ist zwar nicht schön bzw genau, aber wenn man dann noch passend abrundet schafft man sogar die vorgegebene Taktzeit 


Viele Grüße
Mike


PS: die Sache mit den SFC´s werde ich mir mal in Ruhe ansehen...


----------



## crash (8 Mai 2010)

MikeJ schrieb:


> ich hatte eigentlich Hoffnung, dass es so was einfaches wie die Timer gibt mit "vorwärts-zählen"



Wie wäre es dann mit dem IEC-Timer SFB4 (TON).
Der zählt vorwärts und die abgelaufene Zeit wird auch ausgegeben.
Wie genau muss es denn sein?
Wie groß sind deine Taktzeiten?
Millisekunden? Sekunden? Minuten? Stunden?....


----------



## Guts2 (2 Dezember 2010)

BPlagens schrieb:


> Ich zitiere mal die Siemens Hilfe von Step7:


So, ich hab dieses Zitat auch gelesen  auch bei Siemens, aber ich verstehe nicht so ganz wie ich diesen SFC verwenden kann.

Ich hab ja schließlich nur den Eingang EN und als Ausgänge RET_VAL und EN0

Wie bekomme ich jetzt meine Zeit aus dem Baustein. Wie setzt ich die Zeit wieder zurück? Das hab ich bei dem SFC noch nicht verstanden


----------



## Dotzi (2 Dezember 2010)

Der SFC liefert dir die Systemzeit. Die Kalkulation musst du im Anwenderprogramm vornehmen.


----------



## Guts2 (2 Dezember 2010)

Also wenn ich das richtig verstehe hab ich an RET_VAR die Systemzeit die ständig hochzählt und ich muß dann über die Variable die dann an RET_VAR Anliegt meine berechnung vornehmen? 
Weil ich da was gelesen hab das man Starten, Stoppen und neustarten kann. 

Das hat mich etwas verwirrt


----------



## Dotzi (2 Dezember 2010)

Über Starten, Stoppen usw. konnte ich jetzt nichts lesen.


----------



## Dotzi (2 Dezember 2010)

```
FUNCTION_BLOCK "FB_Timer"
TITLE =
//This block counts the time during <B_my_Input> is true.
//The feedback is written in <T_my_Time>.
//<B_Reset> clears <T_my_Time>.
//
//2010-06-07 XXX
VERSION : 0.1
 
VAR_INPUT
  B_my_Input : BOOL ; 
  B_Reset : BOOL ; 
END_VAR
VAR_OUTPUT
  T_my_Time : TIME ; 
END_VAR
VAR
  B_FM : ARRAY  [1 .. 16 ] OF BOOL ; 
  T_my_Time_Stat : TIME ; 
END_VAR
VAR_TEMP
  T_Sys_Time_Temp : TIME ; 
END_VAR
BEGIN
NETWORK
TITLE =
      CALL "TIME_TCK" (//Read the System Time
           RET_VAL                  := #T_Sys_Time_Temp);
      U     #B_my_Input; //New Count (One Shot) ???
      FP    #B_FM[1]; 
      SPBN  _101; 
      L     #T_Sys_Time_Temp; //Init my_Time_Stat
      T     #T_my_Time_Stat; 
_101: NOP   0; 
      U     #B_my_Input; //Count Time ???
      SPBN  _102; 
      L     #T_Sys_Time_Temp; 
      L     #T_my_Time_Stat; 
      -D    ; 
      T     #T_my_Time; 
_102: NOP   0; 
      U     #B_Reset; //Reset my_Time ???
      SPBN  _103; 
      L     0; 
      T     #T_my_Time; 
_103: NOP   0; 
END_FUNCTION_BLOCK
```
 
Vielleicht hilft dir das weiter.


----------



## Guts2 (2 Dezember 2010)

Dotzi schrieb:


> Über Starten, Stoppen usw. konnte ich jetzt nichts lesen.



Betriebzustand Systemzeit ...
Anlauf ... wird ständig aktualisiert.
RUN
STOP ... wird angehalten und behält den aktuellen Wert.
Wiederanlauf
(nicht bei S7-300 und
bei S7-400H)
... läuft mit dem Wert weiter, der beim Übergang in STOP gespeichert wurde.
Neustart (Warmstart) ... wird gelöscht und beginnt wieder von "0" an zu laufen.
Kaltstart

Diese Zustände hab ich gemeint, Auf diese hab ich keinen Einfluss, oder?


----------



## Guts2 (2 Dezember 2010)

Dotzi schrieb:


> ```
> FUNCTION_BLOCK "FB_Timer"
> TITLE =
> //This block counts the time during <B_my_Input> is true.
> ...




Ja danka, sowas hab ich gesucht


----------



## Onkel Dagobert (2 Dezember 2010)

Dotzi schrieb:


> ```
> FUNCTION_BLOCK "FB_Timer"
> TITLE =
> //This block counts the time during <B_my_Input> is true.
> ...


----------



## Dotzi (2 Dezember 2010)

Hi Dagobert,

danke für den Hinweis.
Funktioniert der Baustein in der nun vorliegenden Version?


```
FUNCTION_BLOCK "FB_Timer"
TITLE =
//This block counts the time during <B_my_Input> is true.
//The feedback is written in <T_my_Time>.
//<B_Reset> clears <T_my_Time>.
//
//2010-06-07 XXX
VERSION : 0.1
 
VAR_INPUT
  B_my_Input : BOOL ; 
  B_Reset : BOOL ; 
END_VAR
VAR_OUTPUT
  T_my_Time : TIME ; 
  B_Fault_my_Time : BOOL ; //Value out of Range
END_VAR
VAR
  B_FM : ARRAY  [1 .. 16 ] OF BOOL ; 
  T_my_Time_Stat : TIME ; 
  T_my_Time_Stat_prev : TIME ; 
  B_Overflow : BOOL ; 
END_VAR
VAR_TEMP
  T_Sys_Time_Temp : TIME ; 
END_VAR
BEGIN
NETWORK
TITLE =
      CALL "TIME_TCK" (// Read the System Time
           RET_VAL                  := #T_Sys_Time_Temp);
      U     #B_my_Input; // New Count (One Shot) ???
      FP    #B_FM[1]; 
      SPBN  _110; 
      L     #T_Sys_Time_Temp; // Init my_Time_Stat
      T     #T_my_Time_Stat; 
      R     #B_Overflow; 
_110: NOP   0; 
      U     #B_my_Input; // Count Time ???
      SPBN  _140; 
      L     #T_my_Time_Stat_prev; 
      L     #T_Sys_Time_Temp; 
      >D    ; // Overflow ???
      S     #B_Overflow; 
      U     #B_Overflow; 
      SPB   _120; 
      L     #T_my_Time_Stat; // Here no Overflow
      -D    ; 
      T     #T_my_Time; 
      SPA   _130; 
_120: NOP   0; // Here Overflow
      L     L#2147483647; // max. Time of SFC64
      L     #T_my_Time_Stat; 
      -D    ; 
      L     #T_Sys_Time_Temp; 
      +D    ; 
      U     OV; // Overflow in Result ???
      S     #B_Fault_my_Time; 
      T     #T_my_Time; 
_130: NOP   0; 
      L     #T_Sys_Time_Temp; // Save Sys_Time for next scan
      T     #T_my_Time_Stat_prev; 
_140: NOP   0; 
      U     #B_Reset; // Reset my_Time ???
      SPBN  _150; 
      L     0; 
      T     #T_my_Time; 
      R     #B_Overflow; 
      R     #B_Fault_my_Time; 
_150: NOP   0; 
      U     #B_Fault_my_Time; // Fault Handling
      SPBN  _160; 
      L     0; 
      T     #T_my_Time; 
_160: NOP   0; 
END_FUNCTION_BLOCK
```
 
Gruß


----------

