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

Hilfe für Wartefunktion benötigt

Hubert-De
2012-02-24
2012-02-28
  • Hubert-De - 2012-02-24

    Hallo, ich häng seit 1,5 Tagen und weiß nicht wie ich eine Wartefunktion in einer Schleife implementieren soll, die bei jedem Schleifendurchlauf aber benutzt wird.
    Hintergrund ist: Ich will einen Wert hochzaehlen, wenn eine Taste gedrückt ist. Dies soll aber nicht schnellstmöglich gehen, sondern dass sich der Wert (für eine Widerstandsdekade) alle 500ms um 1 erhöht. Das hochzaehlen funktioniert und einen Timer hätt ich mit einem TP Glied realisiert. Nur die Wartefunktion wird nur einmal ausgeführt, da ja im nächsten Ablauf ET= PT ist und somit die Wartefunktion einfach durchgeschleift wird. Den Wert ET kann ich aber nicht zurücksetzen.
    Gibts einen fertigen Baustein Timer oder wo hab ich grad das Brett vor dem Kopf?

    Vielen Dank schonmal!

    PS: hier noch mein Code
    //
    IF Ergebnis_PP <255 AND PP_Plus_kurz = TRUE THEN

    warte:=TRUE;
    Warten(IN:= warte, PT:= T#200ms);
    setzen_moeglich:= NOT Warten.Q;
    ( schleife wird bisher nur einmal abgearbeitet)
    IF setzen_moeglich = TRUE THEN
    Ergebnis_PP:= Ergebnis_PP +1;
    in_bits_wandeln(In:=Ergebnis_PP);
    OUT_Pp_Bit0 := in_bits_wandeln.B0;
    OUT_Pp_Bit1 := in_bits_wandeln.B1;
    OUT_Pp_Bit2 := in_bits_wandeln.B2;
    OUT_Pp_Bit3 := in_bits_wandeln.B3;
    OUT_Pp_Bit4 := in_bits_wandeln.B4;
    OUT_Pp_Bit5 := in_bits_wandeln.B5;
    OUT_Pp_Bit6 := in_bits_wandeln.B6;
    OUT_Pp_Bit7 := in_bits_wandeln.B7;
    setzen_moeglich := FALSE;
    warte:= False;
    END_IF
    END_IF

     
  • Rolf-Geisler - 2012-02-24

    Hallo,
    Du brauchst zwei Timer, die sich gegenseitig anstossen. Die Flanke eines Timersignals verwendest Du zum Hochzählen.
    Hier ein Beispiel, was ich in allen Projekten als 1s-Taktgenerator benutze :

    FUNCTION_BLOCK FB_Blinker
    (*
    Blinker, 1-s-Takt
    *)
    VAR_INPUT
      Enable  : BOOL;
    END_VAR
    VAR_OUTPUT
      Q       : BOOL;
    END_VAR
    VAR
      Puls    : BOOL;
      tPuls   : TON;
      TPause  : TON;
    END_VAR
    IF Enable
    THEN tPuls  (IN := NOT Puls, PT := TIME#500ms);
         tPause (IN :=     Puls, PT := TIME#500ms);
         IF tPuls.Q
         THEN Puls := TRUE;
         END_IF;
         IF tPause.Q
         THEN Puls := FALSE;
         END_IF;
         Q := Puls;
    ELSE Q := FALSE;
    END_IF;
    

    Q ist das besagte Signal, dessen Flanke zum Zählen verwendet werden kann.
    Gruss

     
  • Hubert-De - 2012-02-27

    Vielen Dank für die ausführliche Antwort.
    Werds morgen gleich mal implementieren, sollte dann ohne Probleme laufen.

    VG
    Hubert

     
  • Erik Böhm - 2012-02-28

    Moin

    Ich denke es geht auch einfacher:

    FUNCTION_BLOCK OSZILLATOR_FB
    VAR_INPUT
    T1 : TIME := t#500ms; ( Pausendauer )
    T2 : TIME := t#500ms; ( Pulsdauer )
    END_VAR
    VAR_OUTPUT
    Q : BOOL;
    END_VAR
    VAR
    blinker:BLINK;
    END_VAR

    blinker(enable:=TRUE,TIMELOW:=T1,TIMEHIGH:=T2);
    Q := blinker.out;

    Jedesmal wenn von Q eine steigende Flanke kommt hochzählen.

    Gruß Erik

     
  • Hubert-De - 2012-02-28

    Hallo,
    ja da war das Brett vorm Kopf. Blinker macht ja genau ein zyklisches Ein/Aus mit einstellbarer Zeitgrenze. Hab den Blinker zur Zeit diverese Male verwendet, aber eben nur für ein zyklisches Einschalten einer LED, da hätt mir das auch auffallen können
    aber mit der Wartefunktion mit 2 Signalen hats auch ganz gut funktioniert und lass es jetzt so drin
    Vg
    Hubert

     

Log in to post a comment.