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

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

Vorheriges Thema - Nächstes Thema

betateilchen


  # i-anteil berechnen
  # i-Anteil mit p-Anteil darf nicht groesser als 100% werden
  my $i = PID_gv($pid,'integrator')+$delta*$pid->{iFactor};
  $i= 100-$p if ($i > 100-$p);
 
  # i-Anteil mit p-Anteil darf nicht kleiner als 0 werden
  $i= -$p if ($i<0 && abs($i) > $p);


@John: das "warum" erschließt sich mir noch nicht ganz?
-----------------------
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,
das war der bescheidene Versuch meinerseits den
Windup-Effekt zu entgegnen.

http://de.wikipedia.org/wiki/Regler

ZitatWind-up-Effekt bei Großsignalverhalten: Wenn beim I-Regler die Stellgröße u(t) durch die Regelstrecke begrenzt wird, tritt ein Wind-up-Effekt auf. Dabei arbeitet die Integration des Reglers weiter, ohne dass die Stellgröße zunimmt. Wird die Regelabweichung e(t) kleiner, entsteht beim Rücklauf von u(t) eine ungewollte Verzögerung der Stellgröße und damit der Regelgröße y(t). Dem tritt man mit der Begrenzung der Integration auf die Stellgrößen-Grenzen entgegen (Anti-wind-up).

    Als eine mögliche Anti-Wind-Up Maßnahme wird der I-Anteil bei Erreichen der Eingangsgrößenbeschränkung auf dem letzten Wert eingefroren (z.B. durch Absperrung des I-Gliedes). Wie bei jedem Begrenzungseffekt innerhalb eines dynamischen Systems verhält sich der Regler nichtlinear. Das Verhalten des Regelkreises ist durch numerische Berechnung zu prüfen. Siehe auch Artikel Regelkreis#Einfluss nichtlinearer Übertragungssysteme auf den Regelkreis mit grafischer Darstellung des Anti-Wind-up Einflusses!

Im original Skript war dies so realisiert:
  my $i = PID_saturate($pid, PID_gv($pid,'integrator')+$delta*$pid->{iFactor});

Damit konnte sich ein I-Anteil von 100% aufbauen und damit theoretisch ein Überhang von 100%, wenn
gleichzeitig der p-Anteil 100% liefert.

Mein Ansatz war, dass P-Anteil und I-Anteil in Summe nicht > 100% werden sollten
und der I-Anteil wird nachrangig behandelt.

Aber ich haben nicht den Stein des Weisen. Es mag bessere Lösungen geben.

John



CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

betateilchen

Danke, ich schau mir das nochmal an - ich muss das eigentliche Problem noch genauer verstehen.

Was mir im Testlauf heute aufgefallen ist:
Die actuation geht nicht auf 0, sondern bleibt immer auf 1, selbst wenn die Isttemperatur längere Zeit größer als die Solltemperatur ist.
Ich muss mal rausfinden, ob das an den Defaultwerten liegt, oder ob da noch irgendeine Sonderbehandlung eingebaut werden muss.

Ansonsten fehlt jetzt nur noch die Fehlerbehandlung für den Fall "toter Sensor". Einfach auf die definierte Error-Position fahren, solange der Sensor tot ist?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

John

ZitatAnsonsten fehlt jetzt nur noch die Fehlerbehandlung für den Fall "toter Sensor". Einfach auf die definierte Error-Position fahren, solange der Sensor tot ist?

Es kommt auf die konkrete Anwendung an was zu tun ist.

Betrachtung der Kritizität im Fall von Raumheizung.

a. die Rohre frieren ein (auch wenn es unwahrscheinlich ist, weil es noch andere Heizkörper gibt)
b. der Raum wird unnötig überhitzt.

a. ist kritischer als b, also wäre hier eine vorgebbare Ventilposition sinnvoll.

Es gibt aber auch die sinnvolle Option, dass der Stellausgang, da wo er steht eingefroren werden soll.

Ich schlage vor beide Optionen anzubieten, dann haben wir alle Fälle abgedeckt.

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

betateilchen

Zitat von: John schrieb am Sa, 05 Oktober 2013 22:11Ich schlage vor beide Optionen anzubieten, dann haben wir alle Fälle abgedeckt.

zwei neue Attribute eingebaut:


pidActorErrorAction:freeze,errorPos (default:freeze)
pidActorErrorPos (default:5)

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

betateilchen

So... nach meinem Empfinden sollte nun alles eingebaut sein.

Falls jemand Lust hat zu testen - nur zu! Und bitte Rückmeldung hier im Thread.


Attribute:

pidActorErrorAction:freeze,errorPos = Verhalten im Fehlerfall (default = freeze)
pidActorErrorPos = Soll-Position im Fehlerfall (default = 5)
pidActorInterval = Mindestzeit zwischen zwei Kommandos an den Aktor (default = 600)
pidActorTreshold = Mindeständerung, ab der ein Kommando an den Aktor geschickt wird (default = 5)
pidDeltaInterval = Intervall, in dem Sensorabfrage und Berechnung durchgeführt werden (default = 60)
pidDeltaTreshold = Mindesttemperaturänderung, ab der eine Berechnung stattfindet (default = 0)
pidDesiredName = Name für Reading und in "set <name> <pidDesiredName>" (default = desired)
pidMeasuredName = Name für Reading des Ist-Wertes (default = measured)
pidParamTimeout = Zeitraum, nach der die berechneten Werte für p i d als ungültig betrachtet und neu berechnet werden (default = 3600)
pidRoundValveValue:0,1 = nur ganzzahlige Werte an actor schicken (default = undef)
pidSensorTimeout = Zeitraum, nach der ein Sensor als "tot" gemeldet wird (Reading und Logmeldung) wenn keine Aktualisierung des Messwertes erfolgt (default = 3600)


