Ankündigung

Einklappen
Keine Ankündigung bisher.

Taste Entprellen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Taste Entprellen

    Kleines Makro aus dem Supportbereich: Entprellen eines Schalt/Tasteingangs...

    Code:
    // Taste Entprellen
    // @date    03.08.2016
    // @version    1
    // @author    Enertex Bayern GmbH
    
    :begin vmTasteEntprellen(bGATaste,bGAAusgang,uZeit)
    :info $Eine Taste/Kontakt Entprellen$\\
        $GA des Kontakts/Taste (b01))$\\
          $GA des Ausgangs (b01)$\\
        $Zeit in ms als Zahl, z.B. 1400 für 1,4 Sekunden (u64)$
    :shortinfo $Eine Taste/Kontakt Entprellen$
    
    
    :var bAusgang@
    bAusgang@=AUS
    
    if bGATaste==EIN and bAusgang@==AUS then {
       bAusgang@=EIN;
       write(bGAAusgang,EIN);
    } endif
    
    // Entprellung
    if after(bAusgang@==EIN, uZeit^u64)  then {
       bAusgang@=AUS;
    } endif
    
    
    if bGATaste==AUS and bGAAusgang==AUS then {
       write(bGAAusgang,AUS);
    } endif
    
    :endif
    offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
    Enertex Produkte kaufen

    #2
    Hallo,

    die Erstellung des obigen Makros hatte ich mit einer Anfrage beim Support initiiert. Leider hatte ich Verständnisprobleme mit dem Makro und hatte nochmals eine Rückfrage beim Support, welche aber bisher noch nicht beantwortet ist. Daher versuche ich nun die Klärung hier im Forum.

    Zuerst versuche ich noch einmal meine Aufgabenstellung und das vorhandene Problem zu beschreiben.

    An meiner Hebe-/Schiebetür habe ich einen Reedkontakt der beim Öffnen bzw. Schließen der Tür die Jalousie hoch- bzw. runterfahren soll. Dafür fährt ein Magnet an einem Reedkontakt nach ca. 1,5m Öffnung vorbei und schließt den Reedkontakt beim Vorbeifahren kurzzeitig. Leider gibt der Reedkontakt bei langsamer Fahrt der Tür 2 Impulse aus.
    Der Binärsensor, der den Reedkontakt einliest, ist auf "Umschalten 0/1" programmiert.

    Wenn ich die Tür schnell fahre funktioniert das ganze so wie geplant. Durch Schließen des Reedkontaktes wechselt Jalousie zwischen Hoch- und Runterfahren. Bei langsamer Fahrt kommt es sofort nach Auslösen der Fahr sofort zu einer Richtungsumkehr, da der Reedkontakt die 2 Impulse liefert.
    Nun hatte ich gehofft, diese Fehlfunktion, ausgelöst durch meine mangelhafte Hardware, durch ein softwareseitiges Entprellen des Reedkontaktes korrigieren zu können.

    Leider verstehe ich das Makro nicht vollständig. Ich bin mir auch nicht sicher, ob das Makro für die Funktion "Umschalten 0/1" im Binärsensor geeignet ist, da das Umschaltobjekt des Binärsensor, welches den Reedkontakt auswertet, einen EIN und AUS Befehl im Wechsel in die verknüpfte Gruppenadresse schreibt.

    Besten Dank im Voraus!

    Jörg

    Kommentar


      #3
      Zitat von JAK Beitrag anzeigen
      Leider verstehe ich das Makro nicht vollständig. Ich bin mir auch nicht sicher, ob das Makro für die Funktion "Umschalten 0/1" im Binärsensor geeignet ist, da das Umschaltobjekt des Binärsensor, welches den Reedkontakt auswertet, einen EIN und AUS Befehl im Wechsel in die verknüpfte Gruppenadresse schreibt.
      Das mit der Rückmeldung muss untergangen sein, sorry. Zum Verständnis: Wo genau ist was unklar? Hast Du das denn auch mal getestet?

      offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
      Enertex Produkte kaufen

      Kommentar


        #4
        Ich glaube nicht, dass das so funktioniert. Der BE macht genau was er soll. Er toggelt zwischen 0 und 1.
        Da kann der EibPC nichts dran ändern und auch nicht ein noch so tolles Makro.
        Wenn Du den BE so einstellst, das er immer nur bei Steigender Flanke eine 1 sendet, kann das auftauchen von mehreren Impulsen in einer kurzen Zeit gefiltert werden.
        Dann ist aber der EibPC immer mit an Bord um Deine Jalousien zu steuern und es ist nicht mehr dezentral.

        „Der Horizont der meisten Menschen ist ein Kreis mit dem Radius 0 und das nennen sie ihren Standpunkt.“ und " Das Wissen entsteht aus Erfahrung, alles andere ist nur Information" Albert Einstein.

        Kommentar


          #5
          Hallo enertegus,

          was ich vom Makro verstanden habe:

          In der ersten if Abfrage wird in die GA des Aktors (bei mir die Jalousie) ein EIN Befehl geschrieben und gleichzeitig der Status auf AUS nach EIN gesetzt. Mit dem bAusgang@=EIN wird in der zweiten if Abfrage der Taster entprellt und gleichzeitig mit dem Setzen von bAusgang@=AUS ein erneutes Schalten ermöglicht.

          bGATaste ist dabei die GA welcher ich das Objekt des Binäreingang zugeordnet habe, bei mir den zu entprellenden Reedkontakt. bGAAusgang geht bei mir in GA welche die Jalousie Auf/Ab fährt. (AUS = Jalousie fährt hoch; EIN = Jalousie fährt runter)

          Mit der letzten if Abfrage kann ich nichts anfangen. Bei mir fährt der Magnet der Schiebetür am Reedkontakt vorbei und schließt dabei immer nur kurz den Reedkontakt (leider immer mit zwei Pulsen)

          Hallo spassbird,

          im Grunde wird bei mir die Jalousiesteuerung schon direkt über das KNX dezentral gesteuert. Lediglich helligkeitsabhängig übernimmt der EibPC das Öffnen und Schließen der Lamellen. Bei meiner Hebe-/Schiebetür habe ich zwei Reedkontakte. Einer erkennt den Status offen/zu (Lüften). Den anderen wollte ich zum Hoch- und Runterfahren nutzen, wenn die Schiebetür weiter als 1,5m aufgefahren wird (dort sitzt der zweite Reedkontakt)

          Ich habe mal das Entprellen über folgenden Befehl versucht umzusetzen, leider ohne Erfolg.
          if after("Wohnzimmer Fenster Sued Offen-12/3/8"==EIN,3000u64) then write("Jalousie_EG_WZ_Sued_li-4/1/0",EIN) endif

          Kommentar


            #6
            Wie ich die Aufgabe verstanden habe:
            Zitat von JAK Beitrag anzeigen
            In der ersten if Abfrage wird in die GA des Aktors (bei mir die Jalousie) ein EIN Befehl geschrieben und gleichzeitig der Status auf AUS nach EIN gesetzt. Mit dem bAusgang@=EIN wird in der zweiten if Abfrage der Taster entprellt und gleichzeitig mit dem Setzen von bAusgang@=AUS ein erneutes Schalten ermöglicht.
            bGATaste ist dabei die GA welcher ich das Objekt des Binäreingang zugeordnet habe, bei mir den zu entprellenden Reedkontakt. bGAAusgang geht bei mir in GA welche die Jalousie Auf/Ab fährt. (AUS = Jalousie fährt hoch; EIN = Jalousie fährt runter)
            Alles richtig. D.h. das Einschalten wird entprellt, das Ausschalten hingegen nicht. Ich dachte das Prellen passiert nur beim Einschalten.
            Mit der letzten if Abfrage kann ich nichts anfangen.
            Naja, das ist dann eben das Ausschalten. Mir ist dann aber offensichtlich die Aufgabe nicht klar.
            Kannst Du das mal skizzieren mit einer Art Zeitdiagramm wo das Ganze auftritt, und was passieren soll. Ob und wie das mit Deiner Schiebetür zusammenhängt wäre dann nicht mehr wichtig zu verstehen.
            Das Makro ist also derzeit so:
            Code:
            GA --> Zeit
            GA Sensor      EIN/AUS/EIN/AUS/EIN           AUS
            GA Ausgang     EIN - entprellen --           AUS
            offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
            Enertex Produkte kaufen

            Kommentar


              #7
              Hallo enertegus,

              anbei der zeitliche Verlauf von Reedkontakt und Binärsensor sowie das dazugehörige Busprotokoll. Wird die Schiebetür schnell bewegt funktioniert alles wie es soll. Bei GA: "Wohnzimmer Fenster Sued Offen-12/3/8" | Wert: AUS | --> Jalousie fährt hoch; EIN --> Jalousie fährt runter.
              Bewegt man die Tür langsam prellt der Reedkontakt und die Jalousie fährt kurz in die gewünschte Richtung und kehrt aber sofort um.
              You do not have permission to view this gallery.
              This gallery has 1 photos.

              Kommentar


                #8
                Für mich schaut Dein Zeitdiagramm nicht nach Entprellen aus, sondern:
                Nach jeder Flanke eine Zustandsänderung. Als Code:
                Code:
                if event(GAReed) and GAReed then write(GATuer, !GATuer) endif
                Beim Initialisieren/Start des EibPC sollte die Tür zu sein, sonst läuft das nicht synchron.
                offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                Enertex Produkte kaufen

                Kommentar


                  #9
                  Bei den doppelt dargestellten Pulsen, die mit "langsam" beschriftet sind, prellt der Reedkontakt - definitiv. Da ich den Binäreingang mit "Umschalten 0/1" programmiert habe, funktioniert es nur richtig bei den von mir "schnell" beschrifteten flanken.

                  Natürlich reagiert der Binäreingang auf jede "Ein"- Flanke als eine Zustandsänderung - ist ja auch so programmiert.

                  So langsam weiß ich nicht mehr wie ich meine Fragestellung/Problem beschreiben soll. Ich möchte lediglich, dass die doppelten Flanken nur einmal ausgewertet werden.

                  Kommentar


                    #10
                    Ich hab's jetzt ein wenig "gschlampert" gelesen, aber ein Entprellen würd' ich so anpacken:

                    Code:
                    if delay(change(GA_die_Prellt), entprellzeit_in_ms_u64) then {
                           write( GAout, WertGAout );
                    } endif

                    Kommentar


                      #11
                      klaus_kraemer

                      Vielen Danke für Deine Mühe mein Problem zu kommentieren. Vielleicht kannst Du mir als Neuling Deinen Code nochmal im Detail erklären. Was ich nicht verstehe, ist der Part change(GA_die_Prellt). Was genau macht die Funktion "change" innerhalb der "delay" Funktion? Hier bin ich im Handbuch nicht schlau geworden.

                      Auch muss WertGAout im Wechsel von EIN nach AUS nach EIN nach AUS... wechseln. Nach jedem Aufschieben der Tuer erfolgt nun mal ein Zuschieben und umgekehrt.

                      Kommentar


                        #12
                        Zitat von JAK Beitrag anzeigen
                        [/USER]

                        Vielen Danke für Deine Mühe mein Problem zu kommentieren. Vielleicht kannst Du mir als Neuling Deinen Code nochmal im Detail erklären. Was ich nicht verstehe, ist der Part change(GA_die_Prellt). Was genau macht die Funktion "change" innerhalb der "delay" Funktion? Hier bin ich im Handbuch nicht schlau geworden.

                        Auch muss WertGAout im Wechsel von EIN nach AUS nach EIN nach AUS... wechseln. Nach jedem Aufschieben der Tuer erfolgt nun mal ein Zuschieben und umgekehrt.
                        Bei jeder Änderung (change) der "GA_die_Prellt" erfolgt die Ausführung der "then" Bedingung nach Ablauf (delay) der "entprellzeit_in_ms_u64", ich würde hier mal mit 200 starten.

                        Versuche doch mal folgendes:

                        Code:
                        if delay(change(GA_die_Prellt), 200u64) then {
                           write( GAout, WertGAout );
                           write(GAout,!GAout)
                        } endif
                        Das 2. write setzt die GA dabei wieder auf den vorherigen Wert.

                        Kommentar


                          #13
                          Zitat von JAK Beitrag anzeigen
                          klaus_kraemer

                          Vielen Danke für Deine Mühe mein Problem zu kommentieren. Vielleicht kannst Du mir als Neuling Deinen Code nochmal im Detail erklären. Was ich nicht verstehe, ist der Part change(GA_die_Prellt). Was genau macht die Funktion "change" innerhalb der "delay" Funktion? Hier bin ich im Handbuch nicht schlau geworden.

                          Auch muss WertGAout im Wechsel von EIN nach AUS nach EIN nach AUS... wechseln. Nach jedem Aufschieben der Tuer erfolgt nun mal ein Zuschieben und umgekehrt.
                          Wenn Du Deine Tür öffnest, sollte "GA_die_prellt" ja ungewollt durch das prellen ein paar mal zwischen "EIN" und "AUS" wechseln, um dann in den richtigen Endzustand zu gelangen. Lies im Handbuch einfach mal zur Delay-Funktion nach. Dieses Wechseln (=change ) löst dann jedes Mal die Startbedingung für den Zeitzähler der Delay-Funktion aus.

                          Der Vorteil der delay(...) ist, dass die Wartezeit bei jedem Zustandswechsel der prellenden GA wieder neu beginnt, bis Ruhe ist im Kuhstall und der Endzustand erreicht sein sollte. Dann beginnt der Verarbeitungsteil zwischen "then {" und "} endif". Da kannst Du jetzt programmieren, wie Du auf den Endzustand Deiner prellenden GA reagieren willst.

                          Die von Kahler vorgeschlagenen 200 ms sollten ein guter Startwert sein, bei so etwas trägem, wie einer Schiebetür, kannst Du auch etwas höher gehen - über eine halbe Sekunde würd' ich es aber nicht machen.

                          Kommentar


                            #14
                            Zitat von klaus_kraemer Beitrag anzeigen
                            Die von Kahler vorgeschlagenen 200 ms sollten ein guter Startwert sein, bei so etwas trägem, wie einer Schiebetür, kannst Du auch etwas höher gehen - über eine halbe Sekunde würd' ich es aber nicht machen.
                            Ich würde eher höhere Zeiten verwenden, denn es kommt doch drauf an, wann eine Aktion abgeleitet werden soll -> evtl. nach 1sec die Jalousie starten ... oder nach 2sec. Macht ja keinen Sinn sie hoch zu fahren, um sie gleich wieder runter zu fahren.
                            BR
                            Marc

                            Kommentar

                            Lädt...
                            X