Fussbodenheizung mit PWM steuern

Begonnen von jamesgo, 24 September 2015, 08:28:49

Vorheriges Thema - Nächstes Thema

Albatros_

#315
Hallo,

nein hatte ich nicht vor, das ist dein Modul. Ich wollte es hier hochladen.
Leider basiert mein Code noch auf einer älteren Version, deshalb hier nur das Delta:

* Berechnung I-Anteil angepasst
* Berechnung P-Anteil angepasst (jetzt auch negative Werte)
* Begrenzung P Anteil entfernt
* Anzahl der Stellen für die Werte von 2 auf 4 erhöht.

 
  my $deltaTempPID = $desiredTemp - $temperaturV;
  $room->{h_deltaTemp}   = sprintf ("%.1f", -1 * $deltaTempPID);
  $room->{h_deltaTemp_D} = sprintf ("%.1f", -1 * ($desiredTemp - $DBuffer->[0]));

  #calculate IValue
  my $ISum = $room->{READINGS}{"PID_IVal"}{VAL};#$room->{PID_IVal};
  $ISum = $ISum+ ($deltaTempPID*$room->{c_PID_IFactor});
 
  #$ISum = $ISum / scalar @{$IBuffer};
  #$ISum = $ISum;

  #my $deltaTempPID = $desiredTemp - $temperaturV;
  #my $IVal = $room->{c_PID_IFactor} * $deltaTempPID + $room->{h_pid_integrator};
 
  my $PVal = $room->{c_PID_PFactor} * $deltaTempPID;
  my $IVal = $ISum;
  my $DVal = $room->{c_PID_DFactor} * ($room->{h_deltaTemp_D} - $room->{h_deltaTemp});

# $PVal    = minNum (1, sprintf ("%.4f", $PVal));
  $IVal    = minNum (1, sprintf ("%.4f", $IVal));
  $DVal    = minNum (1, sprintf ("%.4f", $DVal));

  $IVal    = maxNum (0, $IVal);

  #$room->{h_pid_integrator} = $IVal;

  my $newpulsePID  = ($PVal + $IVal + $DVal);
  $newpulsePID     = minNum ($MaxPulse, sprintf ("%.4f", $newpulsePID));
  $newpulsePID     = maxNum (0,         sprintf ("%.4f", $newpulsePID));

  my $PWMPulsePID  = $newpulsePID * 100;
  my $PWMOnTimePID =  sprintf ("%02s:%02s", int ($newpulsePID * $cycletime / 60), ($newpulsePID * $cycletime) % 60);


Ich habe noch ein Bild von den Daten meines Wohnzimmers hinzugefügt. Interessant ist sicher der Teil nach 22:00.
Der I-Anteil adaptiert sich nur sehr langsam, deshalb habe ich ihn heute morgen nochmal erhöht. Der P Anteil ist dauerhaft negativ und reduziert so den I-Anteil. Die blaue Kurve ist der Ausgang des Reglers (Summe P + I)
Der Vorlauf ist auf die rechte Skala skaliert und liegt bei ca. 33°. Sollwert ist 21°
Aktuelle Werte:
P. 0.8
I: 0.005

der_oBi

Gefällt mir sehr gut, was Du gemacht hast.
Hört sich soweit richtig an, aber gestatte mir die Frage: Wieso muss der I-Anteil auf positive Werte begrenzt werden?

PS: Auch wenn es (zumindest für mich) nur ein Hobby ist, war ich heute schon kurz davor meine alten Vorlesungsunterlagen rauszukramen  ;D

Albatros_

Der I-Anteil wird auf den Wertebereich von 0 bis 1 begrenzt, weil die FUssbodenheizung nicht mehr stellen kann.
Wenn das Fenster länger offen ist und man keinen Sensor für PWMR installiert hat würde der I-Anteil ja theoretisch bis ins unendliche laufen. Und wenn das Fenster wieder geschlossen und die Solltemperatur wieder erreicht ist, müsste der I-Anteil von da oben erst wieder runterlaufen bis die Heizung auch mal wieder ausgeht. Um das zu vermeiden begrenzt man den I-Anteil.

In negative Richtung ist es das selbe. Die Sonne scheint rein uns beheizt den Raum. Wir hätten eine negative Regelabweichung und der I-Anteil würde nach Minus unendlich laufen. Wenn die Sonne weg ist dauert es ewig bis die Heizung wieder angeht.

