PID Regler richtig einstellen.

ssyn

Level-2
Beiträge
132
Reaktionspunkte
12
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich komme zu Frage mit PID Regler und kann leider nicht selbst die Funktionalität vollständig erfassen.

Ich möchte den Fall mit Wassertank simulieren, wo muss bestimmte Temperatur eingehalten werden.
Es gibt "Heater", sobald ist "Heater" aktiv, steigt die Temperatur auf 0.01 Grad pro Zyklus (20 ms)
Es gibt "Coller", sobald ist "Cooler" aktiv, sinkt die Temperatur auf 0.01 Grad pro Zyklus
Und Wassertemperatur sinkt zusätzlich ständig auf 0.003 Grad pro Zyklus wegen Wärmeverluste.

Ich möchte es mit PID Regler machen, aber heater and cooler startet zu oft, ich spielte viel mit KP, TN und TV, aber Problem bleibt doch da.

Code:
PROGRAM PLC_PRG
VAR
    controller: PID;
    ActT : REAL ;
    SetT : Real ;
    heater: BOOL;
    cooler: BOOL;
END_VAR

Code:
controller(actual:=ActT,Set_Point:=SetT);

IF controller.Y  > SetT THEN
  heater := TRUE;
  cooler := FALSE;
ELSIF   controller.Y < SetT THEN
  heater := FALSE;
  cooler := TRUE;
END_IF

IF heater THEN
    ActT := ActT + 0.01;
    ActT := ActT - 0.003;
END_IF

IF cooler THEN
    ActT := ActT - 0.01;
    ActT := ActT - 0.003;
END_IF


pid-mid.gif

Können Sie bitte mir erklären, was mache ich falsch?
 
Code:
// durch hysterese > 0.0 wird ein Bereich ("Band") geschaffen,
// in dem weder heater noch cooler aktiv ist!

heater := controller.Y > hysterese ;
cooler := controller.Y < -hysterese ;

IF heater THEN
    ActT := ActT - 0.003 + 0.01 ;
ELSIF cooler THEN
    ActT := ActT - 0.003 - 0.01 ;
ELSE // weder heater noch cooler:
    ActT := ActT - 0.003 ;
END_IF ;

// alternativ dasgleiche mit weniger Aufwand:

IF controller.Y > hysterese THEN
    ActT := ActT + 0.01 ;
ELSIF controller.Y < -hysterese THEN
    ActT := ActT - 0.01 ;
END_IF ;
ActT := ActT - 0.003 ;
Der Vergleich von 'controller.Y' mit 'SetT' ist falsch, wenn mit 'SetT' der Sollwert gemeint ist.
Der "controller" muss den Sollwert mit dem Istwert vergleichen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
ist hysterese einfach zusätzlich variable oder eingebaute Funktion?

Code:
PROGRAM PLC_PRG
VAR
....
hysterese : REAL;
END_VAR

Ich ergänze diese variable und benutze Ihre Programm, aber die Arbeit ändert sich nicht.
 
ist hysterese einfach zusätzlich variable oder eingebaute Funktion?

Ich ergänze diese variable und benutze Ihre Programm, aber die Arbeit ändert sich nicht.
Ja, hysterese ist eine REAL-Variable, wie Du schon richtig erkannt hast.

In die Variable hysterese musst Du noch einen Wert > 0.0 eintragen.
Z.B. hysterese := 0.1 ;
Welcher Wert das sein müsste, das musst Du noch durch HerumProbieren ermitteln!
 
Ich habe Y_MIN 20, Y_Max 28, SetT (Sollwert) 23 und bei Hysterese 0.1 der Heater einfach arbeitet ständig.
pidd.jpg
pidd2.jpg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe Y_MIN 20, Y_Max 28, SetT (Sollwert) 23 und bei Hysterese 0.1 der Heater einfach arbeitet ständig.
Wie gesagt, bitte mit verschiedenen (positiven) Werten für hysterese testen, wie sich das Programm verhält.
Je kleiner der Wert ist, desto geringer ist der Unterschied im Verhalten zu Deiner ursprünglichen Version.
Wird der Wert aber zu gross gemacht, so kann die gewünschte Temperatur nicht mehr genau genug erreicht werden.
Was für Deinen Geschmack "genau genug" ist, das weiss ich leider nicht.
 
