PID20 Regler zum regeln des Restsauerstoff am HV missbrauchen

Begonnen von e_brandt, 23 März 2019, 06:52:30

Vorheriges Thema - Nächstes Thema

e_brandt

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


bartman121

#1
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.

e_brandt

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

bartman121

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

Bitte das LDH-Prinzip anwenden L(esen)D(enken)H(andeln)

Weiterhin für "list <Device>" bitte code-tags (im Editor die # oben) verwenden.

e_brandt

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


bartman121

Konntest du den pid jetzt erfolgreich resetten?

{my $sum = ReadingsVal("SecundaerPID","p_p",0)+ReadingsVal("SecundaerPID","p_d",0);; fhem("set SecundaerPID restart $sum");;}

e_brandt

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.