Neues Modul PID20 - Der PID-Regler

Begonnen von John, 02 Dezember 2013, 22:03:40

Vorheriges Thema - Nächstes Thema

John

Hallo fhainz,
sieht schon besser als als zu vor.
Der erhöhte P-Faktor schlägt gut durch,
das Ventil schiesst nun vollständig beim Sollwertsprung nach unten um 06:00 Uhr.

Vorschlag wie zuvor bei Hans Franz:

pidActorThreshold zwischen 5 und 10 einstellen
pidActorInterval auf 600-900 stellen (max alle 10..15 Minuten Stellausgang betätigen).
Der Regler darf ruhig in gröberen Schritten agieren.
Temperatur zu regeln ist ein langsames "Geschäft".

Zusätzlich solltest du eher damit beginnen den Raum aufzuheizen.
Gegen 00:00 Uhr ist das Ventil praktisch 100% offen, die Temperatur steigt kaum noch.
Der Sollwert wird nicht erreicht.

John

CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

fhainz

#31
Ok danke.
Ich hab die 2 attribute gesetzt und beginne heute mit dem aufheizen um 19:00. Mal sehen wie es morgen aussieht!

Grüße

fhainz

#32
Hallo!

Die heutige Kurve sieht unter Tags nicht so gut aus. Es wird wärmer aufgeheizt als auf die Soll Temp.
Ich blick da noch nicht durch. An welchen Rädchen muss ich drehen?

Und um die 12 Grad zu erklären: Nach dem Lüften wurde nicht automatisch wieder auf die letzte Temp zurückgesetzt. Warum auch immer. Das muss ich mir erst ansehen.

Grüße

John

Hallo fhainz,
kannst du präzisieren, in welchem Zeitbereich du mit der Regelung nicht zufrieden bist.

Ich finde der Regler hat sein Geschäft so schlecht nicht gemacht.

Hast du um 06:30 das Fenster geöffnet ?
Der Raum kühlt zwischen 7 und 10 praktisch nicht ab. Aber das Thermostat macht immerhin komplett zu.
Der leichte Überschwinger um 10 nach Sollwertänderung ist akzeptabel.

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

fhainz

Ja, ich hab um halb 7 das Fenster aufgemacht. Nachdem ich es geschlossen hatte sollte normalerweise ein script die letzte Temperatur vor dem lüften setzten. Ist aber nicht passiert. Warum auch immer.

Nachdem ich um halb 10 manuell die richtige Soll Temp gesetzt hatte war die Ist-Temperatur immer leicht höher als die Soll Temp. Rund 0.4-0.8 Grad. Ich weiß das sind jetzt Kleinigkeiten ;)

Grüße

John

#35
Das was in der Nacht zwischen 00:00 und 06:00 Uhr bei dir passiert ist,
dürfte sehr selten zu sehen sein.

Über Stunden eine Regeldifferenz von praktisch 0.
Das war wohl eher Zufall.

Meine MAX-Thermostate sind übrigens was Übertemperaturen anbelangt wesentlich grosszügiger als dein PID-Regler.
Da treten teilweise Regeldifferenzen von 2 Grad auf .

Sehen wir uns den Überschwinger um 10:00 Uhr an.
Der I-Anteil stammt noch von der Nacht und ist identisch mit der Ventilstellung für 18 Grad Solltemperatur
bei abgesenkter Vorlauftemperatur.
Der passt natürlich tagsüber nicht mehr, denn nun ist die Vorlauftemperatur höher.
Daher der leichte Überschwinger. Aber der I-Anteil wird nun zusehends reduziert und der starke P-Anteil
greift sofort durch und prügelt das Ventil in den unteren Stellbereich.

Ich könnte damit gut leben.

John

PS:
pidActorThreshold und pidActorInterval haben sich gut bewährt. Die Regelgüte leidet offensichtlich kaum.

CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

fhainz

Alles klar. Ich denke ich kann auch gut damit leben.
Ich beobachte das jetzt ein paar tage dann meld ich mich nochmal!

Vielen dank für deine Hilfe!


Grüße

John

Ich möchte die Nutzer des PID20 Moduls bitten, ihre Erfahrungen hier zu veröffentlichen,
damit ich ein besseres Bild über die Anwendbarkeit gewinnen kann.
(fhainz hat dies schon erledigt)

