|
|
Zeile 1: |
Zeile 1: |
|
| |
| '''PID''' ist ein Modul, das nach dem P-I-D Algorithmus einen Regler realisiert. | | '''PID''' 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
| |
|
| |
| === Define ===
| |
|
| |
| '''bisher:'''
| |
|
| |
|
| |
| <code>
| |
| define <name> PID sensor[:reading:regexp] actor[:cmd:min:max] [p i d]
| |
| </code>
| |
|
| |
|
| |
|
| |
| '''neu:'''
| |
| <code>
| |
| define <name> PID sensor[:reading:regexp] actor:cmd
| |
| </code>
| |
|
| |
|
| |
| '''Begründung'''
| |
| * die p,i,d Faktoren werden in den Attributen definiert (pidFactor_P,pidFactor_I,pidFactor_D )
| |
| * min,max wird ebenfalls in den Attributen (pidActorLimitLower,pidActorLimitUpper)
| |
|
| |
| === Attribute ===
| |
| {| class="wikitable sortable"
| |
| |-
| |
| ! 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) <br />
| |
| freeze: Position des Stellgliedes beibehalten<br />
| |
| ErrorPos: Position anfahren, die unter Attribut <pidActorErrorPos> angegeben ist."
| |
| |-
| |
| |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
| |
| |}
| |
|
| |
| === Readings ===
| |
| [[Datei:13 10 20 Pid readings.png]]
| |
| * 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'''
| |
| <code>
| |
| delta = desired - measured (also Sollwert-Istwert)
| |
| </code>
| |
|
| |
| '''actuation'''
| |
| <code>
| |
| actuation = actuationCalc
| |
| </code>
| |
| jedoch begrenzt durch pidActorLimitLower und pidActorLimitUpper
| |
| und formatiert via pidActorValueDecPlaces
| |
|
| |
|
| |
| '''actuationCalc'''
| |
|
| |
| Der Ausgabewert für das Stellglied wird wie folgt berechnet
| |
|
| |
| <code>
| |
| actuationCalc = p_d + p_i + p_d
| |
| </code>
| |
|
| |
| '''state'''
| |
|
| |
| {| class="wikitable"
| |
| |-
| |
| ! state !! Erläuterung
| |
| |-
| |
| | disabled || PID-Instanz ist inaktiv
| |
| |-
| |
| | initializing || Modul wurde initialisiert
| |
| |-
| |
| | idle || Berechnung ist inaktiv
| |
| |-
| |
| | processing || Berechnung ist aktive, Normalbetrieb
| |
| |-
| |
| | alarm || Ausnahmezustand, z.B. Timout des Istwert-Gebers
| |
| |}
| |
|
| |
| == Hintergrund-Informationen ==
| |
| === list <pid-name> ===
| |
| <code>
| |
| 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
| |
|
| |
| </code>
| |
|
| |
| === 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:
| |
|
| |
| [[Datei:13 10 20 PID Windup.png|WindUP]]
| |
|
| |
| 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.
| |
|
| |
| == Weblinks ==
| |
|
| |
| * [http://forum.fhem.de/index.php/topic,15060.0.html Forumseintrag zur Überarbeitung des Moduls ab 2013/09]
| |
| * [http://de.wikipedia.org/wiki/Regler Wikipedia Regler]
| |
|
| |
| [[Kategorie:Glossary]]
| |