Zeitmessung einer Schleife mit Hilfe von Flankenauswertung

MPH

Level-1
Beiträge
75
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Experten,

ich bin neu hier und erstmal ein herzliches "Hallo an alle....!

Ich donnere auch gleich mal die erste Frage rein. Ich versuche jetzt schon seit mehreren Tagen die Ausführungszeit einer Schleife zu messen. Ich bekomme aber leider weder eine Flankenauswertung, noch eine Speicherung der Zeitpunkte, geschweigedenn den Aufruf, dass es beim Anfang der Schleife losgeht, hin. :neutral: Ich habe bisher ausschliesslich in CoDeSys programmmiert und nur teilweise mit Step 7. Nun mus ich aber mit dem neuen TIA Portal arbeiten.

In CoDeSys gibts ja die Bausteine R_Trig und F_Trig. Gibts die in STep 7 auch????

Ich hatte mir mal nur eine einfache Flankenauswertung basteln wollen,um sie zu verstehen, die wie folgt aussieht:

VAR_Input
Trigger: Bool
VAR_Output
Zeitmessung: Time
VAR_Static
Zeit: Array[0..1] of Time
VAR_Temp
Flanke: Bool
Impuls: Bool



//Flankenbildung
#Impuls := #Trigger AND NOT #Flanke;
#Flanke := #Trigger;




IF #Impuls=TRUE THEN
#Zeit[0]:=TIME_TCK(); //Systemzeit speichern
END_IF;

Nun ist es aber so, wenn ich den Eingang auf TRUE setzte, wechselt der Wert Impuls immer Hin und her von True auf False. In Zeitraum von TRUE wird dann die mitlaufende Systemzeit kurz angezeigt. Es wird aber nie ein Wert im Array gespeichert. Also in dem Fall der Startzeitpunkt. Ich möchte die Werte in einem Array speichern und nicht in einem DB oder so, da der selbe Code auch noch in CoDeSys laufen soll. Dehalb versuche ich die klassischen sachen, wie Merker oder Datenbausteine zu umgehen.

Mache ich generell was falsch???

Hoffe ihr könnt mir helfen.

Vielen Dank schonmal an alle

Grüßle
 
U M2.0 //der zu Überwachende Merker
FP M2.1 //Hilfsmerker
=M2.2 //Flankenmerker

F_Trig und R_Trig gibt es in der PCS7 Bibliothek als FB
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit Schleife meinst du aber keine for oder while Schleife oder? :)

Wenn die Schleife startet, einen Timer starten (z.B. ton, die Zeit halt sehr lang setzten), wenn die Schleife beendet werden den aktuellen Zeitwert des Timers in einer Variable (weg)speichern.
 
Mache ich generell was falsch???

Hoffe ihr könnt mir helfen.

Vielen Dank schonmal an alle

Grüßle

Am einfachsten geht das wohl, wenn du direkt vor der Schleife einmal den sfc64 aufrufst, und den Ausgang (TIME) in den Lokaldaten ablegst.
Direkt nach der Schleife machst du noch nen sfc64 Aufruf, legst den Ausgang ebenfalls in den Lokaldaten ab, und subtrahierst dann Zeit 1 von Zeit 2.
So erhälst du die Laufzeit der Schleife in [ms]...

Ob das in Codesys genauso läuft? Keine Ahnung.

Micha
 
Zuviel Werbung?
-> Hier kostenlos registrieren
U M2.0 //der zu Überwachende Merker
FP M2.1 //Hilfsmerker
=M2.2 //Flankenmerker

F_Trig und R_Trig gibt es in der PCS7 Bibliothek als FB

