# PID Regler richtig einstellen.



## ssyn (29 April 2022)

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.


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


```
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
```




Spoiler: Video












Können Sie bitte mir erklären, was mache ich falsch?


----------



## Heinileini (29 April 2022)

```
// 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.


----------



## ssyn (29 April 2022)

ist *hysterese* einfach zusätzlich variable oder eingebaute Funktion?


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

Ich ergänze diese variable und benutze Ihre Programm, aber die Arbeit ändert sich nicht.


----------



## Heinileini (29 April 2022)

ssyn schrieb:


> 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!


----------



## ssyn (29 April 2022)

Ich habe Y_MIN 20, Y_Max 28, SetT (Sollwert) 23 und bei Hysterese 0.1 der Heater einfach arbeitet ständig.


----------



## Heinileini (29 April 2022)

ssyn schrieb:


> 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.


----------



## ssyn (29 April 2022)

Okay, versuche noch einmal überlegen. 

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



controllerY (20) ist kleiner als -hysterese(24), aber cooler ist FALSE


----------



## ducati (29 April 2022)

ssyn schrieb:


> Okay, versuche noch einmal überlegen.
> 
> Was ich noch gar nicht verstehe, wieso cooler bei mir nie aktiv ist.
> 
> ...


bedeutet das

```
-hysterese
```
dass hysterese negiert wird?  

was willst Du eigentlich machen? Einen eigenen PI-regler programmieren?


----------



## matzecb (29 April 2022)

Hysterese 24(?)
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.


----------



## ssyn (29 April 2022)

ducati schrieb:


> dass hysterese negiert wird?


Nee, Negation verstehe ich . 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


----------



## Heinileini (29 April 2022)

ssyn schrieb:


> 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.


ssyn schrieb:


> Anhang anzeigen 60793
> 
> controllerY (20) ist kleiner als -hysterese(24), aber cooler ist FALSE


controller.Y = 20 wird mit -hysterese = -24 verglichen.
Der Wert 24 für hystesrese dürfte (viel) zu gross sein.



matzecb schrieb:


> 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.



ducati schrieb:


> bedeutet das
> 
> ```
> -hysterese
> ...


Aber ja doch. genau das steht doch da!



ssyn schrieb:


> 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 ...


----------



## ssyn (29 April 2022)

Vielen Dank, Heinileini, ich bin noch nicht vollständig damit, versuche am Montag Ihre Erklärung lesen und Code fertig machen.


----------



## s_kraut (30 April 2022)

ssyn schrieb:


> Ich habe Y_MIN 20, Y_Max 28, SetT (Sollwert) 23 und bei Hysterese 0.1 der Heater einfach arbeitet ständig.
> Anhang anzeigen 60788
> 
> Anhang anzeigen 60790


Endlich kommt ein zeitgemäßer Code.


----------



## Heinileini (30 April 2022)

s_kraut schrieb:


> Endlich kommt ein zeitgemäßer Code.


???  ???


----------



## Onkel Dagobert (30 April 2022)

Heinileini schrieb:


> ???  ???


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.


----------



## ssyn (4 Mai 2022)

Vielen, vielen Dank noch einmal *Heinileini*, deine Information half mir so sehr vollständig die Logik verstehen.     

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:


```
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"


```
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!


----------



## Heinileini (4 Mai 2022)

ssyn schrieb:


> 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.



Onkel Dagobert schrieb:


> 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!


----------



## Onkel Dagobert (4 Mai 2022)

Heinileini schrieb:


> .. 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.


----------



## Heinileini (5 Mai 2022)

Onkel Dagobert schrieb:


> 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:


Heinileini schrieb:


> // durch hysterese > 0.0 wird ein Bereich ("Band") geschaffen,
> // in dem weder heater noch cooler aktiv ist!





ssyn schrieb:


> 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.


ssyn schrieb:


> 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 ...


Onkel Dagobert schrieb:


> 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)?


Onkel Dagobert schrieb:


> 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?


----------



## Onkel Dagobert (5 Mai 2022)

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 .





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




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


----------

