PID-Regler Grundlagen
EMC beinhaltet einen PID-Regelkreis. Die korrekte Einstellung des Reglers bedarf einiges an Erfahrung und Hintergrundwissen. Hier soll eine praxisorientierte Einführung in die PID-Regler-Thematik von EMC gegeben werden.
Wer nur mit Steppermotoren arbeitet, braucht eigentlich keinen Regler. Denn Schrittmotoren werden ohne Rückführung direkt positioniert. Wer den Regler hierbei umgehen möchte, sollte das Modul steppermod.o anstatt freqmod.o verwenden (emc.ini). An verschiedener Stelle wird jedoch empfohlen, freqmod einzusetzen. Der Vorteil besteht sicherlich darin, dass man über den Regler die Dynamik der Motoren verändern kann. Softwaretechnisch gibt es derzeit auch einen Grund auf freqmod zu setzen - bei den neueren EMC-Images wurde rtai als Realtime-Kernel eingesetzt und hier ist man noch nicht so weit, dass darauf steppermod läuft.
Wer freqmod.o für Schrittmotoren einsetzt oder Servomotoren mit Rückführung, der braucht also den PID-Regler und muss ihn konfigurieren. Ein Spezialfall gibt es bei Servomotoren: Es gibt externe Controller, die wie Schrittmotoren mit Takt/Richtungs-Signalen angesteuert werden. Hier ist ein PID-Regler im externen Controller untergebracht. Benutzt man steppermod, erübrigt sich auch hier die Einstellung des PID-Reglers.
PID-Regler werden bei fast allen Regelaufgaben eingesetzt, ob nun Motorregelung, Temperatur-/Heizungsregelung, Prozess-Regelungen usw. Das Wort Regelung sagt schon, dass man ein geschlossenes System hat (closed-loop), dass der Istwert wieder in die Art des Nachstellens einfließt. Ein Regler ist nicht blind, wie eine Steuerung, die einfach nur etwas verstellt oder ausgibt, ohne eine Rückinfo zu bekommen, was ihr Tun bewirkt. Und oft, wenn man so einen Regelkreis hat, kommen PID-Regler zum Einsatz.
Zum Verständnis der Materie braucht es also Informationen aus folgenden Bereichen:
- was sind generell PID-Regler und wie funktionieren sie
- wie funktionieren PID-Regler im Spezialfall Motorregelung
- wie sind die PID-Funktionalitäten in EMC umgesetzt
Auf alle Fragen soll dieses Dokument zumindest grundlegende Antworten geben. Am wichtigsten sind dabei sicherlich die Infos zu EMC, weil es hierfür bisher wenig Dokumentation gibt. Alles andere lässt sich auch woanders nachlesen und vertiefen.
Warum so ein kompliziertes PID-Gebilde?
Wozu denn alles so kompliziert? Nehmen wir an, wir haben eine Servoanlage. Es sollen z.B. 3 Gleichstrommotoren im Bereich von +-24 V laufen. Auf den Motoren ist ein Inkrementalgeber/Encoder aufgeflanscht, der z.B. 500 Impulse pro Umdrehung liefert. Damit die Regelung auch die Richtung weiß, in der sich der Motor gerade dreht, gibt der Encoder 2 phasenverschobene Rechtecksignale zurück. Kommt Phase A vor B, weiß die Regelung, dass er gerade rechts rum dreht, ist B vor A, ists umgekehrt.
Die Regelung muss nun dafür sorgen, dass der Motor immer dort steht, wo er laut Bahnsteuerung auch stehen soll. Hier ist eine gewisse Positioniergenauigkeit auch wichtig - die Abweichung zwischen Sollposition und Istposition muss möglichst gering sein. Die Abweichung wird übrigens als Schleppfehler oder Following Error berzeichnet.
Nun gut, könnte man in einem ersten Anlauf sagen: Wenn der Motor hinterhertrödelt, dann verpasse ich ihm volle 24 Volt, eilt er voraus, gehe ich auf 0 V zurück. Alle z.B. 1 ms schaut das Programm einfach mal nach, wie es mit der Position des Motors steht und entscheidet dann, ob 0V oder 24V bzw. -24 für die andere Richtung. Was würde passieren?
Der Motor hat eine gewisse mechanische Trägheit. Er folgt nicht sofort. Er würde also erstmal beschleunigen, wenn ich ihn mit 24 V beaufschlage. Nehmen wir an, dass er auch ziemlich hinterhereilte, dann wird er eine ganze Zeit lang beschleunigen. Ist er gerade über dem Sollwert, würde beim nächsten Regelzyklus der Regler den Motor mit 0 V beaufschlagen. Auch jetzt hat der Motor eine Trägheit, er möchte seine Geschwindigkeit beibehalten, wird aber durch die 0 V abgebremst. Das dauert jedoch und inzwischen eilt der Motor ein ganzes Stück voraus. Irgendwann kommt er durch das abbremsen wieder beim Sollwert vorbei und schwingt jetzt in negative Richtung weiter, weil er ja nicht sofort wieder auf die Sollgeschwindigkeit beschleunigt wird. Der Motor würde also mehr oder weniger stark um den Sollwert bzw. umd die Sollgeschwindigkeit schwingen. Es wäre eine sehr unpräzise Regelung, weil der Motor oft recht stark vom Sollwert abweicht. Außerdem würde das zu einem unrunden-schwingenden Motorlauf führen. Auch Resonanzen könnten dadurch entstehen und die Maschine insgesamt zum Schwingen anregen.
Der PID-Regler
Eine erste Idee, dieses Problem zu lösen, war ein P-Regler. P steht für proportional und bedeutet, dass man nicht mehr nur 0 V oder 24 V ausgibt. Man schaut sich vielmehr die Regelabweichung zwischen Soll und Ist an. Je höher die Abweichung, um so höher die ausgegebene Spannung. Damit erreicht man, dass man bei kleinen Abweichungen die Motorspannung auch nur um einen kleinen Betrag anhebt oder absenkt. Der P-Wert gibt dabei an, wie hoch die Verstärkung (Gain) zwischen Ein- und Ausgabesignal ist. Hat P den Wert 100, so bewirkt eine Differenz von Soll - Ist = 10 mV zu einer Ausgangs-Spannungsänderung von 10 mV * 100 = 1V, bzw. in unserem Fall könnte z.B. eine Abweichung von Soll - Ist = 0.01mm zu 0.01 * 100 = 10V führen.
Hier zeigt sich: Wenn Soll = Ist, also keine Regelabweichung da ist, führt das zu einer Ausgangsspannung von 0. P wird in aller Regel wesentlich größer als 1 gewählt. Je größer P gewählt, um so aggressiver oder härter reagiert der Regler auf Abweichungen. Wählt man P zu hoch, so verhält sich so ein Regler, als würde man beim Autofahren auf der Autobahn bei einer kleinen Spurabweichung das Lenkrad stark in die entgegengesetzte Richtung ziehen. Hierbei übersteuert man. Und erschrocken lenkt man vielleicht genauso stark zurück und übersteuert wieder. Das kann bis zum Aufschaukeln des Wagens führen. Ein P-Regler, dessen Verstärkung (P-Faktor) sehr hoch eingestellt ist, entspricht dem oben beschriebenen Zweipunktregler: Kleinste Regelabweichung führen zu +24V bzw. 0V Konstellationen. Dazwischen gibt es nichts.
Ein zu schlaff eingestellter P-Wert reagiert dagegen nicht genügend, was ungefähr dem entspricht, dass man sein Auto bei einer Kurve nicht stark genug einlenkt.
Ein P-Regler ist schonmal wesentlich besser, als unser vorheriger Zweipunkt-Regler. Aber ganz so toll ist er auch noch nicht. Es gibt einige Probleme. Nehmen wir an, der Motor soll mit einer bestimmten Geschwindigkeit laufen, wozu er etwa 11 V braucht. Der P-Wert sei 1000. Damit der Motor seine 11 V erhält, braucht es eine beständige Regelabweichung zwischen Soll und ist, nämlich genau 11 V /1000 = 0.011V bzw. eine andere definierte Einheit wie 0.011 mm Streckenabweichung. Das ist nicht viel aber schön ist das nicht. Bei hohen P-Werten fällt es vielleicht nicht ins Gewicht.
Ein anderes Problem kennt man auch vom Autofahren: Einer kleinen Abweichung vom Fahrweg begegnet man oft besser, in dem man eine kleine schnelle Bewegung in die andere Richtung macht, dann aber wieder fast in die ursprüngliche Lenkrad-Position zurückfällt. In diesem Zusammenhang ist es auch sehr interessant, Rallye-Fahrer mal in ihren Lenkbewegungen zu beobachten.
Wenden wir uns ersterem Problem der beständigen Regelabweichung zu. Hierzu hat jemand Findiges den I-Parameter definiert. Während für P ja nur die Regelabweichung interessant war, spielt für I auch die Zeit eine Rolle. Er summiert nämlich die Regelabweichungen mit jedem Regelzyklus auf und steuert hierüber ebenfalls über eine bestimmte Verstärkung (I-Wert) den Ausgang. Nehmen wir an, wir haben einen reinen I-Regler und einen I-Wert von 100. Der Regler stellt eine Regelabweichung von 0.05 mm fest. Er reagiert darauf mit 0.05 * 100 = 5V. Im nächsten Regelzyklus ist die Abweichung vielleicht noch 0.01 mm. Er reagiert nun mit 5V + 0.01 * 100 = 6V. Im nächsten Regelzyklus ist die Abweichung dann z.B. -0.02 mm. Der Regler reagiert mit 6V + (-0.02 * 100) = 4V. Man kann es sich auch so vorstellen, dass eine konstante Regelabweichung ein lineares Hochlaufen der Ausgangsspannung zur Folge hat. Eine gleichbleibende negative Regelabweichung führt dann wieder zum Herunterlaufen der Ausgangsspannung.
Durch dieses Verhalten braucht ein I-Regler keine permanente Regelabweichung. Nehmen wir das obige Beispiel. Der Motor braucht ungefährt 11 V für eine bestimmte Geschwindigkeit. Wenn der Regler irgendwann bei 11 V angekommen ist, und die Regelabweichung 0 ist, sieht die Rechnung beim nächsten Regelzyklus so aus: 11V + 0.00 * 100 = 11 V. Es bleibt bei den 11 V ohne Regelabweichung. Ist beim nächsten Regelzyklus eine kleine Abweichung von 0.01 vorhanden, geht die Spannung auf 12 V hoch, wenn beim nächsten Regelzyklus dann die Abweichung bei -0.01 ist, geht sie wieder auf 11 V zurück. Der I-Regler pendelt also um die Regelabweichung 0 herum und kann dabei trotzdem Ausgangsspannungen im kompletten Bereich erzeugen. Würde man als reiner I-Regler ein Auto lenken, würde man immer langsam um ein Optimum das Lenkrad hin- und herbewegen.
I steht übrigens für Integral oder integrierend. Er integriert die Regelabweichung weg. P und I kann man nun auch verbinden und gleichzeitig wirksam werden lassen. Die Ausgangswerte summiert man einfach. So könnte bei einer Regelabweichung von 0.01mm und P = 100 und I = 100 die Ausgangsspannung anfangs auf 0.01 * 100 + 0.01 * 100 = 2V gesetzt werden. Bleibt die Regelabweichung auch beim nächsten Zyklus, ergibt sich für P derselbe Wert, I dagegen integriert rauf: 0.01 * 100 + (1 + 0.01 * 100) = 3V. Man könnte den I-Regler hier auch so begreifen: "Wenn die Regelabweichung bleibt, dann reagiere ich beständig stärker."
Ich nutze solche Bilder immer wieder, weil es wichtig ist, einen PID-Regler wirklich zu begreifen, sich eine innere Vorstellung davon machen zu können und es nicht nur theoretisch abstrakt nachvollziehen und berechnen zu können. Wer einen Regler einstellen möchte, muss erspüren können, was es braucht und dazu braucht es innere Bilder und Vorstellungen. Es geht nicht um Wisssen, sondern um be-greifen. Natürlich führen auch viele Versuche und Praxiserfahrung zu genau diesem Begreifen. Wenn Vorstellung und Beobachtung widerspruchsfrei sind, dann hat man es verstanden (insofern man nicht verzerrt beobachtet).
Bleibt als Letztes der D-Wert. Der D-Wert ist das kurze aber energischere Ziehen am Lenkrad, wenn eine kleine Abweichung erkannt wird. Genaugenommen geht die Änderungsgeschwindigkeit der Regelabweichung über eine Verstärkung in das Ausgangssignal ein. Ein Sprung im Soll führt damit immer zu einer unendlich großen Veränderung der Ausgangsspannung, real natürlich nur bis zum Maximalwert. Bleibt im nächsten Regelzyklus die Regelabweichung konstant, ist die Veränderungsgeschwindigkeit 0 und damit ist die Ausgabe von D auch wieder 0. D mischt sich sozusagen immer dann ein, wenn sich die Regelabweichung verändert. Und dann in dem Maße, wie stark die Veränderungsgeschwindigkeit bzw. die Beschleunigung der Regelabweichung ist. Hohe Beschleunigungen der Regelabweichung führen zu hohen D-Werten. Bei Motoren macht sowas durchaus Sinn, damit man ihnen bei Regelabweichungen sozusagen einen gehörigen Anfangsschubs verpasst. Jedoch nicht zuviel des Guten, sonst überschwingen sie nämlich. D steht im übrigen für Differenzial.
Umgedreht wirkt D auch dämpfend. Nehmen wir wieder einen Sprung des Sollwerts. D beschleunigt den Motor sofort stark. Die Drehzahl des Motors steigt also stark an. Gleichzeitig wird die Regelabweichung fortlaufend geringer, pro Zeiteinheit immer schneller. Damit greift D jetzt in umgedrehter Richtung ein, stellt sich also gegen den P-Wert (Abweichung noch positiv, Änderungsgeschwindigkeit der Regelabweichung jedoch negativ). Genauso wie also D für ein schnelles Beschleunigen bei ansteigenden Regelabweichungen sorgt, sorgt es für ein abbremsen, wenn die Regelabweichung geringer wird. Und zwar in dem Maße, wie groß die Änderungsgeschwindigkeit ist. Einen Regler mit hohem P-Wert kann man mit einem erhöhten D-Wert also gut dämpfen und damit Überschwinger oder Schwingverhalten kompensieren. Wegen des dämpfenden Charakters von D bezeichnet man ihn auch manchmal als "Damping".
Interessant ist auch der Vergleich zwischen I und D. I reagiert auf Sprünge erstmal überhaupt nicht sondern baut sich gemächlich auf. D reagiert sofort und ist dann wieder schnell verschwunden. I verhält sich wie eine Schwungmasse, die erst langsam in Bewegung kommen muss und dann auch wieder länger braucht, um diese Bewegung herunterzufahren. I ist träge. D nicht. D ist sprunghaft und kann sofort reagieren. I kann man kommen sehen, D ist schon da, bevor man es begreift. D ist das Krokodil, was zuschnappt, I der Elefant, der langsam in Bewegung kommt.
An einem Roboterarm kann man das schön beobachten. Drückt man diesen mit etwas Kraft aus einer bestehenden (geregelten) Position raus, würde I mit immer größer werdender Kraft versuchen, mich zurückzudrücken, um Ist und Soll wieder anzugleichen. Ein großer D-Wert dagegen würde auf einen kleinen Schubs meinerseits sofort mir den Roboterarm entgegenschleudern. Ein P-Wert dagegen würde einfach mit einer Kraft entgegenwirken, die um so größer ist, je weiter ich den Arm aus der Soll-Position drücke.
Noch eine Anmerkung zum Spezialfall Motorsteuerung und I-Wert: Ein Motor hat auch schon integrierende Wirkung, wenn man die Position als Regelgröße nimmt und nicht die Motordrehzahl. Hat man z.B. einen zu kleinen P-Wert eingestellt und hat einen reinen P-Regler, würde ein beträchtliche Regelabweichung übrigbleiben, was die Drehzahl angeht. Bei der Position als Regelgröße ist das anders. Der Motor verfährt ja auch mit kleinen Spannungen in die richtige Richtung und kommt irgendwann genau dort an, wohin er soll. Nur eben etwas verspätet. Damit hat der Motor eine integrierende Wirkung.
Soviel zu P, I und D. EMC hat jedoch noch eine weitere Überraschung: FF0, FF1 und FF2 beziehungsweise "Position Feedforward Gain", "Velocity Feedforward Gain" und "Acceleration Feedforward Gain". Dies ist keine Erfindung von EMC sondern auch wieder, wie PID, ein allgemeingültiges Verfahren.
Motorregelungs-Designer waren nämlich noch nicht zufrieden mit den Ergebnissen, die so ein PID-Regler bringt. Sie wollten, dass der Regler noch schneller reagiert und damit Schleppfehler minimiert werden. Ein Regler kann ja erst dann reagieren, wenn ein Schleppfehler auftritt. Es gibt aber Situationen, da könnte man eigentlich schon früher reagieren und damit Schleppfehler minimieren.
Solch eine Situation wäre diese: Der Motor läuft mit einer konstanten Geschwindigkeit, die durch Soll vorgegeben ist. Dann macht Soll einen Sprung auf eine höhere Geschwindigkeit. Zum Zeitpunkt dieses Sprunges wäre eigentlich schon klar: Der Motor braucht eine höhere Spannung. Der Regler weiß aber noch nichts davon, weil erst beim nächsten Regelzyklus die Abweichung bemerkt und dann reagiert wird. Die Idee ist nun, vorbei am Regler solche Sprünge direkt am Ausgang wirksam lassen zu werden. Sozusagen eine direkte Weitergabe der Solländerung hin zum Ausgang. Springt z.B. die Sollgeschwindigkeit um 10%, werden zusätzlich 2 V zum Ausgang geschickt. Genau das macht FF1 bzw. "Velocity Feedforward Gain". Hier wird die Soll-Geschwindigkeit mit einer Verstärkung (FF1-Wert) zum Ausgang geleitet und dort zu den PID-Werten addiert.
FF2 oder "Accelaration Feedforward Gain" gibt die Änderungsgeschwindigkeit des Sollwertes zum Ausgang und verhält sich damit ähnlich wie der D-Parameter.
FF0 macht bei normalen Motorregelungen wenig Sinn. Hier wird die absolute Position einer Achse über eine Verstärkung (FF0-Wert) zum Ausgang geleitet. Das bedeutet also, wenn eine Achse auf 0 steht, ist dieser Wert 0. Ist die Achse weit verfahren, wird ein hoher Wert auf den Ausgang geschickt. Würde man P,I,D,FF1,FF2 alle auf null setzen und nur FF0 z.B. auf 1, dann würde die Achse von alleine immer schneller fahren, sobald man sie einmal von Null herausbewegt.
Noch ein Wort zu Schleppfehlern. Schleppfehler gibt es immer, weil ein Regler immer um den Sollwert herumpendelt. Schleppfehler sollten möglichst klein bleiben. Bei EMC kann man einen maximalen Schleppfehler festlegen (FERROR). Wird dieser überschritten, stoppt die Maschine. Wenn man mit dem Regler spielt und ihn austestet, ist es günstig, FERROR möglichst hoch zu setzen, damit die Maschine bei nicht optimalen Werten nicht sofort mit einem Following Error aussteigt. Im Backplot kann man gut sehen, was am Reglerausgang wirklich ankommt. Auch kann man das Display von "commanded" auf "actual" umschalten und so Soll und Ist im Auge behalten.
Spezialfall freqmod.o
Das Schrittmotormodul freqmod.o ist ja ein Spezialfall eines Reglers. Wir haben ja kein wirkliches Feedback. Und trotzdem wird ein interner geschlossener Regelkreis (Closed-Loop) erzeugt. Es wird einfach das Ausgangssignal auf den Eingang zurückgekoppelt.
Damit das richtig funktioniert, muss INPUT_SCALE und OUTPUT_SCALE identisch gewählt werden. Dies deshalb, weil ja die Steps des Ausgangssignals direkt 1:1 zurückgekoppelt werden. EMC lässt zwar andere Werte zu, damit funktioniert aber die Regelung nicht mehr sauber.
Warum auch die MAX_OUTPUT und MIN_OUTPUT in Volt eingestellt werden muss, wird klar, wenn man sich den Code betrachtet. Hier benutzt freqmod.o große Teile fast unverändert, die für ein echtes Loopback für Servomotoren verwendet werden. Zu kleine Werte für MAX_OUTPUT und MIN_OUTPUT führen dazu, dass eine maximale Takt-Ausgabefrequenz nicht überschritten werden kann und es damit Following-Errors gibt, sobald man schneller verfahren möchte. Werte von 100-500 V haben sich als sinnvoll erwiesen. Man könnte hier sicherlich noch weiter forschen, um die genauen Zusammenhänge zu verstehen.
Konfigurationsdetails lassen sich unter EMC/KonfigStepper nachlesen.
Beim experimentieren kam mir (WinfriedMueller) folgende Idee: Wenn ich alle Reglerparameter auf 0 stelle und nur FF1 auf genau 1, dann müsste ich damit den Regler eliminiert haben und der Ausgang folgt genau dem Sollwert. Denn mit FF1=1 wird ja festgelegt, dass die Sollgeschwindigkeit genau auf den Ausgang gekoppelt werden soll. So halb funktioniert das tatsächlich, allerdings gibt es noch Following Errors, wenn man FERROR zu klein wählt. Hiermit könnte man aber weiter experimentieren. Es hat sich auch empirisch herausgestellt, dass im konkreten Versuch ein FF1 Wert von 1.3 und einem P-Wert von 200-1000 die Following Errors minimiert.
Optimale Werte für P, I, D, FF0, FF1, FF2 zu finden, die vielleicht auch allgemeingültig formuliert werden können - das ist noch ein weites Betätigungsfeld. Hier wäre es gut, wenn jeder seine Ergebnisse hier veröffentlichen könnte. Auch das Original-Handbuch geht ja diesen Weg - mehrere Nutzer, die von ihren Erfahrungen berichten.
Folgendes lässt sich jedoch schonmal sagen:
- FF0 sollte immer auf Null stehen
- Bei FF1 scheinen Werte zwischen 0 und 1.5 recht brauchbare Ergebnisse zu liefern
- Bei P waren Werte von 100-1000 sinnvoll. Das kann jedoch bei anderen Maschinendaten variieren. Auf jeden Fall sollte P wesentlich größer als 1 gewählt werden.
-> Es kommt immer darauf an. P ist ja der Verstärkungsfaktor der Fehlergröße die der Steuergröße abgezogen wird. Hier habe ich eine Maschiene mit servopneumatischen Schienen, die eine niedrige Verstärkung brauchen. In diesem konkreten Fall ist P = 2 !!! Am einfachsten I und D auf Null setzen und dann P stück für Stück hochdrehen. Reagiert der Aktor in entgegengesetzter Richtung ist P zu groß, schießt der Aktor über das Ziel hinaus, ist P zu klein. Hier eignet sich ein Vorgehen nach logarithmischer Skala.
- Wer das Beschleunigungsverhalten der Motoren verändern will, muss mit den Werten FF2 und D experimentieren.
- P und D sollten immer zusammenhängend verändert werden: Erhöhte P-Werte brauchen erhöhte D-Werte. Schwingt der Regler, sollte ein höherer D-Wert abhelfen.
- über die Verwendung von I gibt es noch wenig Erfahrungen