GIT repositories

Index page of all the GIT repositories that are clonable form this server via HTTPS. Übersichtsseite aller GIT-Repositories, die von diesem Server aus über git clone (HTTPS) erreichbar sind.

Services

A bunch of service scripts to convert, analyse and generate data. Ein paar Services zum Konvertieren, Analysieren und Generieren von Daten.

GNU octave web interface

A web interface for GNU Octave, which allows to run scientific calculations from netbooks, tables or smartphones. The interface provides a web form generator for Octave script parameters with pre-validation, automatic script list generation, as well presenting of output text, figures and files in a output HTML page. Ein Webinterface für GNU-Octave, mit dem wissenschaftliche Berechnungen von Netbooks, Tablets oder Smartphones aus durchgeführt werden können. Die Schnittstelle beinhaltet einen Formulargenerator für Octave-Scriptparameter, mit Einheiten und Einfabevalidierung. Textausgabe, Abbildungen und generierte Dateien werden abgefangen und in einer HTML-Seite dem Nutzer als Ergebnis zur Verfügung gestellt.

PID-Regler erklärt

PID controller explained

(I am currently translation translating this to English - give be a bit of time :-) )

I implemented the interactive tuning example here.

Dieser Artikel ist die gewünschte Erklärung für den PID-Regler-Quelltext (hier). Für die Zielgruppe schreibe ich hier im Plauerton und bleibe beim "Du" - also nicht erschrecken...

Die Headerdatei im oben erwähnten Link enthält Makros für einen sog. PID-Regler, wobei P für "Proportionalanteil", I für "Integralanteil" und D für "Differentialanteil" steht. Diese Begriffe kommen aus der Systemtheorie und haben dort (inklusive dem Wort "Regler") besondere Bedeutungen.

Vorweg: Ein interaktives Beispiel für Reglereinstellungen habe ich hier implementiert.

Regler

Ein Regler ist ein "Irgendetwas" (eigentlich die technische Realisierung eines mathematischen Modells bzw. Formel), das dazu dient einen Wert (z.B. die Temperatur) auf einen gewünschten Sollwert einzustellen - und zwar so, dass die Temperatur dann auch stimmt. D.h. man benötigt zum Regeln definitiv eine Möglichkeit die Temperatur zu beeinflussen (eine Ausgabe) und auch eine Möglichkeit sie zu messen (eine Eingabe). Dann kann man die gemessene Eingabetemperatur von der gewollten Solltemperatur subtrahieren und erhält eine Angabe "wie falsch" die Temperatur ist - den Fehler (wir wollen 78º, wir haben 75º, wir liegen 3º daneben und müssen mehr heizen). Genau mit dieser Fehlerangabe arbeitet ein Regler - er versucht den Fehler auszugleichen indem er seine Ausgabe verändert. Mit anderen Worten ist ein Regler ein "Fehler-Ausgleichselement". Der Versuchung das als Bildchen zu zeigen würden wohl viele unterliegen. Als Namen der Werte ist w das, was wir einstellen wollen, e der Fehler, den der Regler als Eingabe bekommt, u der Stellwert, den der Regler ausgibt, und x das, was am Ende dabei herauskommt. Zur Regelstrecke kommen wir gleich. Wichtig ist der Pfeil zurück über die Messung, denn das ist die Rückführung, mit der wir unseren Fehler überhaupt ausrechnen können.

Regler-Struktur

Es gibt die verschiedensten Arten und Konstrukte für Regler, analog elektronische, digitale und auch mechanische. Sie alle haben gemeinsam, dass sie auf Fehler reagieren. Oftmals ist das Verhalten so, dass sie die Ausgabe umso höher "aufdrehen" je weiter man vom Sollwert entfernt ist. Einfachstes Beispiel ist der gleich beschriebene P-Regler. Es gibt zuvor aber noch etwas Generelles zu wissen:

Regelstrecken

