Neues Modul PID20 - Der PID-Regler

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

Vorheriges Thema - Nächstes Thema

cwagner

Guten Morgen, John,

einen habe ich noch: immer wieder läuft meine Mischerregelung in eine Störung, weil ein Timer nicht ausgeführt werden kann. Jetzt habe ich die Ursache: Der Timer, der ein Delta abarbeiten soll,  ist gerundet 0 und das geht natürlich nicht. Warum ist er Null, obwohl ich Threshold sogar auf 6 gesetzt habe? Das passiert, wenn die letzte Actuation weniger als 6% an der 100  dran ist und der nächste Schritt dann auf 100 erhöht. Meiner Meinung dürfte in diesem Beispiel keine Aktuatoränderung mehr stattfinden, oder?

2014-03-29_07:46:01 PID_Mischer_FBH desired: 37.6
2014-03-29_07:46:01 PID_Mischer_FBH measured: 28.69
2014-03-29_07:46:01 PID_Mischer_FBH p_p: 35.64
2014-03-29_07:46:01 PID_Mischer_FBH p_d: 0
2014-03-29_07:46:01 PID_Mischer_FBH p_i: 64.015
2014-03-29_07:46:01 PID_Mischer_FBH actuation: 99.7
2014-03-29_07:46:01 PID_Mischer_FBH actuationCalc: 99.655
2014-03-29_07:46:01 PID_Mischer_FBH delta: 8.91
2014-03-29_07:46:32 PID_Mischer_FBH desired: 37.6
2014-03-29_07:46:32 PID_Mischer_FBH measured: 28.565
2014-03-29_07:46:32 PID_Mischer_FBH p_p: 36.14
2014-03-29_07:46:32 PID_Mischer_FBH p_d: 0
2014-03-29_07:46:32 PID_Mischer_FBH p_i: 64.9185
2014-03-29_07:46:32 PID_Mischer_FBH actuation: 100.0
2014-03-29_07:46:32 PID_Mischer_FBH actuationCalc: 101.0585
2014-03-29_07:46:32 PID_Mischer_FBH delta: 9.035
2014-03-29_07:48:04 PID_Mischer_FBH desired: 37.6
2014-03-29_07:48:04 PID_Mischer_FBH measured: 30.7525
2014-03-29_07:48:04 PID_Mischer_FBH p_p: 27.39
2014-03-29_07:48:04 PID_Mischer_FBH p_d: 0
2014-03-29_07:48:04 PID_Mischer_FBH p_i: 65.60325
2014-03-29_07:48:04 PID_Mischer_FBH actuation: 93.0
2014-03-29_07:48:04 PID_Mischer_FBH actuationCalc: 92.99325
2014-03-29_07:48:04 PID_Mischer_FBH delta: 6.8475
2014-03-29_07:49:05 PID_Mischer_FBH desired: 37.6
2014-03-29_07:49:05 PID_Mischer_FBH measured: 32.94
2014-03-29_07:49:05 PID_Mischer_FBH p_p: 18.64
2014-03-29_07:49:05 PID_Mischer_FBH p_d: 0
2014-03-29_07:49:05 PID_Mischer_FBH p_i: 66.6415
2014-03-29_07:49:05 PID_Mischer_FBH actuation: 85.3
2014-03-29_07:49:05 PID_Mischer_FBH actuationCalc: 85.2815
2014-03-29_07:49:05 PID_Mischer_FBH delta: 4.66


Ehe ich jetzt auf meiner Seite den Fall abfange, stellt sich die Frage, ob Du in Deinem Programm ein Unterschreiten des Thresholds am "Rande" der Regelstrecke auffangen kannst.

Mit Dir freue ich mich, dass PID20 nun zum Funktionsumfang von FHEM gehört. Ich finde es eine wirkliche Bereicherung des Projektes.

Herzliche Grüße

Christian
PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

John

Es gibt 2 Thresholds.
Welchen meinst du denn ?

Bitte nochmals ein list <pid> reinstellen.

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

cwagner

Hallo John, hier das aktuelle Listing meiner PID20-Instanz am Mischer:

