PID-Algorithmus: Wie werden schnelle Eingangswertänderungen nach einer langen Verzögerung berücksichtigt?

Ich versuche, einen grundlegenden PID-Algorithmus auf einem Arduino Leonardo zu implementieren, um heißes und kaltes Leitungswasser mit servogesteuerten Ventilen zu mischen. Ziel ist es, die Temperatur so nahe wie möglich an einem Sollwert zu halten. Besonders wichtig ist es, zu verhindern, dass die Ausgangstemperatur den Sollwert überschreitet, um den Benutzer vor Verbrennungen zu schützen. Zweitrangig wichtig ist es, die Temperatur so schnell wie möglich in die Nähe des Sollwerts zu bringen.

Für kleine Temperaturänderungen scheint eine Standardimplementierung des PID-Algorithmus gut zu funktionieren. Aber ich weiß nicht, wie ich die langen Verzögerungen berücksichtigen soll, die auftreten können, wenn darauf gewartet wird, dass heißes Wasser das Ventil erreicht, da diese Verzögerungen viel länger sind als Standardverzögerungen nach dem Ändern der Ventilpositionen.

Abhängig von der Länge der Warmwasserleitung und der Zeit seit der letzten Verwendung von Warmwasser kann es offensichtlich mehrere zehn Sekunden dauern, bis das Warmwasser das Ventil erreicht, sodass die Wassertemperatur während dieser Zeit ziemlich konstant auf einer niedrigen Temperatur bleibt und das Warmwasserventil öffnet bald zu 100 %. Die integrale Komponente beginnt, einen großen Fehlerwert zu akkumulieren.

Wenn heißes Wasser schließlich das Ventil erreicht, steigt die erfasste Temperatur sehr schnell auf die maximale Warmwassertemperatur an. Aufgrund des großen Integralfehlers wird das Heißwasserventil lange Zeit auf 100 % gehalten, nachdem die Temperatur den Sollwert überschritten hat, da darauf gewartet wird, dass der Integralwert auf normale Werte reduziert wird. Das Ergebnis ist also Wasser mit maximaler Temperatur für mehrere (zig) Sekunden.

Ich bin mir nicht sicher, wie ich diese mögliche lange Verzögerung erklären soll. Wäre es in einem solchen Fall ratsam, eine obere (und untere) Grenze für den integralen Fehlerwert festzulegen, um die maximale Reaktionszeit zu begrenzen? Dies scheint den Zweck der integralen Komponente zunichte zu machen und würde auch nach dem Erreichen des Sollwerts noch eine gewisse Verzögerung auferlegen.

Oder gibt es eine bessere Möglichkeit, schnelle Eingabeänderungen nach einer langen Verzögerung zu verarbeiten?

Danke für jeden Rat!

Tatsächlich frage ich mich, ob Sie den I-Anteil überhaupt brauchen, da ich denke, dass die Änderungen der Wassertemperatur im Vergleich zur Ventilbetätigung relativ langsam sind. Schlimmer noch, Sie könnten aufgrund des extrem schlechten Phasenspielraums, den Sie wahrscheinlich erhalten, ein oszillierendes Verhalten bekommen (Ihr System kann theoretisch stabil sein, hört aber in der Praxis möglicherweise nie auf zu oszillieren, da die I-Aktion eine Phasenverzögerung hinzufügt). Da Sie möglicherweise Leute verbrennen werden, kann ich nicht genug betonen, um einen Blick auf die Kommentare von Chu und JonRB zu werfen!

Antworten (6)

Ihr Problem heißt Integral Windup , es ist ein allgemeines Steuerungsproblem. In einem nichtlinearen oder anderweitig begrenzten Bereich kann die Steuerung den Sollwert nicht verfolgen und das Integral steigt auf einen großen Wert. Dies führt zu einem großen Überschwingen, wenn der Sollwert schließlich erreicht ist, was genau das Problem ist, das Sie abgeleitet haben.

