Regelung optimieren

Moin,

habe gerade ein Problem, welches vielleicht doch nicht so einfach ist, wie zuerst gedacht. Ich muss zur Erklärung leider etwas ausholen:

Gegeben ist eine Steuerung für einen Positionierantrieb. In dieser sind viele Parameter einstellbar. Einstellung erfolgt per Software, alles programmierbar.

Im normalen Ablauf gibt der Anwender den Befehl, dass der Antrieb auf Position X fahren soll.

Der erste Block des Steuergerätes errechnet daraus (unter Berücksichtigung von maximaler Beschleunigung und Geschwindigkeit) welches Profil der Motor dazu fahren muss: zu welchem Zeitpunkt er welche Geschwindigkeit, Beschleunigung und Position haben muss.

Diese Werte, also a_s, v_s und p_s (_s = Soll) gehen auf den Motorregler.

Dieser errechnet aus diesen Werten und der gemessenen Ist-Position eine Motorspannung.

Der Regler hat einen Block in den der Positionsfehler eingeht. Dieser Fehler wird über ein P, D und I-Glied mit jeweils einstellbaren Koeffizienten auf die Motorspannung gegeben.

Ein anderer Block bekommt die Soll-Geschwindigkeit und Beschleunigung. Über einstellbare Koeffizienten werden diese ebenso auf die Motorspannung addiert. Darüber hinaus kommt noch ein Gleichspannungs-Bias mit drauf (natürlich einstellbar), mit dem sich die Schwerkraft kompensieren lässt (falls der Motor vertikal fahren muss).

Nun dachte ich mir, ich mache mit dem Antrieb einfach Testfahrten und messe den maximalen Positionsfehler während der Fahrt. Den gebe ich auf ein Optimierungsprogramm und lasse die Koeffizienten so lange variieren, bis das Ergebnis optimal ist.

Mir dämmert aber, dass es so eine optimale Lösung garnicht gibt.

Ich möchte erreichen, dass die maximal vorkommende Abweichung zwischen Soll- und Istposition während der Fahrt minimiert wird. Hat jemand eine Idee, mit welcher Prozedur ich die optimalen Reglerparameter herausfinden kann?

Das Problem ist, dass allein schon optimal angepasste Koeffizienten für die Geschwindigkeit und Beschleunigung auf die Motorspannung im Idealfall den Antrieb fehlerfrei steuern können, der PID-Regler wäre im Idealfall überflüssig. Wie finde ich optimale Koeffizienten für einen Regler heraus, der überflüssig ist?

Zur Erläuterung noch mal:

+------(d/dt)---(*Kd)---+ | v P_s->---O------+---------(*Kp)---------O---O----O----O->U_motor ^- | ^ ^ ^ ^ P_i | +---(int dt)--(*Ki)-----+ | | | | | | | | | | Bias Ist-Position | v_s*Kvs a_s*Kas

P_s=Soll-Position, P_i=Ist-Position, a_s*K_as=Soll-Beschleunigung mal Koeffizient, v_s*K_vs=Soll-Geschwindigkeit*Koeffizient, Bias=Gleichspannung zum Ausgleich von Schwerkraft o.ä.

Für die einstellbaren Koeffizienten Kp, Ki, Kd, Kas, Kvs und Bias würde ich gerne optimale Werte finden.

Wie geht man vor? Sollte ich erstmal Kas, Kvs und Bias auf Null setzen und den Regler (Kd, Ki, Kp) optimmieren? Dann Ki, Kp, Kd auf Null setzen und dide anderen Koeffizienten optimieren und dann am Ende alle Werte auf die gefundenen Optima setzen? Oder ist das dann doppelt gemoppelt und damit sehr schlecht?

CU Rollo

Reply to
Roland Damm
Loading thread data ...

X-No-Archive: Yes

begin quoting, Roland Damm schrieb:

Ist das denn nun schon ein Regler, oder was? Wohl nicht, hier wird offenbar nur eine Steuerkurve errechnet.

(Das war jetzt Block 1.)

(Das nennen wir Motorregler.)

Das habe ich nicht verstanden - wie unterscheidet sich das denn nun von Block 1? Dieser Block X scheint doch genau dasselbe zu tun wie der Motorregler, bis auf den zusätzlichen Gleichwert (den eigentlich auch Block 1 bereitstellen können sollte).

Wieso nicht? Ein Optimierungskriterium könnte sein, die Sollposition in der kürzesten Zeit anzufahren - andere sind denkbar. (Ggf. sind Nebenbedingungen einzuhalten wie das Anfahren von Zwischenpunkten oder das Einhalten eines maximalen Abweichungsbands von einer Sollkurve, etwa, um Kollisionen durch Überschwingen zu vermeiden. Die "Zwischenpositionen" könnte man so behandeln, daß man sie der Reihe nach als Sollpositionen benutzt.)

Letzteres etwas ausgeführt: Die Zwischenpunkte sollen nicht wirklich angefahren werden, sondern sind sozusagen nur "Landmarken". Daher sollte man die Fehlerdefinition modifizieren: In der Position P_(i-1) ist der relevante Fehler die Positionsabweichung zur Sollbahn auf dem Weg zum Punkt P_i, je weiter sich der Abstand zu P_i während der Fahrt reduziert, desto mehr wird die Gewichtung des Positionsfehlers reduziert und dafür die Abweichung von der Sollgeschwindigkeit beim Durchfahren von P_i, die sich aus der Sollbahn zu P_(i+1) ergibt, stärker gewichtet (ob nun jeweils linear, müßte man sich überlegen).

