Neues Modul PID20 - Der PID-Regler

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

Vorheriges Thema - Nächstes Thema

John

#60
Hallo Christian und alle anderen Anwender von PID20,

anbei die Version V 1.00.d

Bugfix:
betrifft diejenigen, die pidCalcInterval gändert haben. Hierbei wurde auch actorErrorPos mit dem Wert von pidCalcInterval gesetzt.

John

PS: Dateianhang gelöscht, da Modul in FHEM integriert ist
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

John

Hallo Hans
zu deinem Beitrag #58

Ich finde der Einsatz von pidActorLimitLower hat sich positiv ausgewirkt. Die Überschwinger liegen nun im Bereich von 0.8 Grad.
Vorher waren wir bei 1.5 Grad.

Du solltet pidActorLimitLower in Schritten noch vergrößern bis du die Einsatzschwelle von 15% erreichst, die du ermittelt hast.
Die Periodendauer für einen Schwingungsvorgang beträgt ca. 1h. Es dauert ca. 20 Minuten bis die Temperatur überhaupt ansteigt,
das erscheint mir relativ lange.

zum Beitrag #59
na ja, ab 20 Uhr machen sich die Änderungen des Stellausgangs bemerkbar (vorher war die Temperatur zu hoch).

Anbei noch ein Bild meines MAX-Reglers (also kein PID20). Der schwingt auch.
Ich denke mit dem Schwingen im Bereich von +/- 0.5 Grad kann man leben.

John

CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

cwagner

Guten Morgen, John,

vielen Dank für die rasche Korrektur. Wirkliche Erfahrungen werde ich Dir allerdings erst in ein paar Tagen liefern können. Über Weihnachten ist der WAF sehr wichtig, und der ist nicht nur vom kuscheliger Wärme beinflusst :-)


Gute Festtage

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

CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

cwagner

#64
Guten Morgen, John,

willkommen im Jahr 2014 - möge es alle Wünsche erfüllen :-)

Wie gesagt, experimentiere ich bei meiner Fussbodenheizkreis-Mischerregelung mit Hilfe von PID20 noch immer - ich habe in den letzten Tagen die Parameter verändert, um das doch sehr häufige und wilde Stellen des 4-Wege-Mischers zu dämpfen. Auf diesem Weg bin ich gut vorangekommen. Doch nun habe ich plötzlich Fehlermeldungen im zentralen Log.

Zunächst das Listing meines Regelers:
Internals:
   CFGFN      ./FHEM/heizung.cfg
   DEF        T_Vorlauf_FBH:temperature FBH_Stellwert
   NAME       PID_Mischer_FBH
   NR         556
   NTFY_ORDER 50-PID_Mischer_FBH
   STATE      processing
   TYPE       PID20
   Readings:
     2014-01-01 09:57:19   actuation       66
     2014-01-01 09:57:19   actuationCalc   65.7542250000012
     2014-01-01 09:57:19   delta           1.4975
     2014-01-01 09:57:19   desired         38
     2014-01-01 09:57:19   measured        36.5025
     2014-01-01 09:57:19   measured_avg_day 31.7
     2014-01-01 09:57:19   measured_avg_month 30.0
     2014-01-01 09:57:19   measured_cum_day 1137871.3475
     2014-01-01 09:57:19   measured_cum_month 3670687.34749999
     2014-01-01 07:04:38   measured_max_day 53.3
     2014-01-01 07:04:38   measured_max_month 53.3
     2014-01-01 05:34:12   measured_min_day 23.2
     2014-01-01 05:34:12   measured_min_month 23.2
     2014-01-01 09:57:19   p_d             0
     2014-01-01 09:57:19   p_i             50.7792250000012
     2014-01-01 09:57:19   p_p             14.975
     2014-01-01 09:57:19   state           processing
   Helper:
     actor      FBH_Stellwert
     actorCommand
     actorErrorAction freeze
     actorErrorPos 0
     actorInterval 100
     actorKeepAlive 18000
     actorLimitLower 0
     actorLimitUpper 100
     actorThreshold 3
     actorTimestamp 2014-01-01 09:57:19
     actorValueDecPlaces 0
     adjust     
     calcInterval 100
     deltaTreshold 0
     desiredName desired
     disable    0
     factor_D   0
     factor_I   0.1
     factor_P   10
     isWindUP   
     measuredName measured
     reading    temperature
     regexp     ^([\+,\-]?\d+\.?\d*$)
     reverseAction 0
     sensor     T_Vorlauf_FBH
     sensorTimeout 3600
     stopped    0
     updateInterval 600
