PID-Algorithmus: Wie man schnelle Änderungen der Eingangswerte nach einer langen Verzögerung berücksichtigt


15

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. Zweitens ist es wichtig, die Temperatur so schnell wie möglich in die Nähe des Sollwerts zu bringen.

Bei kleinen Temperaturänderungen scheint eine Standardimplementierung des PID-Algorithmus in Ordnung zu sein. Ich weiß aber nicht, wie ich die langen Verzögerungen berücksichtigen soll, die auftreten können, wenn auf das Erreichen des Ventils mit heißem Wasser gewartet wird, da diese Verzögerungen nach dem Ändern der Ventilpositionen viel länger sind als die Standardverzögerungen.

Offensichtlich kann es abhängig von der Länge der Warmwasserleitung und der Zeit seit dem letzten Gebrauch des Warmwassers mehrere zehn Sekunden dauern, bis das Warmwasser das Ventil erreicht. Während dieser Zeit bleibt die Wassertemperatur bei einer niedrigen Temperatur ziemlich konstant und das Warmwasserventil öffnet bald 100%. Die Integralkomponente 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 Heißwassertemperatur an. Aufgrund des großen Integralfehlers wird das Warmwasserventil für eine 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 einige (zehn) Sekunden.

Ich bin nicht sicher, wie ich diese möglicherweise lange Verzögerung erklären soll . Wäre es in einem solchen Fall sinnvoll, eine obere (und untere) Grenze für den Integralfehlerwert festzulegen, um die maximale Antwortzeit zu begrenzen? Dies scheint den Zweck der Integralkomponente außer Kraft zu setzen und würde auch nach Erreichen des Sollwerts noch eine gewisse Verzögerung verursachen.

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

Danke für jeden Rat!


1
Tatsächlich frage ich mich, ob Sie die I-Aktion überhaupt brauchen, weil ich denke, dass die Wassertemperaturänderungen im Vergleich zur Ventilbetätigung relativ langsam sind. Schlimmer noch, es kann sein, dass Sie aufgrund der extrem schlechten Phasenspanne oszillatorisches Verhalten bekommen (Ihr System ist theoretisch möglicherweise stabil, hört in der Praxis jedoch möglicherweise nie auf zu oszillieren, da I-Action eine Phasenverzögerung hinzufügt). Da Sie möglicherweise Menschen verbrennen werden, kann ich nicht genug Stress verursachen, um die Kommentare von Chu und JonRB zu lesen!
Sanchises

Antworten:


15

Ihr Problem heißt Integral Windup , es ist ein häufiges Steuerungsproblem. In einem nicht linearen oder anderweitig begrenzten Bereich kann der Regler den Sollwert nicht verfolgen, und das Integral steigt auf einen großen Wert an. Dies führt zu einem großen Überschwingen, wenn der Sollwert erreicht ist. Genau das, woraus Sie geschlossen haben, ist das Problem.

Die einfachste Lösung besteht darin, den Integrator-Wert selbst auf ein vernünftiges Maximum zu beschränken. Das Begrenzen des Integralbeitrags funktioniert nicht so gut, da der Integrator immer noch auf einen hohen Wert aufgewickelt wird.

Mathworks hat eine Seite mit einigen anderen Lösungen für das integrale Aufziehen.

In einem PID-Regler möchten Sie im Allgemeinen so wenig Integralterm wie möglich. Bei einem mechanischen Standard-Temperaturregelventil wird nur eine proportionale Regelung verwendet, und sie funktionieren einwandfrei. Halten Sie den ganzzahligen Term so klein wie möglich - der Benutzer wird keinen kleinen Fehler bei der Endtemperatur bemerken. Möglicherweise erzielen Sie mit PD eine akzeptable Leistung.

Da dies ein sehr spezieller, bekannter Fall ist, können Sie in Betracht ziehen, einen anderen Modus für den Controller zu verwenden. Messen Sie die heiße Einlasstemperatur und lassen Sie sie nur 100% heiß, 20% kalt laufen, solange sie unter dem Sollwert liegt. Wenn es warm wird, schalten Sie bei guten Anfangsbedingungen auf die PID um.


1
Ja. Idealerweise können Sie die Vorlauftemperatur unabhängig messen und so das Aufwickeln verhindern.
Brian Drummond

