Neues Modul PID20 - Der PID-Regler

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

Vorheriges Thema - Nächstes Thema

gero

Zitat von: JoeALLb am 09 Januar 2016, 17:18:09
noch eine Frage: Wie berücksichtigt ihr extrem schwankende Vorlauftemperaturen? Meiner ist in einem Heizkreis manchmal nur 25 grad, manchmal aber auch 50. Das beeinflusst den Temperaturanstieg im Raum enorm.  ich stelle mir vor, dass bei 50 grad das Ventil weniger öffnen sollte als bei 25 grad....  Und das bei 25  die Desired Temp von 27 gar nie erreicht werden kann.....
Hat jemanden  dazu eine Theorie?

Ich rechne die Vorlauftemperatur als Offset in den Ausgang des PID-Reglers rein, quasi als nachgeschalteter P-Regler.
Damit kann ich die Schwankungen in der Vorlauftemperatur ganz gut kompensieren.


Gruß,
Gero
Odroid C1 - CULV3-868, JeeLink
16 x TX 29 DTH
MAX!: 15x Heizkörperthermostat+, 2x Wandthermostat, 14x Fenserkontakt, 1x Ecotaster
FS20 S4A, FS20IRF, BSB-Heizungssteuerung über Atmega2560
Z-Wave: ZME_UZB1, Fibaro Wall Plug + Motion Sensor

JoeALLb

Zitat von: John am 08 Januar 2016, 13:38:07
Hier findet sich das neue Attribut pidActorCallBeforeSetting.


Diese Sub wird immer genau vor dem Setzen des Aktors aufgerufen und Muss den auszugebenden Stellwert zurückliefern.

Bitte um Feedback.

John

Hallo John,

vielen Dank. Sorry, dass es gedauert hat, ich hatte nach einem Update abstürze im fhem, die kamen aber von einem anderen Modul.

Es scheint perfekt zu funktionieren, und ist mir wirklich eine große Hilfe!
@gero danke auch für den Tip, ich werd dies gleich mit der neuen Möglichkeit hier mit umsetzen!


Zur Info an alle: Ich nutze im Bad das Rollo zur Lüftungssteuerung und habe hier jetzt experimental auch mal dieses Modul mit einem hohen pidFactor_P zur Steuerung der Rolladen-Öffnung eingesetzt.
Scheint ebenfalls sehr gut zu funktionieren, mir ist lediglich aufgefallen, dass das Modul einen Stop oder Restart-Befehl oft lange nicht anzeigt. Hängt dies mit dem pidActorInterval zusammen?
Prinzipiell fände ich es schöner, wenn der state sofort auf Stop wechselt, da ich am tablet sonst einfach nicht weiß, ob ich vielleicht nur daneben gedrückt habe...
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

John

@JoeAllb
Zitat
mir ist lediglich aufgefallen, dass das Modul einen Stop oder Restart-Befehl oft lange nicht anzeigt

Hab das bereinigt und eingecheckt. (V 1.0.0.8)

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

JoeALLb

Danke, funktioniert bestens!!!

Was mir noch aufgefallen ist: Wenn ich ein FHEM-Restart mache (nach einem Update, etc...), startet das Modul nicht im Modus von zuvor, es startet immer als gestarted.
Das mag bei einer Heizung nach einem Ausfall sinn machen, nach so kurzen Ausfällen wie einem Restart ist das bei mir eher problematisch.

Kann das in einem nächsten Update auch noch einfließen, oder soll ich mir die Stati in dummies wegsichern und diese beim Neustart zurückspielen?
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

alpine310

Hallo
gibt es eine Möglichkeit den internen Rechenwerte p_i zu resetten - spricht auf Null zu setzen?
Setze ich pidFactor_I = 0 dann bleibt p_i auf dem zuletzt berechneten Wert stehen.
Ein Restart setzt die internen Rechenwerte auch nicht auf Null.

Bei meinen Einstellversuchen läuft p_i ab und zu aus dem Ruder und dann würde ich gerne
einen neuen Versuch starten. Deshalb meine Frage.

Gruß Martin
RasPi3, HM Heizkörperthermosate, HM Fensterkontakte, HM Rolladenaktoren, HM-LED Dimmer, HM-Funktaster mit Display, Keymatic, Anbindung an Heizungsregelung SolvisControl2 mit SolvisSmartHomeServer, Anbindung an TA-UVR16x2 (für Luftkollektoren und Lüftung)

