# CoDeSys TP Baustein



## -ASDF- (14 November 2011)

Hallo Forum,

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


```
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:

```
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
```


----------



## StructuredTrash (14 November 2011)

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.

```
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;
```


----------



## -ASDF- (14 November 2011)

Ok nur noch die Zeit auf 0 setzen wärend die Andere läuft und passt (wegen Visu) 

Vielen dank auf jedenfall!


----------