Man muss auch eine Idee haben was man regelt, d.h. was an der Ausgabe des Reglers angeschlossen ist. Systemtheoretiker nennen das die Regelstrecke, und die hat ebenfalls ihre eigene Charakteristik. Es macht nämlich einen Unterschied ob die Temperatur im "Bierbottich", die Drehzahl eines Motors, ein Wasserstand oder die Intensität eines Lasers geregelt werden soll. Nicht alle Regler sind für alle Strecken gut geeignet. Im Gegenteil, Regler werden oft für ein Verhalten einer Regelstrecke entworfen. Je besser man die Regelstrecke kennt, desto besser kann man das Modell und die Einstellungen des Reglers anpassen. Beispiele für unterschiedliche Charakteristiken:

  • Zeitverhalten. Bei der Temperaturregelung eines Wasserkessels dauert es bis die Energie, die wir als Strom in die Heizwicklung stecken, als Wärme im Wasser ankommt. Zuerst muss sie durch die Kesselwand, sie verteilt sich, und etwas davon geht in den Raum verloren. Wenn der Regler dieses Verhalten nicht irgendwie mit beachtet heizt er zu viel, und nachher ist der Kessel zu heiß. Wenigstens hat der Kessel die Eigenschaft, die Temperatur kontinuierlich zu ändern und nicht sprunghaft. Und er verändert sein Verhalten kaum - ansonsten müssten wir die Einstellungen des Reglers ständig anpassen.

  • Kann ich dem System Energie entziehen? Bleiben wir bei der Temperaturregelung und vergleichen eine Heizspule mit einem Peltier-Element. Eine Heizspule ist ein Stück Draht, das heiß wird wenn wir Strom durchschicken, und zwar egal ob "rechts- oder linksrum". Wir können mit dem Regler nur Energie hinzufügen, keine wegnehmen. Es macht also keinen Sinn einen Regler mit negativen Stellwerten zu nutzen. Bei einem Peltier-Element sieht das anders aus. Es wird auf der einen Seite warm und auf der anderen kalt. Wenn wir die Spannungsrichtung umkehren können wir kühlen.

  • Totzeit. Das ist die Zeit, die wir warten müssen, "bis überhaupt mal was passiert", bzw. bis wir eine Reaktion sehen. Gutes Beispiel ist eine Zentralheizung. Auch wenn das Wasser im Heizkessel schnell erwärmt wird dauert es eine Zeit bis dieses Wasser durch die Rohre zu meinem Wasserhahn gelangt wenn ich diesen aufdrehe. D.h. eine Temperaturmessung würde erstmal gar keine Reaktion zeigen, auch wenn ich die Heizspule im entfernten Kessel einschalte. Solche Totzeiten können viele Regler überhaupt nicht gut leiden.

  • Lineares System, zeitinvariant?! Hier würde es theoretisch werden, und diese Materie möchte ich ersparen, aber kurz zum Kontext: Um das Streckenmodell darzustellen braucht man einen Satz von Differentialgleichungen bzw. Transformationen aus der mathematischen Trickkiste. Salopp gesagt: Wenn das System linear ist, dann kommen in diesen Formeln keine nichtlinearen Funktionen vor. Keine Wurzel, kein Sinus. Nur plus, minus, mal, geteilt (klingt logisch). Damit lässt sich vergleichsweise gut rechen und so etwas wie eine Lösungsformel herausfinden. Bei nichtlinearen Systemen ist das deutlich "hässlicher", und auch - jetzt kommt's - rechenaufwändiger für einen Prozessor, der das regeln soll. Dummerweise sind die meisten Systeme in der Natur nichtlinear. Deshalb werden (nach guter Ingenieurfasson) hier und da mal ein paar Annahmen gemacht und Sachen aus der Gleichung gestrichen bzw. angenähert. Nun zum zeitvariant: Es heißt praktisch, das das System seine "Einstellungen" ständig ändert und sich daher anders verhält. Das kann zum einen an Umgebungseinflüssen liegen, die das System verändern (ein Ventilator, der kühlen soll und mit der Zeit verstaubt), oder das System selbst hat solche Eigenheiten. Z.B. eine Rakete beschleunigt mit der Zeit schneller, weil sie ihren Treibstoff verbrennt und leichter wird. Für die Regelung zeitinvarianter Systeme gibt es Mittel und Wege, so lange diese Zeitabhängigkeiten einigermaßen vorhersehbar und nicht zu schnell sind. Die Trickkiste der Signalverarbeitung hat dafür Methoden, mit denen sich die aktuellen Eigenschaften des Systems herausfinden lassen. Damit kann man die Regler-Einstellungen auch automatisch anpassen. Aber auch das kostet Rechenzeit - und man muss doch tiefer in diese Materie einsteigen. Am liebnsten sind deshelb zeitinvariante Systeme, da hat man diese Probleme nicht.