2
Das Aufziehen kann ein Problem sein, aber wenn der Integrator nicht implementiert wäre, würde z. B. der destabilisierende Effekt der Verzögerung immer noch bestehen bleiben. Smith Predictor ist eine gute Methode, um die Auswirkungen einer reinen Zeitverzögerung zu mildern. Das Adressieren des Integrator-Aufwickelns allein trägt nicht dazu bei, die durch die Zeitverzögerung verursachte inhärente Phasenverzögerung zu überwinden.
Chu

2
Genau, ich denke nicht, dass dies eine reine Integrator-Abwicklung ist, auch wenn es das ist. Es ist eine berechtigte Sorge, die für EVEN immer gemildert werden sollte, wenn der normale Betrieb nicht die erforderlichen Bedingungen erfüllt
JonRB

Wow, tolle Antwort! Ich habe nachgedacht (Begrenzung des Integrator-Maximalwerts), aber die Frage nicht richtig formuliert, sodass ich falsch verstanden wurde. Es ist gut zu sehen, dass ich zumindest mit einer Lösung im Stadion bin. Ich denke, die einfachste Lösung wäre, den "I" -Faktor zu deaktivieren, bis die Temperatur einen steuerbaren Bereich erreicht. Dies würde eine sehr schnelle Reaktion auf Änderungen ermöglichen. Wenn sich dann die tatsächliche Temperatur ändert und das gewünschte Ergebnis erreicht wird, aktivieren Sie das Integral erneut, um den erforderlichen zusätzlichen Schub hinzuzufügen. Danke für eine ausführliche Antwort!
Ryan Griggs

Aber der ganzzahlige Term ist nicht da, um ihn zu beschleunigen, sondern um einen systematischen Fehler zu korrigieren, insbesondere einen nicht ganz richtigen proportionalen Koeffizienten. Nein? Und in dieser Situation ist das P coef. kann nicht immer perfekt sein, da es in Abhängigkeit vom Wasserdruck in beiden Rohren variiert.
Roman Starkov

4

Der Schlüssel zur effizienten Steuerung dieses Prozesses besteht darin, zu erkennen, dass die Warm- und Kaltwasserhähne nicht symmetrisch arbeiten, und jeder optimale Algorithmus muss dies berücksichtigen.

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 unverändert (es sei denn, das kalte Wasser stammt aus einem Kaltwassertank mit einer Kältemaschine, was an heißen Sommertagen großartig wäre, aber ich bin es Wetten sind in der Praxis eher selten).

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

Aus der Temperatur des Mischwassers und der Kenntnis der Ventileinstellung sowie aus einer Schätzung der Temperatur des kalten Wassers können wir also abschätzen, wie heiß das Wasser ist, das gegenwärtig aus der Warmwasserleitung kommt. Dann können Sie das Ventil einstellen, um die richtige Ausgangstemperatur ohne PID zu erhalten, 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 eine kurze Zeit (möglicherweise einige Sekunden) 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 beide Temperaturen zu lösen.

Dieses Schema ist nicht genau genug, aber ich schätze, es wird zuverlässig in den Ballpark gelangen, ohne dass die Möglichkeit eines drastischen Überschießens besteht. Anschließend führen Sie PID über diesem Schema aus, um die Ergebnisse zu optimieren. Begrenzen Sie jedoch die Änderung auf die Ventileinstellung, die PID erzeugen darf. Und setzen Sie möglicherweise den PID-Status zurück, wenn sich die Warmwassereingangstemperatur erheblich ändert.

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


Eine weitere großartige Antwort: Denken außerhalb der PID-Box. Ich hatte überlegt, nur die Wassertemperaturen zu testen und eine Art Nachschlagetabelle mit ungefähren Ventilpositionen zu erstellen, um die gewünschte Ausgangstemperatur zu erhalten. Sie haben Recht, dass die Kälte relativ konstant ist, auch wenn es im Winter möglicherweise kälter ist. Die Wasserleitungen sind bei etwa 24-36 Zoll begraben und wir haben hier in der Regel milde Temperaturen. Dann könnte ich auch die maximale Warmwasser-Ausgabetemperatur (ca. 30 ° C) berücksichtigen und eine Nachschlagetabelle erstellen, in der die Ventile entsprechend positioniert und die PID zur Feinabstimmung nach dem Aufwärmen verwendet werden.
Ryan Griggs