Hilfreich wären hierbei Kurven , wie im Wiki dargestellt und ein Auszug der Parameter via "list <pid20>".

Es geht darum, zu beurteilen, wie sich das Modul bei unterschiedlichen Regelstrecken verhält.

Mir bisher bekannte Anwender:

Hans Franz
fgerhardt
Smooth

Im Voraus besten Dank für eure Zuarbeit.

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

Hans Franz

Zitat von: John am 14 Dezember 2013, 11:45:32
Ich möchte die Nutzer des PID20 Moduls bitten, ihre Erfahrungen hier zu veröffentlichen,
damit ich ein besseres Bild über die Anwendbarkeit gewinnen kann.
Gerne:

Internals:
   DEF        CUL_WS_1:temperature stellantrieb.01:valve
   NAME       heizung.01
   NR         305
   NTFY_ORDER 50-heizung.01
   STATE      processing
   TYPE       PID20
   Readings:
     2013-12-14 14:59:10   actuation       19
     2013-12-14 15:07:17   actuationCalc   17.2999999999999
     2013-12-14 15:07:17   delta           -0.300000000000001
     2013-12-14 14:59:10   desired         20.5
     2013-12-14 14:59:10   measured        20.8
     2013-12-14 15:07:17   p_d             0
     2013-12-14 15:07:17   p_i             24.8
     2013-12-14 15:07:17   p_p             -7.50000000000002
     2013-12-14 15:07:17   state           processing
   Helper:
     actor      stellantrieb.01
     actorCommand valve
     actorErrorAction freeze
     actorErrorPos 0
     actorInterval 600
     actorKeepAlive 1800
     actorLimitLower 0
     actorLimitUpper 100
     actorThreshold 5
     actorTimestamp 2013-12-14 14:49:09
     actorValueDecPlaces 0
     adjust     
     calcInterval 60
     deltaGradient 0
     deltaOld   -0.300000000000001
     deltaOldTS 2013-12-14 15:06:07
     deltaTreshold 0
     desiredName desired
     disable    0
     factor_D   0
     factor_I   0.25
     factor_P   25
     isWindUP   
     measuredName measured
     reading    temperature
     regexp     ^([\+,\-]?\d+\.?\d*$)
     reverseAction 0
     sensor     CUL_WS_1
     sensorTimeout 3600
     stopped    0
     updateInterval 600
Attributes:
   alias      Heizungen_1
   pidActorInterval 600
   pidActorTreshold 5
   room       Heizungen





Internals:
   DEF        CUL_WS_2:temperature stellantrieb.02:valve
   NAME       heizung.02
   NR         325
   NTFY_ORDER 50-heizung.02
   STATE      processing
   TYPE       PID20
   Readings:
     2013-12-14 15:09:17   actuation       0
     2013-12-14 15:09:17   actuationCalc   -19.3000000000002
     2013-12-14 15:09:17   delta           -1.4
     2013-12-14 15:09:17   desired         17.0
     2013-12-14 15:09:17   measured        18.4
     2013-12-14 15:09:17   p_d             0
     2013-12-14 15:09:17   p_i             15.6999999999997
     2013-12-14 15:09:17   p_p             -35
     2013-12-14 15:09:17   state           processing
   Helper:
     actor      stellantrieb.02
     actorCommand valve
     actorErrorAction freeze
     actorErrorPos 0
     actorInterval 600
     actorKeepAlive 1800
     actorLimitLower 0
     actorLimitUpper 100
     actorThreshold 5
     actorTimestamp 2013-12-14 14:49:09
     actorValueDecPlaces 0
     adjust     
     calcInterval 60
     deltaGradient 0
     deltaOld   -1.4
     deltaOldTS 2013-12-14 15:07:14
     deltaTreshold 0
     desiredName desired
     disable    0
     factor_D   0
     factor_I   0.25
     factor_P   25
     isWindUP   1
     measuredName measured
     reading    temperature
     regexp     ^([\+,\-]?\d+\.?\d*$)
     reverseAction 0
     sensor     CUL_WS_2
     sensorTimeout 3600
     stopped    0
     updateInterval 600
Attributes:
   alias      Heizungen_2
   pidActorInterval 600
   pidActorTreshold 5
   room       Heizungen



