Ankündigung

Einklappen
Keine Ankündigung bisher.

Frage zum Validierungsschema bei EVAL

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

    [Firmware] Frage zum Validierungsschema bei EVAL

    Moin,

    folgende Frage:

    [ERZWINGT die Funktion eval() die Überprüfung einer Variablen], ODER [PRÜFT die eval() Funktion lediglich, wenn sie durch ein anderes Ereignis aufgerufen wurde, die entsprechende Variable]

    Grund:

    Wenn ich z.B.

    if(sun()==DUNKEL and eval(Wohnen))

    schreibe, dann sollte nach meinem Verständnis doch NUR beim Wechsel zu DUNKEL das Ereignis ausgelöst werden, aber NICHT wenn durch ein Ereignis die Variable Wohnen von 0 auf 1 geändert wird!

    Mein Verständnis war eben:
    "Dieser Ausdruck wird validiert, wenn sun() eine Statusänderung durchführt, UND NUR DANN wird unter der Bedingung, dass Wohnen true bzw. 1b01 ist, der IF Zweig betreten und ausgeführt...

    Wenn das Anders wäre, würde IMHO eval() doch kaum wirklich Sinn machen...
    Keine Garantie auf Richtigkeit! Bitte nicht zu Hause nachmachen!

    #2
    Zitat von rb84 Beitrag anzeigen
    Moin,
    [ERZWINGT die Funktion eval() die Überprüfung einer Variablen]
    ja, sie invalidiert die Variable bzw. Funktion bei jedem Verarbeitungzyklus.
    if(sun()==DUNKEL and eval(Wohnen))
    schreibe, dann sollte nach meinem Verständnis doch NUR beim Wechsel zu DUNKEL das Ereignis ausgelöst werden, aber NICHT wenn durch ein Ereignis die Variable Wohnen von 0 auf 1 geändert wird!
    Du verknüpfst aber eval(Wohnen) mit and und schon ist wieder das Validierungsschema aktiv.
    Das hier ist ein Zähler im Takt der Verarbeitung
    [highlight=epc]
    [EibPC]
    Wohnen=EIN
    a=1
    if eval(Wohnen) then a=a+1 endif
    [/highlight]

    Das hier ist ein zählt nur bis 2.

    [highlight=epc]
    [EibPC]
    Wohnen=EIN
    a=1
    if Wohnen then a=a+1 endif
    [/highlight]
    "Dieser Ausdruck wird validiert, wenn sun() eine Statusänderung durchführt, UND NUR DANN wird unter der Bedingung, dass Wohnen true bzw. 1b01 ist, der IF Zweig betreten und ausgeführt...
    Schon richtig, aber er wird dann eben pro Zyklus des EibPC (einstellbar von 1 bis 50 ms im Menü EibPC-Performance) betreten.

    eval() doch kaum wirklich Sinn machen...
    Das ist es, was ich immer hier predige. EVAL nicht nutzen. Man braucht es nicht, das Valdierungsschema ist viel besser.

    "Warum ist es denn dann drinne?"
    Eingebaut haben wir es nur, dass alle glücklich sind. Ggf. war aber anfangs auch nur das Valdiierungsschema nicht so gut erklärt wie in im aktuellen Beta-Handbuch (Version 16).
    offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
    Enertex Produkte kaufen

    Kommentar


      #3
      aaaaaah ok!

      d.h.

      if(sun()==DUNKEL) then {
      if(wohnen) {

      -> Da betritt er, sobald es dunkel wird den IF Zweig. Darin ist dann noch ein IF.

      So jetzt nur die Frage: Da er ja bereits im IF Zweig ist, wird er hier NICHT mehr validieren oder? Also er prüft, ob wohnen 1 ist und wenn ja, dann weiter...
      Keine Garantie auf Richtigkeit! Bitte nicht zu Hause nachmachen!

      Kommentar


        #4
        Zitat von rb84 Beitrag anzeigen
        -> Da betritt er, sobald es dunkel wird den IF Zweig. Darin ist dann noch ein IF.
        Richtig.
        So jetzt nur die Frage: Da er ja bereits im IF Zweig ist, wird er hier NICHT mehr validieren oder? Also er prüft, ob wohnen 1 ist und wenn ja, dann weiter...
        Beim Verschachteln wird die innere IF von der äußeren invaldiert. Schau mal im Handbuch 16 (aktuelle Betaversion runterladen, F1 drücken und dann das Kapitel zum Valdierungsschema, S. 125 lesen. Dort ist das genauer beschrieben
        offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
        Enertex Produkte kaufen

        Kommentar


          #5
          Sehr gut!
          Das Kapitel ist viel verständlicher als im alten Handbuch!
          Keine Garantie auf Richtigkeit! Bitte nicht zu Hause nachmachen!

          Kommentar


            #6
            Zitat von rb84 Beitrag anzeigen
            Sehr gut!
            Das Kapitel ist viel verständlicher als im alten Handbuch!
            Ach so ein Lob am Heiligabend, das ist schöner als jedes Geschenk
            offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
            Enertex Produkte kaufen

            Kommentar


              #7
              Zitat von enertegus Beitrag anzeigen
              Ach so ein Lob am Heiligabend, das ist schöner als jedes Geschenk
              Hehe

              Dann wird dich freuen zu hören, dass ich die Programmierung meines EibPC gerade rechtzeitig fertig bekommen habe, es ist Weihnachten, alles funktioniert!

              Das Validierungsschema macht im Übrigen durchaus Sinn. Wenn du aber primär Java oder C programmierst, dann ist das schon ein gewisser "Kulturschock". Wenn man mal dran gewöhnt ist, geht es aber sehr gut!
              Keine Garantie auf Richtigkeit! Bitte nicht zu Hause nachmachen!

              Kommentar


                #8
                Zitat von rb84 Beitrag anzeigen
                Dann wird dich freuen zu hören, dass ich die Programmierung meines EibPC gerade rechtzeitig fertig bekommen habe, es ist Weihnachten, alles funktioniert!

                dann ist das schon ein gewisser "Kulturschock". Wenn man mal dran gewöhnt ist, geht es aber sehr gut!
                Wie ich immer sage; Das liegt aber am Konzept des KNX Bus, welches sich im
                EibPC irgendwie wiederfindet...
                offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                Enertex Produkte kaufen

                Kommentar


                  #9
                  Oben wurde gesagt, was man mit
                  [highlight=epc]
                  if (sun()==DUNKEL and eval(Wohnen)) then {
                  ...
                  [/highlight]erreichen will, und das
                  [highlight=epc]
                  if(sun()==DUNKEL) then {
                  if(Wohnen) {
                  ...
                  [/highlight]den gleichen Effekt hat. Aber
                  [highlight=epc]
                  if (sun()==DUNKEL and Wohnen) then {
                  ...
                  [/highlight]ist nicht gleich weil nun auch eine Änderung von Wohnen die Ausführung triggern kann? Oder ist das auch im ersten Fall gegeben, und nur im zweiten Fall nicht? Wenn eval(Wohnen) mit and verknüpfe und schon das Validierungsschema ist wieder aktiv ist, triggert dann nicht auch eine Änderung von Wohnen die Auswertung und dann ggf. die Ausführung des the-Zweiges? Ich bin mir nicht sicher, ob Fall 1 wie Fall 2 oder wie Fall 3 behandelt wird. Oder sind am Ende alle drei wirkungsgleich?
                  Tessi

                  Kommentar


                    #10
                    Fall 1 und 3 sind gleich, also
                    [QUOTE=Tessi;141928]
                    [highlight=epc]
                    if (sun()==DUNKEL and eval(Wohnen)) then {
                    [/highlight]
                    ist vom Ergebnis gleich zu
                    [highlight=epc]
                    if (sun()==DUNKEL and Wohnen) then {
                    ...
                    [/highlight]
                    Allerdings würde die eval-Funktion bewirken, dass die Variable "Wohnen" in jedem Zyklus explizit vom EibPC "angefasst wird. Wenn man das durchgängig macht, dann wird die performance erheblich eingeschränkt.

                    Die Verschachtelung (Fall 3) bewirkt, dass die innere Schleife nur dann ausgeführt wird, wenn die äußere sich ändert.
                    offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                    Enertex Produkte kaufen

                    Kommentar


                      #11
                      Hab ich da was nicht verstanden?

                      Ich dachte, eval "invalidiert" in jedem Zyklus.

                      Im folgenden Fall wird WEDER der Then-Zweig NOCH das Else ausgeführt, wenn sich das Ergebniss der KOMPLETTEN Bedingung NICHT gegenüber dem vorigen Zyklus geändert hat:

                      Code:
                      if (sun()==DUNKEL and Wohnen) then {bla} else {hottehue} endif
                      aber bei folgendem Code wird in jedem fall IMMER entweder Then oder Else ausgeführt (je nach Gesamtergebniss), da durch den Einsatz von Eval(Wohnen) in einem Teilausdruck auch IMMER der Gesamtausdruck "invalidiert" wird:

                      Code:
                      if (sun()==DUNKEL and eval(Wohnen)) then {bla} else {hottehue} endif
                      ?????????????????????????
                      Gruss Pio

                      Kommentar


                        #12
                        Zitat von enertegus Beitrag anzeigen
                        ... Allerdings würde die eval-Funktion bewirken, dass die Variable "Wohnen" in jedem Zyklus explizit vom EibPC "angefasst wird.
                        Das liegt dann halt an der scheinbar falschen Implementierung.

                        Falsch, weil eval() ja immer triggern müsste, wenn die Bedingung wahr ist, also würde:
                        [highlight=epc]
                        if (sun()==DUNKEL and eval(Wohnen)) then {
                        [/highlight]
                        für Wohnen=EIN und sun()=Dunkel ständig den then-Zweig ausführen.

                        Hier hingegen
                        [highlight=epc]
                        if (sun()==DUNKEL and Wohnen) then {
                        [/highlight]
                        nur ein Mal, wenn entweder

                        sun() von HELL auf DUNKEL wechselt
                        UND gleichzeitig
                        Wohnen=EIN

                        ODER

                        sun()=HELL
                        WÄHREND
                        Wohnen von AUS auf EIN wechselt
                        BR
                        Marc

                        Kommentar


                          #13
                          Zitat von saft6luck Beitrag anzeigen
                          Falsch, weil eval() ja immer triggern müsste, wenn die Bedingung wahr ist, also würde
                          Falsch verstanden: Eval "triggert", gibt das pro Zyklus an "AND" weiter.
                          Dieses ist nun zwar "angetriggert" ändert aber am Ergebnis nichts, solange der Wert sich nicht ändert. Quasi so als ob hier ständig ein Telegramm mit dem Inhalt "Wohnen" eintrifft.
                          Da bei AND kein eval steht, wirkt das Validierungsschema.
                          Anders wäre das nun bei
                          if eval(sun()==DUNKEL and Wohnen) then ....

                          Ich hoffe, das ist damit klarer.
                          offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                          Enertex Produkte kaufen

                          Kommentar


                            #14
                            gröglllllll ärgll
                            Gruss Pio

                            Kommentar


                              #15
                              Aber das sind genau die Beispiele, die in dieser detaillierten Form so ins Handbuch gehören!

                              Wieda wat jelernt! Jute Nacht!
                              Gruss Pio

                              Kommentar

                              Lädt...
                              X