PID20 - Der PID-Regler: Unterschied zwischen den Versionen
John (Diskussion | Beiträge) |
John (Diskussion | Beiträge) |
||
Zeile 144: | Zeile 144: | ||
== Inbetriebnahme == | == Inbetriebnahme == | ||
* aktuell freigegebene Version von | * aktuell freigegebene Version von 98_PID20.pm in das Verzeichnis /opt/fhem/FHEM kopieren. | ||
* PID20 definieren, hier mit HMS100TF als Istwertgeber für die Temperatur und ein MAX-Thermostat als Stellglied; Auslegung für eine Fußbodenheizung (sehr träge) | * PID20 definieren, hier mit HMS100TF als Istwertgeber für die Temperatur und ein MAX-Thermostat als Stellglied; Auslegung für eine Fußbodenheizung (sehr träge) | ||
<pre>define PID.FUBO PID20 DG.BAD.TF:temperature HT.FUBO:maxValveSetting</pre> | <pre>define PID.FUBO PID20 DG.BAD.TF:temperature HT.FUBO:maxValveSetting</pre> |
Version vom 14. Dezember 2013, 20:10 Uhr
An dieser Seite wird momentan noch gearbeitet. |
PID20 ist ein Modul, das nach dem P-I-D Algorithmus einen Regler realisiert.
Projekt-Status
Das neue Modul befindet sich in der Evaluations-Phase und ist noch nicht für produktiven Einsatz freigegeben.
Die nachfolgenden Ausführungen dienen zur Spezifizierung der neuen geplanten Funktionalitäten.
Features
- einstellbarer Bewertungs-/Berechungszyklus
- Überwachung des Istwert-Gebers über dessen Zeitstempel (Sensorausfall)
- Skalierbarkeit der Ausgabehäufigkeit an das Stellglied über Zeit und Mindeständerung
- Zwangsausgabe an das Stellglied nach Ablauf eines einstellbaren Zeitintervalls
- Notstellung des Stellgliedes, falls Istwert-Geber ausgefallen ist
- Begrenzung des Stellbereiches nach oben und unten
- Festlegung der Nachkommastellen (0..5) des Ausgabewertes zum Stellglied
- Festlegen einer minimalen Regelabweichung, ab der der Regler aktiv wird
- Festlegen des Reading-Namens für den Sollwert
- Festlegen des Reading-Namens für den Istwert
- Invertierung des Reglerwirksinnes
- Festlegen der minimalen Aktualisierungsrate der Readings
- Festlegen der Proportionalitätskonstanten P,I,D
Aktuelle Version
Die Version V 1.00.c ist als Anhang im angegebenen Link zu finden
Define
define <name> PID20 sensor[:reading:regexp] actor:cmd
Attribute
Parameter | Wertebereich | Default | Beschreibung |
---|---|---|---|
pidActorValueDecPlaces | [0..5] | 0 | Anzahl der Nachkommstellen für Ausgabewert zu Aktor |
pidActorInterval | uint | 180 | minimale Wartezeit in Sekunden, bis eine neue Ausgabe an das Stellglied erfolgen kann |
pidActorThreshold | uint | 1 | Notwendige minimale Änderung zum Altwert der Stellgliedausgabe, damit diese erneut erfolgt |
pidActorErrorAction | [freeze, errorPos] | freeze | legt das Verhalten der Ausgabe zum Stellglied fest, wenn der Istwert nicht innerhalb von <pidSensorTimeout> aktualisiert wurde (Sensor-Ausfall) freeze: Position des Stellgliedes beibehalten |
pidActorErrorPos | int | 0 | Diese Position ist einzunehmen, wenn pidActorErrorAction auf errorPos steht und der Istwert-Geber ausgefallen ist. |
pidActorKeepAlive | uint | 1800 | Spätestens nach dieser Zeit erfolgt eine Zwangsausgabe an das Stellglied
(wenn PID nicht disabled und nicht stopped) |
pidActorLimitLower | float | 0 | untere Begrenzung für das Stellglied |
pidActorLimitUpper | float | 100 | obere Begrenzung für das Stellglied |
pidCalcInterval | uint | 60 | Berechnungszyklus in Sekunden, nach dem die PID-Berechnung durchgeführt wird. |
pidDeltaTreshold | uint | 0 | wenn die Regeldifferenz(delta) kleiner al pidDeltaThreshold,, dann wird der Regler eingefroren (state= idle) |
pidDesiredName | string | desired | Name für das Reading, das den Sollwert für den Regler aufnehmen soll |
pidMeasuredName | string | measured | Name für das Reading, das den Istwert für den Regler aufnehmen soll |
pidSensorTimeout | uint | 3600 | Zeitlimit in Sekunden, nach dessen Überschreitung der Ausfall des Istwert-Gebers anzunehmen ist |
pidReverseAction | [0,1] | 0 | Umgekehrter Wirksinn des Reglers |
pidUpdateInterval | uint | 300 | Zeitlimit in Sekunden, nach der ein Zwangsupdate der Readings erfolgen muss (Kurvendarstellung). |
pidFactor_P | pos. float | 25 | Proportionalitätskonstante für P-Anteil |
pidFactor_I | pos. float | 0.25 | Proportionalitätskonstante für I-Anteil |
pidFactor_D | pos. float | 0 | Proportionalitätskonstante für D-Anteil |
disable | [0,1] | 0 | Freigabe/Sperren des Reglers |
Setter
desired
- Funktion: Sollwert einstellen
- Name des Setters kann vom Anwender über das Attribute "pidDesiredName" definiert werden
start
- PID nimmt den Betrieb wieder auf, es werden P-, I- und D-Anteil vor dem Stop übernommen
stop
- PID geht in den Zustand stopped; alles wird praktisch eingefroren
restart
- arbeitet zunächst wie Start, jedoch gibt man an, mit welchen Prozentwert der Stellausgang anfangs stehen soll
Readings
- actuation liefert den tatsächlichen Ausgabewert an das Stellglied
- actuationCalc liefert den internen Rechenwert des Ausgabewertes für das Stellglied(ohne Begrenzung)
- delta, die aktuelle Regeldifferenz
- desired (Name ist variabel), der Sollwert
- measured (Name ist variabel), der aktuelle Wert vom Istwertgeber
- p_p, der P-Anteil des Ausgabewertes für das Stellglied
- p_i, der I-Anteil des Ausgabewertes für das Stellglied
- p_d, der D-Anteil des Ausgabewertes für das Stellglied
- state, der Betriebszustand des Reglers
delta
delta = desired - measured (also Sollwert-Istwert)
actuation
actuation = actuationCalc
jedoch begrenzt durch pidActorLimitLower und pidActorLimitUpper
und formatiert via pidActorValueDecPlaces
actuationCalc
Der Ausgabewert für das Stellglied wird wie folgt berechnet
actuationCalc = p_p + p_i + p_d
state
state | Erläuterung |
---|---|
disabled | PID-Instanz ist inaktiv |
initializing | Modul wurde initialisiert |
idle | Berechnung ist inaktiv |
processing | Berechnung ist aktiv, Normalbetrieb |
alarm | Ausnahmezustand, z.B. Timout des Istwert-Gebers |
Inbetriebnahme
- aktuell freigegebene Version von 98_PID20.pm in das Verzeichnis /opt/fhem/FHEM kopieren.
- PID20 definieren, hier mit HMS100TF als Istwertgeber für die Temperatur und ein MAX-Thermostat als Stellglied; Auslegung für eine Fußbodenheizung (sehr träge)
define PID.FUBO PID20 DG.BAD.TF:temperature HT.FUBO:maxValveSetting
- "DG.BAD.TF": Name des Istwertgebers (HMS100TF)
- "temperature": das Reading vom HMS100TF, das die Temperatur liefert
- "HT.FUBO" : Name des MAX-Thermostats, das als Stellglied verwendet wird
- "maxValveSetting" : Das Reading vom Max-Thermostat, das PID20 als Stellausgabe manipulieren soll
zusätzlich noch einige Attribute anpassen
- die Ausgabehäufigkeit an das Stellglied auf 15 Minuten begrenzen
attr PID.FUBO pidActorInterval 900
- nur dann einen Wert an das Stellglied ausgeben, wenn die Differenz zum Altwert >= 8%
attr PID.FUBO pidActorTreshold 8
- Nachommastellen für das Stellglied festlegen; MAX-Thermostate erlauben nur Werte ohne Nachkommastellen
attr PID.FUBO pidActorValueDecPlaces 0
- I-Faktor festlegen; Überlegung: bei einer Regelabweichung von 1 Grad, soll der I-Anteil um 0.2% pro Minute inkrementieren/dekrementieren
attr PID.FUBO pidFactor_I 0.2
- P-Faktor festlegen; Überlegung:Bei einer Regel-Abweichung von 1 Grad, soll der P-Anteil +/-50% betragen
attr PID.FUBO pidFactor_P 50
Chart einrichten
Es ist für das Einstellen der Regel-Faktoren (P,I,D) überaus hilfreich, das Verhalten über die Zeit aufzuzeichnen, um das Verhalten objektiv beurteilen zu können.
- Zunächst ein Filelog einrichten
- define PID.PID.File FileLog ./log/PID.PID-%Y.log PID\.PID
- attr PID.PID.File logtype text
Danach ein Chart definieren, angelehnt an folgendem Beispiel:
Anbei ein Vorschlag für au
Hintergrund-Informationen
list <pid-name>
Internals:
DEF DG.BAD.TF PID.Actor:state
NAME PID.PID
NR 616
NTFY_ORDER 50-PID.PID
STATE processing
TYPE PID
Readings:
2013-10-20 17:13:41 actuation 97
2013-10-20 17:21:42 actuationCalc 97.2079999999999
2013-10-20 17:21:42 delta 0.199999999999999
2013-10-20 17:13:41 desired 22
2013-10-20 17:13:41 measured 21.8
2013-10-20 17:21:42 p_d 0
2013-10-20 17:21:42 p_i 92.2079999999999
2013-10-20 17:21:42 p_p 4.99999999999998
2013-10-20 17:21:42 state processing
Helper:
actor PID.Actor
actorCommand state
actorErrorAction freeze
actorErrorPos 0
actorInterval 300
actorKeepAlive 1800
actorLimitLower 0
actorLimitUpper 100
actorThreshold 4
actorTimestamp 2013-10-20 17:13:41
actorValueDecPlaces 0
calcInterval 60
deltaGradient 0
deltaOld 0.199999999999999
deltaOldTS 2013-10-20 17:18:07
deltaTreshold 0
desiredName desired
disable 0
factor_D 0
factor_I 0.25
factor_P 25
isWindUP 0
measuredName measured
reading temperature
regexp ([\d\.]*)
reverseAction 0
sensor DG.BAD.TF
sensorTimeout 3600
updateInterval 600
Attributes:
pidActorInterval 300
pidActorTreshold 4
pidActorValueDecPlaces 0
room PID
verbose 4
Anti-WindUp-Strategie
Der integrale Anteil des PID-Reglers wird ohne Gegenmassnahmen auch dann weiter integriert, wenn das Stellglied bereits an seine Grenzen gestossen ist. Dies hat den Nachteil, dass nach einer Reduzierung der Regeldifferenz lange Wartezeiten entstehen können, bis das Stellglied reagiert. Dies nennt man den WindUP-Effekt. Hierzu wurde die folgende Strategie entwickelt:
Sobald das rechnerische Stellsignal (Ventilstellung Calc=actuationCalc) die obere Grenze des Stellgliedes überschreitet (pidActorLimitUpper) oder die untere Grenze unterschreitet (pidActorLimitLower), wird die Integration des I-Anteils eingefroren.
Am Beispiel:
An Position L1 überschreitet der rechnerische Ausgabewert des Stellgliedes die obere Grenze (100%).
Der I-Anteil verändert sich nicht mehr bis zur Position L2. Hier unterschreitet der Augabewert die
obere Grenze, der I-Anteil kann wieder verändert werden.
Fragen und Antworten
ToDo.