JoeALLb

Noch was, was mir aufgefallen ist: set pid20 restart 75 setzt den Aktor nicht wie erwartet zuerst auf 75, sondern direkt auf 0.

Ich verwende zwar "pidActorCallBeforeSetting PIDActorSet",
aber dieser Code sollte dran nicht schuld sein.

# 1. Parameter = Name des PID
# 2. Parameter = actuator value
sub PIDActorSet($$)
{
    my ( $name, $actValue ) = @_;

if(  $actValue<6 ) {
return 0;
}
elsif($actValue > 90 ) {
return 100;
}
else {
  return $actValue -3;
}

}


Diese Werte zeigen an, was das Modul auch gemacht hat.
Habe ich die Restart-Funktion falsch verstanden?
actuation=0
actuationCalc= -873.39509287767

FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

John

@alpine310

Zitatgibt es eine Möglichkeit den internen Rechenwerte p_i zu resetten - spricht auf Null zu setzen?
Setze ich pidFactor_I = 0 dann bleibt p_i auf dem zuletzt berechneten Wert stehen.
Ein Restart setzt die internen Rechenwerte auch nicht auf Null.

man kann den I-Anteil (p_i) auf 0 setzen durch folgende Maßnahmen

set <dein Pid> restart <p_p + p_d>

Danach wird p_i 0 sein.

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

alpine310

RasPi3, HM Heizkörperthermosate, HM Fensterkontakte, HM Rolladenaktoren, HM-LED Dimmer, HM-Funktaster mit Display, Keymatic, Anbindung an Heizungsregelung SolvisControl2 mit SolvisSmartHomeServer, Anbindung an TA-UVR16x2 (für Luftkollektoren und Lüftung)

tobby

#308
Hier ein interessanter Vortrag über die Auslegung von PI-Reglern für die Steuerung einer Heizung:
https://www.youtube.com/watch?v=quqxyny5kBU

Natürlich macht er ein paar Vereinfachungen (z.B. "regelt" er die Vorlauftemperatur anstatt der Ventilöffnung) und ein paar Dinge fallen auch einfach vom Himmel (Zeitkonstanten sowie Totzeit), trotzdem eine wirklich gute Methode, den Regler zu veranschaulichen.

Seine Methode der Auslegung der Regelung mag auch extrem schnell sein, aber die starken Überschwinger nimmt wohl kaum einer hin, dann lieber eine etwas langsamere Regelung. Die ermittelten Parameter kann man aber danach ja hiermit weiter verbessern: https://de.wikipedia.org/wiki/Faustformelverfahren_(Automatisierungstechnik)#Empirische_Dimensionierung

//EDIT: Ach ja, die Möglichkeit, einen Arbeitspunkt einzustellen, wäre für den PID20 vielleicht auch ganz nett. Und sollte mit sehr wenig Aufwand möglich sein (nur ein konfigurierbarer Offset, der einfach draufgerechnet wird)

Und was ebenfalls noch interessant wäre: Konfigurierbarer WindUp für den I-Anteil. Folgender Fall: Die Vorlauftemperatur reicht einfach nicht aus, um die gewünschte Temperatur zu erreichen. Man kommt vielleicht nah dran, aber nicht drüber. Der P-Anteil regelt konstant seinen festen Wert, der vielleicht schon sehr gering ist, da man nah an der gewünschten Temperatur ist. Der I-Anteil steigt aber langsam und stetig, bis das Ventil in Summe zu 100% geöffnet ist. Die Temperatur steigt trotzdem nicht weiter. Irgendwann will man wieder eine geringere Temperatur haben. Der immer noch sehr hohe I-Anteil sorgt nun dafür, dass man über Stunden oder vielleicht Tage immer eine zu hohe Temperatur bekommt, bis der I-Anteil wieder ausreichend gesunken ist.
Ideen wären:
- Begrenzung des I-Anteils auf fest eingstellten Wert (z.B. max. 30%)
- schlaue Erkennung, dass Temperatur z.B. über 30min keine Veränderung gemacht hat (trotz positiver Regelabweichung), obwohl der I-Anteil bzw. die gesamte Ventilöffnung gestiegen ist -> I-Anteil einfrieren
- schlaue Erkennung, dass Temperatur z.B. über 30min schon die maximale Steigung erreicht hat (bei positiver Regelabweichung) (z.B. 2° pro Stunde) -> I-Anteil einfrieren, bringt dann auch keine Steigerung
- und eventuell nochmal Gedanken machen, ob man irgendwas davon auch bei negativer Regelabweichung betrachten möchte
FHEM 5.7 in Ubuntu 14.04.3 (als VM via KVM auf Homeserver) / CUL V3
MAX!: 5x Wandthermostat+, 5x Heizkörperthermostat (derzeit nicht in Benutzung), 5x Heizkörperthermostat basic, 5x Fensterkontakt, 1x Cube (derzeit nicht in Benutzung)

