Ankündigung

Einklappen
Keine Ankündigung bisher.

Syntaxfragen, mehrere if-Abfragen

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

    Syntaxfragen, mehrere if-Abfragen

    Hallo,
    ich versuche mehrere Abfragen auf eine Variable zu gründen. Ich verstehe, das das nicht geht, wegen des "Validierungsprinzips" des EibPC. Leider fällt mir nix dazu ein, wie ich das hinbekomme. Vielleicht hat jemand 5 min Zeit was dazu zu schreiben.
    Es geht sich um folgendes:
    if delayc("Licht WZ Nord-2/1/0",MaximalTastenZeit,TimerRestZeit) then test=EIN endif /* Taste gedrückt, Timer starten */
    if "Licht WZ Nord-2/1/0" == AUS then { /* Taste wieder losgelassen */
    DimmerZeit = MaximalTastenZeit - TimerRestZeit /* Timer auslesen, zwischenspeichern */
    } endif
    if DimmerZustand == EIN and DimmerZeit < 1000u64 then DimmerZustand = AUS endif /* Dimmer war an, wurde kurz gedrückt, ist nun aus */
    if DimmerZustand == AUS and DimmerZeit < 1000u64 then DimmerZustand = EIN endif /* Dimmer war aus, wurde kurz gedrückt, ist nun an */
    if DimmerZustand == AUS and DimmerZeit > 1000u64 then DimmerZustand = EIN endif /* Dimmer aus, wurde lang gedrückt, ist nun an,Kinderzimmerf.*/

    Ich starte einen Timer wenn eine taste gedrückt wird und lese den Rest aus, wenn sie losgelassen wird. Dann rechne ich aus, wie lang sie gedrückt war. Das klappt alles soweit.
    Nun muss ich auswerten. Dazu muss der DimmerZustand und die "gedrückt" zeit ausgewertet werden. Wenn also der Dimmerzustand auf AUS steht und kürzer als 1000ms gedrückt wurde, soll der Dimmerzustand auf AN. Wenn bei DImmerzustand AUS länger gedrückt wird soll Dimmerzustand auch an. Das muss unterschieden werden, weil noch mehr unterschiedliche Funktionen dann ausgeführt werden sollen. Die Abfrage ist also nicht redundant. Bei Dimmerzustand AN und kurzem Tastendruck soll er auf AUS gehen. Die paar Zeilen code machen das aber nicht, weil offensichtlich die if-abfragen nicht alle ausgewertet werden, weil ja gleiche Abfragen in mehreren aufeinaderfolgenden if-abfragen getätigt werden.
    Ich hoffe jemand versteht was ich meine????
    Ach ja, ich will damit den Zustand von ELTAKO EUD12NPN abfragen (mitprotokollieren). Die habe ich an einen Aktuatorausgang gehängt. Das funktioniert sehr gut, solang ich keinen EibPC hatte. War halt die billigere Lösung

    #2
    [highlight=epc]
    if delayc("Licht WZ Nord-2/1/0",MaximalTastenZeit,TimerRestZeit) then test=EIN endif /* Taste gedrückt, Timer starten */
    if "Licht WZ Nord-2/1/0" == AUS then { /* Taste wieder losgelassen */
    DimmerZeit = MaximalTastenZeit - TimerRestZeit /* Timer auslesen, zwischenspeichern */
    } endif
    if DimmerZustand == EIN and DimmerZeit < 1000u64 then NeuerDimmerZustand = AUS endif /* Dimmer war an, wurde kurz gedrückt, ist nun aus */
    if DimmerZustand == AUS and DimmerZeit < 1000u64 then NeuerDimmerZustand = EIN endif /* Dimmer war aus, wurde kurz gedrückt, ist nun an */
    if DimmerZustand == AUS and DimmerZeit > 1000u64 then NeuerDimmerZustand = EIN endif /* Dimmer aus, wurde lang gedrückt, ist nun an,Kinderzimmerf.*/

    DimmerZustand = NeuerDimmerZustand
    [/highlight]

    sowas meinst Du?

    Kommentar


      #3
      Zitat von bmx Beitrag anzeigen
      [highlight=epc]
      if delayc("Licht WZ Nord-2/1/0",MaximalTastenZeit,TimerRestZeit) then test=EIN endif /* Taste gedrückt, Timer starten */
      if "Licht WZ Nord-2/1/0" == AUS then { /* Taste wieder losgelassen */
      DimmerZeit = MaximalTastenZeit - TimerRestZeit /* Timer auslesen, zwischenspeichern */
      } endif
      if DimmerZustand == EIN and DimmerZeit < 1000u64 then NeuerDimmerZustand = AUS endif /* Dimmer war an, wurde kurz gedrückt, ist nun aus */
      if DimmerZustand == AUS and DimmerZeit < 1000u64 then NeuerDimmerZustand = EIN endif /* Dimmer war aus, wurde kurz gedrückt, ist nun an */
      if DimmerZustand == AUS and DimmerZeit > 1000u64 then NeuerDimmerZustand = EIN endif /* Dimmer aus, wurde lang gedrückt, ist nun an,Kinderzimmerf.*/

      DimmerZustand = NeuerDimmerZustand
      [/highlight]

      sowas meinst Du?
      O.K. Danke. ich werds gleich ausprobieren. dann lag der fehler ja ganz woanders als ich dachte. ich muss da erstmal reinkommen

      Kommentar


        #4
        Danke bmx,
        das wars! Ich bin da überhaupt noch nicht drin.
        In dem Hnadbuch steht ja sinngemäß, das if-Abfragen nur ausgeführt/bearbeitet werden, wenn sich eine GA darin geändert hat. Bei Variablen ist das dann anders?? Werden diese Abfragen immer bearbeitet?

        Kommentar


          #5
          Also, ein Programm im EibPC ist eigentlich kein Programm in dem Sinne, das ein Maschinencode ausgeführt wird. Du ein compiliertes Programm eher mit einer Excel-Tabelle vergleichen die strikt von oben nach unten neu berechnet wird wenn sich was geändert hat und es notwendig ist.

          Beispiel:

          Einer Variable wird eine Konstante zugewiesen:

          Variable=AUS

          Das AUS ändert sich nach dem Programmstart nie mehr, also wird die Anweisung genau ein einziges Mal ausgeführt.

          Wenn eine If-Schleife betreten wird, so passiert das nur, wenn die Abfrage zum ersten mal WAHR wird.

          Sind die Argumente beim nächsten Schleifendurchlauf immer noch WAHR, passiert auf Grund des Validierungsschemas nichts mehr.

          Sind die Argumente FALSCH dann ist die Abfrage in der nächsten folgenden Schleife wieder "scharf".

          Beispiel:
          Variable = EIN

          if Variable == AUS then "mach was" endif

          Erstmal nach Starten passiert nichts. Wenn im Debugger nun Variable auf AUS gesetzt wird, dann ist die Bedingung der if-Schleife wahr und "mach was" wird ausgeführt.

          Die Variable bleibt aber auf AUS. Beim nächsten Zyklus hat sich der Werte der Variable nicht geändert, folglich wird der Ausdruck Variable == AUS nicht neu bewertet (Validierungsschema) und trotz der Tatsache, das die Abfrage eigentlich WAHR ist, wird "mach was" nicht ausgeführt.

          Verabschiede Dich von der Vorstellung, es handelt sich beim EibPC um einen Basic-Interpreter. Die Syntax der Sprache ist zwar ähnlich aber keinesfalls gibt es Subroutinen oder ähnliches. Alles wird in eine lineare Tabelle (bzw. Baumstruktur) überführt und nach Abhängigkeiten und Änderungen evaluiert.

          Das hat eben auch zur Folge, das die Abarbeitung im EibPC sehr schnell vonstatten geht ohne einen GHz strotzenden Prozessor zu nutzen.

          Gruß,
          Bernd

          Kommentar


            #6
            ja, danke für die Erklärung. Man muss sich an diese Art des tippens (programmierens) erst gewöhnen. Ich denk halt noch anders. Wird sich geben. Braucht halt was Übung.

            Kommentar


              #7
              Zitat von bmx Beitrag anzeigen
              Das hat eben auch zur Folge, das die Abarbeitung im EibPC sehr schnell vonstatten geht ohne einen GHz strotzenden Prozessor zu nutzen.
              Die Gute Performance ist m.E. ein Seiteneffekt.
              Wichtiger ist, dass der KNX Bus bzw. jeder Aktor, Taster, Sensor, etc. genau auf diese Weise (durch Änderung erfolgt Reaktion) funktioniert und wir das beim Design "nur" in der Programmierung abgebildet hatten.
              offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
              Enertex Produkte kaufen

              Kommentar


                #8
                Muss man sich halt erstmal dran gewöhnen.
                @ Enertegus: Ist das eigentlich dein Beruf oder dein Hobby? Ich frag nur wegen der Zeiten zu denen du antwortest.

                Und noch die Frage nach dem ftp: Du schriebst, es gäbe da im Januar was neues. Wird man dann Makros/Befehle/Routinen haben, mit den man Text in eine Datei auf dem ftp schreiben kann?
                Das sollte ja von euch aus nicht das riesen Problem sein, weil ja Grundroutinen eh schon vorhanden sind. Ich fänds z.B. praktisch zum Langzeitloggen und auch um die Bustelegramme zu loggen. Dann könnte das umwandeln von binär in txt mitels EibStudio entfallen.
                Hab sowas in die Richtung vor?

                Kommentar


                  #9
                  Zitat von yapon Beitrag anzeigen
                  Muss man sich halt erstmal dran gewöhnen.
                  @ Enertegus: Ist das eigentlich dein Beruf oder dein Hobby? Ich frag nur wegen der Zeiten zu denen du antwortest.
                  Eher Berufung - ich habe z.Z. Urlaub. Und da geh ich etwas später ins Bett. Als Betthupferl dann immer noch schnell das Forum...

                  Und noch die Frage nach dem ftp: Du schriebst, es gäbe da im Januar was neues. Wird man dann Makros/Befehle/Routinen haben, mit den man Text in eine Datei auf dem ftp schreiben kann?
                  nee, die aktuelle Beta hat zwar einiges Neuen, das aber nicht, wobei wir aber auch nicht soweit davon entfernt sind.
                  bmx hat uns da eine ftp-Makrolib geschickt, was wir uns dann mal nach dem Urlaub anschauen werden. Diese Lib soll wohl mit dem Boardmitteln ( tcpsend etc.) einen ftp-Server ansprechen.
                  offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                  Enertex Produkte kaufen

                  Kommentar


                    #10
                    Zitat von enertegus Beitrag anzeigen
                    Eher Berufung - ich habe z.Z. Urlaub. Und da geh ich etwas später ins Bett. Als Betthupferl dann immer noch schnell das Forum...

                    nee, die aktuelle Beta hat zwar einiges Neuen, das aber nicht, wobei wir aber auch nicht soweit davon entfernt sind.
                    bmx hat uns da eine ftp-Makrolib geschickt, was wir uns dann mal nach dem Urlaub anschauen werden. Diese Lib soll wohl mit dem Boardmitteln ( tcpsend etc.) einen ftp-Server ansprechen.
                    Das ist ja unerhört, einfach Urlaub zu machen, wo andere Leute dringend auf neue Feature warten
                    Ich hab ihn angeschrieben, ob er sie mir auch schickt. Mir eilt es etwas, weil ich meine Heizung (9 Sensoren, Holzofen usw.) loggen will. Das geht halt nur im Winter.

                    Kommentar


                      #11
                      Wichtiger ist, dass der KNX Bus bzw. jeder Aktor, Taster, Sensor, etc. genau auf diese Weise (durch Änderung erfolgt Reaktion) funktioniert und wir das beim Design "nur" in der Programmierung abgebildet hatten.
                      Witzig, denn so funktionieren 99% aller Programme, nicht nur am KNX-Bus.

                      Wird es noch ein Update der Inline-Makro-Funktionalität geben, damit man auch an beliebiger Stelle im Code eine (beliebige) Ersetzung vornehmen kann? Du hattest das doch noch implementieren wollen.
                      BR
                      Marc

                      Kommentar


                        #12
                        *Push*
                        BR
                        Marc

                        Kommentar


                          #13
                          Blockt eine lange IF/endif-Folge den Ablaufzuklus

                          Zitat von bmx Beitrag anzeigen

                          Beispiel:
                          Variable = EIN

                          if Variable == AUS then "mach was" endif

                          Erstmal nach Starten passiert nichts. Wenn im Debugger nun Variable auf AUS gesetzt wird, dann ist die Bedingung der if-Schleife wahr und "mach was" wird ausgeführt.

                          Die Variable bleibt aber auf AUS. Beim nächsten Zyklus hat sich der Werte der Variable nicht geändert, folglich wird der Ausdruck Variable == AUS nicht neu bewertet (Validierungsschema) und trotz der Tatsache, das die Abfrage eigentlich WAHR ist, wird "mach was" nicht ausgeführt.

                          Verabschiede Dich von der Vorstellung, es handelt sich beim EibPC um einen Basic-Interpreter. Die Syntax der Sprache ist zwar ähnlich aber keinesfalls gibt es Subroutinen oder ähnliches. Alles wird in eine lineare Tabelle (bzw. Baumstruktur) überführt und nach Abhängigkeiten und Änderungen evaluiert.

                          Das hat eben auch zur Folge, das die Abarbeitung im EibPC sehr schnell vonstatten geht ohne einen GHz strotzenden Prozessor zu nutzen.

                          Gruß,
                          Bernd
                          Bernd (BMX) hat in diesem Beitrag sehr schön das Ablaufkonzept beschrieben. Soweit habe ich auch versucht mein Programm aufzubauen.

                          Unklar ist mir jedoch das Verhalten innerhalb einer If-Endif-Schleife.
                          Besonders nach der Umstellung auf die V3 sind mir erhebliche Zweifel gekommen?

                          Ich übertreibe einmal an einem Beispiel:

                          if "GA.Ich gehschlafen" == EIN then

                          Write GA-Lampe1,AUS
                          ..
                          ..
                          Write GA-Lampe20 , AUS

                          // jetzt die Heizung runter

                          5x Write GA-Heizungen

                          //Jetzt die Jalousien + Lamellen

                          if GA-Raumtempreatur < 20 then
                          GA-Jalousie = 100%
                          GA-Lamelle = 100%
                          endif
                          if GA-Raumtempreatur >= 20 then
                          GA-Jalousie = 90%
                          GA-Lamelle = 20%
                          endif
                          display auf den Botton" Ich schlafe"
                          endif

                          Jetzt gehen n Befehle an die ETS, Statusmeldungen kommen herein!

                          Frage 1: Bleibt die If-Endif-Bedingung über den kompletten Ablauf Valid, d.h. der Ablaufzyklus wird um einige Sekunden unterbrochen?
                          (Einstellungen Anzahl ETS-Befehle pro Zeiteinheit, bis alle GAs beschrieben und gelesen wurden,die zwischen if/endif stehen )

                          Frage 2: Ist es sinnvoller ein Variablensystem zu nutzen?

                          if "GA.Ich gehschlafen" == EIN then
                          varSchlafen=EIN; varLichter = EIN
                          endif
                          if varSchlafen==EIN and varLichter == EIN then
                          Write GAlicht1,Aus
                          usw
                          varLichter=AUS
                          vaHeizungen = EIN
                          endif

                          if varSchlafen==EIN and varHeizungen == EIN then
                          Write GAHeizungen
                          varHeizungen = Aus
                          varJalousien = EIN
                          endif
                          usw

                          Ist damit ein schellerer Ablauf, bzw. schnellere Reaktion auf Status-GAs in der Visu gesichert.

                          Dis Befehlssyntay soll bitte nur beispielhaft sein!!
                          Meine Zweifel mögen unbegründet sein, aber die derzeitigen Bedingungen ( fehlender Seitenaufbau,langsamer Ablauf) ließen mich am Aufbau meiner Makros und Routinen zweifeln. GA-Reaktionen scheinen nicht vorhanden zu sein, bei späterem Bildaufaufbau sind diese dann (manchmal?) da.

                          Wolfgang

                          Kommentar


                            #14
                            Zitat von schloessl Beitrag anzeigen
                            Unklar ist mir jedoch das Verhalten innerhalb einer If-Endif-Schleife.
                            Besonders nach der Umstellung auf die V3 sind mir erhebliche Zweifel gekommen?
                            Da gab es wohl keine Umstellung

                            [highlight=epc]
                            if "GA.Ich gehschlafen" == EIN then

                            Write GA-Lampe1,AUS
                            ..
                            ..
                            Write GA-Lampe20 , AUS

                            // jetzt die Heizung runter

                            5x Write GA-Heizungen

                            //Jetzt die Jalousien + Lamellen

                            if GA-Raumtempreatur < 20 then
                            GA-Jalousie = 100%
                            GA-Lamelle = 100%
                            endif
                            if GA-Raumtempreatur >= 20 then
                            GA-Jalousie = 90%
                            GA-Lamelle = 20%
                            endif
                            display auf den Botton" Ich schlafe"
                            endif
                            [/highlight]
                            Jetzt gehen n Befehle an die ETS, Statusmeldungen kommen herein!
                            Generell werden Ausgaben in Puffer geschrieben (hier nur KNX-Bus-Puffer). Diese Puffer werden dann im Hintergrund abgearbeitet.

                            Frage 1: Bleibt die If-Endif-Bedingung über den kompletten Ablauf Valid, d.h. der Ablaufzyklus wird um einige Sekunden unterbrochen?
                            (Einstellungen Anzahl ETS-Befehle pro Zeiteinheit, bis alle GAs beschrieben und gelesen wurden,die zwischen if/endif stehen )
                            Es gibt einen Event zur Änderung der Variablen. Alles im then-Zweig wird einmal durchlaufen. Generell gibt es keine Kommandos, die den Ablauf blockieren oder verzögern (abgesehen von der tatsächlich benötigten Laufzeit natürlich).

                            Die Verarbeitung der Statusmeldungen musst du getrennt implementieren.

                            Ich glaube, dass beantwortet auch deine weitern Fragen und erklärt die Probleme.
                            BR
                            Marc

                            Kommentar


                              #15
                              Zitat von saft6luck Beitrag anzeigen
                              Wird es noch ein Update der Inline-Makro-Funktionalität geben, damit man auch an beliebiger Stelle im Code eine (beliebige) Ersetzung vornehmen kann?
                              Man kann die Makros schon lange wie "Funktionen" in [EibPC] nutzen, oder was meinst Du genau?
                              offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                              Enertex Produkte kaufen

                              Kommentar

                              Lädt...
                              X