PID-Modul: Vorschläge (gelöst)

Begonnen von John, 01 Oktober 2013, 23:22:35

Vorheriges Thema - Nächstes Thema

betateilchen

kommt alles, aber wahrscheinlich erst am nächsten Wochenende.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

John

Hallo Udo,

sorry, wenn meine Kommentare im Forum mehr Stress als Hilfe für dich waren.

Ich habe dein letztes Skript nun bei mir eingespielt und einige Fixes/Anmerkungen eingetragen.
(#jjj als Marker)

Einige Fragmente konnte ich nicht nachvollziehen.

Anpassungen:

"pidReverseAction " invertierter Wirksinn;
geändertes Handling bei wind-up am unteren Stellbereich.
erstmalige Ausgabe Actuation sicherstellen

Vielleicht hilft es deine Einsatzzeit am Samstag zu verkürzen.

Noch eine Frage
PID startet nicht automatisch. Was ist hier der Plan ?

beste Grüße
John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

betateilchen

Hallo John, danke für Deine Unterstützung.

ZitatPID startet nicht automatisch. Was ist hier der Plan ?

Den Autostart hatte ich schon in meiner hiesigen Version (die noch nicht im Forum war) eingebaut.

Zitat"pidReverseAction " invertierter Wirksinn;
geändertes Handling bei wind-up am unteren Stellbereich.
erstmalige Ausgabe Actuation sicherstellen

Habe ich jetzt erstmal so übernommen.

ZitatEinige Fragmente konnte ich nicht nachvollziehen.

Das waren fast alles Dinge, die ich aus dem Originalmodul übernommen hatte.

Schau Dir bitte das angehängte Modul nochmal an, ich habe da auch noch ein paar Kommentare zu Deinen Fragen eingefügt. Wenn Du das so ok findest, werde ich noch die Doku dazu machen und ein paar unserer Kommentare entfernen, bevor ich es dann einchecke.

Übrigens - Du verwendest scheinbar einen sehr abstrusen Editor, von Sonderzeichen hat der irgendwie noch nie was gehört.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

John

Hallo Udo,
besten dank für das überarbeitete Modul.

Anti-Wind_Up-Strategie

Ich hab mir in den vergangenen Tagen nochmal die Anti-WindUp Strategie vorgenommen
und meine, diese muss geändert werden.

Folgendes konnte ich (wenn auch unter exotischen Bedingungen) produzieren.

Zitatdesired=0
2013-10-09_23:47:26 PID.BAD temperature: 21
2013-10-09_23:47:26 PID.BAD actuation: 0
2013-10-09_23:47:26 PID.BAD delta: -21.0
2013-10-09_23:47:26 PID.BAD p_i: 735
2013-10-09_23:47:26 PID.BAD p_p: -735

desired=20
2013-10-09_23:47:28 PID.BAD temperature: 21
2013-10-09_23:47:29 PID.BAD actuation: 100     <----
2013-10-09_23:47:29 PID.BAD delta: -1.0           <----
2013-10-09_23:47:29 PID.BAD p_i: 135
2013-10-09_23:47:29 PID.BAD p_p: -35

Das Ventil macht zu 100 % auf, obwohl wir unter dem Sollwert liegen.
Der Effekt ist auf die Anti-windup-Strategie zurückzuführen.

Ich bin auf die Suche gegangen und habe folgende mir plausibel erscheinende Realisierung gefunden,
die ich die letzten Tage mit meinem "alten" Modul getestet habe.

  my $isWindup =  ( $delta >0 && $actuationLast>$satMax) ||( $delta <0 && $actuationLast<$satMin);
  if (! $isWindup)  # nur weiter integrieren, wenn kein windUP
  {
    $i = $i + $delta * $pid->{iFactor};
    $pid->{windUP}=0;
  }
  else {
   $pid->{windUP}=1;
  }
  XPID_sv($pid, 'integrator', $i);



Den Vorschlag habe ich hier
http://www.mikrocontroller.net/topic/82685
gefunden und leicht abgeändert.

Idee:
1. actuation wird nicht begrenzt, nur die Ausgabe an das Stellglied wird begrenzt
2. wenn actuation die Stellgrenzen beim letzten Scan verletzt hat,
   wird das Integrieren des I-Anteils beim aktuellen Scan gestoppt. (isWindup=1)
   
Hat sich die letzten 2 Tage gut bewährt.
Gefällt mir auch vom Ansatz her gut.

Code-Fragment
Der Sinn diese Fragments leuchtet mir trotz deiner Erklärung nicht ein.

$a = (int($a) == int($i)) ? $hash->{helper}{satMin} : $a; #jjj unklar warum
# bt weil der Aktor sonst auf != 0 stehenbleiben kann.
                                                               
Der Fall tritt nur ein, wenn $d=0 und $p=0
oder
wenn $d=-$p
warum muss man dann $a auf satMin zwingen ?

D-Anteil


Ich verwende zwar den D-Anteil praktisch nicht,
aber ich glaube dass die derzeitige Umsetzung technisch falsch ist.

Gründe:
Das Modul war zuvor vom Sensor getrieben (wir wissen das hat Nachteile),
damit hatte der D-Anteil seine natürliche Zeitbasis, nämlich die der physischen Werteänderung.
Das ist mit dem Timer-gesteuerten Treiber nun anders.
Das Sende-Intervall des Sensors muss nicht mit der des Timers übereinstimmen.

ZitatSensor-Scan A
PID-Scan     Delta 1 
PID-Scan         Delta 2
PID-Scan      Delta 3  (muss 0 sein, da wir keinen neuen Istwert haben)
Sensor-Scan B

Delta 2 - Delta 1 ist immer 0  (Istwert hat sich nicht geändert)
Delta 3 - Delta 2 ist immer 0  (Istwert hat sich nicht geändert)

Damit liefert Delta 1 einen Peak, der sofort wieder verschwindet (Delta 2,3) ohne physische Berechtigung.
Ich denke man müsste Delta1 merken und bis zum nächsten SensorScan in der PID-Verrechnung verwenden.
Somit müssten wir für den D-Anteil ein eigenständiges Delta mitführen.
Vielleicht ist auch ein anderer Algorithmus möglich, aber der aktuelle scheint mir  nicht zu passen.

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

betateilchen

ZitatDer Sinn diese Fragments leuchtet mir trotz deiner Erklärung nicht ein.
...
Der Fall tritt nur ein, wenn $d=0 und $p=0
oder
wenn $d=-$p
warum muss man dann $a auf satMin zwingen ?

Bei mir trat der Fall auf, dass der erste Fall auftrat und der $a auf 1 stehenblieb, was dazu führte, dass das Heizkörperventil auf 1% steheblieb anstatt komplett zu schließen. Und bei 1% machen meine Heizkörper schon ganz schön warm.

Zu Deinen anderen Vorschlägen:

Ich habe mich noch nicht mit dem technischen Hintergrund der PID-Berechnung selbst befasst. Wenn Du da tiefer drin bist, und  irgendwelche (funktionierenden) Verbesserungen hast, baue ich die gerne in das Modul ein. Im Moment habe ich etwas wenig Zeit, mich auch noch mit der Theroie des PID zu befassen :(

Viele Grüße
Udo
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

John

Hi Uli

Beispiel im Code
Log3 $pn, 2, $msg;

sollte es nicht besser so heissen ?
Log3 $hash, 2, $msg;

mit
sub
Log3($$$)
{
  my ($dev, $loglevel, $text) = @_;

  $dev = $dev->{NAME} if(defined($dev) && ref($dev) eq "HASH");


John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

betateilchen

Log3 kann mit mit beidem korrekt umgehen (sowohl $name als auch $hash) aber was hat das mit dem PID zu tun? Und wo nimmst Du den Uli her?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Hans Franz

Moin,
Danke für die Optimierung des Moduls.

Ich habe mir erlaubt es zu testen und erhalte:
2013.10.13 11:51:41 3: set stellantrieb.02 valve 5.22458e-15 : Set valve needs a numeric parameter between 0 and 100
2013.10.13 11:51:41 2: PID heizung.02: response: Set valve needs a numeric parameter between 0 and 100


Muss ich vor dem Testen noch eine Säuberungsaktion ausführen?

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

John

Hallo Hans
vesuchs mit

attr <pidName> pidRoundValveValue 1

Das sollte den Ausgabewert an das Stellglied auf eine Ganzzahl runden.

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

Hans Franz

Hallo John,
Danke, das wars.
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

Hans Franz

#115
Moin,

Wenn ich den PID-Regler zur Heizungsteuerung einsetze (direktes Ansteuern von FHT8V), wie setze ich dann die Attribute möglichst sinnvoll?

Im Moment (keine Attribute außer pidRoundValveValue gesetzt), ergeben sich extreme Sprünge:

2013.10.15 13:42:51 3: PID heizung.02: set stellantrieb.02 valve 99
2013.10.15 13:42:51 3: FHT8V set stellantrieb.02 valve 99
2013.10.15 13:42:51 3: get stellantrieb.02 valve : 98
2013.10.15 13:42:51 3: PID heizung.02: set stellantrieb.02 valve 99
2013.10.15 13:42:51 3: FHT8V set stellantrieb.02 valve 99
2013.10.15 13:43:53 3: PID heizung.02: set stellantrieb.02 valve 0
2013.10.15 13:43:53 3: FHT8V set stellantrieb.02 valve 0
2013.10.15 13:43:54 3: PID heizung.02: set stellantrieb.02 valve 0
2013.10.15 13:43:54 3: FHT8V set stellantrieb.02 valve 0
2013.10.15 13:44:54 3: PID heizung.02: set stellantrieb.02 valve 0
2013.10.15 13:44:54 3: FHT8V set stellantrieb.02 valve 0
2013.10.15 13:44:55 3: PID heizung.02: set stellantrieb.02 valve 0
2013.10.15 13:44:55 3: FHT8V set stellantrieb.02 valve 0
2013.10.15 13:45:55 3: PID heizung.02: set stellantrieb.02 valve 0
2013.10.15 13:45:55 3: FHT8V set stellantrieb.02 valve 0
2013.10.15 13:45:56 3: PID heizung.02: set stellantrieb.02 valve 0
2013.10.15 13:45:56 3: FHT8V set stellantrieb.02 valve 0
2013.10.15 13:47:01 3: PID heizung.02: set stellantrieb.02 valve 0
2013.10.15 13:47:01 3: FHT8V set stellantrieb.02 valve 0
2013.10.15 13:47:01 3: PID heizung.02: set stellantrieb.02 valve 0
2013.10.15 13:47:01 3: FHT8V set stellantrieb.02 valve 0
2013.10.15 13:48:02 3: PID heizung.02: set stellantrieb.02 valve 95
2013.10.15 13:48:02 3: FHT8V set stellantrieb.02 valve 95
2013.10.15 13:48:02 3: get stellantrieb.02 valve : 94
2013.10.15 13:48:02 3: PID heizung.02: set stellantrieb.02 valve 95
2013.10.15 13:48:02 3: FHT8V set stellantrieb.02 valve 95
2013.10.15 13:49:03 3: PID heizung.02: set stellantrieb.02 valve 97
2013.10.15 13:49:03 3: FHT8V set stellantrieb.02 valve 97
2013.10.15 13:49:03 3: get stellantrieb.02 valve : 96


Gruss
Hans
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

John

Hallo Hans,
ich bin gerade dran die Innereien des Moduls neu zu organisieren.
Ich bitte dich daher noch um etwas Geduld.

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

fhainz

Das kann ich auch bestätigen. PID rechnet den Stellwert richtig, FHT8V stellt aber immer auf 100 bzw 0%.

Grüße

betateilchen

1. reden wir über die Modulversion, die am Wochenende hier im Thread angehängt wurde?

2. was steht in den Readings selbst?

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Hans Franz

Zitat von: betateilchen am 15 Oktober 2013, 16:17:40
1. reden wir über die Modulversion, die am Wochenende hier im Thread angehängt wurde?

2. was steht in den Readings selbst?

zu 1: ja klar :)
zu 2: ich habe gerade mal ein neues Log-File angelegt. Habe bisher nur desired,measured und actuation gelogt.
        Bericht folgt.

Gruss
Hans
         
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20