Hi borromeus,
Vielen Dank für die schnelle Antwort.
Ich habe die FBs nicht gefunden bzw. kann sie nicht aufrufen. Muss ich die Bibliothek erst aktivieren oder so`?
 
Hi Leute vielen Dank für die schnellen Antworten....:razz:


Mit Schleife meinst du aber keine for oder while Schleife oder? :smile:

Wenn die Schleife startet, einen Timer starten (z.B. ton, die Zeit halt sehr lang setzten), wenn die Schleife beendet werden den aktuellen Zeitwert des Timers in einer Variable (weg)speichern.


Eigentlich meinte ich so etwas wie eine FOR Schleife.... Warum? Ist das Blödsinn?
Was meinst du mit "die Zeit sehr lange setzen"? Ist ein TON Timer genau genug um im ms Bereich zu messen?
Wie kann ich den Moment abpassen, wenn die Schleife startet?

For i=0 TO 1000 DO
hier dann den Timer starten????
Danke

Der Klassiker: #Flanke darf nicht VAR_Temp sein - muß Static oder In_Out.

Harald

Danke Harald. Ok das muss ich ändern. Komme aber erst morgen dazu wenn ich wieder am PG sitze. Vielen Dank


Am einfachsten geht das wohl, wenn du direkt vor der Schleife einmal den sfc64 aufrufst, und den Ausgang (TIME) in den Lokaldaten ablegst.
Direkt nach der Schleife machst du noch nen sfc64 Aufruf, legst den Ausgang ebenfalls in den Lokaldaten ab, und subtrahierst dann Zeit 1 von Zeit 2.
So erhälst du die Laufzeit der Schleife in [ms]...

Ob das in Codesys genauso läuft? Keine Ahnung.

Micha

Danke Micha. Den Aufruf des SFC64 so wie ich es gemacht habe???
zeit:=TIME_TCK();
FOR i=0 TO 1000 DO
.....

Wie lege ich Sie in den Lokaldaten ab? Kann ich sie nicht ins Array speichern? Wenn ich das Array wie oben deklariere ist es dann nicht LOKAL? Sonst kann ich doch nur die PLC Variablen anlegen, welche aber dann Global sind. Ausserdem kann ich hier kein Array anlegen....
Kannst du mir das Bitte nochmal kurz erläutern?!

Vielen vielen Dank

Gruß
 
Deine Deklaration ist lokal. Das passt schon!
Ich bin grad nur nicht sicher, was die SCL-Syntax der Zuweisung an das Array angeht.
Ich hab's net so mit SCL...

Muss wahrscheinlich so sein:
Code:
Zeit[0]:= time_tck();

...Schleife...

Zeit[1]:= time_tck();
Dauer:=Zeit[1]-Zeit[0];

Micha
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi borromeus,
Vielen Dank für die schnelle Antwort.
Ich habe die FBs nicht gefunden bzw. kann sie nicht aufrufen. Muss ich die Bibliothek erst aktivieren oder so`?

@borromeus.

Habe die FBs gefunden, obwohl sie hier P_TRIG und N_TRIG heissen. Stehen die nur für die CPU 300/400? zur Verfügung? Ich arbeite nämlich mit der SOFT SPS WIN AC.

Danke und Gruß
 
Deine Deklaration ist lokal. Das passt schon!
Ich bin grad nur nicht sicher, was die SCL-Syntax der Zuweisung an das Array angeht.
Ich hab's net so mit SCL...

Muss wahrscheinlich so sein:
Code:
Zeit[0]:= time_tck();

...Schleife...

Zeit[1]:= time_tck();
Dauer:=Zeit[1]-Zeit[0];

Micha


Komisch. Wenn ich den Wert Flanke wie von Harald beschrieben als STATIC deklariere funktioniert oder passiert überhaupt nichts mehr.
In dem Array, das ich befüllen will steht nie ein WERT. Gibt es eine andere Möglichkeit den Wert zu speichern?

Danke und Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hmm da keiner etwas in die Richtung gesagt hat, bin ich mir nicht mehr so sicher ob mein Gedanke richtig ist.. aber wenn die Schleife abgearbeitet wird bleibt doch das Programm solange "stehen". Setzt du also einen Merker am Anfang der Schleife und setzt den Zurück am Ende der Schleife so wird er im Programm immer nur als "0" auftauchen.

Es muss also in einem Zykluss zwei mal eine Zeit gestoppt werden. Dazu kann man dann keine Befehle verwenden die zwei Zyklen benötigen, also z.B. die Flankenauswertung.

Wie wäre es denn mit alternativen wie "letzte Zykusszeit" aus dem OB1 auslesen und eine Zylusszeit ohne Schleife subrahieren?

Man hat mir damals (tm) beigebracht, dass man Schleifen möglichst vermeiden soll.. und wenn dann müssen sie kurz sein und jeden zykluss durchlaufen werden. Deswegen finde ich den Gedanken schon merkwürdig eine Schleifenlaufzeit automatisch zu messen..

Geht es allgemein um die Laufzeit, dann > Online > Baugruppenzustand > letzte Zyklusszeit > F5 F5 F5.. ist zwar nicht auf die ms genau.. aber wenn da plötzlich astronomische Werte stehen überlege ich mir schnell etwas anderes.
 
Hmm da keiner etwas in die Richtung gesagt hat, bin ich mir nicht mehr so sicher ob mein Gedanke richtig ist.. aber wenn die Schleife abgearbeitet wird bleibt doch das Programm solange "stehen". Setzt du also einen Merker am Anfang der Schleife und setzt den Zurück am Ende der Schleife so wird er im Programm immer nur als "0" auftauchen.

Es muss also in einem Zykluss zwei mal eine Zeit gestoppt werden. Dazu kann man dann keine Befehle verwenden die zwei Zyklen benötigen, also z.B. die Flankenauswertung.

Wie wäre es denn mit alternativen wie "letzte Zykusszeit" aus dem OB1 auslesen und eine Zylusszeit ohne Schleife subrahieren?

Man hat mir damals (tm) beigebracht, dass man Schleifen möglichst vermeiden soll.. und wenn dann müssen sie kurz sein und jeden zykluss durchlaufen werden. Deswegen finde ich den Gedanken schon merkwürdig eine Schleifenlaufzeit automatisch zu messen..

Geht es allgemein um die Laufzeit, dann > Online > Baugruppenzustand > letzte Zyklusszeit > F5 F5 F5.. ist zwar nicht auf die ms genau.. aber wenn da plötzlich astronomische Werte stehen überlege ich mir schnell etwas anderes.


Das Problem was ich habe, ist das ich ein Programm schreiben soll, welches verschiedene SPS Systeme miteinander vergleichen kann. Sozusagen ein Benchmark Programm. Das klassische Benchmark ist ja die totale Auslastung der CPU mit Berechnungen von z.B. Primzahlen oder so. Das soll auch noch kommen. Ich soll jetzt aber noch andere Dinge finden um die Systeme zu vergleichen. Ich hab jetzt halt mal nach ein paar Anfängen gesucht, wo ich überhaupt was messen kann um etwas zu vergleichen. Dazu gehörte wie hier versucht einfach mal die Ausführungszeit einer Schleife zu messen.
Ist ein sehr schwieriges Thema.

Ich habe das jetzt mal so programmiert

VAR_Output
Dauer: TIME
VAR_Static
Zeit: Array [0..1] of TIME
VAR_Temp
i: INT
j: INT


#Zeit[0]:=TIME_TCK();
//Schleife starten
FOR #i:=0 TO 10000 BY 1 DO
#j:=#j+1;
END_FOR;
#Zeit[1]:=TIME_TCK();


#Dauer:=#Zeit[1]-#Zeit[0];

Jetzt ist es so, dass der Wert "Dauer" immer von 1ms auf 2ms hin und her dopst.
Es ist doch so, das die Schleife eigentlich in einem Zyklus abgearbeitet wird oder? Das heisst ja, die Schleife wird inerhalb eines Zykluses auf 10000 hochgezählt?!
Mir wird jetzt aber von der CPU eine durschnittliche Zykluszeit von 0,3 ms angezeigt. Dann kann es doch nicht sein, das die Schleife 1-2ms andauert oder.
Ist das einfach nur bullshit was ich hier mache oder habe ich nur einen Denkfehler? Ist es überhaupt möglich diese Zeit zu messen?
Ausserdem hätte ich gerne am Schluss irgendwie einen Wert der dann fix ist. Mir ist schon lar, dass die Zeit immer wieder aktualisiert wird, weil der FB ja im OB1 zyklisch abgearbeitet wird. Aber wie kann ich mir diese Werte speichern um sozusagen aus 10 dieser Zeitwerte einen Mittelwert zu berechnen??

Habt ihr vieleicht noch irgendwelche ideen oder ANsätze, wie ich ausagekräftige Werte vergleichen Kann für eine Art Benchmark?

So jetzt hab ich euch ganz schön zugemüllt mit meinem Gejammer. Hoffe ihr könnt mir noch weiterhelfen

Vielen Dank schonmal für die bisherigen Antworten. Echt super von euch

Gruß
 
Hallo,

