Ankündigung

Einklappen
Keine Ankündigung bisher.

Vergleichsoperatoren, wo ist der Wurm?

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

    Vergleichsoperatoren, wo ist der Wurm?

    Hallo Gemeinschaft,
    versuche eine Vergleichsabfrage die leider nicht so funktionier wie ich dachte.
    Hintergrund: Wenn die Heizanfrage bei allen GA unter 10 sinkt soll die Zirkulationspumpe Heizung abschalten.Steigt sie bei irgendeiner GA über 10 soll die Pumpe angehen.
    Anbei der Code:
    // Definition Schwellwert ab wann die Zirkulationspumpe angeht
    S_Wert=10u08

    if ("Stellgroesse Heizen Büro EG-4/1/2"<S_Wert)and\\
    ("Stellgroesse Heizen Schlafzimmer EG-4/1/3"<S_Wert)and\\
    ("Stellgroesse Heizen Wohnzimmer EG-4/1/4"<S_Wert)and\\
    ("Aktor Heizung Ein/Aus-4/0/0"==EIN)\\
    then write ("Aktor Zirkulation Hzng.-4/0/1",AUS) else write ("Aktor Zirkulation Hzng.-4/0/1",EIN) endif

    Mache ich einen Denkfehler irgendwo?
    Villeicht hat jemand eine elegantere Lösung.
    Grüße Alfred

    #2
    Ja.
    Dein Denkfehler ist die UND Verknüpfung beim Status der Heizungsaktors.
    Sobald du mit dem THEN den Aktor aus schaltest wird die Bedingung wieder UNWAHR und der ELSE Zweig schlägt zu.
    Ich würde das in 2 IFs machen.
    1x zum ausmachen und 1x zum anmachen.
    Gruß
    Volker

    Wer will schon Homematic?

    Kommentar


      #3
      Vorschlag:

      Code:
      Zirku = "Stellgroesse Heizen Büro EG-4/1/2" >= S_Wert or "Stellgroesse Heizen Schlafzimmer EG-4/1/3" >= S_Wert or .... ;
      
      if change(Zirku) and (Zirku !=  "Aktor Heizung Ein/Aus-4/0/0") then
      {
            write("Aktor Zirkulation Hzng.-4/0/1", Zirku);
      } endif;
      Wobei die Statusabfrage der Zirkulationspumpe eigentlich nicht relevant sein sollte...

      Nebenbei bemerkt: Ich steh' eher auf positive Abfragen - das korrespondiert besser mit der menschlichen Denkweise, deshalb die Umstellung auf >= und or.
      Zuletzt geändert von klaus_kraemer; 22.04.2018, 07:48.

      Kommentar


        #4
        Danke für die Antworten.

        @snowmaker: Es sind verschiedene Aktoren. Gedanke war wenn die Bed. erfüllt ist (alle Stellgrößen unter 10) und die Heizung an ist soll die Umwälzpumpe ausgehen.
        Sobald irgend eine Stellgröße über 10 ist soll die Pumpe angehen.

        @klaus_kraemer: Elegante Lösung, nur sollte ich die Vergleiche nicht mit " and " verbinden damit nicht nur irgendeine Abfrage wahr ist sondern alle . Erst dann soll die Zirkulationspumpe ausgehen.

        Kommentar


          #5
          Zitat von chook Beitrag anzeigen
          Danke für die Antworten.

          @klaus_kraemer: Elegante Lösung, nur sollte ich die Vergleiche nicht mit " and " verbinden damit nicht nur irgendeine Abfrage wahr ist sondern alle . Erst dann soll die Zirkulationspumpe ausgehen.
          Geh meinen Vorschlag nochmal durch: Wenn auch nur eine Stellgröße größer/gleich 10 ist, geht Zirku auf EIN. Das "verodern" ist hier schon richtig. Ich habe Deine Formulierung des Vergleichs nur boolesch negiert.



          Kommentar


            #6
            Ach ja, wenn Du tatsächlich "über 10" meinst, muss bei meiner Lösung das ">=" gegen ">" ersetzt werden und bei Deiner ein "<=" verwendet werden.

            Kommentar


              #7
              Danke klaus_kraemer, werden deinen Vorschlag einbinden. Noch eine Zwischenfrage. Welchen Wert nimmt "Zirku" an wenn die Bedingungen wahr sind? Ist es 1 od. 0 oder kommt eine pos. Ganzzahl raus. Soweit ich es verstanden habe ergibt der Vergleich eine 1 od. 0.
              Also wenn irgend eine Stellgröße über/gleich 10 ist hat "Zirku" den Wert 1. Richtig? Solange nicht alle Stellgrößen unter 10 sind bleibt der Wert 1.
              Hoffe ich habe es richtig verstanden.
              Grüße Alfred

              Kommentar


                #8
                Boolesche Verknüpfungen ergeben immer einen Wert vom Datentyp b01. 0b01 entspricht AUS, 1b01 entspricht EIN - siehe auch die vordefinierten Konstanten des EibStudio. Wie der EibPC intern den b01 Typ speichert bleibt offen, denn bei kleinem Speicher könnte man auf einem Byte auch 8 Wahrheitswerte unterbringen - ich komme noch aus der Zeit, als man um jedes Speicherbyte gerungen hat....

                Mit convert(Zirku, 0u08) kannst Du den Wert der Variablen z.B. in einen unsigned Byte-typen (u08) wandeln und so einen Wahrheitswert in Berechnungen mit einbeziehen.

                Und Du hast ansonsten wohl richtig verstanden. Ein bißchen mit dem Debugger spielen könnte Dir sicher nicht schaden, um besser zu verstehen.

                Kommentar


                  #9
                  Danke klaus_kraemer für deine Hilfe.
                  Hat alles funktioniert bis auf die Statusabfrage der Var. "Zirku". Immer wenn ein Ereigniss beim Vergleich stattgefunden hat (ein "or" wahr wurde) hat die Pumpe ausgeschaltet.
                  Nach entfernen von "change(Zirku) and" läuft alles .
                  Ich habe gerade festgestellt das ich noch viel lernen muß .

                  Grüße Alfred

                  Kommentar


                    #10

                    Kommentar

                    Lädt...
                    X