Das ist nicht unbedingt gut: Wenn man beim Moppedfahren ein paar Zentimeter neben der Ideallinie liegt, besteht kein Anlaß, die Maschine "mit Gewalt" seitlich zu versetzen, vielmehr sollte sich die Fahrlinie der Sollbahn einige zehn Meter voraus anschmiegen. Ich würde die Istbahn ein geeignetes Stück voraus projizieren und dann die geschätzte Sollwertabweichung dort minimieren.

Durch geeignete Störgrößenaufschaltung.

"Doppelt gemoppelt" wäre wegen des Blocks X möglich. Ansonsten sehe ich es so: Block 1 stellt die (ggf. nichtlineare) Steuerkurve bereit, der Regler beseitigt dann die verbleibenden Fehler im linearen Bereich. Ich würde den Regler erst einmal ausschalten und die Steuerungsparameter optimieren (wobei die Koeffizienten wohl nicht unbedingt eindeutig sein werden, sondern von Start- und Zielkoordinaten abhängen können), dann würde ich den Regler zuschalten, ein Störrauschen geringer Amplitude auf dessen Eingang geben und den Regler optimieren.

Gruß aus Bremen Ralf

Reply to
Ralf Kusmierz

Moin,

Ralf Kusmierz schrub:

Nennen wir es mal den Steuerblock. An diesem will ich nichts ändern, die Sollwerte die der liefert sind gut und sollen genau so sein, wie sie sind.

Tcha, wie soll ich das sagen. NAch dem Steuerblock gibt es einen Block, der diese Sollwerte in eine Motorspannung umrechnet. Diesen Block kann man wieder in zwei Teile aufteilen. Der erste Teil ist eine Steuerung also ohne Rückkopplung und rechnet die Motorspannung zu: U=v_s*kvs+a_s*Kas+Bias

Der Regler-Teil bekommt als Eingang nur den Positionsfehler, also Istposition - Sollposition die vom Steuerblock geliefert wird. Dieser Positionsfehler wird parallel den P, I und D-Strängen zugeführt, je mit einem Koeffizienten multipliziert und die Ergebnisse wieder summiert - und dann auf die oben erwähnte Motorspannung draufgeschlagen.

Da habert's schon: Es soll ja eben nicht die Zielposition in kürzest möglicher Zeit angefahren werden, sondern sie soll exakt so angefahren werden, wie der Steuerblock dieses ausrechnet.

Hintergrund: Ich habe zwei solcher Antriebe und muss beide so ansteuern, dass sie zusammen sauber eine Diagonale fahren. Dazu müssen sich beide Antriebe möglichst exakt an die Sollbahn halten. Leider ermöglicht das Steuergerät (in seiner gesamtheit gesehen) keinerlei Kopplung zwischen den Motoren mit der man dieses Problem beheben könnte.

Zwischenpunkte sind in meinem Fall _alle_ Punkte, über die der Motor fährt. Ich werde in einer Endlosschleife ständig die Abweichung zwischen Ist-Position und Sollposition (nach Steuerblock) auslesen und z.B. Fehlerquadrate mitteln oder das Maximum notieren.

Passt nicht so ganz auf mein Problem.

Ich würde aber gerne die gesamte Fahrt von A nach B betrachten und die Qualität des Mopedfahrers danach beurteilen, wie weit er im Mittle oder im Maximum von der Sollbahn abgewichen ist.

P_s->---O------+---------(*Kp)---------O---O----O----O->U_motor

Störgröße: Ich könnte dem Steuergerät eine quasi unendliche Motorgeschwindigkeit und Beschleunigung erlaufen und dann den Antrieb ein Stück fahren lassen. Die Positionssollwerte werden dann in extrem kurzer Zeit quasi springen, viel schneller als der Motor folgen kann. In dieser Situation kann ich jetzt versuchen die Reglerparameter Ki, Kd, Kp so zu optimieren, dass der Sprung im Positionsfehler möglichst schnell ausgeregelt wird, eventuell Überschwinger beachten und vermeiden, ... halt was sinnvoll erscheint. Ja, das wäre ein Plan. Wärend dieser Tests sollte ich Ka, Kv, Bias auf Null setzen, damit nur der Regler Einfluss nimmt.

Alle 6 Koeffizienten im Block optimieren ist deiner Meinung nach wohl nicht so gut, weil sie sich garnicht sauber getrennt voneinander auswirken? Mir ging das durch den Kopf, als mit auffiel, dass ein falsch eingestellter Bias problemlos vom I-Regler kompensiert werden kann. Wollte ich also den Bias richtig einstellen, müsste ich den I-Regler ausschalten. Wenn ich jedoch den I-Regler ausschalte, habe ich andere Probleme, denn dann ist nicht mehr Sichergestellt, dass der Antrieb tatsächlich irgendwann die Zielposition erreicht, der Antrieb fährt in den Anschlag, das Programm stürzt ab...:-/

Sieht alles nach einer Menge Handarbeit aus.

CU Rollo

Reply to
Roland Damm

"Roland Damm" schrieb im Newsbeitrag news:47115f21$0$7686$ snipped-for-privacy@newsspool2.arcor-online.net...

Vestehen kann man das nur über ein mathematisches Modell, ähnlich zu Deinem Problem:

formatting link
1

Annahme Störgrößen

z1=0 z2=0

Übergangsfunktion Equ.1 kann durch Messung f(t) ermittelt werden. Die Koeffizienten der Differentialgleichung sind

A1 (v_s), A2 (a_s) => feedforward

Equ.2 zeigt die Aufschaltung der von Dir genannten Signale.

Eine sprungförmige Sollwertänderung w ist üblich, muß aber intern gedämpft (u) aufgeschaltet werden (Equ.3).

Der PID-Regler arbeitet feedback und korrigiert verbleibende Fehler e.