nternals:
   CFGFN      ./FHEM/heizung.cfg
   DEF        T_Vorlauf_FBH:temperature FBH_Stellwert
   NAME       PID_Mischer_FBH
   NR         593
   NTFY_ORDER 50-PID_Mischer_FBH
   STATE      processing
   TYPE       PID20
   Readings:
     2014-03-29 10:33:32   actuation       100.0
     2014-03-29 10:33:32   actuationCalc   118.4645
     2014-03-29 10:33:32   delta           9.8475
     2014-03-29 10:33:32   desired         37.6
     2014-03-29 10:33:32   measured        27.7525
     2014-03-29 10:33:32   p_d             0
     2014-03-29 10:33:32   p_i             79.0744999999999
     2014-03-29 10:33:32   p_p             39.39
     2014-03-29 10:33:32   state           processing
   Helper:
     actor      FBH_Stellwert
     actorCommand
     actorErrorAction freeze
     actorErrorPos 0
     actorInterval 1
     actorKeepAlive 24000
     actorLimitLower 0
     actorLimitUpper 100
     actorThreshold 6
     actorTimestamp 2014-03-29 09:53:22
     actorValueDecPlaces 1
     adjust     
     calcInterval 30
     deltaGradient 0.0020678481108515
     deltaOld   9.8475
     deltaOldTS 2014-03-29 10:32:57
     deltaTreshold 0
     desiredName desired
     disable    0
     factor_D   0
     factor_I   0.2
     factor_P   4
     isWindUP   1
     measuredName measured
     reading    temperature
     regexp     ^([\+,\-]?\d+\.?\d*$)
     reverseAction 0
     sensor     T_Vorlauf_FBH
     sensorTimeout 3600
     stopped    0
     updateInterval 600
Attributes:
   group      Fussbodenkreis
   pidActorInterval 1
   pidActorKeepAlive 24000
   pidActorTreshold 6
   pidActorValueDecPlaces 1
   pidCalcInterval 30
   pidDebugActuation 1
   pidDebugCalc 1
   pidDebugDelta 1
   pidDebugNotify 1
   pidDebugSensor 1
   pidDebugUpdate 1
   pidFactor_D 0
   pidFactor_I 0.2
   pidFactor_P 4
   room       Heizung
   verbose    0


Deine Antwort hat mir aber aufgezeigt, dass Dein PID20 mir eine Option bietet, die vermutlich besser als actor_Threshold mein Problem erschlägt: Delta_Threshold. Ich würde jetzt also Actor-Threshold auf 0 und Delta_Threshold auf 6 setzen.

Kannst Du mal sagen, wo bei den beiden Thresholds in der Praxis dann der Unterschied ist?

Danke für die schnelle Antwort

Christian
PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

John

Hallo Christian,

Argumente für pidActorThreshold

  • praktisch kein Stellglied kann man beliebig fein stellen, sie benötigen einen "Mindesthub", damit der Stellvorgang glückt.
    (z.B. einen 100 Kg schweren Schrank auf einen halben Millimeter positionieren ist sehr schwierig/kaum möglich mit herkömmlichen Mitteln)


  • man will die Häufigkeit der Stellvorgänge begrenzen, sehr sinnvoll bei funkorientierten Stellgliedern,
    im Fall der Temperaturregelung ist es kein Problem, wenn nicht 1x pro Minute nachgeregelt wird,
    man kann sich viel Zeit damit lassen, der Vorgang ist träge



Argumente für pidDeltaTreshold


  • man weiss, dass die Regelgenauigkeit begrenzt ist, wenn die Regeldifferenz < xy ist, soll der sich der Regler schlafen legen (idle);
    ansonsten würde er immer wieder versuchen den 100kg schweren Schrank auf 0.5 mm zu positionieren, was im einfach nicht gelingen kann, aber er versucht es eben

  • auch damit lassen sich die Stellvorgänge reduzieren, da nur jene ausgeführt werden, die zielführend sind


John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

sweetie-pie

Hallo,

ich habe PID20 gerade im Rahmen eines Updates meiner FHEM-Installation entdeckt.
Hatte bisher PID im Einsatz. Habe jetzt gerade mal auf PID20 gewechselt und werde berichten.

Zur Infos zu meiner Installation:

  • 4 Fußbodenheizungskreise mit je einem thermisch Stellglied (an/aus).
  • Unter und auf dem Estrich (unter dem Bodenbelag) habe ich jeweils einen 1wire-Temperatursensor.
  • In jedem Raum ein 1wire-Raumtemperaturfühler (in ca. 1,2m Höhe an der Wand).
Die Fußbodentemperatur ist mit dem Modul THRESHOLD als Zweipunktregelung ausgeführt.

Für das PID-Modul ist die Raumtemperatur [measured].
Die Stellgröße [actuation] ist dabei der [desired]-Wert vom Modul THRESHOLD.
Die Fußbodentemperatur ist begrenzt im Bereich 18-28 Grad [pidActorLimitLower,pidActorLimitUpper].

Bisher hat das alte Modul auch recht gut funktioniert, wenn auch ich von Regleroptimierung keinen Plan habe, obwohl ich irgendwann in grauer Vorzeit (vor 20 Jahren) ein Semster lang eine Reglungstechnikvorlesung hatte. *schäm*