Internals:
   DEF        CUL_WS_5:temperature stellantrieb.04:valve
   NAME       heizung.04
   NR         370
   NTFY_ORDER 50-heizung.04
   STATE      processing
   TYPE       PID20
   Readings:
     2013-12-14 15:01:49   actuation       29
     2013-12-14 15:01:49   actuationCalc   29.2499999999999
     2013-12-14 15:01:49   delta           0
     2013-12-14 15:01:49   desired         18.0
     2013-12-14 15:01:49   measured        18.0
     2013-12-14 15:01:49   p_d             0
     2013-12-14 15:01:49   p_i             29.2499999999999
     2013-12-14 15:01:49   p_p             0
     2013-12-14 15:01:49   state           processing
   Helper:
     actor      stellantrieb.04
     actorCommand valve
     actorErrorAction freeze
     actorErrorPos 600
     actorInterval 180
     actorKeepAlive 1800
     actorLimitLower 0
     actorLimitUpper 100
     actorThreshold 5
     actorTimestamp 2013-12-14 14:41:46
     actorValueDecPlaces 0
     adjust     
     calcInterval 600
     deltaGradient 0
     deltaOld   0
     deltaOldTS 2013-12-14 15:09:38
     deltaTreshold 0
     desiredName desired
     disable    0
     factor_D   0
     factor_I   0.25
     factor_P   25
     isWindUP   
     measuredName measured
     reading    temperature
     regexp     ^([\+,\-]?\d+\.?\d*$)
     reverseAction 0
     sensor     CUL_WS_5
     sensorTimeout 3600
     stopped    0
     updateInterval 600
Attributes:
   alias      Heizungen_4
   pidActorTreshold 5
   pidCalcInterval 600
   room       Heizungen
   verbose    1


heizung.01 und heizung.02 sind die Zimmer meiner Söhne. Und die sind hot. Anders kann ich mir das gelegentliche Überschwingen nicht erklären. :)

Gruß
Hans
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

John

#39
Hallo Hans Franz
danke für deine Antwort.

Zitat
heizung.01 und heizung.02 sind die Zimmer meiner Söhne. Und die sind hot. Anders kann ich mir das gelegentliche Überschwingen nicht erklären.

Ich denke da gibts noch Optimierungs-Potential.

PID_1

Die kurzeitige geringe Ventilöffnung um 11:30 Uhr bewirkt einen steilen Anstieg der Temperatur von ca. 2.5 Grad/h.
Anders verhält sich das System jedoch um 15:30 Uhr als ein massiver Sollwertsprung von 17 auf 21 Grad stattfindet.
Hier ist die Steigung der Temperatur wesentlich geringer als zuvor, obwohl das Ventil auf 70 Grad öffnet.
Hast du dafür eine Erklärung? (z.B. unterschiedliche Vorauftemperaturen)

Zum Zeitpunkt 15:30 Uhr:
Der massive Sollwertsprung von 17 auf 21 Grad führt zu einer Regeldifferenz von ca. 2.5 Grad.

Ich würde sagen, hier wäre eine Ventilöffnung von 100% angebracht.

Alles was schnell gehen muss wird über den P_Faktor erledigt.
Der P-Faktor beträgt derzeit : 25 %/(Grad Regeldifferenz).
Bei 1 Grad Regeldifferenz liefert der P-Anteil 25 %. zu ActuationCalc.
Wir haben 2.5 Grad, also erhalten wir eine P-Anteil von ca. 65%.

Formel: P-Anteil [%]  = Regel-Differenz [Grad] * P-Faktor [%/Grad]

Gleichzeit legt nun auch der I-Anteil los zu wachsen,  (siehe Chart) das ist aber in dieser Phase noch kontraproduktiv, dazu später.

Wir verdoppeln gedanklich den P-Faktor auf 50%/Grad.
Nun würde der P-Anteil 130% betragen, das Ventil macht also komplett auf.
Der I-Anteil wächst nicht, da nun ActuationCalc >100% ( actorLimitUpper) ist und die Anti-Windup-Massnahmen greifen.
Erst wenn die Regeldifferenz < 2 Grad wird, wird der I-Anteil beginnen zu wachsen.

Der I-Anteil wächst ohnehin zu schnell. Er ist im wesentlichen für die Überschwinger ab 18:00 Uhr verantwortlich.

Also mein Vorschlag:
P-Faktor von 25 auf 50-75 setzen
I-Faktor von 0.25 auf 0.1 setzen