das Problem ist eher das du nur im ms Bereich messen kannst da der Datentyp Time die Werte nur als Ganzzahlige ms speichert.
Du kannst ja nur deine Schleife im OB1 laufen lassen, dann kannst ja die Zykluszeit ablesen so wie du es eh schon gemacht hast.
Ausserdem kannst du mit solchen "Benchmarks" sowieso keine Aussage über das System machen da ja die I/O Zugriffszeiten usw bei einer Steuerung auch interessant sind.

godi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Problem was ich habe, ist das ich ein Programm schreiben soll, welches verschiedene SPS Systeme miteinander vergleichen kann. Sozusagen ein Benchmark Programm. Das klassische Benchmark ist ja die totale Auslastung der CPU mit Berechnungen von z.B. Primzahlen oder so. Das soll auch noch kommen. Ich soll jetzt aber noch andere Dinge finden um die Systeme zu vergleichen. Ich hab jetzt halt mal nach ein paar Anfängen gesucht, wo ich überhaupt was messen kann um etwas zu vergleichen. Dazu gehörte wie hier versucht einfach mal die Ausführungszeit einer Schleife zu messen.
Ist ein sehr schwieriges Thema.

Ich habe das jetzt mal so programmiert

VAR_Output
Dauer: TIME
VAR_Static
Zeit: Array [0..1] of TIME
VAR_Temp
i: INT
j: INT


#Zeit[0]:=TIME_TCK();
//Schleife starten
FOR #i:=0 TO 10000 BY 1 DO
#j:=#j+1;
END_FOR;
#Zeit[1]:=TIME_TCK();


#Dauer:=#Zeit[1]-#Zeit[0];

Jetzt ist es so, dass der Wert "Dauer" immer von 1ms auf 2ms hin und her dopst.
Es ist doch so, das die Schleife eigentlich in einem Zyklus abgearbeitet wird oder? Das heisst ja, die Schleife wird inerhalb eines Zykluses auf 10000 hochgezählt?!
Mir wird jetzt aber von der CPU eine durschnittliche Zykluszeit von 0,3 ms angezeigt. Dann kann es doch nicht sein, das die Schleife 1-2ms andauert oder.
Ist das einfach nur bullshit was ich hier mache oder habe ich nur einen Denkfehler? Ist es überhaupt möglich diese Zeit zu messen?
Ausserdem hätte ich gerne am Schluss irgendwie einen Wert der dann fix ist. Mir ist schon lar, dass die Zeit immer wieder aktualisiert wird, weil der FB ja im OB1 zyklisch abgearbeitet wird. Aber wie kann ich mir diese Werte speichern um sozusagen aus 10 dieser Zeitwerte einen Mittelwert zu berechnen??

Habt ihr vieleicht noch irgendwelche ideen oder ANsätze, wie ich ausagekräftige Werte vergleichen Kann für eine Art Benchmark?

So jetzt hab ich euch ganz schön zugemüllt mit meinem Gejammer. Hoffe ihr könnt mir noch weiterhelfen

Vielen Dank schonmal für die bisherigen Antworten. Echt super von euch

Gruß

Gib ihm halt mal mehr zu tun.
Was erwartest du denn für Zykluszeiten wenn die CPU nur einmal bis 10000 hochaddieren muß?

Nachtrag:
Ich habe das mal ausprobiert mit ner 315-2PN/DP. In der Schleife habe ich eine Konstante 30000 mal in die Lokaldaten kopiert.
Die Messung passt +-1ms mit der Onlinediagnose zusammen...

Zeitmessung.jpg
 
Zuletzt bearbeitet:
Hallo,

das Problem ist eher das du nur im ms Bereich messen kannst da der Datentyp Time die Werte nur als Ganzzahlige ms speichert.
Du kannst ja nur deine Schleife im OB1 laufen lassen, dann kannst ja die Zykluszeit ablesen so wie du es eh schon gemacht hast.
Ausserdem kannst du mit solchen "Benchmarks" sowieso keine Aussage über das System machen da ja die I/O Zugriffszeiten usw bei einer Steuerung auch interessant sind.

godi

Gibt es eine Möglichkeit genauer zu messen? Meinst du es wäre Sinvoll sich auf die Zugriffszeiten der I/os zu konzentrieren?

Vielen Dank

Gib ihm halt mal mehr zu tun.
Was erwartest du denn für Zykluszeiten wenn die CPU nur einmal bis 10000 hochaddieren muß?