Digitaler Regler

Oben bewusst ausgelassen habe ich die Worte analog und digital, und zwar deshalb, weil ein PID-Regler eigentlich ein "analoges Konstrukt" ist, das wir mit Software und Mikroprozessor-Hardware nachäffen. Analog heißt, dass die Ausgabe des Reglers und auch sein Zeitverhalten kontinuierlich sind. Das klingt nicht gerade besonders. Betrachten wir aber einen Mikrocontroller, dann stellen wir fest, dass dieser gar nicht kontinuierlich ist. Egal wie schnell wir unseren ADC (Analog-Digital-Wandler) abfragen, wir bekommen unser Ergebnis immer nur zu bestimmten Zeitpunkten, d.h. wir zerhackstückeln die Zeit schon mal. Kontinuierliche Ein- und Ausgabewerte? Fehlanzeige: Wir bekommen unsere Messwerte als Zahl und die Auflösung unseres ADCs bestimmt wie viel Spannung ein Bit darstellt. Ein halbes Bit bekommen wir nicht. Analog würde gewissermaßen bedeuten, dass wir unendlich viele Bits für Zahlen haben (mit Nachkommastellen versteht sich), und dass wir unendlich schnell den ADC abfragen - und das alles dann auch noch unendlich schnell berechnen können. Nun muss zur Verteidigung erwähnt werden, dass Analogregler auch nicht unendlich schnell sind. Wenn sich Signale zu schnell ändern kommen auch Operationsverstärker nicht mehr mit - aber sie sind kontinuierlich. Nun zum Kern dieses Abschnitts. Es gibt ein paar Grundregeln (mathematischer Natur), die für quasianaloge Regler gelten:

  • Wichtig ist, dass Du den Regler in festen Zeitabständen aufrufst, d.h. mit einer festen Abtastrate: In Systemmodellen spielen vergangene Werte eine große Rolle, egal ob sie im Regleralgorithmus gespeichert werden oder durch Verrechnen versteckt im Ergebnis einer Formel sind. Vergangenheitswerte bestehen aus Wert und Zeit. Der Algorithmus speichert die Zeit dabei (normalerweise) nicht. Er geht davon aus, dass der letzte Takt "1 x Samplezeit" her ist, der davor "2 x Samplezeit" usw. Stimmt die Taktrate (Samplefrequenz) nicht, dann kommt alles durcheinander. Deshalb gibt es bei Mikrocontrollern Timer-Interrupts. Die ISRs (Interrupt Service Routines) werden in festen Zeitabständen aufgerufen.

  • Wichtig ist, dass der Regler (bzw. Eingabe) mindestens doppelt so schnell aufgerufen wird wie die schnellste Änderung deines Messwertes. Das kommt vom sog. Abtasttheorem. Auch hier hat man mathematisch herausgefunden, dass es sonst nicht geht. Die Sache basiert auf der Vorstellung, dass jedes Signal aus vielen Sinuskurven besteht, die man übereinanderlegt (aufaddiert). Die erwähnte "schnellste Änderung" ist die Sinuskurve mit der höchsten Frequenz. Und für eine Sinuskurve eindeutig zu bestimmen muss man (nur) zwei Punkte von ihr kennen. Deshalb müssen wir mindestens zwei mal so schnell abtasten. Das würde allerdings keiner empfehlen; ab drei mal schneller geht's in der Praxis beim Regeln normalerweise los. Man ist lieber ein gutes Stück drüber.

Digitaler PID-Regler

