Zeitmessung mit IEC Timer

MPH

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

ich wollte die Ausführungszeit eines Programmabschnitts messen.
Ich habe das wie folgt realisiert:

IF xB1=True THEN

U:=230;
TON(IN:=xB1,PT:=t#10s);
zeit1:=TON.ET;
zeit11:=Time();

FOR i:=0 TO 30000 BY 1 DO
wert:=wert+1;
x:=x+1;
RR:=RR+1;
P:=(U*U)/RR;
y:=SQRT(x);
z:=SIN(y);
e:=EXP(x);
m:=ATAN(e);
END_FOR

zeit2:=TON.ET;
zeit22:=Time();

END_IF

Dauer:=zeit2-zeit1;
Dauer1:=zeit22-zeit11;


Mit der Funftion Time() funktioniert es und es berechnet mir eine Dauer von ca. 24ms. Ich dachte nun, dass es mit dem TON Timer und des abgreifens von ET auch genauso funktioniert. Aber die Werte sind immer identisch und die Differenz damit 0.
Könnte mir jemand kurz erklären warum und ht jemand vieleicht ne Idee wie es mit einem IEC Timer machen könnte????
Möchte oder muss die Funktion Time() nämlich vermeiden.

Vielen Dank schonmal:ROFLMAO:

Grüßle
 
Hi,

Ist Logisch:

....

U:=230;
TON(IN:=xB1,PT:=t#10s); ----> Hier wird die Zeitfunktion bearbeitet

zeit1:=TON.ET; ----> Hier greifst du auf eine Instanzvariable der Zeitfunktion zu

....

zeit2:=TON.ET; ----> Hier greifst du auf dieselbe Instanzvariable der Zeitfunktion zu
zeit22:=Time();

Die Variable TON.ET wird sich nur von Zyklus zu Zyklus ändern.

Gruss SW-Mech
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
und wenn du den Aufruf des TON dann auch noch in einer bedingten Bearbeitung machst dann bekommt er keinen Flankenwechsel am IN mit und wird sowieso nicht korrekt arbeiten ....

Gruß
Larry

Nachsatz:
Immer noch das Benchmark-Thema ?
Das wird (aber das hatte ich schon geschrieben) mit den internen Timern nicht besser oder präziser weil auch die mit der gleichen Zeitbasis arbeiten wie die andere Geschichte ...
 
Zuletzt bearbeitet:
Hi,

Ist Logisch:



Die Variable TON.ET wird sich nur von Zyklus zu Zyklus ändern.

Gruss SW-Mech

Danke für die schnelle Antwort. :-D
Okey. Heisst das, dass die Zeitfunktion TON nicht in einem Zyklus bearbeitet wird? Oder wie meinst du das mit "Die Variable TON.ET wird sich nur von Zyklus zu Zyklus ändern."??
Könntest du mir das vieleicht nochmal genauer erläutern?

Hättest du eine andere Idee, wie ich es mit einem IEC Timer realisieren könnte????
Oder gibt es eine andere Möglichkeit, die auch bei Siemens geht???

Vielen Dank

Grüßle
 
Hallo,
und wenn du den Aufruf des TON dann auch noch in einer bedingten Bearbeitung machst dann bekommt er keinen Flankenwechsel am IN mit und wird sowieso nicht korrekt arbeiten ....

Gruß
Larry


Nachsatz:
Immer noch das Benchmark-Thema ?
Das wird (aber das hatte ich schon geschrieben) mit den internen Timern nicht besser oder präziser weil auch die mit der gleichen Zeitbasis arbeiten wie die andere Geschichte ...

Hi Larry,
ja leider immernoch Benchmarkthema.:-?
ich hab mich wie gesagt schon verabschiedet genauer als ms zu sein. Das reicht mir aber auch schon mittlerweile. Ich muss halt irgendwie schaffen, das mit einem IEC Baustein zu realisieren, da das auf Step7 auch laufen soll.
Was meinst du mit "Aufruf des TON dann auch noch in einer bedingten Bearbeitung".????
So wie ichs jetzt gemacht habe oder wie?
Wird bei Schalten von xb1 auf True nicht die Flanke erkannt? Der Timer läuft doch an. Also hat er die Flanke doch mitbekommen oder???

Vielen Dank

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Hi,

Also ich habs jetzt mal so probiert, dass ich nach der Schleife einen weiteren TON starte und dann die Zeiten subtrahiere.


IF xB1=True THEN


U:=230;
TON(IN:=xB1,PT:=t#10s);
zeit1:=TON.ET;
zeit11:=Time();

FOR i:=0 TO 30000 BY 1 DO
wert:=wert+1;
x:=x+1;
RR:=RR+1;
P:=(U*U)/RR;
y:=SQRT(x);
z:=SIN(y);
e:=EXP(x);
m:=ATAN(e);
END_FOR

xb2:=true --> hier lasse ich den 2. TON starten
TON2(IN:=xb2,PT:=t#10s);

zeit2:=TON2.ET; --> ALs zeit2 nehme ich jetzt Zeit des 2. TON

zeit22:=Time();

END_IF

Dauer:=zeit1-zeit2; --> Nun ist es leider so, dass ich bei der Dauer über die TONs eine Zeit von 7ms erhalte
Dauer1:=zeit22-zeit11; --> Bei der Messung über die Systemzeit berechnet sich ein Wert von 25ms.

Welcher Wert ist nun Richtig? oder realistischer?
Kann ich es so lösen mit den beiden TON Timern? Oder ist das von der Denkweise her Bullshit?

Würde mich freuen wenn ihr mir nochmal helfen könntet.
:p

Grüße
 
Leg doch einfach mal den Aufruf des TON vor das IF ...

So, wie du es jetzt hast, ist es für den Timer nicht brauchbar ... vielleicht beim ersten Aufruf aber ganz sicher nicht mehr bei jedem weiteren ...

Gruß
Larry
 
Leg doch einfach mal den Aufruf des TON vor das IF ...

So, wie du es jetzt hast, ist es für den Timer nicht brauchbar ... vielleicht beim ersten Aufruf aber ganz sicher nicht mehr bei jedem weiteren ...

Gruß
Larry

Hi Larry

Also irgendwie raff ich des net.
Wenn ich den Timeraufruf ausserhalb der If Anweisung lege liegt die Dauer bei ca 34ms:


TON(IN:=xB1,PT:=t#10s);

IF xB1=True THEN


U:=230;
zeit1:=TON.ET;
zeit11:=Time();

FOR i:=0 TO 30000 BY 1 DO
wert:=wert+1;
x:=x+1;
RR:=RR+1;
P:=(U*U)/RR;
y:=SQRT(x);
z:=SIN(y);
e:=EXP(x);
m:=ATAN(e);
END_FOR

zeit2:=TON2.ET;
zeit22:=Time();

END_IF

Dauer:=zeit2-zeit1;
Dauer1:=zeit22-zeit11;


Wenn ich jetzt aber beide Aufrufe auserhalb der IF- Schleife lege, dann bin ich bei einer Zeit von über 2 sec.

TON(IN:=xB1,PT:=t#10s);
IF xB1=True THEN


U:=230;
zeit1:=TON.ET;
zeit11:=Time();

FOR i:=0 TO 30000 BY 1 DO
wert:=wert+1;
x:=x+1;
RR:=RR+1;
P:=(U*U)/RR;
y:=SQRT(x);
z:=SIN(y);
e:=EXP(x);
m:=ATAN(e);
END_FOR

END_IF

zeit2:=TON2.ET;

zeit22:=Time();


Dauer:=zeit2-zeit1;
Dauer1:=zeit22-zeit11;

Ich teste das im Moment in CoDeSys. Hier werden die ANwenderprogramme doch auch zyklisch abgearbeitet oder nicht?????
Warum ist es so ein ernormer Zeitunterschied. Ich stehe grad voll auf dem Schlauch......
:icon_sad:

Kannst du oder ihr mir weiterhelfen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Versuche es lieber doch mit nur einem Timer, aber so:
Code:
[COLOR=#3e3e3e]TON(IN:=xB1,PT:=t#10s);
IF xB1=True THEN[/COLOR]

[COLOR=#3e3e3e]U:=230;[/COLOR]
[COLOR=#3e3e3e]zeit1:=TON.ET;[/COLOR]
[COLOR=#3e3e3e]zeit11:=Time();[/COLOR]

[COLOR=#3e3e3e]FOR i:=0 TO 30000 BY 1 DO[/COLOR]
[COLOR=#3e3e3e]wert:=wert+1;[/COLOR]
[COLOR=#3e3e3e]x:=x+1;[/COLOR]
[COLOR=#3e3e3e]RR:=RR+1;[/COLOR]
[COLOR=#3e3e3e]P:=(U*U)/RR;[/COLOR]
[COLOR=#3e3e3e]y:=SQRT(x);[/COLOR]
[COLOR=#3e3e3e]z:=SIN(y);[/COLOR]
[COLOR=#3e3e3e]e:=EXP(x);[/COLOR]
[COLOR=#3e3e3e]m:=ATAN(e);[/COLOR]
[COLOR=#3e3e3e]END_FOR[/COLOR]

TON(ET=>Zeit2); (* statt [COLOR=#3e3e3e]zeit2:=TON.ET; *)[/COLOR]
[COLOR=#3e3e3e]zeit22:=Time();[/COLOR]

xB1:=false;  (* weiss nicht,ob Du das irgendwo anders untergebracht hast, aber ohne wird es nicht gehen *)
[COLOR=#3e3e3e]
END_IF[/COLOR]

[COLOR=#3e3e3e]Dauer:=zeit2-zeit1;[/COLOR]
[COLOR=#3e3e3e]Dauer1:=zeit22-zeit11;[/COLOR][COLOR=#3e3e3e][COLOR=#3e3e3e]
[/COLOR][/COLOR]
Voraussetzung ist, dass ET bei jedem TON-Aufruf aktualisiert wird, und nicht etwa nur einmal pro Programmzyklus. Ob das aber jede Steuerung so macht?
 
Versuche es lieber doch mit nur einem Timer, aber so:
Code:
[COLOR=#3e3e3e]TON(IN:=xB1,PT:=t#10s);
IF xB1=True THEN[/COLOR]

[COLOR=#3e3e3e]U:=230;[/COLOR]
[COLOR=#3e3e3e]zeit1:=TON.ET;[/COLOR]
[COLOR=#3e3e3e]zeit11:=Time();[/COLOR]

[COLOR=#3e3e3e]FOR i:=0 TO 30000 BY 1 DO[/COLOR]
[COLOR=#3e3e3e]wert:=wert+1;[/COLOR]
[COLOR=#3e3e3e]x:=x+1;[/COLOR]
[COLOR=#3e3e3e]RR:=RR+1;[/COLOR]
[COLOR=#3e3e3e]P:=(U*U)/RR;[/COLOR]
[COLOR=#3e3e3e]y:=SQRT(x);[/COLOR]
[COLOR=#3e3e3e]z:=SIN(y);[/COLOR]
[COLOR=#3e3e3e]e:=EXP(x);[/COLOR]
[COLOR=#3e3e3e]m:=ATAN(e);[/COLOR]
[COLOR=#3e3e3e]END_FOR[/COLOR]

TON(ET=>Zeit2); (* statt [COLOR=#3e3e3e]zeit2:=TON.ET; *)[/COLOR]
[COLOR=#3e3e3e]zeit22:=Time();[/COLOR]

xB1:=false;  (* weiss nicht,ob Du das irgendwo anders untergebracht hast, aber ohne wird es nicht gehen *)
[COLOR=#3e3e3e]
END_IF[/COLOR]

[COLOR=#3e3e3e]Dauer:=zeit2-zeit1;[/COLOR]
[COLOR=#3e3e3e]Dauer1:=zeit22-zeit11;[/COLOR][COLOR=#3e3e3e][COLOR=#3e3e3e]
[/COLOR][/COLOR]
Voraussetzung ist, dass ET bei jedem TON-Aufruf aktualisiert wird, und nicht etwa nur einmal pro Programmzyklus. Ob das aber jede Steuerung so macht?


http://www.sps-forum.de/member.php/29461-StructuredTrashhttp://www.sps-forum.de/member.php/29461-StructuredTrash
http://www.sps-forum.de/member.php/29461-StructuredTrash
http://www.sps-forum.de/member.php/29461-StructuredTrashHi vielen Dank für deinen Tipp,
ich Holzkopf hab natürlich net an xb1:=false gedacht.
Ich bin nicht mehr am PG. Werde es morgen sofort ausprobieren und Rückmeldung geben.
Weisst du speziell welche Steuerungen das machen mit der ET Aktualisierung oder war das nur mal so ein Einwurf? :)

Danke nochmal

Gruß
 
Weisst du speziell welche Steuerungen das machen mit der ET Aktualisierung oder war das nur mal so ein Einwurf? :)
Ich habe es gerade mal mit Beckhoff TwinCat versucht, und dort wird ET tatsächlich nur einmal pro Programmzyklus aktualisiert, auch wenn man den Timer mehrmals aufruft.
Wenn man mit 2 Timern arbeitet, wird der Zeitunterschied aber an den Werten der internen TON-Variablen "StartTime" sichtbar.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe es gerade mal mit Beckhoff TwinCat versucht, und dort wird ET tatsächlich nur einmal pro Programmzyklus aktualisiert, auch wenn man den Timer mehrmals aufruft.
Wenn man mit 2 Timern arbeitet, wird der Zeitunterschied aber an den Werten der internen TON-Variablen "StartTime" sichtbar.

Vielen Dank, das du es getestet hast!
Ich habe es jetzt mal so gemacht wie du beschrieben hast. Jetzt sind die Zeitmessungen identisch!

Was ist aber der Unterschied zwischen TON(ET=>Zeit2); und zeit2:=TON.ET????? Warum ist es so besser?

Was heisst das jetzt, wenn ET nur einmal pro Zyklus aktualisiert wird? Wie kannst du das sehen?
Ist die Messung somit ungenau und nicht verwendtbar? Weil mit dem Aufruf der Funktion Time() ist die Messung ja die selbe?!

Gruß
 
Was ist aber der Unterschied zwischen TON(ET=>Zeit2); und zeit2:=TON.ET????? Warum ist es so besser?
Zeit2:=TON.ET ist nur eine Zuweisung. In Zeit2 wird der Wert geschrieben, den der TON bei seinem letzten Aufruf in ET geschrieben hat, also der Wert, der auch schon in Zeit1 geschrieben wurde.
Mit TON(ET=>Zeit2) wird der Timer dagegen ein zweites Mal aufgerufen. Meine Hoffnung war, das er dabei auch ET erneut aktualisiert. Das scheint bei Deiner Steuerung ja auch so zu sein, aber das Beispiel
Beckhoff zeigt, dass nicht jede Steuerung das so macht. Vermutlich werden bei Beckhoff die ET's aller TON's nicht bei ihrem Aufruf im Programm, sondern nur einmal vor Beginn des Programmzyklus aktualisiert.
Sehen kann man das, wenn man eine sehr lange Zykluszeit vorwählt, in der die Entwicklungsumgebung ohne weiteres ihre Online-Anzeige mehrmals pro Programmzyklus aktualisieren kann. Bei einer Zykluszeit von z. B. 500 ms kann man dann sehen, dass die ET's aller TON's immer Vielfache von 500 ms sind, es gibt nie Zwischenwerte.
 
Vermutlich werden bei Beckhoff die ET's aller TON's nicht bei ihrem Aufruf im Programm, sondern nur einmal vor Beginn des Programmzyklus aktualisiert.

Verdammt das ist schlecht für mich.
Eine andere Möglichkeit als es mit IEC Timern zu machen scheint nicht möglich zu sein oder?
Leider benutzen alle Systeme einen anderen Aufruf um die Systemzeit auszulesen! Deshalb hab ich es mit IEC Timern versucht. Gibts noch die Möglichkeit sowas mit Taktgenerator oder so etwas zu messen?
Ich muss halt das selbe Messverfahren in STep 7, B&R, und Beckhoff machen können.

Auf jeden Fall vielen Dank für deine und eure Hilfe

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei Beckhoff gibt es, wie gesagt, die Möglichkeit, mit zwei Timern zu arbeiten und deren interne "StartTime"-Variablen voneinander zu subtrahieren. Das dürfte dann auch bei anderen CoDeSys-basierten Steuerungen funktionieren. Ob es diese Variable jedoch in den S7- und B&R-IEC-Timern gibt und ob sie von aussen zugänglich ist, weiss ich nicht.
 
Bei Beckhoff gibt es, wie gesagt, die Möglichkeit, mit zwei Timern zu arbeiten und deren interne "StartTime"-Variablen voneinander zu subtrahieren. Das dürfte dann auch bei anderen CoDeSys-basierten Steuerungen funktionieren. Ob es diese Variable jedoch in den S7- und B&R-IEC-Timern gibt und ob sie von aussen zugänglich ist, weiss ich nicht.

Kann es sein, dass es diesen erneuten Aufruf "TON(ET=>Zeit2)" nicht gibt in STep 7?????
Wenn ich es in STep7 so eintrage ist die komplette Zeile ROT, da die Synntax nicht stimmt.

Meinst du mit zwei Timern arbeiten, jetzt so wie ich es gemacht hatte??? Das ich im Endeffekt einfach einen 2. Timer nochmals aufrufe??

Vielen Dank

Gruß
 
Kann es sein, dass es diesen erneuten Aufruf "TON(ET=>Zeit2)" nicht gibt in STep 7?????
Wenn ich es in STep7 so eintrage ist die komplette Zeile ROT, da die Synntax nicht stimmt.
Wenn es nicht wie angegeben geht, dann vielleicht so:
Code:
TON();
Zeit2:=TON.ET;

Meinst du mit zwei Timern arbeiten, jetzt so wie ich es gemacht hatte??? Das ich im Endeffekt einfach einen 2. Timer nochmals aufrufe??
Im Prinzip ja, aber es geht dann nicht darum, die abgelaufenen Zeiten zu vergleichen, sondern die Startzeitpunkte. Bei Beckhoff/CoDeSys haben die Timer dazu eine Variable namens "StartTime".
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn es nicht wie angegeben geht, dann vielleicht so:
Code:
TON();
Zeit2:=TON.ET;

Ich habs hinbekommen. Bei STep 7 muss man warum auch immer auch die anderen Parameter IN und PT nochmal schreiben.
#TON(IN:=#Start, PT:=t#100s,
ET=>#Zeit2);
Dann gehts.

Im Prinzip ja, aber es geht dann nicht darum, die abgelaufenen Zeiten zu vergleichen, sondern die Startzeitpunkte. Bei Beckhoff/CoDeSys haben die Timer dazu eine Variable namens "StartTime".

Alles klar. Problem ist, dass es in Step7 diese Variable "StartTime" nicht gibt.
Mal sehen. Dann muss ich halt AUsführungszeiten messen, die immer über 500ms sind. :)

Vielen Dank für deine Hilfe

Gruß
 
Die Daten stehen im IDB des IEC-Timers, sind aber nicht rausgeführt.
Wenn die Adressen bei CoDeSys zufällig gleich sind könntest du indirekt auslesen...

T_ON:
DBD14 - Startzeit
DBD18 - Zeit nach Ablauf
 
Die Daten stehen im IDB des IEC-Timers, sind aber nicht rausgeführt.
Wenn die Adressen bei CoDeSys zufällig gleich sind könntest du indirekt auslesen...

T_ON:
DBD14 - Startzeit
DBD18 - Zeit nach Ablauf

Vielen Dank für deine Antwort.
Ich hatte es dann doch gefunden. Leider heisst es in Step 7 "STIME".

Muss mal weiter schauen. Jetzt gehts in Step 7 und CodeSys aber in B&R Automation nicht.

Vielen Dank an alle für eure Hilfe
 
Zurück
Oben