Attributes:
   group      Fussbodenkreis
   pidActorInterval 100
   pidActorKeepAlive 18000
   pidActorTreshold 3
   pidActorValueDecPlaces 0
   pidCalcInterval 100
   pidFactor_D 0
   pidFactor_I 0.1
   pidFactor_P 10
   room       Heizung
   verbose 0


Die Fehlermeldung die nun bei jeder Änderung des Stellwertes kommt:

Zitat2014.01.01 09:55:38 2: CUL_HM set FBH_Mischer_weniger on-for-timer 7
Use of uninitialized value in sprintf at ./FHEM/98_PID20.pm line 660.
2014.01.01 09:57:18 2: CUL_HM set FBH_Mischer_mehr on-for-timer 11
Use of uninitialized value in sprintf at ./FHEM/98_PID20.pm line 660.
2014.01.01 09:58:59 2: CUL_HM set FBH_Mischer_weniger on-for-timer 9
Use of uninitialized value in sprintf at ./FHEM/98_PID20.pm line 660.
Wie Du siehst, wird ein Stellwert errechnet und von meiner kleinen Routine dann das Delta für die konkrete Steuerung des Stellmotors ausgeführt. Aktuell sind die Schwankungen des Vorlaufes sowie der Stellbefehl so gering wie selten zuvor.
Leider habe ich bei meinen vorherigen Experimenten nicht alle Parameter des Reglers dokumentiert.

FBH_Stellwert ist ein Dummy, mit dem ich "Deine" Stellwerte aufnehme, dann das Delta ermittele, mit dem ich dann den Stellmotor konkret auf den von "Deinem" Modul gewünschten Wert verändere.

Herzliche Grüsse

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

#65
Hallo Christian,
ich kann den Fehler leider bei mir nicht nachvollziehen.

Daher habe ich eine neue Version 1.00.e angefügt mit erweiterter Debug-Ausgabe.

Bitte Attribut verbose des PID auf 4 stellen via
attr PID_Mischer_FBH verbose 4

FHEM neu starten und Log an mich zurück.

John

PS: Dateianhang gelöscht, da Modul in FHEM integriert ist
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

Vorhand

Hallo PIDler,

habe jetzt auch einen Versuch gestartet, eine Reglung zum Laufen zu bringen - mit folgendem Code gemäß Wiki:
define Stell.Br FHT8V 5655
#
define PID.Br PID20 fht.Buero:measured-temp Stell.Br
attr PID.Br pidActorInterval 900
attr PID.Br pidActorTreshold 8
attr PID.Br pidActorValueDecPlaces 0
attr PID.Br pidFactor_I 0.2
attr PID.Br pidFactor_P 50

define PID.PID.File FileLog ./log/PID.PID-%Y.log PID\.PID
attr PID.PID.File logtype text

Abweichend vom Wiki nutze ich als Istwert den Messwert eines FHT80b, der nicht mit dem FHT8V verbunden ist und eben den FHT8V.

Fehler wurden zwar keine gemeldet - doch es tut sich auch nichts. Das Logfile bleibt leer.

Fehlt da was?

Grüße zum Neuen Jahr!

Viele Grüße
Raspi,Homatic,ESP,Fronius,KIA-PHEV,DHW300,Mi,Shelly

John

Hallo Vorhand,

Da liegt der Hund begraben:
define PID.PID.File FileLog ./log/PID.PID-%Y.log PID\.PID

gemäß CommandRef zu FileLog
define <name> FileLog <filename> <regexp>

<regexp> ist dein Freund. Das was du hier eingetragen hast, kommt einfach niemals als Ereignis.

Aber im FHEM-Logfile sollten schon einige Einträge vom PID20 zu finden sein und ebenso im Monitor.

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

cwagner

Hi John,

bei meinem Projekt geht es darum, in einem Altbau mit einem Heizkreis mit relativ hohen Vorlauftemperaturen einen Heizkreis für eine Fußbodenheizung mit deutlich niedrigeren Vorlauftemperaturen auszuschleusen.

Hydraulisch läuft das über einen Vierwegemischer und eine eigene (Hocheffizienz-)Pumpe, die den Fußbodenheizkreis bedient. Im Hauptkreis schwanken die Vorlauftemperaturen zwischen 40 und 75 Grad, im Fussbodenkreis sollen sie so begrenzt werden, dass die Fußbodentemperatur wegen des Laminats keinesfalls 28 Grad überschreitet (verprobt mit einem Fühler im Fußboden, der ein THRESHOLD bedient, der die Pumpe anhält), zugleich aber die Raumtemperatur von 21 Grad schnell (für eine träge Fussbodenheizung) erreicht wird. Aktuell experimentiere ich mit einem Vorlauf im Fußbodenkreis von 36 Grad. Und so sieht dann der Tag wie im Anhang aus.

