Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

Timer

Anonymous
2005-06-27
2005-06-29
  • Anonymous - 2005-06-27

    Originally created by: lieven

    Hi, an alle

    ich bin an einer weiteren Aufgabe dran, und suche Hilfe.

    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?

    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

     
  • Anonymous - 2005-06-28

    Originally created by: 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

    gruß

    lieven

     
  • Wolfgang Doll - 2005-06-29

    Hi lieven !

    lieven hat geschrieben:
    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.

    Die Beschreibung passt exakt auf the TP aus der standard.lib

    Du brauchst weder einen Flankenmerker noch sonstige Dinge drum herum. Der Timer liefert bei der ersten positiven Flanke einen

    Impuls für eine exakt vorgebare Zeit, egal was am Eingang passiert

    Viele Grüße

    Wolfgang

     

Log in to post a comment.