Wikipedia schreibt:
"Wind-up-Effekt bei Großsignalverhalten: Wenn beim I-Regler die Stellgröße u(t) durch die Regelstrecke begrenzt wird, tritt ein Wind-up-Effekt auf. Dabei arbeitet die Integration des Reglers weiter, ohne dass die Stellgröße zunimmt. Wird die Regelabweichung e(t) kleiner, entsteht beim Rücklauf von u ( t ) {\displaystyle u(t)} u(t) eine ungewollte Verzögerung der Stellgröße und damit der Regelgröße y ( t ) {\displaystyle y(t)} y(t). Dem tritt man mit der Begrenzung der Integration auf die Stellgrößen-Grenzen entgegen (Anti-wind-up)."

der_oBi

#318
Was Anti-Wind-Up ist, habe ich verstanden.
Die Frage bezog sich vielmehr darauf, wieso der I-Anteil unten auf 0 begrenzt wird?

Sollte der I-Anteil nicht wie folgt begrenzt werden:
$ISum = maxNum (0 - $PVal - $DVal, $ISum);
$ISum = maxNum ($maxPulse - $PVal - $DVal, $ISum);

würde bedeuten, wenn PVal=0.5 DVal=0:
$ISum = maxNum (-0.5, $ISum)

So kenne ich es zumindest von den Reglern auf der Arbeit. Der I-Anteil wird auf die Stellgrößengrenzen abzgl. P+D-Anteil und abzgl. Vorsteuerung (die wir ja hier nicht haben) begrenzt.

Albatros_

Bei einer negativen Reglerabweichung (zu warm) würde doch dann aber auf 0 - (-0,5) also auf +0,5 begrenzt ?
Dann würde doch die Heizung nicht mehr ausgehen ?

der_oBi

Wieso? es würde ja nur auf [0.5,1] begrenzt wenn der P-Anteil bereits bei -0,5 steht.
P+I würde ja wiederum 0 ergeben (also die untere Stellgrößengrenze).

Ich sage auch nicht dass ich 100%ig recht habe, so ist nur mein Verständnis. Ich lasse mich gerne eines besseren belehren ;D

Albatros_

Da hast du recht.
Also. Es ist zu warm.
p bei -0.5 . I wird geklemmt bei 0.5. Jetzt kühlt es ab.
p bei -0.1 . i wird geklemmt auf 0.1 
p bei 0.2  i wird geklemmt auf -0.2 (jetzt spielt es keine rolle mehr, weil i wieder hochläuft)

Also alles eine frage der Zeit. wenn es schnell abkühlt wird I nicht nachkommen und ggf. die Heizung ansteuern. Das kann aber auch positiv sein, weil sie ja eh demnächt gebraucht wird.
Ich würde sagen, wir sollten es mal ausprobieren :)

Die andere Richtung spielt keine Rolle, weil wir nicht kühlen können ?

My-FHEM

#322
Die hier wieder aufgenommene Diskusion zur Berechnung des I-Anteils ist richtig.
Ich hatte bei der Einführung des PID Reglers in das PWR Modul das unverständliche
Verhalten des I-Anteils schon mal angesprochen siehe

https://forum.fhem.de/index.php/topic,41399.msg410559.html#msg410559

Mit den o.g. Änderungen zur Berechnung des I-Anteils läuft es nun wie zu erwarten. :)

Insgesamt ein tolles Modul von Andy.

PS im Anhang zwei Bilder:
erstes
zeigt den bisherigen Verlauf der Stellgrösse hier erhöht sich der I-Anteil nur bis Ende der Rückschau Anzahl, danach bleibt die Stellgröße konstant,l
zweites
nach den Änderungen von Albatros. Hier läuft die Stellgröße bei bleibender Regelabweichung gegen 100% Grenze.


Albatros_

#323
Danke für das Feedback. Ich habe das Gefühl, dass dein Regler schwingt. Versuch mal den I-Anteil zu reduzieren.
Ich bin momentan bei
P: 1.0
I: 0.006
Abtastzeit: 60 Sekunden

wobei das sicher für jeden Raum anders ist.

My-FHEM

#324
Ja hatte ich schon gemacht, diese Bilder waren noch mit den Werten vor deiner Anpassung.
Meine Abtastzeit sind 120 sec. Aber das Überschwingen hält sich in Grenzen. +/- 0.2° das ist mir genau genug
und der Boden fühlt sich nie kalt an.

Btw. man sieht aber auch gut die Wirkung des D-Anteils und dessen durchschieben. Vielleicht müsste hier auch eine
gewichtete Betrachtung erfolgen und nicht nach einen festen Ende nach c_PID_DLookBackCnt. (Siehe Entwicklung 14h15-16h15)

Danke für den Hinweis.

Morgennebel