Die einfachste Lösung besteht darin, den Integratorwert selbst auf ein sinnvolles Maximum zu begrenzen. Das Begrenzen des integralen Beitrags wird auch nicht funktionieren, da der Integrator immer noch auf einen großen Wert aufgewickelt wird.

Mathworks hat eine Seite mit einigen anderen Lösungen für integrales Windup.

Bei einem PID-Regler möchte man im Allgemeinen so wenig Integralterm wie möglich. In einem standardmäßigen mechanischen Temperaturregelventil wird nur eine Proportionalsteuerung verwendet, und sie funktionieren gut. Halten Sie den Integralterm so klein wie möglich – der Benutzer wird einen kleinen Fehler in der Endtemperatur nicht bemerken. Sie werden vielleicht feststellen, dass Sie nur mit PD eine akzeptable Leistung erzielen.

Da dies ein sehr spezieller, bekannter Fall ist, sollten Sie einen anderen Modus für den Controller in Betracht ziehen. Messen Sie die heiße Einlasstemperatur, und während sie unter dem Sollwert liegt, lassen Sie einfach 100 % heiß und 20 % kalt laufen. Wenn es wärmer wird, schalten Sie bei guten Anfangsbedingungen auf PID um.

Ja. Im Idealfall können Sie die heiße Einlasstemperatur unabhängig messen und auf diese Weise ein Aufwickeln verhindern.
Wind-up kann ein Problem sein, aber wenn zB der Integrator nicht implementiert wäre, würde die destabilisierende Wirkung der Verzögerung immer noch bestehen bleiben. Smith Predictor ist eine gute Methode, um die Auswirkungen einer reinen Zeitverzögerung abzumildern. Das Ansprechen des Integrator-Wind-Ups allein trägt nicht dazu bei, die inhärente Phasenverzögerung zu überwinden, die durch die Zeitverzögerung eingeführt wird.
Genau, ich glaube nicht, dass dies ein reines Integrator-Windup ist, selbst wenn es das ist. Es ist eine berechtigte Sorge, die immer für SOGAR gemildert werden sollte, wenn der normale Betrieb nicht die erforderlichen Bedingungen erfüllt
Wow, tolle Antwort! Ich habe in diese Richtung gedacht (Begrenzung des Integrator-Maximalwerts), aber die Frage nicht richtig formuliert, sodass ich missverstanden wurde. Es ist gut zu sehen, dass ich mit einer Lösung zumindest im Stadion bin. Ich denke, die einfachste Lösung wäre, den "I" -Faktor zu deaktivieren, bis die Temperatur einen kontrollierbaren Bereich erreicht. Dies würde eine sehr schnelle Reaktion auf Änderungen ermöglichen. Wenn wir dann eine tatsächliche Temperaturänderung sehen und uns dem gewünschten Ergebnis nähern, aktivieren Sie das Integral erneut, um den erforderlichen zusätzlichen Schub hinzuzufügen. Danke für eine ausführliche Antwort!
Aber der integrale Term ist nicht da, um es zu beschleunigen, er ist da, um einen systematischen Fehler zu korrigieren, insbesondere einen proportionalen Koeffizienten, der nicht ganz richtig ist. Nein? Und in dieser Situation der P-Koef. kann nicht immer perfekt sein, da er je nach Wasserdruck in beiden Rohren unterschiedlich ist.
@romkyns ah ja, wenn du deinen Kommentar genauer liest, hast du recht. Ich glaube, ich wollte "kleinen Fehler in der Endtemperatur" sagen, was das Integral schließlich beseitigen würde.

Der Schlüssel zur effizienten Steuerung dieses Prozesses liegt in der Erkenntnis, dass die Warm- und Kaltwasserabgriffe nicht symmetrisch arbeiten und jeder optimale Algorithmus dies berücksichtigen muss.

Wenn Sie das heiße Wasser eine Zeit lang nicht benutzen, kühlt es in der Leitung ab.

Wenn Sie das kalte Wasser eine Zeit lang nicht benutzen, bleibt es so wie es immer war (es sei denn, das kalte Wasser stammt aus einem Kaltwassertank mit einem Kühler, was an heißen Sommertagen großartig wäre, aber ich bin es Wetten sind in der Praxis eher selten).