Okay, versuche noch einmal überlegen.

Was ich noch gar nicht verstehe, wieso cooler bei mir nie aktiv ist.

pidd3.jpg
controllerY (20) ist kleiner als -hysterese(24), aber cooler ist FALSE :oops:
 
Was ich noch gar nicht verstehe, wieso cooler bei mir nie aktiv ist.
Das ist eigentlich normal, da ja ständig eine Abkühlung stattfindet, auch wenn cooler FALSE ist. Meistens kann man auf ein aktives Kühlen verzichten.
Anhang anzeigen 60793
controllerY (20) ist kleiner als -hysterese(24), aber cooler ist FALSE :oops:
controller.Y = 20 wird mit -hysterese = -24 verglichen.
Der Wert 24 für hystesrese dürfte (viel) zu gross sein.

Eine Hysterese von 0.1 bedeutet das der der Regler ab einer Änderung des Ist-Wertes von 0,1 (°C) nach "oben" oder nach "unten" nachregelt.
Die Hysterese wird hier auf den ReglerAusgang angewendet. Deshalb dürfte kein Zusammenhang mit der Einheit °C bestehen.
ReglerAusgang > Hysterese : es muss geheizt werden.
ReglerAusgang < -Hysterese: es muss gekühlt werden.
ReglerAusgang >= -Hysterese UND ReglerAusgang <= Hysterese : heizen und kühlen sind ausgeschaltet - daher die Beruhigung, dass nicht ständig zwischen heizen und kühlen umgeschaltet wird. Daher auch die grössere Toleranz bezüglich einer möglichst genauen Einhaltung der Temperatur.

bedeutet das
Code:
-hysterese
dass hysterese negiert wird? :unsure:
Aber ja doch. genau das steht doch da!

Ich denke, ich habe gefunden, wo problem war. Setze Y_MIN und Y_MAX auf 0 und jetzt sieht Arbeit schon wesentlich besser, spiele weiter mit KP, TN und TV und hysterese
Ich weiss nicht, was Y_MIN und Y_MAX ist. Sind das die Grenzwerte, auf die der ReglerAusgang begrenzt werden soll?
Dann sollte Y_MIN < -hysterese und Y_Max > hysterese sein.

KP dürfte die ProportionalVerstärkung sein und TN bzw. TV der Integral- bzw. der Differenzial-Anteil des PID-Reglers.

Anfangen mit hysterese = 0 und I- und D-Anteil unwirksam gemacht und KP=0.
Den Sollwert konstant halten.
Dann KP solange erhöhen, bis der RegelKreis schwingt.
Dann die PeriodenDauer der Schwingung notieren. Aus PeriodenDauer die Werte für D-Anteil und I-Anteil berechnen *).
Dann KP solange verringern, bis der RegelKreis nicht mehr schwingt.
Den D-Anteil aktivieren.
Den ProportionalAnteil KP vorsichtig erhöhen, bis der RegelKreis wieder schwingt.
Den ProportionalAnteil KP vorsichtig wieder veringern, bis der RegelKreis nicht mehr schwingt.
Dieser neue Wert für KP dürfte/sollte jetzt ein wenig grösser sein.
Dann ein RechteckSignal auf den Sollwert geben, d.h. in regelmässigen zeitlichen Abständen den Sollwert zwischen einem niedrigen (z.B. 15°C) und einem hohen (z.B. 25°C) Wert umschalten ("Sprungfunktion").
Das Verhalten des Reglers beobachten. Der Istwert sollte dem Sollwert "schnell" folgen (innerhalb der Möglichkeiten begrenzt durch die zur Verfügung stehende Heiz- und Kühl-Leistung), aber nicht überschwingen.
Es dürfte sich so verhalten, dass der Istwert den Sollwert nie ganz erreicht, also immer eine gewisse Differenz erhalten bleibt.
Dann den I-Anteil aktivieren.
Dadurch soll die verbleibende Differenz nach dem Umschalten des Sollwertes nach und nach abgebaut werden.

Erst jetzt mit dem Wert für Hysterese versuchen, dass die Temperatur "genau genug" durch den Regler eingestellt wird, aber nicht "zu oft" die Heizung ein- und ausgeschaltet wird.

