Ankündigung

Einklappen
Keine Ankündigung bisher.

Zeitfunktion / Dauer des Zustandes einer GA

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

    #16
    neues Verhalten durch Firmware Update?

    Zitat von anlo007 Beitrag anzeigen
    Hier auf die gewünschten Zeiten angepasst:
    Code:
    T1=AUS
    If "Kanal 6 Teststahler-4/0/6" then T1=EIN endif
    if !"Kanal 6 Teststahler-4/0/6" and T1 and !(after(T1,600u64)) then write ("Kanal 5-2/0/5",EIN); T1=AUS endif
    if !"Kanal 6 Teststahler-4/0/6" and T1 and after(T1,600u64) and !(after(T1,4000u64)) then write ("Kanal 6-2/0/6",EIN); T1=AUS endif 
    if !"Kanal 6 Teststahler-4/0/6" and T1 and after(T1,4000u64) then write ("Kanal 8-2/0/8",EIN); T1=AUS endif 
    //
    oder Version 2:
    Code:
    T1=AUS
    Z1=0b01
    Z2=0b01
    If "Kanal 6 Teststahler-4/0/6" then T1=EIN endif
    If after(T1,600u64) then Z1=1b01 else Z1=0b01 endif
    If after(T1,4000u64) then Z2=1b01 else Z2=0b01 endif
     
    if !"Kanal 6 Teststahler-4/0/6" and T1 and !Z1 then write ("Kanal 5-2/0/5",EIN); T1=AUS  endif
    if !"Kanal 6 Teststahler-4/0/6" and T1 and Z1 and !Z2 then write ("Kanal 6-2/0/6",EIN); T1=AUS endif  
    if !"Kanal 6 Teststahler-4/0/6" and T1 and Z2 then write ("Kanal 8-2/0/8",EIN); T1=AUS endif
    @pio: Die langen Zeiten waren nur zum besseren Testen.
    Hallo zusammen,

    kann es ein das mit aktueller Firmware (v2.011 / 2.104.ptc) bzw. Compiler (EibStudio v2.104) obige Schnipsel nicht mehr funktionieren?
    Habe eben beide hier probiert und es wird immer die erste Aktion ausgelöst, egal wie lange der Taster gedrückt wird?!?

    Danke und Gruß
    Matthias

    Kommentar


      #17
      Zitat von Matthias Beitrag anzeigen
      Hallo zusammen,
      kann es ein das mit aktueller Firmware (v2.011 / 2.104.ptc) bzw. Compiler (EibStudio v2.104) obige Schnipsel nicht mehr funktionieren?
      Habe eben beide hier probiert und es wird immer die erste Aktion ausgelöst, egal wie lange der Taster gedrückt wird?!?
      Ja, an dem Verhalten von after hat sich was geändert. Es wird nur noch ei Impuls ausgegeben (so wie auch im Handbuch beschrieben) und verhält sich somit wie delay - nur eben ohne re-Trigger.

      Schau Dir mal das Makro LangerTastendruck(Name,TasteGA,Zeit,Kommando1,Komm ando2)
      in der Enertex.lib an. Das sollte gehen.
      offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
      Enertex Produkte kaufen

      Kommentar


        #18
        Help please - ich kriegs net hin...

        Hallo zusammen,

        ich muss das Thema noch mal nach oben ziehen.
        Heut Nachmittag wollte ich die Problematik endlich mal angehen. Leider bekomm ich es nicht hin.

        Noch kurz zum vorigen Posting:
        Zitat von enertegus Beitrag anzeigen
        Ja, an dem Verhalten von after hat sich was geändert. Es wird nur noch ei Impuls ausgegeben (so wie auch im Handbuch beschrieben) und verhält sich somit wie delay - nur eben ohne re-Trigger.
        Wo steht das? Ich hab das nicht im Changelog noch in der README.txt gelesen.
        So eine "breaking change" gehört doch dort erwähnt!
        Wenn ich schon mal das Handbuch gelesen habe, werde ich es doch nicht nach jedem Release erneut lesen.

        Zitat von enertegus Beitrag anzeigen
        Schau Dir mal das Makro LangerTastendruck(Name,TasteGA,Zeit,Kommando1,Komm ando2)
        in der Enertex.lib an. Das sollte gehen.
        Das hab ich. Leider benötige ich drei Zustände.
        Das Makro dort bildet nur zwei ab.
        So wie ich das vestehe klappt das ja auch, weil dazu nur ein "after()" ohne re-trigger benötigt wird.

        Um das zu umgehen habe ich den Code etwas umgebaut und mehrere after() auf verschiedene Variablen eingabaut. Vielleicht sollte ich das Handbuch nochmal gründlich lesen, aber folgender Code funktioniert nicht:

        [highlight=epc]
        //
        // Test-Neu
        //
        Messung=AUS
        State1=AUS
        State2=AUS
        State3=AUS
        // Taster Drücken bzw. Loslassen abfangen
        if "Taster_links-3/0/60" then Messung=EIN endif
        if !"Taster_links-3/0/60" then Messung=AUS endif
        // Messung starten
        // als erstes die Zustände initialisieren, kurzer Druck jetzt bereits "ein", alle Anderen "aus"
        if Messung then {
        State1=EIN;
        State2=AUS;
        State3=AUS
        } endif
        // nach 300ms in den nächsten Zustand gehen und Ersten auf "aus" setzen
        if after(State1,300u64) and Messung then {
        State1=AUS; State2=EIN;
        } endif
        // nach weiteren 2s (also insgesamt 2,3s) den dritten Zustand aktivieren und den Zweiten auf "aus" setzen
        if after(State2,2000u64) and Messung then { State2=AUS; State3=EIN; } endif
        // Auswertung
        if !Messung and State1 then {
        if !"Lampe_L1-0/0/11" then {
        write("Lampe_L1-0/0/11",EIN);
        write("Lampe_L1_DimWert-0/0/30",10%)
        }
        else {
        write("Lampe_L1-0/0/11",AUS);
        write("Lampe_L1_LED-0/0/10",AUS)
        } endif
        } endif
        if !Messung and State2 then {
        write("Lampe_L1-0/0/11",EIN);
        write("Lampe_L1_DimWert-0/0/30",100%)
        } endif
        if !Messung and State3 then {
        write ("RoMo-0/1/6",EIN)
        } endif
        [/highlight]
        Was will ich mit dem Code erreichen? Bei kurzem Druck (unter 300ms) geht, wenn Licht bislang aus ist, das Licht gedimmt an. Wenn es an war geht es aus (also einfache Taster-Funktion).
        Bei Druck länger als 300ms (und kürzer als 2,3s) geht das Licht an und Dimmer auf 100%.
        Bei Druck länger als 2,3s geht das Rollo runter.

        Ich vermute meinen Fehler bei
        [highlight=epc]if after(State1,300u64) and Messung then {[/highlight]
        Es wird nie der "State2" erreicht.
        Also vermute ich mal, dass die "Messung" in dem Fall nicht auf "EIN" steht und der Ausdruck somit nie war wird.
        Nur wie soll ich das anders machen? Ich muss ja sicher sein dass der Taster überhaupt noch gedrückt ist, also die Messung läuft.

        Ich hab zwar über die Sache noch nicht geschlafen, aber vielleicht hat ja jemand eine schlaue Idee

        Danke und Grüße
        Matthias

        Kommentar


          #19
          Zitat von Matthias Beitrag anzeigen
          Es wird nie der "State2" erreicht.
          Also vermute ich mal, dass die "Messung" in dem Fall nicht auf "EIN" steht und der Ausdruck somit nie war wird.
          Ich vermute eher, dass Du nicht den Zustand zurücksetzt und beim Testen ist das nicht aufgefallen: Also noch anfügen:
          [highlight=epc]
          if after(Messung==AUS,10u64) then {
          State1=AUS
          State2=AUS
          State3=AUS
          } endif
          [/highlight]
          P.S. Die neue Firmware wird das Messen der Zeit mit der afterc ("c" für Chronograph) ermöglichen.
          offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
          Enertex Produkte kaufen

          Kommentar


            #20
            Das könnt's sein..

            Zitat von enertegus Beitrag anzeigen
            Ich vermute eher, dass Du nicht den Zustand zurücksetzt und beim Testen ist das nicht aufgefallen: Also noch anfügen:
            [...]
            P.S. Die neue Firmware wird das Messen der Zeit mit der afterc ("c" für Chronograph) ermöglichen.
            Das mit dem Zustand könnte durchaus der Fehler sein (kanns grad nicht testen).
            Aber wenn natürlich an folgender Stelle:
            [highlight=epc]
            if Messung then {
            State1=EIN;
            State2=AUS;
            State3=AUS
            } endif
            [/highlight]
            der State1 nur 1x auf "EIN" gesetzt wird (und zwar beim allerersten Druck nach Programmstart) und sonst nie wieder (und nicht wie fälschlich angenommen bei jeder neuen Messung) dann macht das natürlich Sinn und würde das nicht-funktionieren erklären.

            Danke an der Stelle!

            Das mit dem "afterc" klingt spannend. Wie wäre die Verwendung? (Bitte an der Stelle ein kleines "Sneak-Peek" )

            Kommentar


              #21
              Zitat von Matthias Beitrag anzeigen
              Das mit dem "afterc" klingt spannend. Wie wäre die Verwendung? (Bitte an der Stelle ein kleines "Sneak-Peek" )
              [WICHTIG] Ab Version 2.2xxx[/WICHTIG]
              Unsere Test-Suite:
              [highlight=epc]
              //-------------------------------------------------------------
              /// delayc
              xT=0u64
              /// Der Timer kann nun über xT abgefragt werden
              if delayc(systemstart(),100000u64,xT) then u=EIN endif
              // Sind 200 ms Vergangen?
              if (change(xT/200u64)) then write('2/2/2'u64, xT) endif

              //-------------------------------------------------------------
              /// afterc
              xC=0u64
              /// Der Timer kann nun über xC abgefragt werden
              if afterc(systemstart(),100000u64,xC) then u=EIN endif
              // Sind 300 ms Vergangen?
              if (change(xC/300u64)) then write('2/2/2'u64, xC) endif
              [/highlight]
              offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
              Enertex Produkte kaufen

              Kommentar


                #22
                Zitat von enertegus Beitrag anzeigen
                Ja, an dem Verhalten von after hat sich was geändert. Es wird nur noch ei Impuls ausgegeben (so wie auch im Handbuch beschrieben) und verhält sich somit wie delay - nur eben ohne re-Trigger.
                Wo finde ich denn das Handbuch, in dem das schon beschrieben ist?
                Der Link auf Eurer Homepage fördert immer noch die Version "HandbuchEibPC-19.odt, 2011-06-17" zu Tage, und darin ist noch die alte "Version" von after beschrieben...
                Tessi

                Kommentar


                  #23
                  Zitat von Tessi Beitrag anzeigen
                  Wo finde ich denn das Handbuch, in dem das schon beschrieben ist?
                  Das "alte" after gibt es nach wie vor, afterc erst im nächsten Release.
                  offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                  Enertex Produkte kaufen

                  Kommentar


                    #24
                    Ich meinte eigentlich folgendes:
                    https://knx-user-forum.de/190405-post6.html

                    Schon in der Version ist im Diagramm beider Funktionen zu sehen, das es sich um einen Impuls für die Dauer eines Durchlaufs handelt, nur im Text für after() steht es anders.

                    Die neue Funktion verwirrt mich jetzt ein wenig:
                    Was genau wird after() ab der nächsten Version tun
                    Was genau bringen die neuen Funktionen afterc() und delayc()?Einfach nur eine zusätzliche Variable, die den aktuellen Timerstand enthält? in welchem Intervall zählt die dann, 1ms?

                    Code:
                    [FONT=Courier New][COLOR=#0000ff]// Ist xC nun ein Zähler, der ab Systemstart 10000 Jahre in 1ms Schritten zählt?[/COLOR][/FONT]
                    [FONT=Courier New]afterc[COLOR=#000000]([/COLOR][COLOR=#e63ec3]systemstart[/COLOR][COLOR=#000000]([/COLOR][COLOR=#000000])[/COLOR],[COLOR=#0b610b]315569520000000u64[/COLOR],xC[COLOR=#000000])[/COLOR][/FONT]
                    [FONT=Courier New][COLOR=#0000ff]// Sind 200 ms Vergangen?[/COLOR][/FONT]
                    [COLOR=#e63ec3]if[/COLOR] [COLOR=#000000]([/COLOR][COLOR=#e63ec3]change[/COLOR][COLOR=#000000]([/COLOR]xC/[COLOR=#0b610b]200u64[/COLOR][COLOR=#000000])[/COLOR][COLOR=#000000])[/COLOR] [COLOR=#e63ec3]then[/COLOR] [COLOR=#e63ec3]write[/COLOR][COLOR=#000000]([/COLOR]'[COLOR=#0b610b]2[/COLOR]/[COLOR=#0b610b]2[/COLOR]/[COLOR=#0b610b]2[/COLOR]'[COLOR=#0b610b]u64[/COLOR], xC[COLOR=#000000])[/COLOR] [COLOR=#e63ec3]endif[/COLOR]
                    [FONT=Courier New][COLOR=#0000ff]
                    // Ist xT nun ein Zähler, der ab Systemstart 1 Tag in 1ms Schritten zählt?[/COLOR][/FONT]
                    [FONT=Courier New]afterc[COLOR=#000000]([/COLOR][COLOR=#e63ec3]systemstart[/COLOR][COLOR=#000000]([/COLOR][COLOR=#000000])[/COLOR],[COLOR=#0b610b]86400000u64[/COLOR],xT[COLOR=#000000])[/COLOR][/FONT]
                    [FONT=Courier New][COLOR=#0000ff]// Sind 500 ms Vergangen? Wenn xT im Millisekundentakt inkrementiert wird, wie hoch ist hier die Systemlast? Wird dann praktisch in jedem Zyklus xT/500 neu berechnet?[/COLOR][/FONT]
                    [COLOR=#e63ec3]if[/COLOR] [COLOR=#000000]([/COLOR][COLOR=#e63ec3]change[/COLOR][COLOR=#000000]([/COLOR]xT/[COLOR=#0b610b]500u64[/COLOR][COLOR=#000000])[/COLOR][COLOR=#000000])[/COLOR] [COLOR=#e63ec3]then[/COLOR] [COLOR=#e63ec3]write[/COLOR][COLOR=#000000]([/COLOR]'[COLOR=#0b610b]2[/COLOR]/[COLOR=#0b610b]2[/COLOR]/[COLOR=#0b610b]2[/COLOR]'[COLOR=#0b610b]u64[/COLOR], xC[COLOR=#000000])[/COLOR] [COLOR=#e63ec3]endif[/COLOR]
                    Ist xC nun ein Zähler, der ab Systemstart 10000 Jahre in 1ms Schritten zählt?
                    Ist xT nun ein Zähler, der ab Systemstart 1 Tag in 1ms Schritten zählt?
                    Was ist mit xT nach einem Tag? Bleibt der Wert dann bei 86400000 stehen? Oder ist die Variable danach ungültig?
                    Wenn xT im Millisekundentakt inkrementiert wird, wie hoch ist dann die Systemlast?
                    Wird dann xT/500 jede Millisekunde neu berechnet, sofern der EibPC gerade mehr als 1000 Zyklen pro Sekunde schafft, bzw. wird dann xT/500 in jedem Zyklus neu berechnet, sofern der gerade EibPC weniger als als 1000 Zyklen pro Sekunde schafft?
                    Hebelt das ein wenig den ursprünglichen Gedanken der Lastreduktion hinter dem Validierungsschema aus?
                    Tessi

                    Kommentar


                      #25
                      Zitat von Tessi Beitrag anzeigen
                      Die neue Funktion verwirrt mich jetzt ein wenig:
                      Was genau wird after() ab der nächsten Version tun
                      Was genau bringen die neuen Funktionen afterc() und delayc()?Einfach nur eine zusätzliche Variable, die den aktuellen Timerstand enthält? in welchem Intervall zählt die dann, 1ms?
                      Ja und zwar die Zeit in ms die vom Triggerstartpunkt verstrichen ist.
                      Wenn xT im Millisekundentakt inkrementiert wird, wie hoch ist dann die Systemlast?
                      Genauso wie bisher bei after, da auch dort eine Objekt genauso (für den Anwender unsichtbar) die Zeit zählt.
                      Hebelt das ein wenig den ursprünglichen Gedanken der Lastreduktion hinter dem Validierungsschema aus?
                      Nee, weil ja nur der gestartete Zähler überhaupt etwas ungültig macht.
                      offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                      Enertex Produkte kaufen

                      Kommentar


                        #26
                        Zitat von Tessi Beitrag anzeigen
                        Die neue Funktion verwirrt mich jetzt ein wenig:
                        Was genau wird after() ab der nächsten Version tun
                        Was genau bringen die neuen Funktionen afterc() und delayc()?Einfach nur eine zusätzliche Variable, die den aktuellen Timerstand enthält? in welchem Intervall zählt die dann, 1ms?
                        Ja und zwar die Zeit in ms die vom Triggerstartpunkt verstrichen ist.
                        Wenn xT im Millisekundentakt inkrementiert wird, wie hoch ist dann die Systemlast?
                        Genauso wie bisher bei after, da auch dort eine Objekt genauso (für den Anwender unsichtbar) die Zeit zählt.
                        Hebelt das ein wenig den ursprünglichen Gedanken der Lastreduktion hinter dem Validierungsschema aus?
                        Nee, weil ja nur der gestartete Zähler überhaupt etwas ungültig macht. Dann aber in der Zeitscheibe, die im Perfomance-Einstellung parametriert wurde.
                        offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                        Enertex Produkte kaufen

                        Kommentar


                          #27
                          Kurze Frage...

                          würde gern die Zeit zwischen Zwei Impulsen messen..

                          Hintergrund.. ich bekomm über einen Binäreingan (Strommessung) einen Zählerstand auf den Bus geschickt.. dieser gibt mir den verbrauchten Strom wieder.

                          Jetzt würd ich aber gern den akt. Stromverbrauch wissen wollen.
                          Heißt ich muss irgendwie die Zeit zwischen zwei Impulsen möglichst genau
                          ausrechnen.

                          was wär da ein gangbarer Weg... (oder gibt es sogar schon was vorgefertigtes)

                          Gruß Martin
                          Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

                          Kommentar


                            #28
                            Zitat von Brick Beitrag anzeigen
                            Kurze Frage...
                            würde gern die Zeit zwischen Zwei Impulsen messen..
                            Nur kurz von unterwegs: in der Lib zum überwachen von Geräten steht da so was (phymonitor). Später mehr...
                            offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                            Enertex Produkte kaufen

                            Kommentar


                              #29
                              Zitat von enertegus Beitrag anzeigen
                              Nur kurz von unterwegs: in der Lib zum überwachen von Geräten steht da so was (phymonitor). Später mehr...
                              ok.. danke.. werd ich mir mal anschauen.. !!!

                              in der Zwischenzeit hab ich das jetzt mal gebastelt ..

                              [highlight=epc]
                              akt_deltaT = 0f32
                              akt_T=0f32
                              akt_T1=0f32
                              akt_T2=0f32

                              if cycle (00,01) then akt_T=akt_T+1f32 endif
                              if event("Gesamtverbrauch-6/1/2") then {
                              akt_T2=akt_T1;
                              akt_T1=akt_T;
                              akt_deltaT=akt_T1-akt_T2
                              }endif
                              [/highlight]

                              aber wie genau ist das ?? vor allem für meine Zwecke ausreichend ???

                              Gruß Martin
                              Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

                              Kommentar


                                #30
                                Hi Martin,

                                das es noch ungeklärte Ungenauigkeiten von cycle() gibt, würde ich wie weiter oben vorgeschlagen vorgehen und afterc nutzen.

                                Gruß,
                                Bernd

                                Kommentar

                                Lädt...
                                X