Schaltet man zusätzlich Störgrößen (z1, z2) dynamisch unter Beachtung einer bekannten Übergangsfunktion auf, kann man beste Regelergebnisse erzielen (Seite 2, u ~= v1).

Eine klare Aufgabenstellung wäre z.B. eine Bechmark-Test zu definieren (Seite 2, u=Target) und Geschwindigkeit v1' und Beschleunigung v1'' zu ermitteln. Damit kann man die aufzubringenden Kräfte (m * v1'' + Reibung) abschätzen.

Ohne Störgrößenaufschaltung erhält man Ergebnisse wie auf Seite 5 gezeigt, d.h. z1 und z2 vorhanden, aber nicht aufgeschaltet. Eine Optimierung kann bei Simulation (off-line) durch ein ITAE-Kriterium erfolgen.

Eine Berechnung aller Parameter ist möglich, wenn die Anlagen-Übergangsfunktion bekannt ist. Ist die Anlagen-Übergangsfunktion nicht bekannt, hilft nur probieren.

Beispiel (Dfgl 3. Ordnung) für Bestimmung der Anlagen-Übergangsfunktion:

formatting link

Reply to
JCH

X-No-Archive: Yes

begin quoting, Roland Damm schrieb:

Ja gut, klingt vernünftig.

Gut, dann wäre als Optimum in der Tat das Minimum der aufintegrierten quadrierten Positionsfehler denkbar. (Leider hat dann jede Sollbahn ihr eigenes Optimum.)

Kann man machen.

Doch, schon, ergibt sich aber fast automatisch "von selbst" dabei.

Das funktioniert aber nur im nachhinein und ist kein Auslegungskriterium für eine gute Reglerstrategie.

Nö, ich würde die letzten drei optimal lassen (also zuerst bei ausgeschaltetem Regler optimieren) und dabei dann einfach nur Störungen auf den Reglereingang aufschalten (Rauschen, Sprünge und Rampen) und die Reglerparameter so einstellen, daß er die "gestörte" Bahn möglichst optimiert, also die Eingangsgröße optimal wegregelt.

Nein, das sollte eigentlich nicht passieren. Ohne den Regler, also rein über die Steuerung, sollte sich die Sollbahn schon ziemlich genau nachfahren lassen. Der Regler wäre dann nur noch für die "kleinen Abweichungen" zuständig. Vielleicht ist ein Bug im Steuerblock: Der darf natürlich nicht bei einem "irrigen Glauben" über eine "angenommene Ist-Position" bleiben, sondern muß schon die (veränderliche) "wahre Ist-Position" zur Kenntnis nehmen und daraus kontinuierlich neue Steuerbefehle errechnen.

Eigentlich nicht. Ich sehe einen Konzeptionsfehler im Regler: Zwar ist die Regelgröße die Positionsabweichung, aber man hat wohl veränderliche Streckenparameter wegen der variablen Geschwindigkeiten vorliegen. Günstiger wäre es deswegen, eine mehrdimensionale Regelgröße, bestehend aus dem Positions- und dem Geschwindigkeitsvektor, zu betrachten und zu regeln. Das würde darauf hinauslaufen, zu dem D-Zweig noch einen D^2-Zweig parallelzuschalten.

Stimmt das?

Nehmen wir mal ein kurzes Bahnstück, das ausgehend von der Position P_(i-1) mit der Anfangsgeschwindigkeit v_(i-1) und der konstanten Beschleunigung a in der Zeit Dt durchlaufen werden soll. Wir haben also

P_i = P_(i-1) + v_(i-1) * Dt + a * Dt^2 / 2 und v_i = v_(i-1) + a * Dt

Offenbar ist das Problem unlösbar: a kann entweder so gewählt werden, daß P_i oder v_i erreicht werden, nicht zwangsläufig beides zugleich. Also braucht man als einfachsten Steuerungsansatz eine kubische Bahnkurve und muß d/dt a als (abschnittsweise) Konstante vorgeben.

(Falls Dich das D^2-Glied im Regler graust, kannst Du auch einfach dv als Regelgröße ansehen und die Positionsausreglung dann über ein (gutmütiges) I^2-Glied vornehmen.)

Hier wären jetzt vielleicht ein paar Leistungsbetrachtungen angebracht:

Der Motor hat eine Geschwindigkeit, die durch die Gegen-EMK E leidlich linear repräsentiert wird, und eine Leistung, die aus

P = E*I = k*v*F

(E~v, I~F) folgt, wobei die anzulegende Spannung durch

U = R*I + E = k1*F + k2*v

dargestellt werden kann (k1, k2 Antriebskonstanten).

Um die infinitesimale Sollbahn

P(t) = P_(i-1) + v_(i-1)*t + a_(i-1)*t^2/2 + d/dt a_(i-1)*t^3/6

zu fahren, muß die Kraft

F(t) = F_(i-1) + k * [a_(i-1) + d/dt a_(i-1)*t]

und die Geschwindigkeit

v(t) = v_(i-1) + a_(i-1)*t + d/dt a_(i-1)*t^2/2

angewendet werden, also benötigt der Motor die Spannung

U(t) = k1*F(t) + k2*v(t) = k1*(F_(i-1) + k * [a_(i-1) + d/dt a_(i-1)*t]) + k2*(v_(i-1) + a_(i-1)*t + d/dt a_(i-1)*t^2/2) = k1*[F_(i-1) + k * a_(i-1)] + k2*v_(i-1) + [k1*k*d/dt a_(i-1) + k2*a_(i-1)] * t + k2*d/dt a_(i-1) * t^2/2