1
Brunnenwasser kann je nach Tiefe / Quelle auch in warmen Sommern sehr kalt bleiben. Das "kalte" Wasser in den Hausrohren ist wärmer als das, was von unten gepumpt wird. So wird das kalte Wasser bei Gebrauch tatsächlich kälter (bis es sich der Grundwassertemperatur nähert). Ich bin immer "überrascht", wenn ich in die "große Stadt" gehe und das kalte Wasser nie kalt wird.
Rickhg12hs

2

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

Es gibt typische Lehrbuchaktionen dagegen, ohne den für die Leistungsspezifikation tatsächlich erforderlichen integralen Gewinn zu opfern.

  1. Jedes Mal, wenn Sie die Null-Fehlerstufe überschreiten, setzen Sie den Integrator zurück. Dies macht den Integrator zu einem nichtlinearen Integrator-On-Demand-Element anstelle eines blinden Akkumulators.

  2. Grundsätzlich verbinden Sie den Integralaktionseingangsblock mit einem indikativen Element in der Schleife. Dies kann entweder die Ausgabe des Integrators sein, um zu beurteilen, ob er den Aufbau gestartet hat (was ein Verständnis des Prozesses erfordert, um die richtige Beurteilung vorzunehmen). Oder Sie prüfen, ob Ihre Aktoren gesättigt sind oder nicht und bilden anhand dieser Informationen eine Rückkopplungsschleife. Ich habe nur zufällig den ersten Link ausgewählt, der aus Google stammt, und am Ende dieses Videos befindet sich eine grafische Erklärung meines letzten Punktes. https://www.youtube.com/watch?v=H4YlL3rZaNw


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

1

Manchmal kann es hilfreich sein, mehrere Sätze von PID-Parametern für grobkörnige Phasen des Systembetriebs zu haben, die Sie im laufenden Betrieb ändern, wenn das System von einer Phase des Verhaltens in eine andere übergeht. Zum Beispiel ein Satz Kp, Ki und Kd, wenn Sie den Heißwasserhahn aufdrehen und nur kaltes Wasser erhalten. Wechseln Sie dann zu einem anderen Satz von Kp, Ki & Kd, sobald die Temperatur steigt. Dann stimmen Sie die beiden entsprechend.

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


Danke für die Vorschläge. Ich habe die pid-Bibliothek nicht verwendet, sondern sie selbst geschrieben, um mehr darüber zu erfahren, wie sie funktioniert.
Ryan Griggs

Haben Sie überlegt, vorwärts zu speisen? Es ist, als würden schnelle Änderungen die Ausgabe über eine offene Schleife beeinflussen, sodass Sie nicht auf eine geschlossene Schleife warten müssen, um zu reagieren.
Gregory Kornblum

Ich versuche mein Gehirn darum zu wickeln, wie "Feed Forward" in diesem Fall funktionieren würde. Wäre der Eingang die gewünschte Temperatur und der Ausgang würde die Ventile unter Verwendung einer Nachschlagetabelle oder einer einfachen Gleichung in eine vorbestimmte Position bringen (wie in meinem anderen Kommentar oben erläutert)?
Ryan Griggs

Sie können Feedforward zusätzlich zu Ihrer Rückmeldung verwenden (PID mit geschlossenem Regelkreis). Sie fügen einfach die Aktion des Feedback-Controllers zur Aktion des Feedforward-Controllers hinzu. Idealerweise wäre die Vorwärtsregelung ein inverses Modell des Ventils. Mit Feedforward können Sie im Wesentlichen sofort auf eine Sollwertänderung reagieren. Auch bei Vorwärtskopplung und Rückkopplung müssen Sie die Aufwicklung im Kompensator für die Rückkopplungsregelung berücksichtigen. Die Feedback-Komponente muss berücksichtigt werden.
docscience

1

Haben Sie das System modelliert?

Haben Sie einige zeitbasierte Daten, die das Überschwingen anzeigen - insbesondere die Frequenz?

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