*) Jetzt wird's ggfs schwierig, weil ich mir nicht sicher bin, was genau der Regler für Angaben benötigt. Muss ich mal nachforschen ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vermutlich wollte s_kraut darauf aufmerksam machen, dass das Modell der Regelstrecke völlig ungeeignet ist, um das Verhalten eines PID-Reglers zu simulieren. Da hilft auch kein Optimieren. Man benötigt eine Regelstrecke, auf die das Stellsignal einen stetigen Einfluss hat. Ein PT1-Glied wäre für den Anfang ganz gut geeignet.
 
Vielen, vielen Dank noch einmal Heinileini, deine Information half mir so sehr vollständig die Logik verstehen. (y) (y) (y)

Ich habe noch ein bisschen mit PID-Regler gekämpft und fand einfache Lösung.

Das Problem war, dass ich immer mit der Einschaltung/Ausschaltung von Heizregister (so, von 0 sofort auf 100% und zurück) alles regeln wollte, was total falsch war. Natürlich musste ich die Heizung von 0 auf 100% flexible regeln.

Die Lösung:

Code:
PROGRAM PLC_PRG
VAR
    controller    :         PID := (Y_min:=0, Y_max:=100);
    ActT         :        REAL ;     // IstTemperatur     -         Aktuelle Temperatur
    SetT         :         REAL;    // SollTemperatur     -        Eingestellte Temperatur
    hy_y        :        INT;
END_VAR

Und "Programm"

Code:
controller(actual:=ActT,Set_Point:=SetT);
hy_y := REAL_TO_INT(controller.Y);
ActT := ActT + (hy_y * 0.0005) - 0.01; // Heizung bei 100 % + 0,05 Grad pro 20 ms und Wärmeverlust - 0,01 Grad pro 20 ms

Natürlich, das ist nur die Simulation und in echte Situation die Kode muss ein bisschen anders geschrieben werden.

hy_y als INT, damit nicht zu oft den Wert für Heizung ändern und sieht visuell auf Visualisierung besser aus.

KP := 11, TN:= 7 und TV:= 7 (das kann ich durch Visualisierung online ändern).

Funktioniert sehr gut und ist für mich noch ein Schritt weiter, danke alle Teilnehmer in Thema auch!
 
Das Problem war, dass ich immer mit der Einschaltung/Ausschaltung von Heizregister (so, von 0 sofort auf 100% und zurück) alles regeln wollte, was total falsch war. Natürlich musste ich die Heizung von 0 auf 100% flexible regeln.
Total falsch war das nicht. Das hängt davon ab, ob die "Hardware", mit der geregelt werden soll, die Möglichkeit bietet, die HeizLeistung kontinuierlich (oder in Stufen) zu ändern oder, ob nur Ein- und Ausschalten zur Verfügung steht.
Auch mit nur Ein- und Ausschalten gibt es eine "KompromissLösung" genannt PWM (Pulse Width Modulation), die aber mit Relais/Schützen wohl eher uninteressant sein dürfte, wegen der hohen SchaltHäufigkeit.
Da Du z.Z. nur simulierst, bist Du in der glücklichen Lage, verschiedene Methoden ausprobieren und vergleichen zu können.