Daher gehen wir davon aus, dass wir nicht wissen, was wir aus der Warmwasserleitung bekommen, aber wir können uns darauf verlassen, dass die Kaltwasserleitung während eines Laufs ziemlich konstant ist.

Somit können wir aus der Temperatur des Mischwassers und der Kenntnis der Ventileinstellung und aus einer Schätzung der Temperatur des Kaltwassers abschätzen, wie heiß das Wasser ist, das gerade aus der Warmwasserleitung kommt. Dann können Sie das Ventil einstellen, um die richtige Ausgangstemperatur ohne PID zu erhalten, nur basierend auf der Auswertung einer thermodynamischen Formel.

Um die "Schätzung der Temperatur des kalten Wassers" zu erhalten, können Sie zu Beginn des Zyklus für kurze Zeit (einige Sekunden vielleicht) kaltes Wasser laufen lassen und die Temperatur ablesen. Nehmen Sie dann an, dass es sich danach nicht ändert, da Sie nicht genügend Daten haben, um nach beiden Temperaturen zu suchen.

Dieses Schema wird nicht ganz genau sein, aber ich schätze, es wird zuverlässig in den Baseballstadion gelangen, ohne die Möglichkeit eines drastischen Überschießens. Dann führen Sie PID zusätzlich zu diesem Schema aus, um die Ergebnisse zu optimieren, aber beschränken Sie die Änderung auf die Ventileinstellung, die PID erzeugen darf. Setzen Sie möglicherweise den PID-Status zurück, wenn Sie signifikante Änderungen der Warmwassereingangstemperatur feststellen.

Ausgefallenere Lösungen sind mit mehreren Temperatursensoren möglich.

Eine weitere großartige Antwort - über den Tellerrand der PID hinaus denken. Ich hatte überlegt, einfach die Wassertemperaturen zu testen und eine Art Nachschlagetabelle mit ungefähren Ventilpositionen zu erstellen, um die gewünschte Ausgangstemperatur zu erzielen. Sie haben Recht, dass die Kälte relativ konstant ist, wenn auch möglicherweise kälter im Winter. Die Wasserleitungen sind etwa 24-36 Zoll tief vergraben und wir haben hier normalerweise milde Temperaturen. Dann könnte ich auch die maximale Warmwasserausgangstemperatur (ca. 120 F) berücksichtigen und eine Nachschlagetabelle erstellen, die die Ventile entsprechend positioniert, wobei PID zur Feinabstimmung nach dem Aufwärmen verwendet wird.
Brunnenwasser kann je nach Tiefe/Quelle auch in warmen Sommern sehr kühl bleiben. Das „kalte“ Wasser, das in den Hausleitungen ruht, ist wärmer als das, was von unten gepumpt wird. Das kalte Wasser wird also bei Gebrauch tatsächlich kälter (bis es sich der Grundwassertemperatur annähert). Ich bin immer „überrascht“, wenn ich in die „große Stadt“ gehe und das kalte Wasser nie kalt wird.

Ich wollte den netten Antworten oben nur ein Detail hinzufügen, was Steuerungsingenieure für die integrierten Aufziehmöglichkeiten tun. Dies geschieht auch in vielen industriellen Prozessen und ist eher eine Kunst als eine Wissenschaft.

Dagegen gibt es lehrbuchtypische Maßnahmen, ohne auf den für die Leistungsangabe vielleicht wirklich nötigen Integralgewinn zu verzichten.

  1. Jedes Mal, wenn Sie die Null-Fehler-Grenze überschreiten, setzen Sie den Integrator zurück. Dies macht den Integrator zu einem Integrator-on-Demand-Typ eines nichtlinearen Elements anstelle eines blinden Akkumulators.

  2. Sie verbinden im Grunde den Integralaktions-Eingangsblock mit einem indikativen Element in der Schleife. Dies könnte entweder die Ausgabe des Integrators sein, um zu beurteilen , ob er mit dem Aufbau begonnen hat (was ein Verständnis des Prozesses erfordert, um die richtige Beurteilung zu treffen). Oder Sie überprüfen, ob Ihre Aktuatoren gesättigt sind oder nicht, und bilden basierend auf diesen Informationen eine Rückkopplungsschleife. Ich habe einfach zufällig den ersten Link ausgewählt, der von Google kam, und am Ende dieses Videos gibt es eine grafische Erklärung zu meinem letzten Punkt. https://www.youtube.com/watch?v=H4YlL3rZaNw

Gute Punkte, danke für die Erweiterung der Idee. Danke für das Video, es erklärt das Problem sehr gut.

Manchmal kann es hilfreich sein, mehrere Sätze von PID-Parametern für grobkörnige Stufen des Betriebsbereichs des Systems zu haben, die Sie im laufenden Betrieb ändern, wenn das System von einer Verhaltensstufe zur nächsten übergeht. Zum Beispiel ein Satz Kp, Ki und Kd, wenn Sie den Warmwasserhahn aufdrehen und nur kaltes Wasser bekommen; Wenn Sie dann sehen, dass die Temperatur ansteigt, wechseln Sie zu einem anderen Satz von Kp, Ki und Kd. Dann stimmen Sie die beiden entsprechend ab.

Verwenden Sie die PID-Bibliothek im Arduino Playground von Brett Beauregard? Dieser ist ganz nett. Und es gibt auch ein „adaptives“ Beispiel dafür.

Danke für die Vorschläge. Da ich die PID-Bibliothek nicht verwende, habe ich sie selbst geschrieben, um mehr darüber zu erfahren, wie sie funktioniert.
Haben Sie Feed Forward in Erwägung gezogen? Es ist, als ob schnelle Änderungen die Ausgabe durch einen offenen Regelkreis beeinflussen, sodass Sie nicht auf den geschlossenen Regelkreis warten müssen, um zu reagieren.
Ich versuche mir vorzustellen, wie "Feed Forward" in diesem Fall funktionieren würde. Wäre die Eingabe die gewünschte Temperatur und die Ausgabe würde die Ventile mithilfe einer Nachschlagetabelle oder einer einfachen Gleichung auf eine vorbestimmte Position einstellen (wie in meinem anderen Kommentar oben besprochen)?
Sie können Feedforward zusätzlich zu Ihrem Feedback verwenden (Closed-Loop-PID). Sie addieren einfach die Aktion des Feedback-Controllers zur Aktion des Feedforward-Controllers. Idealerweise wäre der Feedforward-Regler ein inverses Modell des Ventils. Feedforward gibt Ihnen im Wesentlichen sofortige Maßnahmen bei einer Sollwertänderung. Selbst mit Feedforward plus Feedback müssen Sie immer noch Windup im Feedback-Control-Kompensator berücksichtigen. Die Rückkopplungskomponente muss berücksichtigt werden.

Haben Sie das System modelliert?

Haben Sie einige zeitbasierte Daten, die das Überschwingen zeigen - insbesondere die Freq

Dies sind zwei Fragen, die bei jeder steuerungsbasierten Abfrage gestellt werden sollten.

Nach dem, was Sie beschrieben haben, ist Ihr integraler Gewinn zu hoch, viel zu hoch. Dies könnte am Integrator-Windup liegen: Der gezeigte Code hat einige echte praktische Bedenken, von denen einer darin besteht, dass er nicht der größte diskrete Integrator ist

  • Sehr schlechte diskrete Integratortopologie
  • Keine Klemmen/Grenzen, weder am I-Ausgang, geschweige denn am P+I-Ausgang

Es könnte auch daran liegen, dass es sehr hoch ist und es Zeit braucht, um es zu verringern.

Also ja, der im I-Register gespeicherte Wert hätte zu sagen ... 1000 ° C betragen können, da P + I nicht auf die Reaktion des Systems eingestellt waren und es dann heruntergefahren werden muss.

