Was sind im Rahmen eines PID-Algorithmus die Einheiten für die Grössen
Messwert, Stellwert, Fehler, Kp, Tn, Tv?
Ich sehe öfter in PID-Sourececodes Formeln wie yp = Kp * error /*
P-Anteil berechnen */ (z.B. Beitrag "PID-Regler so realisierbar?"),
was auf mich wie das Verrechnen von Kartoffeln mit Äpfeln wirkt. Bei
einer Heizung würde man so durch Multiplikation aus Fehler ([Celsius])
mit Konstante eine Leistung erhalten.
Es würde für mich nur Sinn ergeben, wenn Stellgrösse, Messwert und
Fehler (also quasi alle Werte) jeweils dimensionslos aus dem Bereich 0,0
... 1,0 bzw. 0% ...100% stammen würden. Nur sehe ich in den
Beispielcodes nie das Skalieren auf 0...1. Man scheint immer direkt
Messwerte/Fehler mit Faktoren zu multiplizieren, um direkt zum Stellwert
zu kommen. Z.B. http://www.embedded.com/2000/0010/0010feat3.htm ("PID
Without a Phd"): drive = UpdatePID(&plantPID, plantCommand - position,
position) ruft die PID-Berechnung mit dem Fehler "plantCommand -
position" auf, was eine Einheit wie mm haben könnte - aber nicht
erkennbar dimensionslos ist.
Hintergrund ist, dass ich mal Ziegler anwenden wollte und einen
PID-Algorithmus brauche, in den ich das Ergebnis einsetzen kann. Muss
ich also im PID-Algorithmus alles auf 0...1 skalieren, z.B. error =
(Messwert - Sollwert) / (Tmax - Tmin)?
Das sollte man nicht so geanu nehmen. Aus einem Fehler wird eine
Stellgroesse. Die Strecke hat ein Zeitverhalten, der Regler hat ein
Zeitverhalten, und beide zusammen auch. Vielleicht solltest du mal eine
Simulation auf dem PC laufenlassen.
Mirko schrieb:
> Bei> einer Heizung würde man so durch Multiplikation aus Fehler ([Celsius])> mit Konstante eine Leistung erhalten.
Abweichung * Konstante = Leistung
Kelvin * 1 = Watt
Das musste mir jetzt mal erklären. Welche Einheit hat denn die
Konstante?
Aber du hast schon recht, auch solche Algorithmen sind mathematisch
korrekt. Es gibt da auch diverse Herleitungen des PID Reglers über
veschiedene Methoden. (Laplace Transformation und sowas, glaube ich).
"ziemlich genauen Ergebnisse vom Ziegler"
das ist doch schon ein Widersprung für sich^^
les dich erst einmal ein wenig in Regelungstechnik ein, dann klappts
auch. Wenn überhaupt irgendwo eine Größe drinsteckt, dann in Kp. Kannst
aber auch vorher alles auf den Stellbereich normieren, dann hast eben
keine Einheiten
> Wenn überhaupt irgendwo eine Größe drinsteckt, dann in Kp
Vermutlich knapp daneben. Soweit ich das verstehe, ist Kp dimensionslos
(Gain), Tp und Tn werden in [Sekunden] angegeben. Weil Kp dimensionslos
ist, versteh ich nicht, wie man beispielsweise aus einer
Temperaturdifferenz beim Ofen-PID duch Multiplikation mit Kp eine
Heizleistung (Stellgrösse, Watt) erhalten kann - ausser es wäre alles
auf 0 ... 1 normiert. Aber eben diese Normierung sehe ich in den
Sourcecodes nie.
> "ziemlich genauen Ergebnisse vom Ziegler" das ist doch schon ein Widersprung für
sich^^
Nur wenn man den Widerspruch sehen will ;) Ich sage nicht, dass die
Ziegler-Ergebniss gut sind - aber es sind nun mal exakte Zahlen.
Irgendwo muss ich die einsetzen.
> Wen ich das nicht genau nehme, wie sollen dann die ziemlich genauen> Ergebnisse vom Ziegler irgendeinen Sinn ergeben?
Mach dich mal von diesem Gedanken frei. :-)
Das ist eher als grobe Naeherung zu verstehen die fuer manches
ausreichend ist, und fuer vieles der Anfang bevor du selber
weiteroptimierst.
Nebenbei gesagt in der Regelungstechnik kannst du sehr viel mit Mathe
rumhampeln, eine Menge Studenten werfen auch dort das Handtuch.
Es ist auch notwendig das einmal verstanden zu haben! Aber in der
Praxis stoesst man schnell auf das Problem eine Strecke nicht richtig
beschreiben zu koennen sobald die etwas komplizierter ist.
Olaf
> wie man beispielsweise aus einer Temperaturdifferenz beim Ofen-PID duch
Multiplikation mit Kp eine Heizleistung (Stellgrösse, Watt) erhalten kann
kannst du auch nicht. Temperaturdifferenz*Kp bleibt eine Temperatur. Es
sei denn du integrierst im Kp noch deine Streckenverstäkungen, die du
vermutlich nicht so genau kennst, aber streng genommen ist Kp im Regler
dimensionslos.
Um auf dein Beispiel zurückzukommen, wäre das dann z.B.: Wenn du das
Fouriesche Gesetz ins Kp packst, bekommst du eine Wärmeleistung heraus.
> kannst du auch nicht. Temperaturdifferenz * Kp bleibt eine Temperatur
Aber die PID-Berechnung ist doch so (mit y = Stellgrösse, Ta =
Abtastzeit, Tn = Nachhaltezeit, usw.):
y = Kp * (Ta/Tn * errsum + Tv/Ta (ei - ei_1))
Hier wird aus einem Fehler (recht) die Stellgrösse (links) berechne. Das
sind offensichtlich unterschiedliche Dinge und dazwischen stehen nur
einheitenlose Faktoren.
Für mich ergibt das nur Sinn, wenn man alles im PID-Algorithmus
(Messwert, Stellwert und Fehler) dimensionslos betrachtet, also alles
auf 0...1 normiert. Aber das sehe ich in Beispielen nie.
Messwert, Stellwert und Fehler sind dimensionslos und normiert. Die
Normierung findet aber nicht im Source statt, sondern bei der Berechnung
bzw. Bestimmung der Reglerparameter.
mfg, Stefan.
Normalerweise hast du ein mathemtisches Modell deiner Strecke. Diese
Strecke versuchst du nun durch eine Stellgröße zu regeln.
Angenommen du hast einen Glas Wasser, dessen Temperatur zu regeln
willst. Dafür misst du die Temperatur. Die Stellgröße ist aber natürlich
keine Temperatur sondern die Heizleistung. Diese stellst du z.B. durch
eine Spannung ein. Die Temperatur, die du misst, ist ja aber vermutlich
auch nur eine Spannung. Du misst ja nur irgendwie indirekt.
Der Fehler steckt jetzt in deinem Sollwert. Den müsstest du durch eine
Umrechnung, so wie du von der gemessenen Spannung auf die Temperatur
schließt, in eine Spannung umrechnen, damit alles passt.
Natürlich wirst du eher deine gemessene Spannung in eine Temperatur
umrechnen. Du nimmst im Prinzip die Umrechnung deiner Temperatur in
Spannungen in den Regler. So scheint dieser nicht mehr dimensionslos.
Der Regler ansich ist es noch, aber du hast eine Umrechnung
mitdazugenommen, die genaugenommen nicht Teil des Reglers ist.
Ich hoffe, dass es einigermaßen verständlich ist.
> y = Kp * (Ta/Tn * errsum + Tv/Ta (ei - ei_1))
wo hast du die Formel her?
> Ich hoffe, dass es einigermaßen verständlich ist.
Nicht für mich :) Aber Stefan's Antwort werde ich vieleicht noch
verstehen: In die Festlegung von Kp, z.B. per Ziegler-Nichols, fliesst
ein Faktor ein, der den willkürlichen Wertebereich des Stellgliedes -
könnte bei einer Heizung je nach Ansatz der Stellfunktion eín Prozenwert
sein oder ein Byte 0...255 oder eine Einschaltzeit in 0....1000ms pro
Sekunde - normiert und Stellwerte in eine Relation zu
Temperaturdifferenzen setzt.
> wo hast du die Formel her?
Aus einer Vorlesung Regelungstechnik:
http://people.fh-landshut.de/~sbr/Vorlesungsmitschrift_Version4.pdf (S.
55)
> In die Festlegung von Kp, z.B. per Ziegler-Nichols, fliesst> ein Faktor ein, der den willkürlichen Wertebereich des Stellgliedes -> könnte bei einer Heizung je nach Ansatz der Stellfunktion eín Prozenwert> sein oder ein Byte 0...255 oder eine Einschaltzeit in 0....1000ms pro> Sekunde - normiert und Stellwerte in eine Relation zu> Temperaturdifferenzen setzt.
Kompliziert ausgedrückt, aber ich glaube Du hast es verstanden. Ich
versuche das nochmal anders auszudrücken: Die Einheiten, die Du in
Deiner ersten Frage gesucht hast, stecken in den Faktoren zur Normierung
von Stellgröße, Führungsgröße und Regelgröße.
mfg, Stefan.
Da steht die Formel auch richtig. ;-)
y = Kp * (e(i) + Ta/Tn * SUM_k=0..i(e(k)) + Tv/Ta (e(i) - e(i-1)))
Also im Prinzip ist das dann schon richtig mit den Dimensionen. In den
Regler fließen Faktoren mit ein, sodass du mit deiner Einheit rechnen
kannst. Daraus folgt also ungefähr: Vergiss die Einheiten, das geht
meist schon so. ;-)
Wenn du sagst, was du genau machen willst, kann dir vielleicht noch
etwas mehr geholfen werden.
> was du genau machen willst, kann dir vielleicht noch
etwas mehr geholfen werden.
Ich will lediglich ein paar Tuning-Verfahren ausprobieren. Ein
akzeptabel funktionierender C-PID-Regler liegt vor - mit dem Algorithmus
der "Pid withouth a PhD-Seite". Ich war der Meinung, dass die
willkürliche Wahl bei bestimmten Dingen (z.B. Werteberich des
Stellgliedes oder Wahl der Einheit der Temperatur) ein Problem ist und
dass man explizit normieren muss, bevor man die mit Z-N ermittelten
Zahlenwerte einsetzen kann. Sonst hätte jeder andere Gleichungen. Der
Denkfehler war wohl, dass die per Z-N ermittelten Werte für alle Nutzer
einer bestimmten Regelstrecke identisch sind. Wenn ich das jetzt richtig
verstehe, erhalten zwei Anwender derselben Regelstrecke u.U.
unterschiedliche PID-Faktoren, je nachdem wie "Implementationsdetails"
wie Einheiten und Übergabeparameter an die Stellgliedfunktion gelöst
sind.
Na. Es geht in dieser Richtung. Es gibt Leute, die rechnen ein System
als Temperatur-in, Leistung-raus, oder PWM-raus, oder einfach nur
2^16-in, 2^16-aus. Wo und wie man normiert ist eigentlich egal. Eine
Normierung ist ja nur eine Multiplikation. Zahlen sind weniger
interessant wie ein Zeitverhalten.
Moin erstmal!
Das Thema ist schon lange beendet- aber vielleicht bekomme ich ja doch
eine erhellende Antwort.
Ich habe mich in den letzten Wochen zum 1sten mal mit PID-Reglern
befasst.
Ohne die tiefsten Tiefen der mathematischen Herleitungen wirklich
begriffen zu haben, zugegebener Maßen. So ein ungefähres Bild, was P-,
I-, und D-Anteil bewirken sollen (und warum sie das auch tun) hat sich
aber schon eingestellt.
Aber genau bei dem Skalierungsproblem komme ich auch nicht weiter.
Also angenommen man möchte eine Temperatur regeln, z.B. auf 50°C.
Und angenommen, irgendwann würde diese Temperatur ereicht und sich nicht
mehr ändern (also quasi Störgröße konstant -> Regleroutput (z.B.
50%)auch konstant und gleicht die Störgröße aus).
Dann müsste ja der I-Anteil des Reglers bei einem Ausgangssignalbereich
von 0..100 (%) permanent 50 rausgeben, oder? (Damit dann ein einfaches
Stellventil z.B. immer in dieser Stellung bleibt).
Ist das soweit richtig bzw. nachvollziehbar?
Na, ich schau erstmal, ob da jemand antworten mag, dann kann's weiter
gehen
mit der Frage ;-)
Danke, so oder so (wirklich informatives Forum, hat mir schon öfter
geholfen)
Stefan
Das stimmt so.
Da bei Regelabweichung 0 der P-Anteil der Stellgröße ebenfalls 0 ist,
muss der I-Anteil allein die erforderliche Stellgröße liefern.
btw. Stellventile steuert man oft mit einem Dreipunktschrittregler an.
siehe z.B.
http://www.jumo.de/de_DE/support/faq-weiterbildung/faq/regler/T2/Q16.html
Moin Dieter Werner,
danke für die schnelle Antwort!
Nun denn.
wenn ich jetzt mal die u.A. auch in diesem Forum benutzte Formel
esum += e_neu
y= Kp *e + Ki*esum + Kd* (e_neu-e_alt)
wobei esum dann ja oft auf y_max begrenzt wird (was dann ja oft als
Anti-Wind-Up bezeichnet wird). Meine ich auch hier und anderswo gefunden
zu haben.
Dann müsste, wenn ich Ki auf z.B. 0.5 gesetzt hätte, esum ja 100 sein?
Wenn ich jetzt den Sollwert auf z.B 60° setzen würde, müsste ich also Ki
vergrößern, um die Regelabweichung im oben angenommenen ZUSTAND
überhaupt noch kompensieren zu können, da esum ja auf 100 begrenzt
ist??
Soweit auch noch richtig?
Stefan
...
Den Drei-punkt-schrittregler habe ich mir schon schön programmiert- und
zwar so, dass er immer 0..100% möchte.
Jumo- PID-Regler beschreibung, Adruino-PID-Regler (sehr schön! Den
Hinweis habe ich, glaube ich. auch hier im Forum gefundenund) und
vieles, vieles andere habe ich mir auch schon 'reingezogen'
Stefan
Mirko schrieb:> Was sind im Rahmen eines PID-Algorithmus die Einheiten für die> Grössen> Messwert, Stellwert, Fehler, Kp, Tn, Tv?>> Ich sehe öfter in PID-Sourececodes Formeln wie yp = Kp * error /*> P-Anteil berechnen */ (z.B. Beitrag "PID-Regler so realisierbar?"),> was auf mich wie das Verrechnen von Kartoffeln mit Äpfeln wirkt. Bei> einer Heizung würde man so durch Multiplikation aus Fehler ([Celsius])> mit Konstante eine Leistung erhalten.
Kommt drauf an. Bleiben wir doch gleich beim Beispiel einer
Heizungsregelung. Soll- und Istwert sind °C. Der Fehler ist dann einfach
nur K.
Der Stellwert ist meinetwegen der Duty-Faktor einer PWM, also
dimensionslos. Nun muß man also nicht weiter machen, als festzulegen,
daß die Einheiten der Koeffizienten eben 1/K betragen sollen, damit das
K bei der Multiplikation korrekt verschwindet. Oder man stellt wirklich
direkt eine Leistung in kW. Auch kein Problem, dann wird eben einfach
festgelegt, daß die Einheit der Koeffizenten kW/K sein soll.
Genau das ist der Trick: Die Konstanten haben immer genau die Einheit,
die sie brauchen, um die Fehlergröße bei der Multiplikation korrekt in
die Stellgröße zu überführen. Da das sowohl zur Entwurfs- als auch zur
Laufzeit Aufwand spart, ist es sinnvoll. Und weil es sinnvoll ist ist,
wird es immer so gemacht und jeder (außer dir offensichtlich) weiß auch,
daß es immer so gemacht wird. Deswegen kümmert sich auch niemand darum,
in der Doku mit irgendwelchen Einheiten zu hantieren. Sie sind schlicht
und einfach irrelevant.
Beim Anti-windup gibt es verschiedene Möglichkeiten. Die wohl einfachste
ist es die Integration auszusetzen, wenn der Ausgang in der Begrenzung
ist. Sehr ähnlich ist die Methode, dann wenn der Ausgang in der
Begrenzung ist, esum so zu berechnen das gerade so die Begrenzung
erreicht wird. Die 3. methode ist es einfach Esum zu begrenzen. Das
klingt einfach, aber die Wahl der Grenzen ist halt das Probem, und da
gibt es mehrere Möglichkeiten:
1) Etwa so das noch der Maximale Sollwert plus etwas Reserve erreicht
wird.
2) So das noch der maximale Stellwert erreicht wird.
3) So das um den aktuellen Sollwert noch eine genügende Reserve besteht.
Den letzten Fall kriegt man z.B. indem man zum Ausgangswert noch den
Schätzwert für den aktuellen Sollwert dazu addiert - als ein einfache
Form von Feed-Forward. Dann muss esum*Ki nur noch den Fehler der
Schätzung korrigieren, und das kann man meist relativ eng begrenzen.
Man sollte sich von der ganzen Theorie loesen und sich das Verhalten
anschauen. Es gibt immer einen Grund weshalb das System nicht linear
ist. Der PID ist das Werkzeug fuer die Denkfaulen.
Danke,
aber das Problem, auf das ich hinausmöchte ist die Skalierung /
Normierung der Ein- und Ausgangsparameter eines Regel-Algos.
Wenn ich dann nun mit einer der oben genannten Formeln eine Temperatur
um die 500° (was auch immer) regeln möchte, aber immer noch 0..100 (%)
als out erhalten möchte- wo fange ich da am besten an rumzuschrauben?
Skaliere ich z.B. den Temperatur-Ist- & Sollwert z.B. von 450..550 auf
0..100 herunter?
Oder (habe ich auch irgendwo gesehen) bekommen die Beiwerte (Kp, Ki, Kd)
nen Faktor..
Oder nehme ich den Reglerausgang und versuche den wieder auf 0..100
runterzurechnen?
Stefan
короткое троль schrieb:> Man sollte sich von der ganzen Theorie loesen und sich das> Verhalten> anschauen. Es gibt immer einen Grund weshalb das System nicht linear> ist. Der PID ist das Werkzeug fuer die Denkfaulen.
Ja, wie machst Du das denn???
Lass mich / uns doch nicht dumm sterben.
Siehe auch Beitrag "PID-Algorythmen Ein- und Ausgangsparameter skalieren"
Man kann in ADC-Koordinaten denken, oder so. Falls der Sensor linear
verwende ich als Rechenwerte das ADC System. Dh. Sollwert ist der
gewollte ADC Wert. Der Regelalgorithmus laeuft dann in Longinteger. Am
Schluss wird dann auf das Stellglied runterskaliert. Nie Float.
Falls der Sensor nicht linear ist, wird erst auf eine sinnvolle Groesse
linearisiert. Natuerlich auf Ganzzahl. Fuer Temperaturen zB auf
Milikelvin.