Zitat von: Albatros_ am 02 Dezember 2016, 08:38:33
nein hatte ich nicht vor, das ist dein Modul. Ich wollte es hier hochladen.

Ich habe die Änderungen bei mir lokal eingepflegt, erhalte jetzt aber eine Warnung nach einem "shutdown restart":


2016.12.04 19:27:52 1: HMLAN_Parse: HMLAN1 new condition ok
2016.12.04 19:27:55 1: PERL WARNING: Use of uninitialized value $ISum in addition (+) at ./FHEM/93_PWMR.pm line 999.


Ist das kritisch?

Danke, -MN
Einziger Spender an FHEM e.V. mit Dauerauftrag seit >= 24 Monaten

FHEM: MacMini/ESXi, 2-3 FHEM Instanzen produktiv
In-Use: STELLMOTOR, VALVES, PWM-PWMR, Xiaomi, Allergy, Proplanta, UWZ, MQTT,  Homematic, Luftsensor.info, ESP8266, ESERA

Albatros_

Den Fehler habe ich bei mir nicht. Ggf. ist bei der Übernahme der Änderung etwas schiefgegangen ?
@jamesgo: wie wollen wir denn weiter vorgehen ? Willst du die Änderungen übernehmen oder vielleicht einen weiteren "usePID" Modus ergänzen ?
Dann wäre das Update rückwärts kompatibel und man würde den bisherigen Nutzern nicht ihre Regelungen durcheinanderbringen ? Alle die möchten könnten dann Modus 2 nutzen.

Morgennebel

Zitat von: Albatros_ am 04 Dezember 2016, 20:07:53
Den Fehler habe ich bei mir nicht. Ggf. ist bei der Übernahme der Änderung etwas schiefgegangen ?

Es war eine (von 12) PWMR-Definitionen, dort fehlten die Parameter am Ende (1:0.8:0.4,5:0.5,10).

Wild spekuliert: Zeile 999 ist:


  $ISum = $ISum + ($deltaTempPID*$room->{c_PID_IFactor});


ist evtl. $room->{c_PID_IFactor} ohne die Parameter in der PWMR-Definition leer (d.h. gleich 0) und der Ausdruck wird in diesem Fall zu $ISum = $ISum?

Falls dies richtig ist, wäre es evtl. sinnvoll, die Existenz von  $room->{c_PID_IFactor} zu überprüfen oder mit einem Vorgabewert zu belegen?

Ciao, -MN
Einziger Spender an FHEM e.V. mit Dauerauftrag seit >= 24 Monaten

FHEM: MacMini/ESXi, 2-3 FHEM Instanzen produktiv
In-Use: STELLMOTOR, VALVES, PWM-PWMR, Xiaomi, Allergy, Proplanta, UWZ, MQTT,  Homematic, Luftsensor.info, ESP8266, ESERA

Morgennebel

Moin Moin,

Zitat von: Albatros_ am 02 Dezember 2016, 08:38:33
nein hatte ich nicht vor, das ist dein Modul. Ich wollte es hier hochladen.
Leider basiert mein Code noch auf einer älteren Version, deshalb hier nur das Delta:

Im Anhang ist Deine Änderung gegen 93_PWMR.pm 12595 2016-11-17 11:22:46Z jamesgo $ als diff-Datei, die mit "patch" eingespielt werden kann.

Danke für Deine Arbeit,

Ciao, -MN

Einziger Spender an FHEM e.V. mit Dauerauftrag seit >= 24 Monaten

FHEM: MacMini/ESXi, 2-3 FHEM Instanzen produktiv
In-Use: STELLMOTOR, VALVES, PWM-PWMR, Xiaomi, Allergy, Proplanta, UWZ, MQTT,  Homematic, Luftsensor.info, ESP8266, ESERA

Morgennebel

Zitat von: Albatros_ am 04 Dezember 2016, 15:48:09
Ich bin momentan bei
P: 1.0
I: 0.006
Abtastzeit: 60 Sekunden

Moin Moin,

die bisher im Forum empfohlenen Parameter für PWMR waren  1:0.8:0.4,5:0.5,10. Inwieweit ändern sich diese Parameter durch Deine Modifikationen der PID-Regelung bzw. wie können die ideal passenden Parameter für jeden Raum gefunden werden?

Danke, -MN
Einziger Spender an FHEM e.V. mit Dauerauftrag seit >= 24 Monaten

FHEM: MacMini/ESXi, 2-3 FHEM Instanzen produktiv
In-Use: STELLMOTOR, VALVES, PWM-PWMR, Xiaomi, Allergy, Proplanta, UWZ, MQTT,  Homematic, Luftsensor.info, ESP8266, ESERA