NEWS
Test Adapter pid (pid-Regler) V1.0.x
-
@rene55 said in Test neuer Adapter pid (pid-Regler) V0.0.1-alpha.x:
@mcm57 sagte in Test neuer Adapter pid (pid-Regler) V0.0.1-alpha.x:
Steuerungsdesign_und_Stromlaufplan-Werkzeug
Soetwas hatte ich eigentlich erwartet.
OK, als V1.x.x mach ich das auch noch.
Und im Ernst - schreib wirklich in einen Feture Request rein was du brauchst. iob ist zwar kein Wunschkonzert und ich kann und will nicht versprechen was ich einbau, aber je besser kalr ist was gewunschen wird, desto eher kannman überlegen ob und wie das geht. -
@mcm57 Lass mich erst noch etwas damit rumspielen, bevor ich neue Wünsche äußere. Möglicherweise macht der Adapter schon jetzt was ich brauche.
-
@mcm57
Du berechnest nach der theoretischen Methode (auf die Regelabweichung bezogen)this.y = this.data.off + this.k_p * this.err + this.k_i * this.sumErr + this.k_d * this.diffErr;
Das wird in der Praxis selten angewendet. Man arbeitet mit Xp (Proportionalband), Tn (Nachstellzeit) und Tv (Vorhaltezeit).
y = diff * (max - min) / Xp * (1 + Summe(dt / Tn) + Tv/dt) + offset
Habe ich es nur nicht gefunden oder ist eine Umkehr der Regelrichtung (Stichwort: Heizen/Kühlen) nicht vorgesehen?
Den selten gebrauchten D-Anteil sollte man nur auf den Istwert anwenden, da der Sollwert meist große Sprünge macht.
-
@paul53
Ja das hast du richtig erkennt. Ich habe die Funktion ident zum hier an anderer Stelle schon erwähnten node-pid-controller (https://github.com/Philmod/node-pid-controller) umgesetzt. Da wird die D Komponente auch auch den Error angewendet. Deine Anregung bezüglich Sprungverhalten versteh ich aber.Eine Invertierung des Ausgangs hab ich nicht vorgesehen. Diese wäre leicht außerhalb machbar, kann ich aber auch im Regler vorsehen wenn Bedarf besteht (wär ja trivial ). Bitte ggF. Feature Request einstellen.
Im Prinzip ist es aber trivial auch eine andere Funktion umzusetzen, d.h. auf Nachstellzeit / Vorhaltezeit zu wechseln. Nur beide Optionen will ich nicht anbieten :-).
BITTE UM EURE MEINUNG: Soll ich auf tn/tv umstellen gemäß obiger Formel? Oder das Verhalten analog zu node-pid-controller beibehalten???
Wobei ich bei einer Umstellung noch Nachhilfe bei der Formel brauch. (Will meine Scripten aus den 80ern nicht im Keller suchen gehen). Summe(dt/Tn) ist irgendwie nicht stimmig im I Anteil muss doch die Summe der Fehler auftreten.
-
@mcm57 sagte: Summe(dt/Tn) ist irgendwie nicht stimmig im I Anteil muss doch die Summe der Fehler auftreten.
Ja natürlich, ist eine vereinfachte Darstellung. Es ist bezüglich Deiner Berechnung nur zu beachten, dass kp als Multiplikator in alle 3 Komponenten (PID) eingeht: Tn und Tv sind auf den Ausgang bezogen. Tn ist die Zeit, um die sich der Ausgang nochmal um den gleichen Betrag ändert wie durch den P-Anteil.
Formel:
mit
Kp = (MaxOut - MinOut) / Xp
-
@paul53
OK, dann wart ich mal ab ob / was zu dem Thema noch kommt. In github hat fu-zhou auch einigen Input / Anregungen gegeben. Möchte gerne warten was er schreibt (außer du bist eh fu-zhou - forum / github / telegram = multiple Persönlichkeiten ) -
@mcm57 sagte: außer du bist eh fu-zhou
Nein, das von fu-zhou erwähnte NPM-Modul "pi-controller" stammt von mir.
-
@paul53 said in Test neuer Adapter pid (pid-Regler) V0.0.1-alpha.x:
@mcm57 sagte: Summe(dt/Tn) ist irgendwie nicht stimmig im I Anteil muss doch die Summe der Fehler auftreten.
Ja natürlich, ist eine vereinfachte Darstellung. Es ist bezüglich Deiner Berechnung nur zu beachten, dass kp als Multiplikator in alle 3 Komponenten (PID) eingeht: Tn und Tv sind auf den Ausgang bezogen. Tn ist die Zeit, um die sich der Ausgang nochmal um den gleichen Betrag ändert wie durch den P-Anteil.
Formel:
mit
Kp = (MaxOut - MinOut) / Xp
Das bedeutet also:
MaxOut und MinOut Werte werden obligatorisch.Kp = (MaxOut-MinOut) / Xp e = act - set (Integral e) ... e + e[t-1] + e[t-2] .... Summe aller Differenzen, sumErr derzeit de = e - e[t-1] Input act ... aktueller IST Wert (Input) set ... aktueller SOLL Wert (Input) Parameter Xp ... Parameter für Verstärkung (und damit auch Proportionalanteil) Tn ... Nachlaufzeit (ms) - Parameter für Integralanteil Tv ... Vorhaltezeit (ms) - Parameter für Differentialanteil dt ... Zeitdifferenz zu letzter Berechnung (ms), ca Zykluszeit od Zeit zw 2 manuellen Triggern Output u ... output, derzeit y
Den Sinn des Max-Min Terms versteh ich nur bedingt. Die Begrenzung des Ausgangswertes auf Max bzw. Min erspart das jedenfalls nicht. Die Differenz zwischen Act und Set kann ja "beliebig" sein. Ergo könnte man max und min ja auch in Xp berücksichtigen. Da brauch ich noch ne Erklärung.
Offset wird in jedem Fall noch dazu gerechnet.
Und Invertierung wäre ja einfache Invertieren des Ausgangswerte ( y = -y). Oder überseh ich da was?
-
@mcm57 sagte: Die Begrenzung des Ausgangswertes auf Max bzw. Min erspart das jedenfalls nicht.
Das ist die Begrenzung des Ausgangswertes. Stellglieder haben einen begrenzten Stellbereich, meist 0 ... 100 %. Darauf bezieht sich das Proportionalband Xp.
Beispiel für P-Anteil: Xp = 4; Offset = 50 = (Max + Min) / 2; e = -1 --> y = 25 %@mcm57 sagte in Test neuer Adapter pid (pid-Regler) V0.0.1-alpha.x:
Und Invertierung wäre ja einfache Invertieren des Ausgangswerte ( y = -y).
Invertierung von Kp oder e.
-
Boah, jetzt geht's ja ganz schön ab hier, sehr schön! Hier mal mein Input:
@paul53 sagte in Test neuer Adapter pid (pid-Regler) V0.0.1-alpha.x:
@mcm57
Du berechnest nach der theoretischen Methode (auf die Regelabweichung bezogen)this.y = this.data.off + this.k_p * this.err + this.k_i * this.sumErr + this.k_d * this.diffErr;
Das wird in der Praxis selten angewendet. Man arbeitet mit Xp (Proportionalband), Tn (Nachstellzeit) und Tv (Vorhaltezeit).
y = diff * (max - min) / Xp * (1 + Summe(dt / Tn) + Tv/dt) + offset
Habe ich es nur nicht gefunden oder ist eine Umkehr der Regelrichtung (Stichwort: Heizen/Kühlen) nicht vorgesehen?
Den selten gebrauchten D-Anteil sollte man nur auf den Istwert anwenden, da der Sollwert meist große Sprünge macht.
Ich gebe paul53 da Recht, auch wenn ich nur Regler-Anwender, nicht Regler-Programmierer bin. Bei der Optimierung eines Regelkreises, z.B. nach Ziegler-Nichols, berechnet man über die Formel tatsächlich die Nachstellzeit Tn und (wo notwendig) die Vorhaltezeit Tv in Sekunden, was ich auch irgendwie greifbarer finde - weil ich das halt kenne.
Zum Heizen/Kühlen: Das ist eine Split-Range-Regelung, lässt sich über MIN MAX out (LL, LH) realisieren, z.B. MIN = -100%, MAX = 100%. Der Regler startet bei 0% (=kein Energieverbrauch), bei positiver Regelabweichung (w-x > 0) schiebt der Regler den Ausgang Richtung 100%, also wird mit 0-100% ein Heizventil angesteuert und bei negativer Regelabweichung schiebt der Regler Richtung -100% und damit wird dann ein Kühlventil angesteuert. Habe ich nur ein Stellglied, in meinem Fall wieder die Wallbox, die 1,4 - 11 kW kann, ist MIN 0 und MAX 11, wobei ich MAX mit Blockly bestimme: Nachts, wenn die Hausbatterie leer ist, darf die Wallbox mit 11 kW laden, tagsüber max. mit dem PV-Überschuss. Das hilft, den Regler entsprechend schnell zu begrenzen, wenn eine Wolke drüber zieht, der Regler muss dann nicht mit den eingestellten Parametern zurückregeln.
-
OK, das es n unmehr 3:0 steht treffe ich die Entscheidung
Es wird auf Tn/Tv umgestellt
(aber nicht mehr heute :-))
-
@paul53 said in Test neuer Adapter pid (pid-Regler) V0.0.1-alpha.x:
@mcm57 sagte: Die Begrenzung des Ausgangswertes auf Max bzw. Min erspart das jedenfalls nicht.
Das ist die Begrenzung des Ausgangswertes. Stellglieder haben einen begrenzten Stellbereich, meist 0 ... 100 %. Darauf bezieht sich das Proportionalband Xp.
Beispiel für P-Anteil: Xp = 4; Offset = 50 = (Max + Min) / 2; e = -1 --> y = 25 %@mcm57 sagte in Test neuer Adapter pid (pid-Regler) V0.0.1-alpha.x:
Und Invertierung wäre ja einfache Invertieren des Ausgangswerte ( y = -y).
Invertierung von Kp oder e.
OK nur die Formal an sich begrenzt da noch nicht.
act=0
soll=500
min=0
max=100
Xp=50Kp = (Max-Min)/Xp = (100-0)/50 = 2
e=act-soll = 500-0 = 500
u=Kp * e (bei I und D Anteil disabled) + offset = 500*2 + 50 = 1050.
Ergo muss da der Code noch auf 100 limitieren.Oder versteh ich das falsch?
Bei Xp 50 wäre eine maximale Differenz
von 25 im Regelbereich
u = Kp * e + offset = 25*2 +50 = 100Zusatzfrage(n):
Eine explizite Invertierungsmöglichkeit braucht man dann ja doch nicht. ein negativer Xp würde das ja dann auch tun wie du schreibst.Braucht dann noch wer den expliziten Parameter Offset? Ich meine ja, da ansonsten bei Abweichung 0 fix (Max-Min)/2 am Ausgang anstünde. Aber ev. will man da ja auch Min (z.B. 0) anliegen haben. Beispiel: Temperaturregler - bei passender Temperatur soll nicht geheizt werden.)
-
@mcm57 Ich bräuchte den Offset - wieder bei der Wallbox. Die legt erst ab 1.4 kW los (230V, 6A) und der Regler steuert direkt die Leistung der Wallbox über Stromstärke und Anzahl Phasen an. Bei mir ist also der Offset 1.3 kW, weil der Regler soll nicht erst mal von 0 hochlaufen bis 1.4 kW erreicht sind, das lässt sich über den Offset machen. Ich könnte natürlich den Regler auch 0-100% ausgeben lassen, ohne Offset, müsste dann aber an anderer Stelle (z.B. Blockly) über eine Kennlinie normieren; 0% =1.3 kW, 100%=11 kW.
Und wenn man den Offset am Reglerausgang nicht braucht, lässt man den halt bei 0. -
Vielleicht an der Stelle nochmal der Hinweis auf den OSCAT-Regler (steht ja schon im Github):
Es gibt eine freie SPS-Bibliothek "OSCAT". Hier ist auch ein PID-Regler dabei, der eigentlich alles kann, was man so braucht und ein bisschen mehr
Hier der Link zu Dokumentation der gesamten Bibliothek (ist ein PDF), der PID Regler ist auf S. 395 - 397 beschrieben (23.8. CTRL_PID)
http://www.oscat.de/de/component/jdownloads/summary/2-oscat-basic/7-oscat-basic333-de.htmlWind-Up ist hier auf S. 387/388 gut beschrieben.
-
@mcm57 sagte: ein negativer Xp würde das ja dann auch tun
Richtig, ist aber unüblich. Ebenso kann man Ist- und Sollwert vertauschen (außer, wenn der D-Anteil nur auf den Istwert wirken soll). Aber das soll sicherlich für Leute handhabbar sein, die sich nicht oder kaum mit Regelungstechnik auskennen?
@mcm57 sagte in Test neuer Adapter pid (pid-Regler) V0.0.1-alpha.x:
Bei Xp 50 wäre eine maximale Differenz von 25 im Regelbereich
Ja, +/- 25.
@mcm57 sagte in Test neuer Adapter pid (pid-Regler) V0.0.1-alpha.x:
Braucht dann noch wer den expliziten Parameter Offset?
In praktischen Reglern gibt es ihn nicht.
-
@paul53 ich würde eher zu einem negativen Xp greifen, als Ist- und Sollwert zu vertauschen, das macht man aus dem von dir angeführten Grund ja lieber nicht. Ich kenne die Möglichkeit des Offsets auf den Reglerausgang eigentlich durchgängig aus der SPS-Welt - s. z.B. auch die OSCAT-PID Beschreibung oben im Link.
-
@fu_zhou sagte: aus der SPS-Welt
Ich komme aus der DDC-Welt.
-
OK, dann mach ich Folgendes:
-) expliziter Schalter "invert" (und Limit Xp > 0)
-) expliziter Offset (muss ja nicht benutzt werden)P.S. Ich hab zwar Regelungstechnik studiert - aber einerseits ist das 40 Jahre her (wobei der PID Regler damals auch schon erfunden war) und andrerseits wisst ihr Eh dass Praxis ein Studium schlägt. Und die Praxis hatte ich von Anfang an im Programmieren (Assembler Intel 8080/8087 für Messgeräte über Pascal auf VMS (Digital Equipment, dann Compaq und HP) bis zuletzt C, Perl, Linux für online Transaktionssysteme)
DANKE euch allen für euren wertvollen Input.
-
@mcm57 eine Vorbelegung sämtlicher Werte wäre sinnvoll, so dass kein "Null" im Objekt steht, z.B.:
Kp= 1
Tn= 60 (Sekunden)
Tv= 0 (D-Anteil deaktiviert => zunächst nur PI-Regler)
LL: 0
LH: 100
... -
@mcm57
@mcm57 sagte in Test neuer Adapter pid (pid-Regler) V0.0.1-alpha.x:
-) expliziter Schalter "invert" (und Limit Xp > 0)
Das ist eine gute Lösung finde ich, vielleicht auch als Bool Objekt? Dann könnte man z.B. ein Stellglied, das heizen und kühlen kann, in die entsprechende Betriebsart bringen (z.B. über Temperaturdifferenz innen - außen) - auch wenn das wahrscheinlich eher wenig genutzt werden wird, weil das die Geräte selbständig tun, z.B. Lüftung Sommer- vs. Winter-Betrieb: Im Winter möchte ich die Wärmerückgewinnung nutzen, um die kalte Außenluft mit der warmen Abluft vorzuwärmen und im Sommer möchte ich die warme Außenluft mit der kühleren Abluft vorkühlen.