ActuationCalc = I-Anteil + P-Anteil

morgen sehen wir weiter.


John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

Hans Franz

Hallo John,
Danke für die Erklärung/Interpretation.
Ich habe für PID_1 die Werte geändert. Oder sollte ich das für die anderen PIDs auch schon machen?
Ich gebe allerdings zu bedenken, dass verschiedene Störfaktoren mitspielten: Um 12 Uhr schien gestern die Sonne ins Zimmer, abends war Zocken mit zwei Kumpel angesagt. Drei Jungmänner heizen! Also wird ein Fenster aufgerissen...
Ich beschränke mich daher noch aufs Beobachten der Plots. Deine Hilfe ist somit Gold wert.

Ein kleiner Fehler ist mir bei "Inbetriebnahme" im WIKI noch aufgefallen: Es müsste wohl "98_PID20.pm" heissen.

Gruss
Hans
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

Hans Franz

Hallo John,

Die Änderungen (pidFactor_I 0.1,   pidFactor_P 50) haben ja dramatische Auswirkungen. Für PID_1 die Werte geändert, bei PID_2 noch die Default-Werte.
Ist jetzt der p-Faktor nicht zu bestimmend ? Für mich sieht PID_2 erstmal gesünder aus.

Gruß
Hans
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

cwagner

Hallo John,

Dein PID20 setze ich zur Steuerung eines Heizkreises für Fußbodenheizung ein.
Problemstellung: In einem Altbau mit vielen alten Heizkörpern muss ich relativ hohe Vorlauf-Temperaturen fahren. Diese sind für die Fußbodenheizung viel zu hoch. Deshalb wird aus dem Haupt-Heizkreis über einen motorisch betriebenen Mischer ein zweiter Heizkreis mit deutlich niedrigeren Vorlauftemperaturen abgezweigt. Dein PID20 steuert hier also einen 4-Wege-Mischer über zwei Aktoren. Aktuell debugge ich noch meine Mischer-Steuerungsroutine. Wenn ich hier fertig bin, poste ich hier die Plots.

PID20 ersetzt hier also eine professionelle Honeywell Centratherm, die ich eben nicht in die gesamte Hausautomatisierung (Anwesenheitssteuerung etc) einbinden konnte. Die ersten 2 Wochen Betrieb zeigen schon ohne Optimierung der Einstellwerte, dass PID20 mit einer solchen industriellen Lösung mithalten kann.

Herzliche Grüße

Christian
PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

John

#43
Hallo Hans,

ich stimme dir zu, die Änderungen sind dramatisch. Wir haben einen schwingenden Regler.

Dann ist einer der Faktoren zu hoch, in deinem Fall der p-Faktor.

Als Erstmassnahme p-Faktor auf 30 nehmen und schrittweise erhöhen, bis das Schwingen wieder einsetzt.
Dann die vorherige Einstellung wählen.

Hast du eine Erklärung dafür, dass es fast 1h dauert bis die Temperatur auf die sich öffnende Ventilstellung reagiert ?
(z.B. um 04:30 Uhr)
Aber dann mit einem extrem steilen Anstieg. Das ist ungewöhnlich.

Kann es sein dass dein Ventil eine Todzone hat (Bereich in dem keine Änderung der Regelgröße stattfindet)
D. h. das Ventil muss erst eine Mindestöffnung erreichen bis es überhaupt wirkt.
In diesem Fall müsste man pidActorLimitLower entsprechend anpassen.

Kannst du etwas mehr zu dein Heizsystem sagen:

Verlauf der Vorlauftemperatur ?
elektronisch geregelt Umwälzpumpe ?
Zweirohrsystem ?
Es handelt sich um herkömmliche Heizkörper, die über Konvektion arbeiten ?
In welcher Zeit ist die Vorlauftemperatur abgesenkt ?
Wie stabil ist die Vorlauftemperatur ?

John


CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

John

#44
Hallo Christian,
danke für deine Rückmeldung.

ZitatDein PID20 steuert hier also einen 4-Wege-Mischer über zwei Aktoren. Aktuell debugge ich noch meine Mischer-Steuerungsroutine. Wenn ich hier fertig bin, poste ich hier die Plots.

Das ist ja schon einen High-End-Anwendung.

Ich bin gespannt, ob sich PID20 bewährt.

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP