Hallo miteinander,
wir sind gerade dabei die Steuerung meines Holzvergasers auf Raspberry umzustellen.
Soweit klappt es auch alles. Ein PID20 regelt sehr schön die Abgastemperatur und ein weiterer die Vorlauftemperatur, nun soll der dritte den Restsauerstoff regeln.
Das klappt leider überhaupt nicht, sobald der Restsauerstoff so unter den Wert 8 geht fängt der Regler an gegen zu steuern obwohl der desired auf 4 steht(hab auch schon auf 0.5 gestellt) immer da gleiche.
Der Regelbereich liegt quasi bei 0-21 Prozent Restsauerstoff.
Gibt es da eine Art Frostschutz die immer gegensteuert?
Arbeitet der Regler nicht mit so kleinen Werten?
Ich habe da mal ein Bild mit den Einstellungen angehangen. (https://uploads.tapatalk-cdn.com/20190323/a9803ac222bcb5dfb8e0fb4b7e96c988.jpg)
Gesendet von meinem MHA-L29 mit Tapatalk
Es scheint etwas Verständnis zum PID-Regler zu fehlen, erstmal "nachholen".
Dein p_i-Wert ist viel zu hoch, die Ursache ist unklar, ich vermute aber das irgendwann pidFactor_I viel zu hoch war. Außerdem sind upper und lower limit falsch, diese Werte beeinflussen auch p_i (vgl. Anti-Wind-Up-Strategie)
Ich hatte hier mal etwas zum PID-Regler geschrieben, in diesem Thread findest du ein paar hilfreiche Infos.
https://forum.fhem.de/index.php/topic,17067.msg915120.html#msg915120
Ich empfehle folgendes:
pidFactor_P 4
pidFactor_I 0.005
pidFactor_D 0
Danach den PID-resetten.
Danach rantasten, wie beschrieben.
Edith: Bitte in Zukunft ein list <DEVICE> in code-Tag einfügen, statt eines unprofessionellen Bildes.
okay, habe deine Anweisungen befolgt...
nach einer Min springt der p_i wieder auf 100
Internals:
DEF Raspit:O2 pidwertSec
NAME SecundaerPID
NR 58
NTFY_ORDER 50-SecundaerPID
STATE Status: processing Ist: 9.36 soll: 5.0 Aktuation: 83
TYPE PID20
VERSION 1.0.0.9
READINGS:
2019-03-23 16:03:07 actuation 83
2019-03-23 16:03:07 actuationCalc 82.55658
2019-03-23 16:03:07 delta -4.36
2019-03-23 16:03:07 desired 5.0
2019-03-23 16:03:07 measured 9.36
2019-03-23 16:03:07 p_d 0
2019-03-23 16:03:07 p_i 99.99658
2019-03-23 16:03:07 p_p -17.44
2019-03-23 16:03:07 state processing
helper:
actor pidwertSec
actorCommand
actorErrorAction freeze
actorErrorPos 0
actorInterval 180
actorKeepAlive 1
actorLimitLower 0
actorLimitUpper 100
actorThreshold 1
actorTimestamp 2019-03-23 16:03:07
actorValueDecPlaces 0
adjust
calcInterval 1
deltaGradient 0.0382266193926792
deltaOld -4.36
deltaOldTS 2019-03-23 16:03:07
deltaTreshold 0.5
desiredName desired
disable 0
factor_D 0
factor_I 0.005
factor_P 4
isWindUP
measuredName measured
reading O2
regexp ^([\+,\-]?\d+\.?\d*$)
reverseAction 0
sensor Raspit
sensorTimeout 3600
stopped 0
updateInterval 1
Attributes:
comment setzt pidwertsec und ruft durch vonpidansec eine funktion in myutils auf die dann hochskaliert auf 4000
pidActorKeepAlive 1
pidCalcInterval 1
pidDeltaTreshold 0.5
pidFactor_D 0
pidFactor_I 0.005
pidFactor_P 4
pidUpdateInterval 1
room 1_RaspitroniK
stateFormat Status: state Ist: measured soll: desired Aktuation: actuation
Zitat von: e_brandt am 23 März 2019, 16:04:57
okay, habe deine Anweisungen befolgt...
nach einer Min springt der p_i wieder auf 100
das klingt nicht so als ob dein "restart" wirklich funktioniert hat.
Ich kann mir vorstellen, dass es an dem 1Sek-Intervall liegt.
gib mal folgendes in die Kommandozeile vom FHEM ein:
{my $sum = ReadingsVal("SecundaerPID","p_p",0)+ReadingsVal("SecundaerPID","p_d",0);; fhem("set SecundaerPID restart $sum");;}
Willst du wirklich den Sollwert sekündlich rauskrachen, kann der Actor hinten dran so schnell?
actorKeepAlive 1
das bewirkt, dass auch bei keiner Sollwertänderung der Sollwert sekündlich rausgekracht wird, wozu?
actorInterval 180
das heißt, der Actor soll nur alle 180Sekunden bedient werden? Warum dann actorKeepAlive1? Wozu CalcInterval auf 1 Sekunden, wenn du doch nur alle 180 Sekunden einen Wert schreiben willst.
Deine Parameter sehen mir nicht gerade danach aus, als ob dir klar ist was du da tust.
--> PID20 Commandref (https://fhem.de/commandref.html#PID20)
Bitte das LDH-Prinzip anwenden L(esen)D(enken)H(andeln)Weiterhin für "list <Device>" bitte code-tags (im Editor die # oben) verwenden.
das hatte ich nur zum testen mal verstellt...
und ja das sollte schon relativ schnell reagieren, ich denke 5sec ist schon ziemlich lange sag ich mal.
und gelesen habe ich auch schon relativ viel, meine beiden anderen funktionieren ja auch.
Gesendet von meinem MHA-L29 mit Tapatalk
Konntest du den pid jetzt erfolgreich resetten?
{my $sum = ReadingsVal("SecundaerPID","p_p",0)+ReadingsVal("SecundaerPID","p_d",0);; fhem("set SecundaerPID restart $sum");;}
ja, jetzt funktioniert er auch, wir hatten in der Ansteuerung einen Timer der alle 5 sec den desired aktualisiert hat, das hat ihn anscheinend gestört.
Danke für die Hilfe.