Die Motorspannung ändert sich also schon im einfachsten Fall für die Steuerung eines kurzen Bahnabschnitts quadratisch mit der Zeit, wenn man von der einfachsten Annahme einer konstanten Beschleunigungsänderung, also einem zeitlinearen Beschleunigungsverlauf, ausgeht. (Ich hoffe, daß der Steuerblock das weiß und kann.)

Eine Störung wäre offensichtlich ein Fehler dU in U. Wie wirken sich abweichende Motorspannungen auf die Sollbahn aus? Eine um dU zu hohe Spannung bewirkt offenbar einen zusätzlichen Strom

dI = dU / R,

der wegen

dU = R * dI = k1 * dF und dF = k * da

eine Zusatzbeschleunigung

da = dF / k = dU / (k*k1)

bewirkt, die einen Positionsfehler

dP = da/2 * dt^2 = dU * Dt^2/(2*k*k1)

und einen Geschwindigkeitsfehler

dv = da * dt = dU * Dt/(k*k1)

hervorruft - na gut, alles erfreulich linear, mit konstanten Koeffizienten.

Aber hier haben wir möglicherweise das Problem, daß die Ausregelung von Positions- und Geschwindigkeitsfehlern in Konflikt miteinander stehen: Eine schnelle Ausregelung eines Positionsfehlers führt zu einem großen Geschwindigkeitsfehler, und umgekehrt.

Und hier müßte man dann Kompromisse machen, was dann zu variablen Reglerkoeffizienten führt, wenn man den Vorrang der Positions- oder Geschwindigkeitsregelung von der jeweiligen Größe der Regelabweichung abhängig machen will.

Viel Spaß, würde ich sagen - derzeit scheinst Du bzgl. der Geschwindigkeit als Regelgröße einen PI^2-Regler vorliegen zu haben. (Reicht das nicht?)

Gruß aus Bremen Ralf

Reply to
Ralf Kusmierz

Moin,

Ralf Kusmierz schrub:

Ich mache jede Menge Testfahren und ermittle den besten Fahrer - und den setze ich dann im Rennen ein, sozusagen. Im Nachhinein ist in Ordnung.

Das wäre jetzt schade, wenn das stimmt.

Hmm, wie mache ich das nur... Ich kann dem Steuergerät nur eine neue Zielposition übermitteln, worauf hin dieses dann die Bahn (das Geschwindigkeitsprofil) einmalig berechnet und abfährt.

Ich hab nur rein praktisch das Problem, dass die Bewegung des Antriebs erst dann als abgeschlossen angesehen wird, wenn die Zielposition genau genug erreicht ist. Wenn sie aber nie erreicht wird, dann warte ich ewig darauf - oder ich muss an meinem Programm noch einiges umstricken und komplizierter machen, was ich gerne vermeiden wollte.

Nein, der misst schon noch die wahre Position. Nur ganz ohne I-Glied wird der Fehler bein Anfahren der Zielposition nie zu Null.

Hmm... Ein P-Regler allein fährt asymptotisch die richtige Zielposition an (nach einem Positionssprung), behält bei konstanter Geschwindigkeit einen Schleppfehler der Position bei (es bleibt ein stationärer Fehler) und bei Beschleunigung vergrößert sich der Fehler stetig. Ein D-Regler würde bei konstanter Geschwindigkeit einen stationären Schleppfehler in der Geschwindigkeit erreichen... nee, jetzt habe ich mich verfranst.

Ich krieg's jetzt nicht zusammen, aber ich denke du hast recht. Nur nutzt das nichts: Position und Geschwindigkeit und alles ist in Einheiten von Zeitschritten und Motorschritten, die ganze Regelung funktioniert mit reiner Ganzzahlarithmetik. So ein diskretisiertes Signal ein mal ableiten geht noch mit Augen zudrücken, aber nach der zweiten Ableitung hat man nur noch Diskretisierungsrauschen. Klar kann man das filtern, aber dann ist die Pointe hin, weil ein Filter das Ergebnis wieder träge macht.

Also an der Reglerstruktur werde ich bestimmt nicht herumbasteln, es handelt sich um eine fertige PCI-Steckkarte die ungefair ganz viel kostet (sagt dir PI was?).

Das Steuergerät gibt an den Motor eine Gleichspannung, diese wird im 'Motor' (genauer in dessen eingebauter Elektronik, der Motor hat ein eigenes Netzteil) verstärkt. Ich denke daher, ich kann vom Motor beliebiges verlangen, ohne dass er kaputt geht. Leistung ist mir daher eher egal. Aber gut...

U:Spannung, F:Kraft, v:Geschwindigkeit - richtig? Gut....

Nee, der Steuerblock erzeugt nur konstante Beschleunigungen, entweder a_max, 0 oder -a_max.

Von der Größe sollte es erst abhängen, wenn nichtlineare Effekte ins Spiel kommen. Die gibt es zweifellos im realen System, aber in dieser Rechnung noch nicht.

Ich denke schon das das reicht. Was mich irritiert ist eher, dass das Regel/Steuersystem zu viele Freiheitsgrade hat.

Aber gut, mir ist inzwischen klar geworden, dass wenn die feed-forward's, also die direkten Durchgriffe von Soll-Beschleunigung und Soll-Geschwindigkeit auf die Spannung perfekt abgestimmt sind, dass dann im Idealfall garkein Positionsfehler mehr auftritt und der Regler wirkungslos bleibt. Der Regler dient also nur dazu, die Abweichungen zwischen idealisiertem Modell und Realität aufzufangen.