Nun zum PID-Regler und seinen P-, I- und D- Anteilen. Alle drei Komponenten kann man als einzelne Regler betrachten, die überlagert (d.h. zusammenaddiert) werden. Jedes dieser Elemente hat eine Verstärkungskonstante, also einen Gewichtungswert, den wir einstellen, und sein eigenes Zeitverhalten. Setzen wir seine Verstärkung auf 0, so fliegt gewissermaßen sein Buchstabe aus dem Wort "PID" raus (also z.B. PD-Regler oder PI-Regler oder nur P-Regler).

  • P-Regler Ein P-Regler hat nur den Proportionalanteil und er ist nichts weiter als ein Verstärker, d.h. Ausgabe gleich Fehler mal P-Konstante. Je größer die Regelabweichung, desto mehr dreht er auf. Genau dies beschreibt das Diagrammsymbol für einen P-Regler (rechts), wenn man ihn an einen Schalter anschließt, einschaltet und ein Bisschen wartet. Ein Oszilloskop würde dann einfach nur eine waagerechte Linie zeigen. Der P-Anteil bei einem PID-Regler ist bei den meisten Anwendungen der größte. Aber nur mit einem P-Regler werden wir bei vielen Regelstrecken den Fehler nicht vollkommen ausmerzen können, dazu folgende Überlegung: Wir wollen die Geschwindigkeit eines Gleichstrommotors auf 100 RPM regeln. Wenn der Motor steht, gibt der Regler Vollgas, also 100% (ob Strom oder Spannung lassen wir jetzt mal außen vor). Wenn der Motor auf halber Geschwindigkeit ist, ist die Reglerausgabe nur noch 50%, bei 90 RPM Motorgeschwindigkeit nur noch 10%. Schön und gut. Das heißt, dass der Motor immer langsamer auf Touren kommt, weil der Regler immer weniger Gas gibt. Wir nähern uns also erst schnell, dann immer langsamer den 100 RPM, erreichen sie aber nie wirklich. Deshalb schaltet man den I-Anteil hinzu ...

  • I-Regler Ein I-Regler hat nur einen Integralanteil, den wir ebenfalls mit einer Einstellungskonstanten mehr oder weniger verstärken. Er baut seine Ausgabe über die Zeit auf und ab, je nachdem ob die Regelabweichung positiv oder negativ ist, d.h. er reagiert träge. Das Diagrammsymbol zeigt auch hier die Sprungantwort des I-Glieds. Die Ausgabe baut sich über die Zeit linear auf, wenn man am Anfang der Schalter schlagartig von aus auf ein wechselt. Was bedeutet das jetzt? Ganz einfach. Der I-Regler hat einen echten oder im Programm simulierten Energiespeicher. Je größer positive Regelabweichungen werden, desto schneller wird dieser gefüllt, und je größer negative Fehler werden, desto schneller wird er entleert bzw. "negativ" gefüllt (die andere Richtung). Wenn beim P-Regler der Fehler Null wird, dann wird auch seine Ausgabe Null. Wenn beim I-Regler der Fehler Null wird, dann ändert sich die Ausgabe nicht mehr. I-Regler dienen meistens dazu, den Restfehler des neben ihm laufenden P-Reglers auszugleichen. Zu den Nachteilen des I-Reglers gehört in erster Linie, dass er Überschwingen verursachen kann - und dies bei praktischen Anwendungen auch oft tut. Das kommt einfach daher, dass der Regler seinen "Speicher erst einmal wieder abbauen muss", wenn wir den gewünschten Sollwert schon erreicht haben. Denn haben wir den Sollwert gerade überschritten, wird der Regelfehler erst negativ und die Ausgabe wird langsam kleiner; das ganze passiert dann noch mal, wenn er wieder zurück pendelt. Er schwingt sich also auf den korrekten Sollwert (bzw. Fehler gleich Null) ein. Auch hier gibt es ein paar, teilweise recht einfache Tricks, mit denen übermäßiges Einschwingen verhindert werden kann:

    1. Man begrenzt den Integratorspeicher (Kapazität des Energiespeichers). Eine oft genutzte Methode.

    2. Man schaltet ihn erst ein wenn man nicht mehr weit vom Sollwert weg ist, so dass er bei großen Regelabweichungen sich noch nicht groß aufbaut.

    3. Man man belegt den I-Anteil mit einer Eingangskurve (im Programm wäre das eine Funktion oder lookup table).

      Diese Methoden funktionieren oft gut, haben aber auch ihre Tücken, vor allem weil man Regler damit nichtlinear macht. Es kommt auf die Regelstrecke an, ob das immer gut geht (dieses Fass machen wir jetzt aber nicht auf). Kurz gesagt: Begrenzen ist oft eine gute Idee. Hinzuschalten und Kurven sind situationsabhängig und schon ein stärkerer Eingriff ins Gesamtregelsystem.

  • D-Regler Jetzt haben wir den "Normalen" (P-Regler), den "Trägen" (I-Regler), fehlt noch "Der Nervöse" (D-Regler). Dieser reagiert auf zeitliche Änderungen der Regelabweichung, also je schneller sich das Eingabesignal ändert, desto höher schlägt er aus. Hier sind Beispiele für der Anwendung nicht ganz so offensichtlich wie beim P- und I-Anteil. Letztendlich versuchen wir ja mit einem Regler dafür zu sorgen, dass ein Sollwert so schnell, stabil und genau wie möglich erreicht wird. Dazu gleichen wir den gesamten Regler auf die Regelstrecke ab, und bei vielen Anwendungen ist ein D-Anteil hilfreich, schneller ans Ziel zu kommen. Bei anderen Systemen hingegen lässt man ihn ab Besten ganz weg weil er zu "zappelig ist". Auf ein Problem beim D-Regler sei noch hingewiesen: Er reagiert empfindlich auf Signalstörungen, weil diese oft (im Vergleich zur Taktrate) hohe Frequenzen enthalten. Das sorgt beim Differenzieren für ungewollte, hohe Ausschläge. Deshalb werden die Eingabewerte oft vorgefiltert, um diese hohen auszuschließen, und zwar mit einem analogen Tiefpass, der dem Analog-Digitalwandler vorgeschaltet ist, öfter aber mit einem digitalen Tiefpass (z.B. ein "Mittelwertbilder" über die letzten 8 Eingabewerte). Im Algorithmus kann man diese gemittelten Werte dann auch nur dem D-Regler zuspielen, die PI-Anteile bekommen den ungefilterten Fehler und reagieren deshalb schneller. Filter sind eine Materie für eine eigene Seite - streng genommen gehört ein PID-Regler auch zur "Gattung der Filter". Was ich aber hier mit Filter meine sind Tiefpass-Filter, d.h. am Radio die Hoch- und Mitteltöner wegdrehen und der Bass bleibt.

