Re: Hysterese programmieren

Hallo Zusammen :slight_smile:

ich hätte auch ne frage zum Hysterese.

Bei der Messung hab ich folgendes gemerkt:

Sollwert: 150mbar
Hystrese:5mbar

Wenn Soll-Hyst größer als Ist-Wert ist, soll Ventil öffnen, sonst schließen.
Das heißt das Ventil muss bei 145mbar shließen und erst bei 152mbar öffnen.

Leider ist mir bei der Messung aufgefallen, das er bei 148mbar öffnet und 144mbar schließt. Das vorgegebee Interval wird nicht ausgenutzt, so flattert das Ventil durch ständige auf und zu.

void uedruck_Flasche3(){
  //Unterdruckventil zu macheen
  
   if (Relai1Flag)
   {
    if (druck3  < PsollF3pos - Hyst1)
{           
     digitalWrite(Relai1, LOW);
     digitalWrite(Relai2, LOW);
    
  }
  if (druck3 >= PsollF3pos)
   
  {                         
   
    digitalWrite(Relai1, HIGH);
    digitalWrite(Relai2, LOW);
  }
}
else 
digitalWrite(Relai1, LOW);
digitalWrite(Relai2,HIGH);
}

Woran kann es liegen, das er den Interval nicht nutzt? liegt es an dem Code?

Edit: Inhalt gelöscht, war hinfällig.

Ich hab eigentlich ein neuen Beitrag wo ich wegen Druck diskutiere, leider wird dort nicht mehr geantwortet :slight_smile: hab viel zu viel gefragt :D. Da in diesem Beitrag speziel wegen Hysterese diskutiert wurde, dachte ich das es hier besser passt :slight_smile:

Hab den Topic von der anderen Diskussion getrennt.

Grüße Uwe

ah Okay. Ich dachte immer das es reicht wenn man auf einer Seite die Hysterese abzieht und das andere braucht man nicht. Deshalb flattert er immer?

Sollwert: 150mbar
Hystrese:5mbar

Wenn Soll-Hyst größer als Ist-Wert ist, soll Ventil öffnen, sonst schließen.
Das heißt das Ventil muss bei 145mbar shließen und erst bei 152mbar öffnen.

Leider ist mir bei der Messung aufgefallen, das er bei 148mbar öffnet und 144mbar schließt. Das vorgegebee Interval wird nicht ausgenutzt, so flattert das Ventil durch ständige auf und zu.

So wie Du das programmiert hats öffnet es bei 144mb :
(druck3 < PsollF3pos - Hyst1) = (druck3 < 150 - 5) = (druck3 < 145) (druck3 <= 144)
Und schließt bei 149mb:
(druck3 >= PsollF3pos) = (druck3 >= 150)

Grüße Uwe

Maria2:
ah Okay. Ich dachte immer das es reicht wenn man auf einer Seite die Hysterese abzieht und das andere braucht man nicht. Deshalb flattert er immer?

Du kannst alles machen.
Die Frage ist soll die Hysterese unterhalb, um oder oberhalb des Sollwerts sein.

Das Ventil flattert weil die Hyterese kleiner als die Störungen auf dem Meßwert sind.
Wenn Du 150 mbar hast, und die Messung +/- 3mbar schwankt, muß die Hysterese größer als 6 sein.

Grüße Uwe

Bei ersten befehl ist er ja auf LOW, das heißt da schließt er und bei den zweiten öffnet er

Es soll unterhalb des sollwert sein, weil ich exakt den sollwert erreichen möchte

dann muss ich folgendermaßen schreiben, damit ich den Sollwert erhalte?

if (Relai1Flag)
   {
    if (druck3  <= PsollF3pos - Hyst1) {        //wenn der Ist-W kleiner = 145 zu   
     digitalWrite(Relai1, LOW);
     digitalWrite(Relai2, LOW);
    
  }
  if (druck3 >= PsollF3pos)                       //wenn Ist-W größer = 150 auf
 
  {                         
    
    digitalWrite(Relai1, HIGH);
    digitalWrite(Relai2, LOW);
  }
}

stimmt das jetzt?

Kann ich anstatt größer/kleiner-zeichen nur = schreiben?

(druck3 = PsollF3pos - Hyst1)

Nein!

= ist eine Zuweisung
== wäre der Vergleich. Die Wahrscheinlichkeit, dass Du genau den Punkt triffst, ist gering.

= bzw. <= ist das, was Du nutzen solltest.

Gruß Tommy

das stimmt, hast du recht.

@Tommy: Würde ich mit folgende Befehl mein Sollwert erreichen?

Sollwert=150
Hyst=5

if (Relai1Flag)
{
if (druck3 <= PsollF3pos - Hyst1) { //wenn der Ist-W kleiner = 145 zu
digitalWrite(Relai1, LOW);
digitalWrite(Relai2, LOW);

}
if (druck3 >= PsollF3pos) //wenn Ist-W größer = 150 auf

{

digitalWrite(Relai1, HIGH);
digitalWrite(Relai2, LOW);
}
}

Maria2:
Kann ich anstatt größer/kleiner-zeichen nur = schreiben?

(druck3 = PsollF3pos - Hyst1)

Die = und == Problematik wurde schon angesprochen.

Nein besser nicht.
Wenn nämlich aus irgendeinem Grund der Wert ausgelassen wird schaltet der Ausgang nicht obwohl der Meßwert sehr viel größer oder sehr viel kleiner als der Sollwert ist.
Grüße Uwe

Hi

Warum editierst Du nicht Deine ganzen Post's, wenn Du 'noch was dazu schreiben' willst?
Das liest sich echt sehr anstrengend!!

Ob Dein Druckflag nun gesetzt ist, oder nicht, sollte bei diesem Problem ganz weit außen vor sein.
Hier geht es ausschließlich um die Hysterese dieses einen Ventil.
Wenn DAS klappt, kannst Du die Anforderung drum herum bauen, daß dieses Ventil überhaupt 'auf den Druck achten' soll.

Druck_Max=250mBar
Hysterese=10mBar
Druckerhöhung_abschalten WENN Druck>=Druck_Max
Druckerhöhung_einschalten WENN Druck+Hysterese<Druck_Max (oder Druck<Druck_Max-Hysterese)

Das schalten bei >=250mBar AUS
Und schalten bei <240mBar EIN

Wenn Das jetzt klappt, packe Dein 'Relai1Flag' drum herum.
Wenn Das ein Relais befeuern soll, solltest Du den Namen auch Relais nennen - ein Relai gibt's schlicht nicht.

Wenn Du auf Probleme triffst, isoliere Diese, baue einen eigenen Sketch, Der Sich NUR um dieses eine Problem kümmert.
Wenn das Problem dann kein Problem mehr ist, die gefundene Lösung in den Produktiv-Sketch - eine Baustelle fertig, auf zur Nächsten.

In einem Nachbar-Thread wurden bool'sche Ausdrücke mit 'nachtkalt' erstellt - Gleiches kannst Du auch mit Deiner Hysterese machen.
Du musst der Prüfung nur Akt_Druck, Grenz_Druck, Hysterese mitgeben - oder die Hysterese kommt fest in den Sketch - Deiner Fantasie sind hier kaum Grenzen gesetzt.

MfG

Super danke :slight_smile: