PI-Regler in Java

Hallo Leute,

ich muss für ein Projekt einen PI-Regler in Java programmieren. Da das Grundkonzept des Programms vorgelegt wurde, muss ich nur eine Klasse konstruieren, die 2 Werte bekommt. Einmal den aktuellen Wert und einmal den Sollwert.

Eine allgemeine Formel habe ich breits im Internet gefunden:

esum = esum + e
y = Kp * e + Ki * Ta * esum


"e" ist die hier Regeldifferenz (Sollwert - akt.Wert = e)
"esum" wird dann einfach ausummiert.

Nur wie bestimme ich nun Ki,Kp und Ta?

Mfg


 
AW: PI-Regler in Java

Hallo, das hängt ganz von dem zu regelnden System ab. Darüber brauchst du Informationen und dann gibt es viele verschiedene Auslegungsverfahren, von Faustformeln über gezielte Berechnung bis zu Parameteroptimierung.

Ein oft verwandtes Faustformelverfahren sind die Einstellregeln nach Chien/Hrones/Reswick. Dafür muss es sich aber um eine PT1-Strecke handeln, zumindest annähernd. Ta ist die Abtastzeit.

Um weiter zu machen, bräuchte man also ein paar mehr Informationen über das Regelproblem.

Gruß
 
AW: PI-Regler in Java

Es geht hauptsächlich um eine Heizungsregelung.
Der Ausgabewert der Methode muss zwischen 0 und 1 liegen, damit der Heizungskessel nicht andauernd vollständig heizt.

Gruß
 
AW: PI-Regler in Java

OK, eine Heizungsregelung, sprich, es gibt eine Heizung, einen Sensor, einen Kessel und eine Solltemperatur. So einen Prozess kann man im Allgemeinen mit einem PT1-Tt-System annähern, demzufolge wäre eine Einstellung nach besagtem Chien/Hrones/Reswick möglich. Da es eine diskrete Regelung ist, musst Du noch überlegen, wie die Abtastrate Ta gewählt wird. Wenn Du in der Lage bist, diese sehr klein zu setzen, dann ist es OK, sollte sie größer sein, dann muss sie mit beachtet werden und bspw. auf die Einstellregeln nach Takahashi zurückgegriffen werden.

Für beides müssen wiederum die Streckenkennwerte bekannt sein, spricht T1 und Tt, diese kannst du einer Sprungantwort entnehmen.

Hast du eine konkrete Strecke vorliegen oder geht es nur um die Theorie, wie man zu diesen Werten käme? Wie "gut" muss die Regelung sein? Wenn bestimmte Gütekriterien vorgegeben sind, müssen andere Verfahren Anwendung finden.

Wenn du näehere Informationen gibst, dann kann ich dich auch mit Gleichungen versorgen. Will jetzt hier nicht alle Möglichkeiten hintippen :-)

Gruß
 
AW: PI-Regler in Java

Im Anhang ist ein Beispiel wie es derzeit bei mir aussieht ... Den Boiler habe ich mit einem Zweipunktregler realisiert (ist erledigt und funktioniert) und uns wurde der Tipp gegeben, dass die Heitung am Besten mit einem PI-Regler gemacht werden kann, da man den D-Anteil vernachlässigen kann. Mein Problem ist jetzt an die Werte für die Formel zu kommen.
xaP = Kp * xe
xaI = Ki * xe * delta_t + xa0
xaPI = xaP + xaI
xe habe ich und xa0 kann man doch vernachlässigen da der Verlauf bei 0 beginnt.
delta_t nehme ich die zeitliche Differenz bei der die Funktion immer aufgerufen wird.
Bleibt also Kp und Ki!?
 

Anhänge

  • Unbenannt.jpg
    Unbenannt.jpg
    65,4 KB · Aufrufe: 17
AW: PI-Regler in Java

Hallo, ja, und um diese zu bestimmen braucht man Informationen über den Prozess, also wie schnell der abläuft einfach gesagt.
Es sind 3 Räume, für jeden eine Heizung, also auch für jeden einen Regler. Wenn die Räume bspw. unterschiedlich groß sind, wird sich ein Raum schneller aufheizen als der andere, hätte also eine andere Zeitkonstante.
Um diese Zeitkonstante und evtl. die Totzeit zu bestimmen, müsstes du mal eine Sprungantwort aufnehmen. Sprich, den Raum auf einen stationären Wert abkühlen, dann die Heizung sprunghaft mit voller Leistung betreiben und die Kurve der Raumtemperatur aufnehmen.

Über das: http://de.wikipedia.org/wiki/Systemidentifikation#Wendetangentenverfahren kannst du die Ersatztotzeit Tu und die Ersatzzeitkonstante Tg bestimmen.
Mit diesen Werten gehst du hier hin: http://de.wikipedia.org/wiki/Faustf...nstellregeln_nach_Chien.2C_Hrones_und_Reswick und berechnest deine gesuchten Werte (Ki=1/TN).