Um 5.30 Uhr wird die desired-temp des PID-Reglers von 16 auf 36 Grad hochgestellt. Die Actuation wird über eine kleine Routine in die rechts-links-Bewegungen des Mischers umgesetzt. Aktuell sind mir die Mischerbewegungen noch zu "hektisch", aber die Vorlauftemperatur pendelt schon hübsch im Bereich der 36°. Sobald/solange der Raum 21 Grad hat, wird über einen weiteren Threshold die Pumpe angehalten. Ab 15.30 Uhr wird wieder "Nachtabsenkung" eingeschaltet, weil der aufgeheizte Fußboden noch für die Restnutzung lang genug Wärme abgibt.

Sachdienliche Hinweise zum Setzen der Parameter sind hochwillkommen.

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

#69
Hallo Christian

ein
list DeinPid
wäre hilfreich, damit wir alle Parameter kennen.

Die Dynamik der Temperatur ist bemerkenswert. Dennoch meine ich der P-Faktor ist zu gross. (ohne diesen zu kennen)

Ist dir klar, dass du dir in der Phase der Nachtabsenkung den tagsüber gelernten I-Anteil wieder "verspielst".
Da gibts ja eigentlich nichts mehr zu regeln.

Der I-Anteil ist so etwas wie ein angelernter Arbeitpunkt für den P-Anteil, um den dieser pendeln kann.

Aber der I-Faktor scheint sehr klein, vielleicht zu klein.

Mögliche Verbesserungen:
PID in der Absenkphase auf Stop nehmen, zumindest solange der Istwert>Sollwert

Fragen:
in welchen Bereich darf den die Vorlauftemperatur pendeln, oder welche Regelabweichung wäre akzeptabel ?

John


PS:
Noch eine Frage: hängt das "Überleben" deines Laminats von einem lauffähigen FHEM ab ?

CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

cwagner

Hallo John,

die Idee mit dem Start/Stopp werde ich versuchen, schnellstmöglich umzusetzen. War mir eigentlich klar, war ich aber irgendwie drüber weggekommen. Die Schwankungen der Vorlauftemperatur im FBH-Kreis kann ich nur empirisch ermitteln. Ich befürchte, sie sollte nicht über 55 Grad steigen.

Das Listing:


Internals:
   CFGFN      ./FHEM/heizung.cfg
   DEF        T_Vorlauf_FBH:temperature FBH_Stellwert
   NAME       PID_Mischer_FBH
   NR         554
   NTFY_ORDER 50-PID_Mischer_FBH
   STATE      processing
   TYPE       PID20
   Readings:
     2014-01-02 22:05:32   actuation       0
     2014-01-02 22:07:12   actuationCalc   -120.840774999999
     2014-01-02 22:07:12   delta           -17.5025
     2014-01-02 22:05:32   desired         16
     2014-01-02 22:05:32   measured        33.565
     2014-01-02 22:05:32   measured_avg_day 33.3
     2014-01-02 22:05:32   measured_avg_month 32.2
     2014-01-02 22:05:32   measured_cum_day 2648469.20499999
     2014-01-02 22:05:32   measured_cum_month 8120733.26750007
     2014-01-02 07:12:22   measured_max_day 46.9
     2014-01-01 12:28:11   measured_max_month 53.8
     2014-01-02 05:41:53   measured_min_day 21.4
     2014-01-02 05:41:53   measured_min_month 21.4
     2014-01-02 22:07:12   p_d             0
     2014-01-02 22:07:12   p_i             54.1842250000013
     2014-01-02 22:07:12   p_p             -175.025
     2014-01-02 22:07:12   state           processing
   Helper:
     actor      FBH_Stellwert
     actorCommand
     actorErrorAction freeze
     actorErrorPos 0
     actorInterval 100
     actorKeepAlive 18000
     actorLimitLower 0
     actorLimitUpper 100
     actorThreshold 3
     actorTimestamp 2014-01-02 19:25:01
     actorValueDecPlaces 0
     adjust     
     calcInterval 100
     deltaTreshold 0
     desiredName desired
     disable    0
     factor_D   0
     factor_I   0.1
     factor_P   10
     isWindUP   1
     measuredName measured
     reading    temperature
     regexp     ^([\+,\-]?\d+\.?\d*$)
     reverseAction 0
     sensor     T_Vorlauf_FBH
     sensorTimeout 3600
     stopped    0
     updateInterval 600
