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

Taster entprellen, Taster mit Schalterverhalten

mwatermann
2006-08-01
2007-04-13
  • mwatermann - 2006-08-01

    guten morgen,

    kann mir evtl mal jemand auf die sprünge helfen; denke ich habe grad ne blokade... :-/

    ich möchte einen taster einlesen, der eine led schaltet. also ein tastendruck (ca. 500ms) soll eine led so lange schalten, bis ich diesen taster wieder drücke.

    bislang versuche ich das ganze als funktionsblock (debounce) in ST zu lösen, leider ohne erfolg...

    bin für jede anregung dankbar.

    mfg

     
  • mwatermann - 2006-08-01

    bin schon weiter... hatte die falsche variable eingelesen :-/

    der code "toggelt" die led quasi alle sekunde:


    IF AutoManual = TRUE AND TIMER_FLAGS._1000ms THEN

    IF OldState = TRUE THEN
    
        SwitchState := FALSE;
    
        OldState := FALSE;
    
    ELSIF OldState = FALSE THEN
    
        SwitchState := TRUE;
    
        OldState := TRUE;
    
    END_IF;
    

    END_IF;


    AutoManual ist der taster um den es sich dreht und und SwitchState dann die ausgabe, also der "schalter" (TIMER_FLAGS._1000ms ist alle 1000ms genau einen durchlauf lang TRUE => timer)

    für erweiterungen und verbesserungen wäre ich dankbar...

    mfg

     
  • Denkes - 2006-08-02

    Hallo Marcus,

    danke für die private Nachricht. Das war mein erster Beitrag im Forum und ich hatte nur den falschen Button erwischt. Du kannst meinen Beitrag gern öffentlich in das Forum stellen, denn ich muss schon feststellen, dass viele Antworten im Forum die gestellten Fragen nicht beantworten (zum Teil auch falsch sind)

    Tschüss Norbert

     
  • J Schohaus - 2006-08-03

    Du kannst dein Programm wesentlich einkürzen.

    Dein Programm Toggelt SwitchState bei jeden durchlauf.

    IF OldState = TRUE THEN

    SwitchState := FALSE;

    OldState := FALSE;

    ELSIF OldState = FALSE THEN

    SwitchState := TRUE;

    OldState := TRUE;

    END_IF;

    Den gleichen erfolg hättest du hirmit

    SwitchState := NOT SwitchState ;

     
  • mwatermann - 2006-08-03

    danke euch beiden für die hilfe und anregungen.

    hier nun der code von Norbert, wie ich ihn implementiert habe.

    funktioniert einwandfrei.

    vielen dank dafür!

    ========================================

    FUNCTION_BLOCK LP100_Button2Switch

    VAR_INPUT

    bInput : BOOL;  (* input from button *)
    

    END_VAR

    VAR_OUTPUT

    bOutput : BOOL; (* debounced switch output *)
    

    END_VAR

    VAR

    SR1: SR;
    
    SR2: SR;
    
    TON1: TON;
    

    END_VAR

    ========================================

    ( --- button can be used as a (debounced) latched switch --- )

    TON1(IN := bInput, PT := T#50ms); ( debounce pressed button )

    SR1(SET1 := TON1.Q AND NOT SR2.Q1, RESET := TON1.Q AND SR2.Q1); ( use two SR FlipFlops to toggle the switch state )

    SR2(SET1 := NOT TON1.Q AND SR1.Q1, RESET := NOT TON1.Q AND NOT SR1.Q1);

    bOutput := SR1.Q1; ( output debounced switch state )

    ========================================

     
  • hugo - 2006-08-29

    hallo schau dir mal die freien bibliotheken von oscat (open source community for automation technology) an

    http://www.oscat.de

    lade die bibliothek 1.0 und du findest dort einen swith_i

    der macht alles was du willst und noch vieles mehr

     
  • mwatermann - 2006-08-30

    wow, danke dir!

    wird bestimmt noch einmal hilfreich sein.

    mfg, Marcus

     
  • mwatermann - 2006-08-30

    PS: seit gestern gibt's die version 1.1

     
  • hugo - 2006-08-30

    ja ich entwickle selber daran mit.

    hoffentlich finden sich noch viele die testen und weiterentwickeln

     
  • hugo - 2006-10-07

    auf w www.oscat.de w ist die neuste lib 1.2

    die hat einen intelligenten schalter "switch_i"

    dieser schalter configuriert sich selber auf (öffner, schliesser oder wechselschalter.

    er kann mit ontime begrenzung und externen on off bedient werden.

     
  • mwatermann - 2006-10-09

    sehr schön, danke

    gleich mal durchschauen die neue bibliothek...

     
  • sborisgmxat - 2007-04-10

    Hallo

    ich habe genau das gleich problem wie oben erwähnt! ich habe die Oscat.lib schon durchsucht und bin dort auch fündig geworden! jetzt stellt sich die frage ob es in den codesys libs nicht auch so einen switch_I Block gibt! ich kann leider keinen finden. es geht mir darum das mein programm auch für neuere versionen gültig bleibt und deswegen würde ich gerne nur die codesys libs verwenden!!

    wäre für jede hilfe dankbar

    mfg boris

     
  • gravieren - 2007-04-10

    Hi

    Zitat:
    es geht mir darum das mein programm auch für neuere versionen gültig bleibt und deswegen würde ich gerne nur die codesys libs verwenden!!

    Ziehe dir den Code von der OSCAT einfach raus und ergänze/integriere

    diese in deinem Programm.

    Dieses ist erlaubt und in deinem Fall möglicherweise Sinnvoll.

    P.S: OSCAT.lib ist Quelltextoffen und frei verwendbar.

        (Das ist ja das Coole an dieser Bibliothek)
    

    Karl

     
  • sborisgmxat - 2007-04-11

    Die oscat.lib funktioniert ja nicht schlecht! das Problem dieser lib. (nicht der ganzen lib sondern nur dem switch_i) ist es falls mal einer 5 sekunden auf den taster drückt was ja vorkommen kann. bin ich drauf gekommen, dass das licht nicht eingeschalten wird.

    irgendwie kann ich es nicht verstehen das codesys keine anzuverzögerung oder abfallsverzögerungsbausteine besitzt.

    bzw. muss es doch eine einfach schrittschaltung geben die nur erkennt taster wurde gedrückt und beim nächsten druck wieder weiss taster wurde ausgeschalten!

    mfg boris

     
  • gravieren - 2007-04-11

    Hi

    Zitat:
    ist es falls mal einer 5 sekunden auf den taster drückt was ja vorkommen kann. bin ich drauf gekommen, dass das licht nicht eingeschalten wird.

    Du kannst ja den Code ändern.

     
  • gravieren - 2007-04-11

    Hi

    Zitat:
    bzw. muss es doch eine einfach schrittschaltung geben die nur erkennt taster wurde gedrückt und beim nächsten druck wieder weiss taster wurde ausgeschalten!

    Werte doch mal einen Signalwechsel von low-high pegel aus.

    Anschliessend bei diesem Wechsel toogelst du das Signal.

    Teste das doch mal.

    Solltest du hilfe benötigen, rühr dich nochmals.

     
  • Erik Böhm - 2007-04-12

    Hi

    Ich würde da doch ganz einfach einen R_TRIG benutzen.

    Bei jedem R_TRIG.Q den Ausgang toggeln.

    Das müsste doch machbar sein.

    Gruss Erik

     
  • gravieren - 2007-04-12

    Hi

    @Erik Böhm

    Zitat:
    Ich würde da doch ganz einfach einen R_TRIG benutzen.
    Bei jedem R_TRIG.Q den Ausgang toggeln.

    Ich denke, das müsste so funktionieren.

    Möglicherweise wird vorher noch ein TON benötigt.

    (Prellen/Flattern des Schalters bei schnellen Eingängen)

    Test macht schlau

     
  • Oberchefe - 2007-04-12

    Um den Timer für's Entprellen kommt Du fast nicht drumrum. Der Funktionsbaustein kann dann so aussehen wie hier ganz unten beschrieben:

    http://www.sps-foren.de/showthread.php?t=12637&page=2

    und der Aufruf für einen Schalter dann so:

    Prell_L(Taster:= I_LT_Kueche);
    IF Prell_L.Flanke  THEN
    O_Licht_Kueche:= NOT O_Licht_Kueche;
    END_IF
    

    (Prell_L ist dann vom Typ "Entprellung", der Rest sollte klar sein, die Variable G_Prellzeit ist eine globale und für alle Schalter gleich))

     
  • gravieren - 2007-04-12

    Hi Oberchefe

    Würde sagen:

    100 % ACK

     
  • Ralph Holz - 2007-04-13

    Hätte auch noch eine Variante zu bieten:

    Oberchefe hat geschrieben:

    Prell_L(Taster:= I_LT_Kueche);
    IF Prell_L.Flanke  THEN
    O_Licht_Kueche:= NOT O_Licht_Kueche;
    END_IF
    

    Statt IF ....

    O_Licht_Kueche:= O_Licht_Kueche XOR Prell_L.Flanke;

    Für irgendwas muss das XOR doch zu gebrauchen sein javascript:emoticon(':lol:')

    Laughing

     
  • Oberchefe - 2007-04-13

    Zitat:
    Statt IF ....
    O_Licht_Kueche:= O_Licht_Kueche XOR Prell_L.Flanke;

    macht es natürlich nochmal etwas kürzer

     

Log in to post a comment.