CoDeSys TP Baustein

-ASDF-

Level-1
Beiträge
235
Reaktionspunkte
8
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Forum,

Ich habe ein Baustein Programmiert in dem ich den Timer Pulse verwende.
Der Baustein sieht wie folgt aus:

Code:
IF Freigabe THEN
TP_IMP(IN:=NOT Q_TP_PAU , PT:=Imp_Zeit , Q=>Q_TP_IMP , ET=>Imp_Zaehl);
TP_Pau(IN:=NOT Q_TP_IMP , PT:=Pau_Zeit , Q=>Q_TP_PAU , ET=>Pau_Zaehl);
    IF Q_TP_IMP THEN
    Anst:=TRUE;
    ELSE
    Anst:=FALSE;
    END_IF
ELSE
Imp_Zaehl:=t#0s;
Pau_Zaehl:=t#0s;
Anst:=FALSE;
END_IF

Mein Problem ist jetzt nur dass wenn "Freigabe" false ist die 2 TPs trotzdem "intern" weiter zählen... (Obwohl Sie ja eigentlich durch das IF... sozusagen ausgeklammert sind.
Was überseh ich da? bzw. Woran liegt das?

Schonmal danke für die Hilfe

EDIT: Hier die Deklaration:
Code:
VAR_INPUT
	Imp_Zeit:TIME;
	Pau_Zeit:TIME;
	Freigabe:BOOL;
END_VAR
VAR_OUTPUT
	Imp_Zaehl:TIME;
	Pau_Zaehl:TIME;
	Anst:BOOL;
END_VAR
VAR
	TP_IMP:TP;
	TP_PAU:TP;
	Q_TP_IMP:BOOL;
	Q_TP_PAU:BOOL;
END_VAR
 
Zuletzt bearbeitet:
Die FB's der Standard-Lib sind durchweg für einen zyklischen Aufruf gedacht. Bei bedingtem Aufruf entspricht die Funktion nicht immer dem, was man erwartet.
Unabhängig davon ist für einen Impuls-Pause-FB, dessen Ausgang bei fehlender Freigabe auf False gehen soll, ein TON besser geeignet.
Code:
VAR
   Timer:TON;   (* anstelle der beiden TP's *)
END_VAR

IF Anst
THEN
   Timer.PT:=Imp_Zeit;
   Imp_Zaehl:=Timer.ET;
ELSE
   Timer.PT:=Pau_Zeit;
   Pau_Zaehl:=Timer.ET;
END_IF;

Timer(In:=Freigabe and not Timer.Q);
IF Freigabe
THEN
   IF Timer.Q
   THEN
      Anst:=not Anst;
   END_IF;
ELSE
   Imp_Zaehl:=t#0s;
   Pau_Zaehl:=t#0s;
   Anst:=False;
END_IF;
 
Zuletzt bearbeitet:
Zurück
Oben