Hysterese / Einschaltbedingung Ausschaltbedingung

  • Hallo zusammen,
    ich stehe gerade auf dem Schlauch.

    Beispiel:
    Ich möchte (als Beispiel) eine Heizung bei 18 Grad einschalten und bei 21 wieder ausschalten.

    Code
    if (Temp<18) 
      {Heizung = 1}
       else {
           {if ((Heizung==1) && (Temp >21))
             {Heizung = 1}
        else {Heizung =0}

    Die Idee dahinter:
    1. Bei unter 18 Grad einschalten.
    2. Wenn die Heizung eingeschaltet hat, aber noch nicht 21 Grad erreicht hat, dann soll sie anblieben.
    3. In allen anderen Fällen soll die Heizung aus sein.

    Punkt 1 Klappt.
    Punkt 2 klappt nicht. Ich vermute es liegt daran das die bedingung (Temp<18) nicht mehr erfüllt ist und somit die Heizung schon wieder aus ist.

    Hat jemand eine Idee? Bei einer SPS würde ich einfach ein RS-Gatter nehmen. Aber das gibts in C scheinbar nicht. :(

    Danke für Eure Hilfe,

    Achim

  • Du hast deine Logik völlig quer.

    Du musst zuerst über den Heizungszustand verzweigen, und DANN über die Temperatur.

    Code
    if(Heizung && Temp > 21) { Heizung = 0; }
    if(!Heizung && Temp < 18) { Heizung = 1; }

  • Du hast deine Logik völlig quer.

    Du musst zuerst über den Heizungszustand verzweigen, und DANN über die Temperatur.

    Code
    if(Heizung && Temp > 21) { Heizung = 0; }
    if(!Heizung && Temp < 18) { Heizung = 1; }

    Ähhhh.....
    :s
    Kann gar nicht funktionieren..... viel zu einfach!
    :blush:
    /Sakasmus aus
    :D
    Danke für den Tip. Werde ich heute abend versuchen!
    :bravo2:

    • Offizieller Beitrag


    Würde dann nicht nur zwischen 18 und 21° geheizt?

    :wallbash: ich I***t!

    Code
    if(Temp > 21) { Heizung = 0; }
    else { Heizung = 1; }

    // EDIT: hier fehlen noch die 18 Grad

  • hyle Nö. Ohne den Ist-Zustand in die Bedingung aufzunehmen ist das logisch unmöglich, weil du 3° Überlappung hast, in der die Heizung sowohl an als auch aus sein kann. Dazu bedarf es dann mehr wissen.
    Automatisch zusammengefügt:
    Nachtrag: Und noch mal nö. So erfriert zwar keiner, aber die gewünschte Hysterese hast du ausgebaut.

  • Hallo __deets__,


    hyle Nö. Ohne den Ist-Zustand in die Bedingung aufzunehmen ist das logisch unmöglich, weil du 3° Überlappung hast

    Sehe ich nicht so:

    Code
    if t < 18 then heizung = 1
    if t > 21 then heizung = 0

    Im Temperaturbereich [18 ... 21] bleibt der Status Heizung unverändert. Bei steigender Temperatur wird weiter geheizt, bei fallender Temperatur nicht geheizt - bis jeweils die obere / untere Grenze überschritten / unterschritten wird.

    Damit die Variable [font="Courier New"]heizung[/font] nicht unbelegt ist, kann man es unmittelbar nach dem Start auf 0 oder 1 setzen.

    [OT]
    In Icon könnte man sogar noch auf die if's verzichten und die Vergleichsausdrücke direkt der Variablen heizung zuweisen.

    Code
    heizung := (t-17<1) | (21-t<0)

    Hier nutzt man eine Eigenheit von Icon, dass bei Vergleichen kein boolescher Wert geliefert wird, sondern der Ausdruck hinter dem letzten Vergleichszeichen.

    t-17 < 1 ist dann so zu lesen: Wenn t-17 kleiner als 1 ist, dann ist das Ergebnis 1.
    Wenn dieser Vergleich erfolglos war, dann bewirkt |, dass der Ausdruck rechts davon alternativ für ein Ergebnis herangezogen wird.
    21-t < 0 ist dann so zu lesen: Wenn 21-t kleiner als 0 ist, dann ist das Ergebnis 0.
    1 => Heizung an-, 0 => Heizung ausschalten

    Dazwischen ist weder die eine noch die andere Bedingung erfüllt, die Zuweisung [font="Courier New"]heizung :=[/font] wird dann nicht durchgeführt. Der Wert der Variablen [font="Courier New"]heizung[/font] bleibt wie er war.


    Man kann das noch einen Schritt weiterführen, indem man direkt die Funktion heizen() mit diesem Vergleich aufruft.
    Der Ausdruck

    Code
    heizen((t-17 < 1) | (21-t < 0))


    bewirkt dann analog, dass

    • bei einer Temperatur < 18 heizen(1) gilt
    • bei einer Temperatur t > 21 heizen(0) gilt
    • bei allen Temperaturen dazwischen heizen() nicht aufgerufen wird, da die Bedingungen nicht erfüllt sind (eine weitere Besonderheit von Icon). Das heißt, die Heizung läuft weiter wie bisher. Wenn sie heizen soll, dann heizt sie - wenn nicht, dann bleibt sie aus.


    [/OT]


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (15. Februar 2017 um 23:30)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!