Wo liegt hier der Fehler? TON für Zykluszeitmessung, CODE hochgeladen

KingHelmer

Level-1
Beiträge
1.076
Reaktionspunkte
139
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo leute,

ich brauche in einem Programmbaustein die aktuelle Zykluszeit des Programms.
Diese wollte ich über die "Elapsed TIME" des TON (ET) herausfinden.

Also habe ich folgendes eingefügt:

Code:
Trigger_TON:= NOT Trigger_TON ;
Instanz1_TON(IN:= Trigger_TON, PT:= T#5s);

IF xUse_Cycle_Measurement = TRUE THEN

Cycle_Time:=TIME_TO_REAL(Instanz1_TON.ET);

ELSIF xUse_Cycle_Measurement = FALSE THEN

Cycle_Time:=TIME_TO_REAL(tCycle_Time);

END_IF;

die Cycletime bleibt bei "xUse_Cycle_Measurement" auf TRUE aber bei T#0s, genau so wie auch die Elapsed Time des TON.
Ich sehe aber, dass Trigger.TON TRUE wird.

Selbst, wenn man die IF Bedingungen komplett löscht, müsste der TON doch wenigstens eine ET beim Online-Watch anzeigen.
Hier kommt aber nüscht.

Kann mir jemand weiterhelfen?

Grüße,
Flo

PS:
System: Keins, nur Simulation
CodesysVersion: 2.3.X
 
Hi!
Versuch das mal:

Instanz1_TON(IN:= Trigger_TON, PT:= T#5s);
if not Trigger_TON then
Trigger_TON:=true;
end_if;
if Instanz1_TON.ET>0 then
Trigger_TON:=false;
end_if;

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallöchen,

das hat funktioniert, allerdings muss ich den Wert am Schluss noch durch zwei teilen, um die wirkliche Zykluszeit herauszufinden.
Denn hier "braucht" die IF bedingung ja einen zyklus, damit der TON angeschmissen wird.

Das muss man hier beachten.
Ansonsten funktioniert es so einwandfrei.

Mich würde nur interessieren, warum bei meiner Lösung nicht ging.....

Grüße,
Flo
 
Oder auch so:
Code:
VAR
   Timer:TON;
   GetCycleTime:BOOL;
   LastET:TIME;
   CycleTime:TIME;
END_VAR

Timer(In:=GetCycleTime,
         PT:=t#Länger als Du messen willst);
CycleTime:=Timer.ET-LastET;
LastET:=Timer.ET;
IF GetCycleTime AND (CycleTime>t#0ms)
THEN
   (* CycleTime gültig, mach was damit *)
END_IF

Deine Lösung funktionierte nicht, weil der Timer-Eingang nur für einen Zyklus True war.
 
Zuletzt bearbeitet:
Hallo leute,

ich brauche in einem Programmbaustein die aktuelle Zykluszeit des Programms.
Diese wollte ich über die "Elapsed TIME" des TON (ET) herausfinden.

Also habe ich folgendes eingefügt:

Code:
Trigger_TON:= NOT Trigger_TON ;
Instanz1_TON(IN:= Trigger_TON, PT:= T#5s);

IF xUse_Cycle_Measurement = TRUE THEN

Cycle_Time:=TIME_TO_REAL(Instanz1_TON.ET);

ELSIF xUse_Cycle_Measurement = FALSE THEN

Cycle_Time:=TIME_TO_REAL(tCycle_Time);

END_IF;

die Cycletime bleibt bei "xUse_Cycle_Measurement" auf TRUE aber bei T#0s, genau so wie auch die Elapsed Time des TON.
Ich sehe aber, dass Trigger.TON TRUE wird.

Selbst, wenn man die IF Bedingungen komplett löscht, müsste der TON doch wenigstens eine ET beim Online-Watch anzeigen.
Hier kommt aber nüscht.

Kann mir jemand weiterhelfen?

Grüße,
Flo

PS:
System: Keins, nur Simulation
CodesysVersion: 2.3.X



PROGRAM MAIN
VAR
Cycle_Time:UDINT;
Exec_Cycle_Time:UDINT;
_i:DINT;
END_VAR
(********************************************)

WHILE _i < 100000 DO
_i:=_i+1;
END_WHILE;
_i:=0;

(*TwinCAT PLC Utilities Library*)
(*Sehe GV InfoTaskArray*)
Exec_Cycle_Time:=Cycle_Time:=SystemTaskInfoArr[1].lastExecTime;(*abarbeitungszeit Programm in microsec*)
Cycle_Time:=SystemTaskInfoArr[1].cycleTime;(*Aktuelle Tasktime*)

(**********************************************)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
oder benutze NOW() as this gives the actual time.

irgendwo im program wieder auffragen und dan substrahieren.
den cycletime gibt es auch im resources.
overall cycletime wird nicht stabil sein durch interupts
 
Zurück
Oben