Vermutlich wollte s_kraut darauf aufmerksam machen, dass das Modell der Regelstrecke völlig ungeeignet ist, um das Verhalten eines PID-Reglers zu simulieren. Da hilft auch kein Optimieren. Man benötigt eine Regelstrecke, auf die das Stellsignal einen stetigen Einfluss hat. Ein PT1-Glied wäre für den Anfang ganz gut geeignet.
Das hängt wohl auch von der Regelstrecke ab, Dagobert. Um eine Heizung zu simulieren, finde ich auch ein (oder mehrere) PT1-Glied(er) näher an der zu simulierenden Aufgabe. Aber so total am Thema vorbei ist eine Annäherungen durch Rampen doch auch nicht, oder?
Zumindest, wenn es darum geht, den exponentiellen Verlauf der Kurven in nur kleinen Abschnitten nachzubilden, liegt man mit den Rampen doch nicht so sehr falsch.
Deiner Behauptung "dass das Modell der Regelstrecke völlig ungeeignet ist, um das Verhalten eines PID-Reglers zu simulieren" möchte ich glatt widersprechen. Der PID-Regler lässt sich (nicht zuletzt mangels besserer Alternativen) durchaus auf Regelstrecken anwenden, die nicht optimal auf die Eigenschaften des PID-Reglers abgestimmt sind!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
.. Deiner Behauptung "dass das Modell der Regelstrecke völlig ungeeignet ist, um das Verhalten eines PID-Reglers zu simulieren" möchte ich glatt widersprechen...
Widerspruch abgelehnt. Der PID-Regler hat mit seinem Stellsignal auf die o.g. Regelstrecke gerade mal den Einfluss, zwischen Heizen und Kühlen um zu schalten. Das Ergebnis ist ein schwingendes Etwas, was absolut nichts mit einer stetigen Regelung zu tun hat. Jeder simple Zweipunktregler macht das besser. Es ist einfach nur eine Illusion, dies als PID-Regelverhalten zu betrachten. Dem TE tust du damit keinen Gefallen, sorry.
 
Der PID-Regler hat mit seinem Stellsignal auf die o.g. Regelstrecke gerade mal den Einfluss, zwischen Heizen und Kühlen um zu schalten.
Ja, Dagobert. Darum habe ich ja in #2 versucht, den simplen "EinPunktRegler" durch Einführung der Hysterese in einen simplen Zwei- bis DreiPunktRegler aufzubohren:
// durch hysterese > 0.0 wird ein Bereich ("Band") geschaffen,
// in dem weder heater noch cooler aktiv ist!

Was ich noch gar nicht verstehe, wieso cooler bei mir nie aktiv ist.
Hier schreibt ssyn doch, dass er nicht mehr zwischen Heizen und aktivem Kühlen umschaltet, sondern nur noch zwischen Heizen und Nicht-Heizen.
Das Problem war, dass ich immer mit der Einschaltung/Ausschaltung von Heizregister (so, von 0 sofort auf 100% und zurück) alles regeln wollte, was total falsch war. Natürlich musste ich die Heizung von 0 auf 100% flexible regeln.
Hier macht er anscheinend den Schritt von Ein/Aus zu einem kontinuierlichen Variieren der HeizLeistung.
Ist das nicht das, was Du mit ...
Man benötigt eine Regelstrecke, auf die das Stellsignal einen stetigen Einfluss hat.
... gemeint hast?
Haben die ssyn-schen Rampen nicht auch einen "stetigen Einfluss" (na ja, nicht wirklich stetig, aber angenähert durch die feinen Abstufungen, die durch die RampenBildung entstehen)?
Ein PT1-Glied wäre für den Anfang ganz gut geeignet.
Hattest Du "PT1-Glied" gar nicht als Gegensatz zur RampenBildung gemeint, sondern als Gegensatz zum Ein-/Ausschalten?
Wenn ja, dann habe ich's falsch verstanden (und verstehe es auch weiterhin nicht).
Warum haben dann PID-Regler z.T. schon entsprechende Ausgänge für z.B. Heizen Ein/Aus und/oder Kühlen Ein/Aus?
Ist das ein überzogener Versuch, einen eierlegenden WollMilchSau-PID-Regler anzubieten, den in Wirklichkeit niemand braucht?
 
Heinileini,

sieh mir bitte nach, dass ich nicht mehr auf jeden deiner Kommentare eingehen kann. Ich versuche es aber noch mal unter Zuhilfenahme meiner Buntstifte. Das folgende Bild zeigt einen geschlossenen Regelkreis. Ein geschlossener Regelkreis ist gut :).

Regelkreis geschlossen.png


Das nächste Bild zeigt den Regelkreis, mit dem unter Verwendung des Models aus #5 simuliert und optimiert wurde:

Regelkreis offen.png

Dort, wo das Kreuz gesetzt ist, ist der Regelkreis unterbrochen. Ein Regelkreis mit Unterbrechung zu seiner Regelstrecke ist ganz ganz schlecht zu regeln :devilish:. "ssyn" ist dennoch durch wenige wertvolle Tipps auf den richtigen Weg gebracht worden. Das ist wiederum gut :).
 
Zurück
Oben