Ankündigung

Einklappen
Keine Ankündigung bisher.

"and" und "or" in der "if" Anweisung besser verstehen - Validierung

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

    "and" und "or" in der "if" Anweisung besser verstehen - Validierung

    Über einen Taster pbutton soll beim drücken abwechselnd entweder ein Timer bei 0 sec starten und eine Variable (in meinem Code noch pdisplay) im 3 min ein- und 6 min aus Zyklus geschaltet werden. Oder die Variable ist dauerhaft ausgeschaltet.

    Im pbutton soll der Text „Automatik“ erscheinen, wenn der Timer startet, und der Text „AUS“ wenn die Variable Ausgeschaltet ist.

    Der Indikator im pbutton soll leuchten wenn die Variable EIN ist.




    Ich würde gerne elegantere Lösungen erlernen um mit Variabeln in einer „if“ Anweisung die mit anderen Variabeln per „and“ und „or“ verknüpft sind zu arbeiten.




    Code:
    //- Prio3 - Single Button um Variable „WildschweinradioAuto“ wie ein FlipFlop auf Zustand Automatik oder Aus zu setzen: - nicht schön aber tut was es soll.
    
    if pbutton(WildschweinRadioIndikatorID, LichtPageID)==1 then WildMerker1 = WildMerker1 + 1 endif
    
    if WildMerker1 == 1 then WildschweinradioAuto=EIN else WildschweinradioAuto=AUS endif
    
    if WildMerker1 == 2 then WildMerker1 = 0 endif
    
    
    
    
    // -Prio2 - Timer //3min an; 6min aus - funktioniert jedoch elegante lösung gesucht
    
    // mit OR funktioniert es nicht wenn ich die letzten beiden Zeilen ersetze durch  „if (WildMerker2>=3) or (WildschweinradioAuto==AUS) then WildMerker2=0 endif“
    
    if cycle(3,0) then WildMerker2 = WildMerker2 + 1 endif
    
    if (WildMerker2>=3) then WildMerker2=0 endif
    
    if (WildschweinradioAuto==AUS) then WildMerker2=0 endif
    
    
    
    
    // -Prio1 - pbutton setzten -  Tut nicht was es soll
    
    if WildschweinradioAuto==AUS then pdisplay(WildschweinRadioIndikatorID, $AUS$,LIGHT,INACTIVE,GREY, LichtPageID) endif
    
    if (WildschweinradioAuto==EIN and WildMerker2==2) then pdisplay(WildschweinRadioIndikatorID, $Automatik$,LIGHT,INACTIVE,BLINKBLUE, LichtPageID) endif
    
    if (WildschweinradioAuto==EIN and WildMerker2>=0) then pdisplay(WildschweinRadioIndikatorID, $Automatik$,LIGHT,ACTIVE,BLINKBLUE, LichtPageID) endif
    Das Problem bei „Prio1“ ist, vermutlich mein Umgang mit der Validierung. Ich vermute sobald WildschweinradioAuto=EIN ist, wird zwar die Auswertung der if Anweisung invalid aber nur für einen Zyklus. Dass sich dann WildMerker2 ändert, ist dann nicht mehr von Interesse und der ausführbare Teil der if Anweisung wird nicht mehr ausgeführt. Hier suche ich eine Lösung zum besseren Verständnis im Umgang mit if, and und or, bevor der ganze Code umgebaut wird.

    Bei „Prio2“ kann ich ein „or“ in der if Anweisung (zwar unschön) umgehen, indem ich die beiden Teile der Auswertung in zwei einzelne Zeilen geschrieben habe. Bei „and“ stehe ich auf dem schlauch und habe keine Lösung.


    Ich hoffe meine Ausführung ist nachvollziehbar.
    Zuletzt geändert von knxTest; 04.11.2017, 17:14.

    #2
    Mit folgender Änderung tut es fast was es soll, aber ich verstehe nicht warum "WildMerker2>=0" nicht funktioniert.

    Code:
    if (WildschweinradioAuto==EIN and WildMerker2==[COLOR=#FF0000][B]1[/B][/COLOR]) then pdisplay(WildschweinRadioIndikatorID, $Automatik$,LIGHT,INACTIVE,BLINKBLUE, LichtPageID) endif  
    
    if (WildschweinradioAuto==EIN and WildMerker2[B][COLOR=#FF0000]==0[/COLOR][/B]) then pdisplay(WildschweinRadioIndikatorID, $Automatik$,LIGHT,ACTIVE,BLINKBLUE, LichtPageID) endif

    Kommentar


      #3
      Es funktioniert wie gewollt. Der Code der mich nach Rom geführt hat sieht wie folgt aus. Änderungen in Blau.
      Jedoch ist mir in manchen Punkten nicht klar warum es nur so funktioniert.
      Insbesondere warum es vor der Änderung im Post #2 gar nicht funktioniert (die Anzeige im pbuton nicht geblinkt) hat. Erklärung willkommen.
      Vielleicht kann ich einfach nicht bis drei zählen...

      Code:
      if pbutton(WildschweinRadioIndikatorID, LichtPageID)==1 then WildMerker1 = WildMerker1 + 1 endif
      if WildMerker1 == 1 then WildschweinradioAuto=EIN else WildschweinradioAuto=AUS endif
      if WildMerker1 == 2 then WildMerker1 = 0 endif
      
      i[COLOR=#0000FF]f delay (WildschweinradioAuto==EIN, 3000u64 )then WildMerker2 = WildMerker2 + 1 endif
      if delay (WildschweinradioAuto==EIN and change (WildMerker2), 3000u64 )then WildMerker2 = WildMerker2 + 1 endif[/COLOR]
      
      if (WildMerker2>=3) then WildMerker2=0 endif
      [COLOR=#0000FF]if (change (WildschweinradioAuto) and WildschweinradioAuto!=EIN) then WildMerker2=0 endif[/COLOR]
      
      if WildschweinradioAuto==AUS then pdisplay(WildschweinRadioIndikatorID, $AUS$,LIGHT,INACTIVE,GREY, LichtPageID) endif
      if (WildschweinradioAuto==EIN and WildMerker2[COLOR=#0000FF]==1[/COLOR]) then pdisplay(WildschweinRadioIndikatorID, $Automatik$,LIGHT,INACTIVE,BLINKBLUE, LichtPageID) endif
      if (WildschweinradioAuto==EIN and WildMerker2[COLOR=#0000FF]==0[/COLOR]) then pdisplay(WildschweinRadioIndikatorID, $Automatik$,LIGHT,ACTIVE,BLINKBLUE, LichtPageID) endif
      (Anstelle der im #1 geforderten 3min sind hier 3 sec wg. Testzwecken)

      Kommentar


        #4
        Die Lösung, warum OR in der If Verknüpfung nicht so funktioniert, wie ich dachte, findet man hier:
        Irgendwie steh ich grad auf dem Schlauch.... Die Zeile if change(azimuth()) then pdisplay(3, round(azimuth(),0, AUS) + $° = $ + Himmelsrichtung, WIND, INACTIVE,

        Kommentar

        Lädt...
        X