Zeitmessung

bastler

Level-2
Beiträge
258
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo
Ein Eingang (E1.0) wird ca. alle 20sek für 100ms gesetzt.
Wie kann ich die genaue Zeit zwischen den Setzen des Eingangs messen.
In Forum hab ich noch nichts passendes gefunden. CPU 315.

MfG
bastler
 
Du könntest bei steigender und fallender Flanke, mit
der systemfunktion SFC 64 TIME_TCK, die systemzeit
Auslesen. Die Differenz beider Werte im Time-Format
bildest durch DINT-Subtraktion.
Um genauere Werte zu bekommen, solltest du vielleicht
über einen Alarmeingang einlesen und das ganze im
OB40 machen.

Gruss Helmut
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In einem Weck OB mit kleinstmöglicher Zeit (zB 10ms)->Hardwarekonfig

Code:
L PEW 0 //Peripherieabbild aktualisieren
U E1.0
FP M1.0
SPB W //wenn Flanke Sprung
L MD2 
L 0.01 //10ms
+R
T MD2
SPA W3
W: L MD2
T MD6 //hier steht die Zeit des letzten Abstandes
L 0.0
T MD2
W3: NOP 0

nicht getestet....
 
Zuletzt bearbeitet:
Du könntest bei steigender und fallender Flanke, mit
der systemfunktion SFC 64 TIME_TCK, die systemzeit
Auslesen. Die Differenz beider Werte im Time-Format
bildest durch DINT-Subtraktion.
Um genauere Werte zu bekommen, solltest du vielleicht
über einen Alarmeingang einlesen und das ganze im
OB40 machen.

Gruss Helmut

Servus,

ich glaube er meint den Abstand zwischen den positiven Flanken und nicht die Flanke selbst, aber wer weiss....
 
Hallo
Ein Eingang (E1.0) wird ca. alle 20sek für 100ms gesetzt.
Wie kann ich die genaue Zeit zwischen den Setzen des Eingangs messen.
In Forum hab ich noch nichts passendes gefunden. CPU 315.
Hallo Bastler,
da gibt es hier im Forum sogar recht viel. :D
Das Schlüsselwort liegt hier im OB1
Code:
[COLOR=black][FONT=Courier New]L #OB1_prev_cycle[/FONT][/COLOR]
Merke Dir bei jedem Eingang den Wert der Variable und ziehe den neuen Wert von dem alten ab.
So hast Du die Vergangene Zeit Millisekunden genau.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Servus,

ich glaube er meint den Abstand zwischen den positiven Flanken und nicht die Flanke selbst, aber wer weiss....

hast vielleicht recht, dann also zwischen den positiven flanken, sollte
auch kein problemm sein. Aber ich tendiere mehr zum TIME_TCK, im
OB40, so bekommt man es fast ms genau.
 
hast vielleicht recht, dann also zwischen den positiven flanken, sollte
auch kein problemm sein. Aber ich tendiere mehr zum TIME_TCK, im
OB40, so bekommt man es fast ms genau.

Möglich, aber wenn die Zykluszeit hoch ist, dann nicht.
Bei Baugruppen die einen AlarmOB auslösen geht es noch genauer.
Das granulare 10ms (oder auch 1ms) gezaehle ist nicht so schlecht....
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Frage ist jetzt erstmal, wie genau braucht er es denn?!

@borromeus
Code:
L PEW0  //Peirpherieabbild aktualisieren
U E1.0
...
Korrigier mich wenn ich falsch liege, aber nur durch das Laden des PEW0 wird nicht das PAE aktualisiert.
Es fehlt noch das Transferieren in das PAE.

Code:
L PEW0
T EW0
Gruß wolder
 
Hallo zusammen
Da hab ich ja ne ganz schöne Diskussion entfacht. Erstmal vielen Dank für Eure Anregungen. Also ich möchte die Zeit zwischen den positiven Flanken des E1.0 messen, immer vom setzen des Eingangs bis zum nächsten setzen des Eingangs.
Da ich kein Programmierprofi bin wie Ihr, fällt es mir noch recht schwer da durchzusehen.


Gruß
baster
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier ein Beipiel mit TIME_TCK, zur vervollständigung.
(ist aber nicht getestet!)
Code:
//Peripheriewort umladen
      L     PEW    0
      T     MW    0
//Messung starten
      U     M     1.0
      FP    #FL_1
      SPBN  M002
//Zeit auslesen
      CALL  "TIME_TCK"
       RET_VAL:=#RET_VAL_SFC64
//Kontrolle ob Systemzeit überlauf??? wenn ja
//dann Wert korrigieren
      L     #RET_VAL_SFC64
      L     #last_time
      <D    
      SPBN  M001
      TAK   
      L     L#2147483647
      +D    
      L     #last_time
//Differenz zwischen den Durchläufen errechnen
M001: -D    
      L     #diff_time
//Systemezeit zwischenspeichern
      L     #RET_VAL_SFC64
      T     #last_time
M002: NOP   0
 
SFC64 "TIME_TCK" ungenau

Also ich würde nicht SFC64 "TIME_TCK" benutzen, die hat bei S7-300 nur eine Auflösung von 10 ms.

Besser ist SFC1 "READ_CLK" und dann die Differenz der Zeitwerte mit FC34 "SB_DT_DT" berechnen
lassen. Das ergibt die Zeit mit einer Auflösung von 1 ms.
Ohne zusätzlichen Aufwand verrechnen sich SFC1+FC34 einmal um Mitternacht Silvester 2089. ;-)
(FC34 "SB_DT_DT" aus Standard Library - IEC Function Blocks)

Bei der kurzen Zeitspanne von ca. 20 Sekunden ist auch ein einfaches Addieren von OB1_PREV_CYCLE
bei S7-300 genau genug (1 ms Auflösung).
Bei S7-400 wird die Genauigkeit einer beliebig langen Addition von OB1_PREV_CYCLE nur durch die
Genauigkeit der CPU-Uhr bestimmt. Die ms-Bruchteile werden gesammelt und einem späteren OB1_PREV_CYCLE
zugeschlagen, sobald die Summe der Bruchteile 1 ms erreicht.

Gruß
PN/DP
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ich würde nicht SFC64 "TIME_TCK" benutzen, die hat bei S7-300 nur eine Auflösung von 10 ms.

Besser ist SFC1 "READ_CLK" und dann die Differenz der Zeitwerte mit FC34 "SB_DT_DT" berechnen
lassen. Das ergibt die Zeit mit einer Auflösung von 1 ms.
Ohne zusätzlichen Aufwand verrechnen sich SFC1+FC34 einmal um Mitternacht Silvester 2089. ;-)
(FC34 "SB_DT_DT" aus Standard Library - IEC Function Blocks)

Bei der kurzen Zeitspanne von ca. 20 Sekunden ist auch ein einfaches Addieren von OB1_PREV_CYCLE
bei S7-300 genau genug (1 ms Auflösung).
Bei S7-400 wird die Genauigkeit einer beliebig langen Addition von OB1_PREV_CYCLE nur durch die
Genauigkeit der CPU-Uhr bestimmt. Die ms-Bruchteile werden gesammelt und einem späteren OB1_PREV_CYCLE
zugeschlagen, sobald die Summe der Bruchteile 1 ms erreicht.

Gruß
PN/DP

Mag ja sein, funktioniert aber alles nur in einem Weck-OB mit selbstgemachten TPA wenn die Zykluszeiten ein Vielfaches von ms sind.
Ist die Zykluszeit kurz genug ist die SFC1 Methode das genaueste.

lG
Karl
 
Zurück
Oben