Von dem, was Sie beschrieben haben, ist Ihre integrale Verstärkung zu hoch, viel zu hoch. Es könnte an einem Integrator-Windup liegen: Der gezeigte Code hat einige echte praktische Probleme, von denen eines ist, dass er nicht der größte diskrete Integrator ist

  • Sehr schlechte Topologie des diskreten Integrators
  • Weder am I-Ausgang noch am P + I-Ausgang gibt es Klemmen / Grenzen

Dies kann auch daran liegen, dass es sehr hoch ist und es einige Zeit dauert, bis es sich verringert.

Ja, der im I-Register gespeicherte Wert hätte also sagen können ... 1000C, weil das P + I nicht auf die Reaktion des Systems eingestellt war und es dann abwickeln muss.

Als erstes würde ich Echtzeitdaten für die Nachbearbeitung erfassen. Als nächstes würde ich P-only ausführen und sicherstellen, dass die proportionale Verstärkung FAST die gewünschte Temperatur erreicht (die Regelungstheorie besagt, dass dies nicht der Fall ist ). Das kommt drauf an ob

  1. Analyse der vorliegenden Erfassungsdaten erleichtert die Bestimmung des geeigneten I-Gewinns
  2. Ein Pflanzenmodell wird abgeleitet, um geeignete Gewinne zu erzielen

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

Sie müssen wirklich feststellen, wogegen diese Gewinne gedacht sind. Der Eingang ist Temperatur, der Ausgang ist ... Durchfluss? Es sollte also eine Flow / C-Übertragung und eine Flow / Cs-Übertragungsfunktion geben.


Gute Antwort auch, danke. Ich habe das System noch 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 außerhalb angemessener Grenzen steigt. Können Sie mich auf einen besseren Implementierungsalgorithmus für den Integrator hinweisen? Pseudocode ist am besten geeignet, da ich den Code lernen und in meine eigenen Wörter einfügen kann, anstatt ihn zu kopieren / einzufügen. Können Sie mir auch eine Einführung in die Modellierung einfacher Systeme wie dieses geben? 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.
Ryan Griggs


1

Eine Möglichkeit, das Integral Windup zu lösen, besteht darin , den Fehler nicht mehr zu akkumulieren, wenn Ihr Steuerausgang die maximale Auslenkung aufweist . Oder skalieren Sie den Abstand zur maximalen Auslenkung. Wenn Ihre Steuerung also "Warmwasser 100%, Kaltwasser 0%" ausgibt, akkumulieren Sie den Fehler nur nicht, sondern setzen Sie ihn auch nicht auf Null zurück.

Ich mag es nicht, das Integral auf ein Maximum zu beschränken, weil es dann eine Grenze dafür gibt, welchen systematischen Fehler Ihre PID kompensieren kann.

Ich würde auch vorschlagen, dass Sie anstelle einer "dummen" PID, die nur einen Parameter enthält, den sie ohne Kenntnis des zugrunde liegenden Systems steuern möchte, zwei zusätzliche Temperatursensoren sowohl am heißen als auch am kalten Eingang installieren. Sie versuchen dann, eine Funktion zu finden, die die gewünschte Position basierend auf den Eingangstemperaturen approximiert, und Sie verwenden nur die PID-Schleife, um den Fehler in der Ausgabe dieser Funktion auszugleichen.

Der Fehler ist erheblich, da Sie den Durchfluss nicht messen (außer natürlich), was nicht nur von den Ventilstellungen (bekannt), sondern auch vom Wasserdruck (unbekannt) abhängt.

Dies sollte jedoch viel dazu beitragen, dass heißes Wasser endlich in den Hahn gelangt, da Sie sich in einem gut gedämpften PID-Regelkreis darauf verlassen müssen, dass das D-Element gut kalibriert ist, um den Heißfluss schnell zu verringern. Nach meiner Erfahrung ist es normalerweise am schwierigsten, den Ableitungskoeffizienten zu korrigieren. Wenn Sie jedoch die zwei zusätzlichen Sensoren hätten, würde sich der Hauptausgang genauso schnell ändern wie die Eingangswassertemperatur, also im Grunde genommen augenblicklich, ohne dass das Ableitungselement überhaupt erforderlich wäre.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.