Der Gesamte Regler sieht jetzt also so aus. Rot eingezeichnet habe ich hier die Begrenzung des I-Anteils und den Tiefpass-Vorfilter für den D-Anteil.

PID-Regler

Abgleich

So, jetzt wissen wir um was es geht und wo die Haken und Ösen so liegen. Wenn man erstmals ein System aus Regler und Strecke abgleichen will, dann helfen so manche "altbekannte Vorgehensweisen". Bei vielen geht es dabei darum das Gesamtsystem an die Stabilitätsgrenze zu treiben, sich diese Situation genau anzuschauen und daraus Werte zu berechnen. Hier ist eine einfache Methodik, bei der ein Bisschen mehr nachjustiert werden muss, aber nichts berechnet werden muss. Sie funktioniert bei Stecken die zeitlich träge reagieren.

  1. Den P, I und D vom Regler auf 0 stellen. Die I-Begrenzung voll aufdrehen (falls denn eine da ist).

  2. Erst Mal schauen wie weit man nur mit dem P-Regler kommt, in dem man dessen Verstärkung erhöht. Irgendwann wird das System normalerweise nervös und beginnt zu schwingen. Dann sind wir erstmal zu weit. Wenn man den P-Anteil dann ca. 20% herunter dreht liegt man zum weitermachen erstmal nicht all zu falsch.

  3. Jetzt versuchen wir mit wenig I-Anteil den Sollwert zu erreichen. Der I-Anteil bleibt meistens im Vergleich zum P-Anteil auch später kleiner, vor allem dann, wenn die Taktrate unseres Reglers ein gutes Stück schneller ist als die Reaktionszeit der Strecke.

  4. Überschwinger abfangen: Den I-Anteil begrenzen bis man merkt, dass der Sollwert nicht mehr erreicht wird - dann haben wir gerade die Strecke, die der P-Regler nicht mehr schafft. Diese Begrenzung müssen wir aber wieder ein wenig lockern weil es sein kann, dass der Restfehler des P-Anteils auch mal größer ist.

  5. D-Anteil langsam dabei schalten. Dieser verändert das Verhalten wieder. Auch hier wird das System irgendwann instabil. Wenn wir Signalstörungen haben oder erwarten am Besten ganz weglassen.

