PI Regler für Heizung

Fohnbit

Top Contributor
Hallo,

weiß jemand einen Beispielcode für einen PI Regler für Heizungssteuerungen? Es soll in % (0-100) die Ventilstellung ausgeben.

Vielen Dank!
 
Worum geht es denn genau? Für die Raumtemperatur gilt z.B. delta temp/delta t= K/temp, das bedeutet, dass in einem Raum umso langsamer steigt, um so wärmer er ist. Für eine 2-PunktSteuerung wird damit:

temp(t)= Temp0-exp(-k*t) für Heizung ist ein

und temp(t)= Temp1+exp(-k*t) für Heizung ist aus.

Im grafischen Bedeutet das eine sägezahnartige Veränderung der Temperatur, wo es zwischen der Änderung der Heizung und der Änderung der Temperatur eine zeitliche Verzögerung gibt.
Soweit Theorie 1.
Nun ist aber der Herzkörper selbst auch eine Einrichtung, die so gestaltet ist dass es auch zu einer Verzögerung der Einstellung am Heizkörperventil und der Temperatur des Heizkörpers gibt.
Da aber die Temperatur des Raumes gemessen wird, ergibt sich das Modell der Heizung dieses Raumes als Differenzialgleichung 2. Ordnung.

Und dann kommt der PI-Regler. Diesen kann man im einfachsten beschreiben, indem man sein Eingang als x=temp (ist)-Temp(soll) nimmt, und seine Ausgangsgröße als y= -(k1*x+k2*(Integral von x über t)).
 
PI-Regler für Heizungssteuerungen sind ordinäre PI-Regler, wie jeder andere PI-Regler auch. Bevor du einen PI-Regler für Java gefunden hast, hast du das selber geschrieben, das müßten <10 Codezeilen sein. Wenn du die Mathematik dahinter nicht hinkriegst - die Formeln gibt es zuhauf im Netz. Ansonsten einfach C- oder Arduinocode adaptieren.

Parametrieren mußt du den Regler natürlich noch selber...dafür gibts aber Verfahren wie das von Ziegler/Nichols.
 
Unglücklicherweise findet man im Netz bei "PI" nur Raspberry Ergebnisse ... einen PI Regler für Arduino oder Co habe ich noch nicht gefunden
 
Hier mal ein simpler P-Regler. Regelungstechnik ist allerdings schon sehr lange her, darum keine Ahnung, ob das zu 100% richtig ist 😉
[CODE lang="java" title="P-Regler"]public class P_Regler implements Regler {

private double kp; // Proportionalbeiwert
private double ap; // Arbeitspunkt

public P_Regler(double kp, double ap) {
this.kp = kp;
this.ap = ap;
}

public void setKp(double kp) {
this.kp = kp;
}

public void setAp(double ap) {
this.ap = ap;
}


/**
* @param w Sollwert
* @param x Istwert
* @return Stellwert
*/
@Override
public double getY(double w, double x) {
return Math.min(100, Math.max(0, ap + (w - x) * kp));
}

}[/CODE]
 
Zuletzt bearbeitet:

Zurück
Oben