Also mein Plan für morgen ist jetzt der: Ich schlate den Regler ab (alle Koeffizienten auf Null) und lasse Kv, Ka, Bias optimieren. Dabei lasse ich sicherheitshalber den I-Regler dennoch etwas mitlaufen, damit der Antrieb wenigstens irgendwann die Zielposition erreicht und ich die ganze Optimierungsstrategie meines Programmes nicht umbauen muss. (Stop: Mir fällt gerade ein, dass ich abfragen kann, ob die Sollposition schon die Zielposition ist anstatt abzufragen, ob die Ist-Position schon die Zielposition ist... Gut, egal.) Dann sage ich dem Steuerblock, dass er gigantische Geschwindigkeiten und Beschleunigungen fahren darf, setze die feed-forwards, also Kv und Ka auf Null und lasse den Antrieb auf eine neue Position fahren. Das dürfte sich wie ein Sprung in der Position auswirken der nur vom Regler alleine ausgeglichen werden muss. Tcha, und jetzt bin ich am überlegen, auf welches Kriterium hin ich optimieren soll. Sicher daraufhin, dass die Zielposition so schnell wie möglich erreicht wird. Ohne Überschwinger.... Mal sehen.

CU Rollo

Reply to
Roland Damm

Moin,

Roland Damm schrub:

So, habe heute ein paar Stunden an dem Steuerrechner verbracht...

Stunden deswegen, weil wenn man zu oft den Positionsfehler von der Steuerkarte abfragt, diese Misst baut. Und weil manche Funktionen aus der Dokumentation nicht wie dokumentiert sondern vermutlich eher garnicht funktionieren. Toll...

Aber zumindest hat dann zuletzt doch noch was funktioniert: Ich habe erst mal stumpf alle Parameter simultan optimieren lassen. Das scheint trotz meiner Befürchtungen zu gehen und reproduzierbare Ergebnisse zu liefern. Schön zu beobachten ist, dass das Optimierungsverfahren gelegentlich die Parameter in einen instabilen Wertebereich bringt, dann brummt der Antrieb mächtig herum (mein Chaf hat gleich panisch den Not-Aus gedrückt...:-)). Aber der Optimierer merkt natürlich, dass das nicht gut ist (Aufschaukeln heißt ständig großer Positionsfehler) und stellt es gleich wieder ab. Schön.

Ärgerlich ist nur, dass unter den dokumentierten aber nicht funktionierenden Funktionen auch das Beschleunigungs-Feed-forward ist. Das muss ich aber noch mal genauer verifizieren. Der Bias ist entweder auch wirkungslos, oder aber wie von mir vermutet, wird bei Fehleinstellung locker vom I-Regler wegkompensiert und ist damit ohnehin überflüssig.

Immerhin kam ich zuletzt auf einen mittleren Positionsfehler der nur noch 10% von dem beträgt, der sich bei Verwendung der Herstellerempfehlungen/Defaultwerte für den Antrieb ergibt. Wenn auch zu dem Preis, dass die Koeffizienten recht groß und sehr knapp an der Stabilitätsgrenze sind.

Ich werde dann noch mal die Bewertung von Mittlerer Fehler auf Maximalfehler umbauen und mal sehen, was dann so herauskommt.

CU Rollo

Reply to
Roland Damm

X-No-Archive: Yes

begin quoting, Roland Damm schrieb:

Ist es dann nicht /eigentlich/ einfach?

Wir haben:

einen Zeitschritt Dt eine Ist-Position P(t) eine Ist-Geschwindigkeit v(t) eine Sollposition P(t+Dt) einen "Schwerebeschleunigungswert" g (bias) (und ggf. noch Reibungsterme R = c0*v/|v| + c1*v + c2*v^2 ...)

Angefahren wird

Ps(t+Dt) = P(t) + v(t)*Dt + (a+g+R)*Dt^2/2,

wobei a aus {-a_max, 0, a_max}.

Dann rechnet man einfach aus, für welchen der drei Fälle |Ps(t+Dt) - P(t+Dt)| das Minimum annimmt, und wählt danach a aus, das ganze in einer Schleife: jeweils nach Dt P(t) und v(t) erneut messen und wiederum für das nächste P(t+Dt) das beste a berechnen.

Besser kann man es mit einem Dreipunktregler nicht machen.

Es ist bei der Berechnung der Sollbahn, also der Sollpositionen P(t+Dt), darauf zu achten, daß die Bahn stetig differenzierbar ist, die Beschleunigungen nicht zu hoch werden (sonst werden die Positionsabweichungen |Ps(t+Dt) - P(t+Dt)| zu groß) und vor allem der "Zieleinlauf" auch nach dem letzten Impuls mit einer Geschwindigkeit 0 endet, sonst vibriert der Antrieb um die Endposition herum. Am besten nimmt man einen "Standard-Zieleinlauf" aus wiederholten Folgen (0, 0,

0, 0, 0, 0, -a_max) in der Sollbahn, der den Antrieb von einer "Endgeschwindigkeit" auf Null herunterbremst, wobei die mehreren Nullen dem Regler noch genug Spielraum lassen, im Auslauf Positionsfehler zu korrigieren.

Gruß aus Bremen Ralf

Reply to
Ralf Kusmierz

Moin,

Ralf Kusmierz schrub:

Das hast du was falsch verstanden. Es geht nicht darum, a auszurechnen. Eine Fahrt sieht so aus, dass der Antrieb steht. Jetzt gebe ich eine neue Position ein, die angefahren werden soll. Daraus errechnet der Sollwertgeber den kompletten Verlauf von Position, Geschwindigkeit und Beschleunigung der nötig ist, damit der Antrieb die Zielposition so schnell wie möglich erreicht und auf der Zielposition stehen bleibt. Dabei werden vorgegebene Maximalwerte für Beschleunigung und Geschwindigkeit nicht überschritten. Dieses so berechnete Profil beinhaltet immer, dass der Antrieb bei erreichen des Zielpunktes _steht_ - was eine große Seuche ist, da so das kontinuierliche Abfahren von Kurven so nicht mehr möglich ist, aber das ist eine andere Geschichte.

Damit sind jedenfalls die Beschleunigungen (Sollwerte) für jeden Zeitpunkt im Voraus exakt bekannt.

Sinn der Regelung ist es jetzt, dafür zu sorgen, dass diese Werte auch eingehalten werden.

Wenn der Motor unterwegs ist, sind die Sollpositionen für beliebige Zukunft bekannt (zumindest bis zu dem Zeitpunkt, zu dem der Antrieb zum Stehen kommt).

Verschätzt dich mit der Diskretisierung nicht. Im wesentlichen ist das schon noch ein kontinuierlich laufender Motor den man beschleunigen und bremsen kann, aber nicht in diskreten Schritten wie ein Schrittmotor.

Nachher werde ich mal überprüfen, ob dieses K_aff, also der Durchgriff der Sollbeschleunigung auf die Motorspannung überhaupt funktioniert oder ob das nur ein Dummy-Wert ist. Ich fürchte zweiteres. Das wäre natürlich sehr schade, da dann selbst im Idealfall der Antrieb nicht exakt laufen kann (wärend Beschleunigungsphasen).

CU Rollo

Reply to
Roland Damm

"Roland Damm" schrieb im Newsbeitrag news:4713dc8b$0$30379$ snipped-for-privacy@newsspool4.arcor-online.net...

Definitionen:

formatting link

Diese Werte, also a_s, v_s und p_s (_s = Soll) gehen auf den Motorregler.

A0*v1 = A0*p (A0=1) A1*v1' = A1*v A2*v1'' = A2*a

Diese 3 Parameter repräsentieren ein mathematisches Modell und können aus Messungen ermittelt werden. Es sind 'Ist-Daten' mit den Koeffizienten A0=1, A1, A2, ... Damit kann man rechnen/simulieren/optimieren [1]:

Regelstrecken-Übergangsfunktion (t=Zeit, v1=Position)

10%ige sprungförmige Änderung v2 (Eingang Regelstrecke, z.B. 1V) ergibt einen Verlauf v1(t):

t v1 (=p)

0 0 . . .

Anzahl ca. 20 Wertepaare.

Diese Daten würden mich mal interessieren, um mit echten Daten eine Simulation vornehmen zu können.

Daraus kann die Dfgl F1(s) (Equ.1, z1=0) ermittelt werden:

v1 + A1*v1' + A2*v1'' + ... = K1*v2 p + A1*v + A2*a + ...

Eine Feedforward-Kompensation wäre:

K2*(u + B1*u' + B2*u'' + ...) = v2 (im Reglerblock, Seite 1, Equ.2)

v1 + A1*v1' + A2*v1'' + ... = K1 * K2 * (u + B1*u' + B2*u'' + ...)

Mit

B1=A1 B2=A2 .

wird das Zeitverhalten eliminiert. Die dazu notwendigen Kräfte wären bei sprungförmigen Sollwertänderungen allerdings nicht aufzubringen. Es muß deshalb ein Filter F3(s) für die Sollwertführung u vorgeschaltet werden.

Je nach Einstellung ergeben sich v1(t), v1'(t) und v1''(t). Siehe z.B. Seite

2, Fig. 3 und 4.

Geschwindigkeitsbegrenzungen für die Sollwertführung C*v_const sind machbar aber bei Feedforward-Schaltungen nicht empfehlenswert.

Ein Feedback-PID-Regler übernimmt das Ausregeln von Störgrößen z1 und z2 (Seite 5).

Anmerkungen:

Regelung ohne (oder falschem) Feedforward: Siehe Seite 6 (Beispiel für fast ungedämpfte Regelstrecke)

[1]
formatting link
Reply to
JCH

Moin,

JCH schrub:

Schwer nachvollziehbar, ohne Anleitung. Geht es dabei um einen Schätzfilter? Wieso gehen dann die Störgrößen die auf die Strecke wirken nicht in die Strecke ein sondern in den Regler (dafür aber gleich zwei)?

Gut, das sind Sollgrößen.

Hmm. Ich kann solcherlei Werte bedingt überwachen. Aber nur teilweise. Ist-Position, Positionsfehler, integrierter Positionsfehler, Soll-Geschwindigkeit, (Ist-Geschwindigkeit), (Soll-Beschleunigung) [sind Werte ich ich aus dem Controller auslesen kann, in Klammer: bei denen bin ich mir nicht sicher].

Problem dabei: Ich kann zu einem Zeitpunkt immr nur eine Größe auslesen, die nächste lese ich dann danach aus und ich habe keine Ahnung, wie schnell das Auslesen geht. Ich bekomme also nie verschiedene Werte des gleichen Zeitpunktes ausgelesen und vermutlich kann ich noch nicht mal den genauen Zeitpunkt des Auslesens ermitteln. Kennt Windows sowas wie sinngemäß Get-Uhrzeit welches in ms-Auflösung funktioniert?

Der Controller hat eine Möglichkeit zum Aufzeichnen einiger weniger Größen, aber ich weiß längst nicht, wie das geht.

Gut, wenn ich das Streckenverhalten kenne, müsste ich es exakt eleminieren können. Nur ist das Ergebnis dann stabil?

In meinem Fall habe ich den Bahnprofil-Generator, der keine Sollbahnen generiert, die Sprünge in Geschwindigkeit oder Position haben. Also wird vom Antrieb nichts verlangt, was er nicht auch bringen kann. Das ist gut so, keinen Grund da einzugreifen. Ich nehme an, dann erübrigt sich auch so ein Filter.