OT an die Reglungsprofis hier: Gibt es eine Freeware (vorzugsweise für Linux) mit der man das ganze simulieren kann?
Ich glaube damals in der Hochschule hatten wir WinFact unter Win3.1 oder so... ;-)
Die Software gibt es noch aber nur zum Spielen so eine Software zu kaufen scheint mir etwas überzogen.

Gruß
  Holger


Hans Franz

Moin,Moin,

Habe zwar keine Software, aber eine simple Simulation für Libre Office Calc, mit der ich mal `rumgespielt habe. Ist nach einem Youtube-Tutorial gebaut.

Viel Spaß,
Hans
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

sweetie-pie

Also bisher läuft das Modul anscheinend ganz gut, leider (oder zum Glück) ist zur Zeit kein richtiges "Heizwetter" mehr.
Ein kleiner Schönheitsfehler ist mir im Log aufgefallen:

Use of uninitialized value $retStr in concatenation (.) or string at ./FHEM/98_PID20.pm line 685.

Gruß
Holger

betateilchen

Ändere mal Zeile 684 im Modulquelltext in:

my $retStr = ($ret) ? $ret : "";

und teste nochmal.

(es erschließt sich mir allerdings noch nicht wirklich, wieso da plötzlich eine zweite Variable eingeführt und benutzt wird)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

sweetie-pie

Zitat von: betateilchen am 11 April 2014, 15:45:10
Ändere mal Zeile 684 im Modulquelltext in:

okay, hab das jetzt mal eingebaut und test weiter...

Bernhard

Hallo,

PID20 stellt als Untergrenze für aktuationr den mit pidActorLimitLower vereinbarten Wert ein.
m.E. wäre es aber besser, wenn für "geschlossen" wirklich "0"  und nur für actuator-Werte > 0 pidActorLimitLower+ ermitteltes actuation gesetzt würde.

Grund: pidActorLimitLower dürfte in der Regel den Wert enthalten, bei dem der Anwender weiss/merkt, dass der Regler geöffnet wird (z.B. 8).
Ob da der Regler (z.B. ein FHT8V) wirklich geschlossen ist, weiss man deshalb trotzdem nicht!!!


Bernhard

John

Hallo Bernhard,

ZitatGrund: pidActorLimitLower dürfte in der Regel den Wert enthalten, bei dem der Anwender weiss/merkt, dass der Regler geöffnet wird (z.B. 8).
Ob da der Regler (z.B. ein FHT8V) wirklich geschlossen ist, weiss man deshalb trotzdem nicht!!!

Es geht nicht um den Anwender, sondern um den PID-Regler selbst.
pidActorLimitLower bezeichnet die Stellposition, ab der das Stellglied tatsächlich seine Wirkung "entfaltet".

Damit sagst du dem PID, alle Stellpositionen < pidActorLimitLower sind sinnlos, da sich diese nicht auf den Regelkreis auswirken.

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

Bernhard

#206
@John
da möchte ich behaupten: scheinbar nicht auswirken!

Der Anwender legt pidActorLimitLower fest und kann dabei irren.
Wenn ich mich recht erinnere, wurde diese Schwelle eingeführt, da das mit FHT8V gesteuerte Ventil mitunter ein sehr eigenartiges Verhalten zeigen kann.
Ich selbst habe an einem HK ein Ventil, das erst bei knapp 9% zu öffnen, ein anderes , das bei ca 5% und eins das ich an der Rücklaufverschraubung stark bremsen muss - und das in einem Raum.

Erzähl mir jetzt aber bitte nicht, dass ich die Ventile tauschen soll - es ist mir schlicht nicht möglich.

Vielleicht  könnte als Stellsignal 0 ausgegeben werden, wenn das errechnete actuation <= pidActorLimitLower ist.

fhainz

Hallo!

Ich versuche seit Tagen den Regler zu stoppen, leider startet der Regler nach jedem FHEM-Neustart wieder.

Bug oder Feature? :D


Grüße


John

Hallo fhainz,

ZitatIch versuche seit Tagen den Regler zu stoppen, leider startet der Regler nach jedem FHEM-Neustart wieder.

Das Stop/Start/Restart-Command war als Befehl während der Laufzeit geplant, die enstprechende Stati sind im
nicht remanenten Bereich abgespeichert.

Beim Hochstarten von FHEM wird der Regler automatisch auf Start genommen.

Das Disable Attribut hat denselben Effekt, wie das Stop-Kommando und übersteht auch einen FHEM-Neustart.
Vielleicht ist dir damit geholfen.

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

fhainz

Perfekt danke. Hatte doch glatt das disable Attribut überlesen  ;D