PID: Unterschied zwischen den Versionen

Aus FHEMWiki
(Der Seiteninhalt wurde durch einen anderen Text ersetzt: „'''PID''' ist ein Modul, das nach dem P-I-D Algorithmus einen Regler realisiert.“)
(Restauration zu PID20)
Zeile 1: Zeile 1:
'''PID''' ist ein Modul, das nach dem P-I-D Algorithmus einen Regler realisiert.
 
{{Baustelle}}
{{SEITENTITEL:PID20}}
'''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.<br/>
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 ==
ToDo.
 
=== Define ===
<code>
  define <name> PID20 sensor[:reading:regexp] actor:cmd
</code>
 
 
=== 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
|}
 
=== 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 ===
[[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.
 
== Fragen und Antworten ==
ToDo.
 
== Weblinks ==
 
* [http://forum.fhem.de/index.php/topic,15060.0.html Initialer Forumseintrag zur Überarbeitung des PID-Moduls]
* [http://de.wikipedia.org/wiki/Regler Wikipedia Regler]
 
[[Kategorie:Glossary]]

Version vom 2. Dezember 2013, 21:23 Uhr


Clock - Under Construction.svg 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

ToDo.

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
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

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

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

  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_d + p_i + p_d

state

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>

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:

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.

Fragen und Antworten

ToDo.

Weblinks