Wieso? In meinem Fall ist die Geschwindigkeitsbegrenzung im Bahnprofilgenerator drin. Der Antrieb darf, wenn es ihm der Regler sagt, sich auch schneller bewegen. Das macht nichts, da sind gute 100% Luft nach oben drin.

formatting link

Nun gut: Ich müsste also das Streckenverhalten ausmessen. Auch das ist wieder nicht ganz einfach. Ich habe heute gemerkt, dass ich die Kueffizienten des Reglers nicht auf einfach Null setzen kann, dann macht der Controller Blödsinn. Nur die Feed-forward-Koeffizienten darf ich auf Null setzen. Ich würde also immer das Verhalten Regler plus Stecke ausmessen. Macht die Sache schwieriger, aber nicht unmöglich.

Gnädigerweise kenne ich allerdings den Regler exakt, also ich weiß wie welche Zahlen verrechnet werden (10bit-Festkommaarithmetik mit hier und da mal fest eingebauter Kommaverschiebung, aber alles bekannt). Man müsste den Regler also simulieren können. Leider kann man den Ausgang des Reglers (also die Motorspannung) _nicht_ auslesen. Das wäre ja die praktische Größe schlechthin.

Ach ja, was meine Versuche angeht: Ich bin heute durchaus auf Werte gekommen, die den Restfehler unterhalb der mechanischen Genauigkeit des Systems halten. Also vollkommen hinreichend. Ärgerlicherweise ist die Lösung die ich finde jedoch nicht reproduzierbar. Je nach Startwerten der Optimierung finde ich eine andere Lösung, aber alle gefundenen Lösungen sind (abgesehen von Messunsicherheiten) gleich gut. Den Bias habe ich dabei schon mal komplett außen vor gelassen, denn IMO kann der durch den I-Regler ersetzt werden, ist also überflüssig. Aber das System hat noch mindestens einen weiteren Freiheitsgrad. Irgendwas ist an dem System immernoch redundant. Bei einem der vielen Optimierungsläufe kam eine Parameterkombination heraus, in der sogar der I-Regler nur noch einen sehr kleinen Koeffizienten bekam. Das Ergebnis war trotzdem fast so gut, wie die anderen optimalen Lösungen.

Ich vermute es liegt daran, dass allein die Feed-Forward-Gains den Motor schon so gut steuern, dass der Regler fast überflüssig wird. Der Regler dient also dazu, Störungen auszugleichen - so richtig testen (und optimieren) kann ich ihn also nur, wenn ich Störungen auf den Antrieb gäbe. Aber selbst ein bischen den Finger an die Motorwelle halten bringt keinen messbaren Ausschlag im Positionsfehler. Und in der Anwendung wofür das Ganze da ist (Bleche mit Laser ausschneiden) wird es keine nennenswerten Störgrößen geben (keine Werkzeugkräfte). Die eingespannten Teile werden nicht schwingen, der Tisch auf dem das steht ist eine optische Bank. Die Signalübertragung ist digital oder PWM, also keine relevante elektromagnetische Einstreuung. Also weit und breit keine Quelle für Störgrößen zu finden.

Scheint so, dass ich unter diesen Bedingungen keine Möglichkeit habe, _den_ perfekten Regler durch Ausprobieren herauszufinden, es wird immer viele perfekte geben.

CU Rollo

Reply to
Roland Damm

X-No-Archive: Yes

begin quoting, Roland Damm schrieb:

Muß wohl - was bedeutet der Satz: "der Steuerblock erzeugt nur konstante Beschleunigungen, entweder a_max, 0 oder -a_max."?

Das ist irgendwie einfach: Die kürzeste Verbindung zwischen zwei Punkten ist die Gerade. Also fährt man mit maxiamler Beschleunigung in Richtung Ziel los, und zwar solange, bis entweder die Maximalgeschwindigkeit oder die halbe Wegstrecke erreicht ist, dann fährt man den doppelten Weg bis zur halben Wegstrecke mit Beschleunigung Null und den Rest mit maximaler negativer Beschleunigung.

Dagegen wäre ja nun ein Kraut gewachsen.

Ich dachte jetzt, der Regler hätte aber nur drei mögliche Ist-Werte zur Verfügung?

"Geradeaus" _ist_ stetig differenzierbar ...

Aber das Beschleunigen und Bremsen geht nur mit drei diskreten Einstellwerten (was nicht falsch wäre)?

Wie kriegst du das raus?

Wie lang sind eigentlich die Schleifendurchläufe, d. h. wie fein ist die Bahn eigentlich diskretisiert? (Ich würde sagen: 1.000 Punkte sind ziemlich gut, 10 Punkte könnten vielleicht ein wenig knapp werden.)

Gruß aus Bremen Ralf

Reply to
Ralf Kusmierz

Moin,

Ralf Kusmierz schrub:

Stimmt, macht aber nichts. Die Bahn kann genauso gut auch vorher bekannt sein, es bleibt eine Sollbahn ohne Feedback.

Welches?

Aber der Regler weiß nicht, welche ich wähle:-). Abgesehen davon, dass der Regler die Soll-Beschleunigung nicht wählen kann, er bekommt sie vorgegeben.

Ja, man kann (Sollwerte für) Beschleunigung und Bremsung vorgeben (die wähle ich gleich der Beschleunigung) und zwischendruch wird mit konstanter Geschwindigkeit gefahren. *)

Stundenlang dumm vorm Computer sitzen und fluchen - und sich dann daran erinnern, dass die verschiedenen Mechanismen zum Setzen der Parameter (nicht alle Paramter lassen sich über die selben Befehle setzen) unterschiedliche Kanalnummerierungen verwenden. Dann merkt man plötzlich, dass man die ganze Zeit Achse 2 optimieren wollte, die Werte aber teilweise für Achse 1 gesetzt hat. Selbstverständlich steht davon nichts in der Doku....