Attributes:
   group      Fussbodenkreis
   pidActorInterval 100
   pidActorKeepAlive 18000
   pidActorTreshold 3
   pidActorValueDecPlaces 0
   pidCalcInterval 100
   pidFactor_D 0
   pidFactor_I 0.1
   pidFactor_P 10
   room       Heizung
   verbose    0


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

Hallo Christian,

warum hast du pidCalcInterval von 60 auf 100 hochgenommen ?
Bei der Schnelligkeit der Erwärmung hätte ich eher mit einer Reduzierung gerechnet,
die ich auch für sinnvoll erachten würde.

Vorschläge in folgender Reihenfolge :
a.) Wenn möglich pidCalcInterval verkleinern (30 Sek.), damit der PID besser auf die hohe Dynamik reagieren kann.
Prozess beobachten.

b.)
Ich schlage vor wie zuvor schon angedeutet, dem I-Anteil eine grössere Gewichtung zu geben (I-Faktor auf 0.2) und den P-Anteil zu
reduzieren (6 statt 10).

Die schwingende Bereiche weisen auf eine zu hohe Verstärkung hin bzw. zu langsame Reaktion (wg. pidCalcInterval) hin



John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

cwagner

#72
Moin, moin,
PIDCalcInterval hatte ich hochgenommen, weil der Mischer für eine Vollbewegung 95 Sekunden braucht. Ich hatte mit frühren P/I-Werten die Beobachtung gemacht, dass es häufig Vollausschläge gab, die noch nicht abgearbeitet waren, als schon die nächste gegenläufige Bewegung errechnet wurde.
Werde Deine Werte mal ausprobieren, ich hatte mich schrittweise zu den bisherigen, im Vergleich zu Deinen Vorschlägen ja noch großen P/I-Werten gearbeitet und dabei dann den PIDCalcInterval aus den Anfangszeiten stehen gelassen.
Ich merke, dass ich das Wirkungsmechanismen des Reglers noch nicht ausreichend verstanden habe. Du hilfst mir vor allem auch mit der Erklärung Deiner Vorschläge sehr gründlich weiter!

Gruß

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

Hallo Christian

ZitatPIDCalcInterval hatte ich hochgenommen, weil der Mischer für eine Vollbewegung 95 Sekunden braucht. Ich hatte mit frühren P/I-Werten die Beobachtung gemacht, dass es häufig Vollausschläge gab, die noch nicht abgearbeitet waren, als schon die nächste gegenläufige Bewegung errechnet wurde.

Dein System hat ein hohe Reaktionsgeschwindigkeit.

Beim mir benötigt ein Sollwertsprung von 2..3 Grad Raumtemperatur ca. 1.5 bis 2 h, damit der Raum diese Temperatur tatsächlich erreicht.
(Istwert=Sollwert)

Bezogen auf 2 Stunden erhält der Regler 120x die Gelegenheit (pidCalcInterval=60) die Situation zu bewerten und zu korrigeren.

Das kann er somit in kleinen Schritten auch tun.

Nehmen wir an, du gibst im nur noch 2x pro Stunde diese Möglichkeit.

Dann werden sich grosse Regeldifferenzen aufbauen, da der Regelalgorithmus viel zu selten die Möglichkeit hat, die sich ändernden Größen
zu bewerten und zu korrigieren.

Ein schwingendes System ist das Ergebnis,  das mit -100% .. +100% arbeitet.

Und das nur deswegen, weil der Regler viel zu selten "bewerten" kann.

Man muss sich also die Änderungsgeschwindigkeit des Istwertes ansehen. Je steiler die Transienten, umso schneller sollte PID bewerten.

Es gibt dabei eines zu berücksichtigen:
pidCalcInterval wirkt nicht direkt auf den p-Anteil, aber auf den I-Anteil, damit der häufigeren Bewertung nun auch häufiger integriert wird.
Also bitte nicht beides gleichzeitig ändern, sondern immer nur einen Parameter, beobachten, dann den nächsten.

Versuch die maximale Steigung der Temperatur aus deinen Charts rauszufinden,  dann haben wir einen Anhaltspunkt für
die Dimensionierung zu pidCalcInterval.

John


CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

stgeran

Muß oder soll ein externer Tempgeber eingesetzt werden oder kann ich auch die "desiredTemperature" des Max Thermostates selbst verwenden?
FHEM auf Raspberry
CSM 866MHz für EM1010 mit Strom und Gaszähler
CUL 866MHz für MAX! Radiator Thermostat 
CUL 433MHz für Innen und Aussen Temp
HMLAN für HM-LC-Sw1-PI-2