Nachtrag:
Ich habe das mal ausprobiert mit ner 315-2PN/DP. In der Schleife habe ich eine Konstante 30000 mal in die Lokaldaten kopiert.
Die Messung passt +-1ms mit der Onlinediagnose zusammen...

Anhang anzeigen 18345
Hi,
danke das du es getestet hast. Ich erwarte bei meiner Schleife keine beonders großen Zykluszeiten. Ich verstehe nur nicht, wie die 1-2ms zustande kommen, wenn der Zyklus 0,3 ist. Dann müsste mir die Subtraktion doch eher 0 anzeigen statt 1ms oder?
Sorry das ich nochmal so dumm nachfrage. Wie meinst du das in die Lokaldaten schreiben. Ich kenne mich wie gesagt nur gut in CodeSys aus. Wie schreibe ich den scheiß in die Lokaldaten? Sind nicht alle Variablen Lokal ausser die PLC Variablen?
Ich weiss auch immer noch nicht wie ich die Werte speichern kann. Ich müsste doch diese messung von 1ms irgendwo ablegen können, dass sie nach jedem Schleifendurchlauf irgendwo fest steht.
In CoDesys waren die Werte dann immer im Array gespeichert ohne sich wieder zu verändern und ich konnte sie dann weiterverarbeiten.

Danke dir



Die Ausführungszeit von S7-Anweisungen ist dokumentiert.. dafür braucht man kein Benchmark schreiben.

Ich weiss dass die Ausführungszeiten im Handbuch stehen. War halt ein kläglicher Versuch mal mit irgendetwas anzufangen.
Meine AUfgabe lautet halt wie gesagt so ein Programm zu schreiben um zu testen welches SPS System unter welchen Voraussetzungen am schnellsten und stabilsten läuft.

Hast du oder IHr Ideen, wie ich da besser rangehen könnte? Hab im Moment noch net so richtig Ahnung was ich so messen und vergleichen soll.....

Vielen Dank weiterhin für eure zahlreichen Hilfen :ROFLMAO:

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich würde sagen, dass deine Vorgehensweise vom Code her korrekt ist.
Du mußt hier aber auch noch berücksichtigen, dass der Baustein "Time_Tick" auch eine Laufzeit hat. Außerdem ist es schwierig in einem System etwas unter 1 ms zu messen wenn das Sstem nur auf ms auflösst und es das auch anscheinend nicht so genau nimmt.
In der Messtechnik sagt man ja eigentlich, dass die Mess-Mimik immer um den Faktor 10 genauer sein soll als die Genauigkeit, die man erreichen möchte ... das passt ja hier nun nicht so ganz ... 8)

Gruß
Larry
 
Meine AUfgabe lautet halt wie gesagt so ein Programm zu schreiben um zu testen welches SPS System unter welchen Voraussetzungen am schnellsten und stabilsten läuft.

Wer denkt sich solche Aufgaben aus? Ehrlich.. die Entscheidung welche SPS ich nutze mache ich sicherlich nicht von "stabil" abhängig. (Kann man ehe nicht bewerten) Und wie hier schon geschrieben worden ist: schnell ist relativ und von ein paar dutzend Faktoren abhänig. Und zumindestens mit S-Komponenten wird man (fast) jedes technische Problem lösen können. (Eine 319 / 416 / WinAC kann schon ziemlich große Anlagen steuern).
Viel wichtiger sind die fähigkeiten des Programieres. Der eine hat verstanden wie man S7 Programmiert und automatisiert locker eine große Fertigungsstraße, der andere klickt nur seine Schrittketten in Graph ab und wundert sich warum die CPU so schnell voll wird..

Programmiere eine Schleife aus ein paar zehn(hundert?)tausend Gleitpunkt Optionen, stell den watchdog auf 100ms und schau wieviele Durchgänge die SPS schafft.. Den Wert kannste dann ausdrucken und dir (oder deinem Cheff) an die Wand hängen ;)
 
Zuletzt bearbeitet:
Hi Leute,

weiterhin vielen Dank für die Anregungen und Hilfen.
Ich hätte mal noch eine andere Frage. Gibt es die Möglichkeit die Zeit mit einem IEC Timer zu messen? Also anstatt des Aufrufs von SFC64????

Vielen Dank

Gruß
 
Zurück
Oben