alpine310

Hallo

den Wunsch nach einer Begrenzung des I-Anteil (nach unten sowie auch nach oben) unterstütze ich auch.

Ich verwende den PID20 zur Beeinflußung der Vorlauftemperatur meiner Heizung. Als Eingangsgröße verwende ich die durchschnittliche Ventilstellung meiner Heizkörperthermostate. Die Antwortzeiten sind hier prinzipbedingt sehr langsam. Wähle ich den I-Faktor sehr klein, dann läuft der I-Anteil währen der Nachtabsenkung an die untere Grenze. Bei der Umschaltung auf Tagbetrieb dauert es ewig bis der I-Anteil wieder nach oben gelaufen ist. Wähle ich den I-Faktor größer (für eine schnellere Reaktion) dann beginnt die Regelung zu schwingen.

Eine Begrenzung des I-Anteils wäre hier genau das richtige.

Martin
RasPi3, HM Heizkörperthermosate, HM Fensterkontakte, HM Rolladenaktoren, HM-LED Dimmer, HM-Funktaster mit Display, Keymatic, Anbindung an Heizungsregelung SolvisControl2 mit SolvisSmartHomeServer, Anbindung an TA-UVR16x2 (für Luftkollektoren und Lüftung)

John

@tobby, @alpine310

Anbei das überarbeitete Modul.
Hier findet sich das neue Attribut pidIPortionCallBeforeSetting.

ich habe in 99_Utils.pm folgende Sub definiert:
# 1. Parameter = Name des PID
# 2. Parameter = i-portion value

sub PIDIPortionSet($$)
{
    my ( $name, $iPortion ) = @_;
    return $iPortion;
}


und das Attribut wie folgt gesetzt:
Zitat
attr PID.TEST pidIPortionCallBeforeSetting  PIDIPortionSet
Diese sub wird vor der Berechnung von actuationCalc aufgerufen.


Bitte um Feedback. Wenn alles klappt checke ich die Änderungen ein.

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

alpine310

Hallo John

habe ich das richtig verstanden, daß die Korrektur
des I-Anteils in der sub PIDIPortionSet erfolgen soll,
damit jeder das dann nach seinem eigenen Gusto
implementieren kann?

Martin
RasPi3, HM Heizkörperthermosate, HM Fensterkontakte, HM Rolladenaktoren, HM-LED Dimmer, HM-Funktaster mit Display, Keymatic, Anbindung an Heizungsregelung SolvisControl2 mit SolvisSmartHomeServer, Anbindung an TA-UVR16x2 (für Luftkollektoren und Lüftung)

John

CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

alpine310

Hallo John
Hab das ganze mit einer einfachen Begrenzung nach oben und unten
bei mir umgesetzt und es funktioniert einwandfrei.
Martin
RasPi3, HM Heizkörperthermosate, HM Fensterkontakte, HM Rolladenaktoren, HM-LED Dimmer, HM-Funktaster mit Display, Keymatic, Anbindung an Heizungsregelung SolvisControl2 mit SolvisSmartHomeServer, Anbindung an TA-UVR16x2 (für Luftkollektoren und Lüftung)

tobby

Ich kann zwar programmieren, aber leider überhaupt kein Perl. Magst du uns deine Umsetzung hier mal posten?
FHEM 5.7 in Ubuntu 14.04.3 (als VM via KVM auf Homeserver) / CUL V3
MAX!: 5x Wandthermostat+, 5x Heizkörperthermostat (derzeit nicht in Benutzung), 5x Heizkörperthermostat basic, 5x Fensterkontakt, 1x Cube (derzeit nicht in Benutzung)