TIMER in ST

A

Anonymous

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich brauche eure Hilfe. Bin ein Neuling in CoDeSys und ST.

Ich habe einen FB erstellt, der folgendes machen soll:
Wenn an einem Eingang eine pos. Flanke auftritt, dann starte einen Timer von x Sekunden, unabhängig was in der Zwischenzeit an diesem Eingang passiert.

Der Code ist noch nicht optimiert!

FRAGE: Der Timer läuft nur ein einziges mal ab, warum?

Ich habe es mit einer eigenen Version, mit einem Flag das gestzt wird, wenn der Eingang 0 ist probiert, doch dort läuft die Funktion auch nur einmal durch?

FRAGE: Mach ich vielleicht etwas mit dem Simulator falsch?

Code:
FUNCTION_BLOCK Flanke_Impuls_Zeit 

VAR_INPUT 
   blImpuls_Start: BOOL; 
END_VAR 

VAR_OUTPUT 
   blZeitimpuls_Gesetzt: BOOL; 
END_VAR 

VAR 
   blFlag_Merker_Impuls_Start:BOOL; 
   blFlanken_Impuls: BOOL:=FALSE; 
   blTemp_Zeitimpuls_Gesetzt: BOOL:= FALSE; 
END_VAR 

VAR PERSISTENT 
   blFlanke_Positiv: R_TRIG; 
   timeZeit_Impuls: TP; 
   timeZeitdauer_Impuls: TIME:=T#5s; 
   timeAnzeige: TIME; 
END_VAR 

blFlanke_Positiv(CLK:= blImpuls_Start);                                    (* Aufruf von R_TRIG *) 
blFlag_Merker_Impuls_Start:= blFlanke_Positiv.Q; 

IF blFlag_Merker_Impuls_Start=TRUE THEN 
   blFlanken_Impuls:= TRUE;                                          (* Kopieren *) 
END_IF; 


IF blFlanken_Impuls=TRUE THEN                                       (* Abfragen ob Positive Flanke *) 
   timeZeit_Impuls (IN  :=  blFlanken_Impuls, PT:= timeZeitdauer_Impuls );      (* Timer TP aufrufen *) 
   blTemp_Zeitimpuls_Gesetzt:= timeZeit_Impuls.Q; 
   timeAnzeige:=timeZeit_Impuls.ET;                                    (* ablaufende Zeit abfragen *) 

   IF timeAnzeige >= timeZeit_Impuls.PT THEN                           (* Wenn abgelaufene Zeit der gesetzten entspricht, blFlanken_Impuls zurücksetzen *) 
      blFlanken_Impuls:= FALSE; 
   END_IF; 

END_IF;

Freu mich, wenn mir jemand weiterhelfen kann. DANKE

lieven
 
Hab die Antwort selbst gefunden. Weis nicht warum ich die Sache so kompliziert gemacht habe, hier ne Lösung die Funktioniert:

Code:
FUNCTION_BLOCK Flanke_Impuls

(* Eingang *)
VAR_INPUT
	Eingangs_Impuls: BOOL;
END_VAR

(* Ausgang *)
VAR_OUTPUT
	Ausgangs_Impuls: BOOL;
END_VAR

(* Lokal *)
VAR
	Timer: TP;								(* Timer vom Typ TP, Impuls *)
	Flanken_Merker: BOOL:= FALSE;
	Zeitdauer: TIME;						(* Zeitdauer einstellbar *)
	Zeit: TIME;								(* dient der Kontrolle *)
END_VAR


(* Flanken-Erkennung  *)
IF Eingangs_Impuls=TRUE THEN
	Flanken_Merker:= TRUE;
END_IF;

(* Aufruf der Timerfunktion TP aus der Standard LIB *)
Timer(IN:= Flanken_Merker, PT:= Zeitdauer);
Ausgangs_Impuls:=Timer.Q;
Zeit:= Timer.ET;
IF Timer.ET >= Timer.PT THEN
	Flanken_Merker:= FALSE;
END_IF;

Danke fürs lesen :lol:

gruß
lieven
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Timer in ST

Hallo lieven,

ich würde es so machen:

Code:
FUNCTION_BLOCK Flanke_Impuls 

(* Eingang *) 
VAR_INPUT 
   Eingangs_Impuls: BOOL; 
   Zeitdauer: TIME;                  (* Zeitdauer einstellbar *)
END_VAR 

(* Ausgang *) 
VAR_OUTPUT 
   Ausgangs_Impuls: BOOL;
   Zeit: TIME;                        (* dient der Kontrolle *)  
END_VAR 

(* Lokal *) 
VAR 
   Timer: TOF;                        (* Timer vom Typ TOF*) 
   Flanke: R_TRIG; 
END_VAR 


(* Flanken-Erkennung  *) 
Flanke(CLK:= Eingangs_Impuls);

(* Aufruf der Timerfunktion TOF aus der Standard LIB *) 
Timer(IN:= Flanke.Q, PT:= Zeitdauer); 
Ausgangs_Impuls:=Timer.Q; 
Zeit:= Timer.ET;

Mfg
 
Zurück
Oben