Es sollen Strukturen mit einem Laser von 3um Durchmesser ausgeschnitten werden und zwar quasi so klein wie geht - also sagen wir mal Löcher so groß, dass der Laser klein gegen die Lochabmessungen ist. Und der Antrieb macht 8 Zählschritte pro um. Also Bewegungungen im 4..5stelligen Bereich an Schritten.

Allerdings kann ich die natürlich nicht aufzeichnen. Frage ich die Position so oft ab, wie es die Leistung des Rechners erlaubt, dann stürzt die Steuerkarte ab. Also muss ich zwischen zwei Abfragen ein minimales Delay einbauen, was rund 5ms beträgt. Damit kann ich pro realistischer Testfahrt so 50..500 Messwerte aufzeichnen.

Die Steuerkarte hat eine log-Funktion, aber die habe ich noch nicht ausprobiert und wenn die ähnlich gut mit der Doku übereinstimmend funktioniert, wie andere Funktionen, dürfte sie warscheinlich nicht verwendbar sein.

*) Der Controller erlaubt auch noch ein Bahnprofil ohne Sprünge in der Beschleunigung zu fahren. S-Profil nennt sich das dann, ruckfreies Anfahren könnte man es auch nennen. Dabei wird die Änderung der Beschleunigung nach der Zeit, also da/dt, auf einen angebbaren Wert limitiert. Werde ich auch einbauen müssen, weil ich jetzt eine so exakte aber auch harte Steuerung habe, dass man das Klackern in der Kugelumlaufspindel (Spiel) hört - ich glaube das ist auf Dauer nicht nett. Jedenfalls wird in diesem Fall jede Soll-Beschleunigung zwischen -a_max und a_max durchgefahren. In dem Fall ist es auch übrigens so, dass wenn der Antrieb einmal zum Ziel losgefahren ist, man ihm keine neuen Steueranweisungen geben kann bis dass er sein Ziel erreicht hat. Also die Bahn wird beim Start vermutlich komplett durchgerechnet und bleibt dann fest vorgegeben.

CU Rollo

Reply to
Roland Damm

X-No-Archive: Yes

begin quoting, Roland Damm schrieb:

Ja, sicher. Nur ist es eben kein besonderes Kunststück, die zu ermitteln.

Na, einen anderen Zielpunkt zu wählen, der so liegt, daß das Ding beim beabsichtigten Zwischenpunkt mit der gewünschten Geschwindigkeit vorbeikommt. Allerdings schriebst Du weiter unten:

Das wäre in dem Fall maximaler Mist.

Und was den "anderen Zielpunkt" angeht, könnte es natürlich auch sein, daß die Steuerung streikt, wenn der außerhalb des anfahrbaren Bereichs liegt.

Welcher Regler denn jetzt, der "Steuerblock"?

Das Ding ist vergurkt ...

Der Antrieb könnte also größenordnungsmäßig 100 nm auflösen. Kann der Regler auch von Punkt zu Punkt rechnen? Das ist je nach Fahrgeschwindigkeit u. a. eine Zeitfrage.

Das ist irgendwie Affenscheiße, scheint mir. (Und natürlich werden keine Verträge vorliegen, die a) Nachbesserungsforderungen erlauben oder b) den Erhalt einer vollständigen (wenigstens Hardware-)Dokumentation ermöglichen.)

Das sieht mir nämlich inzwischen danach aus, den ganzen Steuerkrempel zu verschrotten, den/die Trottel, der/die das verbrochen hat/haben, ebenfalls zu entsorgen und eine neue Steuerung mit schnellen Komponenten von nicht geistesgestörten Programmierern aufzubauen. Nun ja, wird alles nicht realisierbar sein.

(Sowas ist ja irgendwie der Normalfall. Ich frage mich inzwischen immer, ob das die Hersteller absichtlich machen, oder wie so ein Produkt eigentlich auf den Markt gerät. Mit welchen Tricks schaffen es ausgewiesene Oberdeppen eigentlich, in die entsprechenden Entwicklungsabteilungen einzusickern und dort auch lauffähige Funktionsattrappen zusammenzutackern?)

Kann man Herstellern wenigstens noch auf die Füße treten? (Ich habe schon Fälle gehabt, in denen mir Hersteller Kopien von Spezifikationslisten aus der Entwicklungsabteilung geschickt hatten, mit deren Hilfe es dann möglich war, systeminterne Binärdateien zu interpretieren und Gerätefunktionen zu verstehen bzw. zu modifizieren.)

Das wird sich wohl nicht vermeiden lassen, das Lagerspiel totzuschlagen - müßte die Spindel eigentlich abkönnen. Aber diese ganze Antriebssteuerung scheint ein Güllefaß zu sein.

Neu machen wird wahrscheinlich zu aufwendig - kannst Du sie vielleicht so modifizieren, daß ein externes Programm sie immer mit ganz kurzen Bahnabschnitten füttert und die jeweils durchfahrene Bahn alle paar Schritte im laufenden Betrieb durch eine neue ersetzt?

Gruß aus Bremen Ralf

Reply to
Ralf Kusmierz

Moin, mal ein Nachtrag:

Roland Damm schrub

Hab das heute mal eingebaut - geht natürlich nicht. Denn wenn der Controller in diesen Modus geschaltet ist, bringt ihn das erst beste Bewegungskommando dazu, alle Achsen mit v_max in den mechanischen Anschlag zu fahren:-)

Dabei hat die Software-Versionsnummer deutlich mehr als 'ne Null vorm Komma....

CU Rollo

Reply to
Roland Damm

PolyTech Forum website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.