Set Befehle:

set <name> clear = löscht die berechneten Werte manuell (automatisches Löschen erfolgt, wenn älter als 1 Stunde)
set <name> <pidDesiredName> = setzt die gewünschte Temperatur
set <name> factors = wie bisher
set <name> start = startet pid
set <name> stop = stoppt pid


Dokumentation fehlt noch komplett - das weiß ich :)
-----------------------
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,
vielen Dank für deine Arbeit.

Ich werde es mir demnächst genauer ansehen.

Mir sind noch 2 Dinge eingefallen, die aber nachrangig behandelt werden können.

1. invertierter Wirksinn des Stellgliedes
Bisher hatten wir: wenn Temperatur höher werden soll, dann Ventil weiter öffnen .

Es gibt aber auch den umgekehrten Fall: z.B Regeln der Geschwindigkeit durch Bremsen
Wenn wir schneller werden wollen, dann weniger bremsen.
(sollte mit dem Invertieren des Vorzeichens von delta erledigt sein)

2. Dynamische Adaption des Stellgliedes beim Aufstarten

Nach dem bisherigen Ansatz bestimmt der Regler "patriachalisch" den I-Anteil und verwendet beim Neustart
einfach den zuletzt in den Readings abgelegten Wert.

Es gibt auch sinnvolle Anwendungen, in denen er sich nach dem Starten einmalig vom Stellglied den aktuellen Wert holt
und damit seinen I-Anteil initial berechnet.

Damit fährt er "sprungfrei" das Stellglied weiter und holt es dort ab wo es steht.

John

CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

betateilchen

1. Werde ich so umsetzen, dass die Min und Max des Stellglieds dann als 100:0 im define angegeben werden. In der Doku werde ich die Werte dann als Start und Stop beschreiben.

2. Funktioniert nicht, da es nicht zu allen Stellgliedern eine zuverlässige Methode der Abfrage gibt.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

fhainz

Hallo!

szStellventil zeigt immer nur defined an und die szHeizung springt hin und wieder auf pauset.

define szStellventil FHT8V 1234
attr szStellventil alias Stellventil
attr szStellventil group Heizung
attr szStellventil icon sani_heating
attr szStellventil room 2_Schlafzimmer

define szHeizung PID Schlafzimmer szStellventil
attr szHeizung alias Temperatur
attr szHeizung group Heizung
attr szHeizung icon temp_temperature
attr szHeizung room 2_Schlafzimmer


Hab ich noch etwas vergessen zu definieren?

Grüße

cwagner

Guten Tag,

hier würde ich mich als potentieller Tester mal einklinken:  sehe ich das doch richtig, dass Homematic Sensoren/Aktoren noch nicht unterstützt werden?
Ich erhalte für ein:

define PID_Suedzimmer PID CC_Suedzimmer:measured-temp Aktor_Suedzimmer
      PID_Suedzimmer: Unknown sensor type CUL_HM, specify regexp

Das finde ich schade, weil ich da Bedarf hätte :-)


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

betateilchen

Du kannst verwenden, was Du willst (funktioniert sogar mit einem dummy), solange Du DIch beim define an die vorgegebene Syntax hältst, wie sie in der commandref steht.

Und Dein Fehler wird Dir ja im Klartext angegeben: Du hast keine regexp angegeben.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: fhainz schrieb am So, 06 Oktober 2013 19:42szStellventil zeigt immer nur defined an und die szHeizung springt hin und wieder auf pauset.
Hab ich noch etwas vergessen zu definieren?

szStellventil ist aber schon mit fhem gepaired, oder? "Paused" beim PID bedeutet, dass die Solltemperatur erreicht ist und deshalb keine Regelung stattfindet.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: betateilchen schrieb am So, 06 Oktober 2013 16:251. Werde ich so umsetzen, dass die Min und Max des Stellglieds dann als 100:0 im define angegeben werden. In der Doku werde ich die Werte dann als Start und Stop beschreiben.

Ganz so einfach spontan gedacht funktioniert es dann doch nicht...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

fhainz

Hab vorhin gesehen das am Ventil 30% steht. Anscheinend hat es heute Nachmittag beim rumprobieren 1h die Verbindung verloren und ging in den Notbetrieb. Hab schon ein paar mal versucht neu zu pairen aber das antennensymbol blinkt immer noch.
Hast du einen Tipp?

Grüße

betateilchen

Hat das Ventil beim Pairen gepiept? Wenn ja, blinkt das Antennensymbol so lange, bis es einen Befehl bekommt. Schick halt mal irgendeinen Stellbefehl über die Kommandozeile ab.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!