Wie groß ist die Aufrufzeit deines Reglers? Sollte diese größer sein als, naja, sagen wir mal 5% von Tg, dann sollte sie innerhalb eines anderen Verfahrens mit beachtet werden. Oder mal probehalber die halbe Abtastzeit auf das Tu aufschlagen und damit rechnen.

Gruß

P.S.: Dass die Stellgröße zwischen 0 und 1 liegen soll ist nur eine Skalierungsfrage.
 
Zuletzt bearbeitet:
AW: PI-Regler in Java

Hallo, also es sind 3 räume die alle unterschiedlich groß sind und zudem alle ein fenster haben welches logischerweise die temperatur weniger ansteigen lässt, außerdem kann die heizung 5 verschiedene temperaturstufen einnehmen ... die grafik zeigt den kleinsten raum, mit geschlossenem fenster und höchster heizstufe, was doch am meisten sinn machen würde!?
das problem ist zudem, dass die logik für alle 3 räume gleich ist und somit die konstanten alle gleich sein müssen :-/
hilft das weiter bei der lösung?


Unbenannt.jpg
 
AW: PI-Regler in Java

Hallo, ja, wenn die Logik gleich ist aber die Räume unterschiedlich, muss man eben Kompromisse in Kauf nehmen. Was meinst du mit 5 unterschiedlichen Stufen? Fünf verschiedene Sollwerte oder kannst du die Heizung im Bereich 0-100% nur auf 5 verschiedene Positionen einstellen? Damit ließe sich natrülich nicht gut regeln, wäre eher ein Fall für einen Mehrpunktregler.

Dein Bild ist etwas schwer zu erkennen und du hast auch nicht ganz den stationären Zustand abgewartet. Ich habe mal versucht was einzuzeichnen und abzulesen. Die Verstärkung K ist auf die Differenz bezogen, denn Anfangs-, Umgebungstemperatur oder Fenster sind Störungen, wenn ich mich jetzt nicht vertue. Außerdem ist sie auch auf 0-1 und nicht 0-100 gerechnet, so wie du es wolltest.
Mit den Werten gehst du jetzt bspw. in den Chien/Hrones/Reswick-Link und rechnest deine Parameter aus und guckst, obs irgendwie passt.

Gruß

Unbenannt.jpg
 
AW: PI-Regler in Java

Mit den Stufen meinte ich 5 verschiedene Sollwerte (6 (Frostschutz), 12, 16, 20, 24, 28) ...
iwie bringen mich die werte nicht weiter um an Kp und Ti zu kommen ...
was muss ich denn bei CHR nehmen?
Kp = 0.35 * 3180 / (1220 * 19.5);
ergibt einen sehr kleinen wert und eigt liegt Kp doch immer über 1!?
und Ti weiß ich gar nicht wie ich daran kommen soll :-/
habe auch eine neue grafik hochgeladen!Unbenannt.jpg
 
AW: PI-Regler in Java

KR muss nicht über 1 liegen. Die Strecke ist sehr langsam, das führt zu einer kleinen Reglerverstärkung. Ki ist, wie oben schon geschrieben, 1/TN.

Sagen wir mal mit Überschwingen, auf Störung:

Kp=0,7*3180/1220/19,5=0,094
TN=2.3*1220=2806s -> KI=1/TN=3,56e-4

Das gibt, wenn ich das mal fix mit unserem Modell simuliere, schon ein ganz passables Ergebnis. Schwingt etwas über, was ihn aber natürlich schneller macht.
Wenn ich MATLAB kurz optimieren lasse, mit etwas weniger Überschwingen aber ähnlicher Geschwindigkeit, komme ich zu:

Kp=0.08
KI=2.78e-4
 
AW: PI-Regler in Java

vielen dank, das sieht schon ganz gut aus :-)
leider schaffe ich es noch nicht genau an die zieltemperaturen heranzukommen.
somit gehe ich davon aus, dass ich die faktoren noch etwas anpassen muss.
hier mal das bisherige ergebnis:
Unbenannt.jpg
 
AW: PI-Regler in Java

Ob eine bleibende Abweichung eintritt oder nicht, liegt nicht an den Parametern sondern am Gesamtsystemverhalten. In diesem Fall sollte der PI-Regler auf jeden Fall dafür sorgen, dass der Sollwert erreicht wird.

Ausnahme: Störung in der Rückführung/Temperaturmessung

Solange eine Regelabweichung besteht sorgt der I-Anteil (der Term mit KI) für ein stetiges Wachsen der Stellgröße. Da du ja den Code vor dir hast, könntest du im Livedebugging über Haltepunkte ja feststellen, ob das im Bereich der Abweichung der Fall ist.
Es ist auch meist sinnvoll das Anwachsen des I-Anteils zu begrenzen (Anti-Wind Up), da der sonst unter Umständen voll laufen kann, wenn z.B. die Heizung auf Maximum steht, aber alle Fenster offen sind und der Sollwert einfach nicht erreicht werden kann.

Leider ist das Bild (für mich :-)) etwas zu klein, um etwas ordentlich zu erkennen.
 
Zuletzt bearbeitet:
Top