Der Feinabgleich bleibt einem selten erspart. Letztendlich muss man meistens einen Kompromiss eingehen:

  • Man kann den Regler "feste anziehen", dass er schnell reagiert. Damit handelt man sich oft ein, dass man über das Ziel erstmal hinausschießt und sich auf den Sollwert einpendelt. Man riskiert auch, dass das System instabil wird wenn sich eine Kleinigkeit ändert. Auch gibt es in der Praxis Anwendungen, bei denen man auf keinen Fall Überschwinger haben will (z.B. zu hohe Temperatur oder über den Zielpunkt Hinausfahren).

  • Oder man kann dafür sorgen, dass der Regler langsamer reagiert und sich dem Sollwert langsam nähert. Damit verliert man dann Zeit - und es kann von der Anwendung her unerwünscht sein.

Es gibt bei solch einem "allgemeinen", oft benutzten Regler auch Grenzen. Dessen sollte man sich auch bewusst sein

Nachträge

Diese Nachträge wegen Rückfragen :-) ...

Programmieren eines digitalen PID-Reglers

In aller Kürze (das Beipiel hier zeigt den entsprechenden C-Quelltext)

  • Der Regler in festen Zeitabständen (ich sage mal T) ausgeführt.

  • P-Regler: Man rechnet pro Takt P_ANTEIL * REGELABWEICHUNG. Mehr ist nicht dabei.

  • I-Anteil: Man hat eine Zwischenvariable I. Darin speichern wir das Integral. Wir rechnen I = I + I_ANTEIL * REGELABWEICHUNG. Wenn wir eine Begrenzung einbauen, ist das die richtige Stelle. Dazu haben wir eine Einstellung (I_SATURATION). Alles, was wir tun müssen ist Wenn I > I_SATURATION dann I = I_SATURATION, und das ganze nochmals negativ. Wo versteckt sich jetzt die Zeit beim Integrieren? --> In der Taktrate des Reglers. Eigentlich rechnen wir implizit so was wie I = I + I_ANTEIL * REGELABWEICHUNG * T. Die feste Zeit T versteckt sich dabei in unserem eingestellten I_ANTEIL. Und wenn wir die Reglertaktrate verdoppeln, dann werden wir feststellen, dass wir auch den I-Anteil um den Faktor zwei verkleinern müssen, weil die Ausgabe des I-Reglers sonst ungewollt doppelt so schnell wächst. Das Prinzip, "Wert mal Zeit" zu rechnen und aufzusummieren ist nicht die einzige Form des Integrierens. Es gibt auch andere Möglichkeiten, z.B. eine Parabel durch die drei letzten Punkte legen und daraus das letzte Flächenstück zu ermitteln (Schlagwort Interpolation). Die einfache Methode funktioniert aber erstaunlich gut und dauert nicht lange beim Rechnen.

  • D-Anteil: Auch hier müssen wir uns merken was vorher so passiert ist - den letzten Wert der Regelabweichung. Ziehen wir diesen ab von der aktuellen Regelabweichung und gehen auch hier davon aus, dass die Zeit-Skalierung in unserer Einstellung D_ANTEIL versteckt ist, rechen wir gewissermaßen "Wert jetzt minus Wert eben geteilt durch Zeit, die zwischen den beiden Werten vergangen ist". Also im Programm D_ANTEIL * (REGELABWEICHUNG - LETZTE_REGELABWEICHUNG).