Als erstes würde ich Echtzeitdaten für die Nachbearbeitung erfassen. Als nächstes würde ich nur P ausführen und sicherstellen, dass die proportionale Verstärkung FAST die gewünschte Temperatur erreicht (die Steuerungstheorie besagt, dass dies nicht der Fall ist). Das hängt davon ab, ob

  1. Analyse der vorliegenden Erfassungsdaten zur Erleichterung der Bestimmung einer geeigneten I-Verstärkung
  2. Ein Anlagenmodell wird abgeleitet, um geeignete Verstärkungen zu erzeugen

Ich würde damit beginnen, den PID-Code zu ändern, um eine bessere Implementierung zu erhalten, und dann ein kleines bisschen I hinzufügen, nur um einen Punkt zu beweisen.

Sie müssen wirklich bestimmen, wogegen diese Gewinne gedacht sind. Der Input ist die Temperatur, der Output ist... Durchfluss? es sollte also eine Flow/C-Übertragung und eine Flow/Cs-Übertragungsfunktion geben.

Gute Antwort auch, danke. Ich habe das System nicht modelliert, da ich noch nicht weiß, wie – ich fange gerade an, meine Füße in dieser Studie nass zu machen. Sie haben Recht, dass der I-Wert über das vernünftige Maß hinaus ansteigt. Können Sie mich auf einen besseren Implementierungsalgorithmus für den Integrator verweisen? Pseudocode ist am besten, da ich damit lernen und den Code in meine eigenen Worte fassen kann, anstatt ihn zu kopieren/einzufügen. Können Sie mich auch auf Einführungen in die Modellierung einfacher Systeme wie dieser verweisen? Sie haben Recht, dass die Durchflussmengen (heiße und kalte Mischung) die Ausgänge dieses Systems sind. Derzeit ist es nur umgekehrt proportional H / C.
Ich werde in Kürze eine Optimierung hinzufügen

Eine Art, wie ich das Integral Windup lösen möchte, besteht darin, die Akkumulation des Fehlers zu stoppen, wenn Ihr Steuerausgang bei seiner maximalen Auslenkung ist . Oder skalieren Sie es, wie weit es von der maximalen Auslenkung entfernt ist. Wenn Ihr Controller also "Warmwasser 100%, Kaltwasser 0%" ausgibt, akkumulieren Sie den Fehler einfach nicht, setzen Sie ihn aber auch nicht auf Null zurück.

Ich mag es nicht, das Integral auf ein Maximum zu begrenzen, denn dann gibt es eine Grenze für den systematischen Fehler, den Ihre PID kompensieren kann.

Ich würde auch vorschlagen, dass Sie, anstatt eine "dumme" PID zu erstellen, die nur einen Parameter hat, den sie ohne Kenntnis des zugrunde liegenden Systems zu steuern versucht, zwei zusätzliche Temperatursensoren sowohl am heißen als auch am kalten Eingang installieren. Sie versuchen dann, eine Funktion zu finden, die sich der gewünschten Position basierend auf den Eingangstemperaturen annähert, und verwenden nur die PID-Schleife, um den Fehler im Ausgang dieser Funktion auszugleichen.

Der Fehler ist erheblich, da Sie den Durchfluss nicht messen (es sei denn, Sie tun dies natürlich), der nicht nur von den Ventilpositionen (bekannt) sondern auch vom Wasserdruck (unbekannt) abhängt.

Dennoch sollte dies bei dem Problem, dass heißes Wasser schließlich den Wasserhahn erreicht, sehr hilfreich sein, da Sie sich in einem gut gedämpften PID-Kreislauf darauf verlassen müssen, dass das D-Element gut kalibriert ist, um den heißen Durchfluss schnell zu reduzieren. Nach meiner Erfahrung ist es normalerweise am schwierigsten, den korrekten Ableitungskoeffizienten zu erhalten. Aber wenn Sie die zwei zusätzlichen Sensoren hätten, würde sich der Hauptausgang genau so schnell wie die Eingangswassertemperatur ändern, also im Grunde sofort, ohne dass überhaupt das Ableitungselement benötigt wird.