# Automatische Reglereinmessung



## Majestic_1987 (13 Dezember 2008)

Hallo Leute, ich möchte eine Routine schreiben, die in der Lage ist, die Parameter für einen PID-Regler über das Wendetangentenverfahren zu ermittelen.

Ich möchte das Programm anweisen, einen Stellwertsprung auszugeben.
Dann möchte ich die Zeit messen, bis die Antwort der Strecke beginnt, sich zu ändern.

Das sollte soweit machbar sein.

Jetzt kommts aber...ich muss jetzt den Zeitpunkt der maximalen Steigung der Sprungantwort finden. Es gibt in der Oscat.lib einen Differenzier-Baustein, den ich dazu nehmen könnte.

Meine Frage: Wie kann ich den Wert finden, an dem diese Differentiation maximal wird? Gibt es eine Funktion, die einen Werteverlauf überwacht und ein lokales maximum finden kann?

Hoffe ihr habt einen Tipp für mich, Danke schonmal im Voraus.


----------



## Thomas_v2.1 (14 Dezember 2008)

Majestic_1987 schrieb:


> Meine Frage: Wie kann ich den Wert finden, an dem diese Differentiation maximal wird? Gibt es eine Funktion, die einen Werteverlauf überwacht und ein lokales maximum finden kann?



Die gute alte Kurvendiskussion:
1) f''(x) bilden (also deinen differenzierten Wert nochmal durch den Diff.Baustein jagen)
2) Nullstellen von f''(x) bestimmen, hier sind die möglichen Wendepunkte
3) f'''(x) berechnen, wenn !=0 dann ist hier ein Wendepunkt

In deinem Fall reicht es bis 2) vorzugehen und dann abzubrechen (ggf. so etwas wie eine Statemachine aufbauen).

Mehrfaches differenzieren an realen Messwerten ist aber oft schwierig.
Wichtig ist dabei vor den Differenzierer einen Tiefpass zu schalten dessen Grenzfrequenz so liegt, dass dein zu erwartender Messwertverlauf noch sicher erfasst wird.

Gruß
Thomas


----------



## Majestic_1987 (14 Dezember 2008)

Also, wie ich das auf dem Papier mach wenn ich eine gegebene Funktion habe ist mir soweit ja klar.

ABER: Wenn ich einen Messwert ableite bekomme ich eine Steigung zum Zeitpunkt der Ableitung.

Wenn ich das jetzt nochmal mache, habe ich ja wieder einen festen Wert...Finde ich da kritische Punkte, wenn ich diesen Wert auf 0 überwache?

Das mit dem Tiefpass musst du mir erklären.

Ich kämpfe ohnehin noch mit dem Oscat-PID-Baustein...dahinter muss eine Schwingungspaketsteuerung (Also quasi PWM mit sehr geringer Frequenz...und ich hab keine Ahnung welchen Wertebereich mein PID ausspuckt, sodass ich diesen auf 0...1 skalieren kann...). Mal sehen wie ich das dann noch löse.


----------



## Thomas_v2.1 (14 Dezember 2008)

Also ich schreibe mal in Pseudocode wie ich das meine:

```
// In
Messwert : Real
// out
Wendepunkt : Bool;
// Var
Messwert_alt : Real;
dx_dt : Real;
dx_dt_alt : Real;
d2x_dt2 : Real;
d2x_dt2_alt : Real;
state : int;

// Differenzieren
dx_dt = Messwert - Messwert_alt;
d2x_dt2 = dx_dt - dx_dt_alt;

Messwert_alt = Messwert;
dx_dt_alt = dx_dt;
d2x_dt2_alt = d2x_dt2;

switch (state) {
case 0: 
  if (dx_dt > 0 and d2x_dt2 > 0)
    state = 1;
case 1:
  if (dx_dt > 0 and d2x_dt2 <= 0)
    state = 2;
}

if (state == 2) then wendepunkt := true;
```
Dieser Code sollte in einem festen Zeitraster aufgerufen werden.

Mit dem Tiefpass meine ich folgendes:
Da ein realer Messwert oft stark schwankt, muss dieser erst soweit geglättet werden damit nicht jede kleine Schwankung als Wendepunkt erkannt wird.
Dazu gibt es in der Oscat Lib auch einen Baustein (glaube P_T1 heißt der dort). 
Die Zeitkonstante an diesem Baustein muss dann so angepasst werden, dass ungewollte Messwertschwankungen herausgefiltert, aber der eigentliche (zu erwartende) Messwertverlauf nicht zu stark gedämpft und somit verzögert wird.

Grob gesagt: Ändert sich der Messwert bei einer Sprungantwort in einer Sekunde, liegt man mit einer Grenzfrequenz von 1 Hz auf jeden Fall zu niedrig.


----------



## Majestic_1987 (14 Dezember 2008)

Fakt ist aber, dass ich den Wendepunkt ja garnicht suche! 

Was ich suche ist die maximale Steigung des rückgeführten Wertes!

Also wenn der Messwert der Funktionswert f(x) ist...

Dann ist f'(f(x)) die Steigung in diesem Punkt.

Deren Maximum benötige ich, ich setze also f'(f(x)) als neue Funktion g(x) voraus.

Deren Maximum finde ich durch 2-Fache Differentiation:

g'(x) == 0 -> kritischer Punkt

WENN das der Fall ist bilde ich g''(x)

Ist g''(x) < 0 -> lokales Maximum.

Dann kann ich den zu diesem Zeitpunkt aktuellen Steigungswert des Messwertes als maximale Steigung der Sprungantwort meiner Regelstrecke ansehen.

hier mein vorzeitiger Code...ich weiß nur nicht, ob er wirklich mein Problem lösen kann:

Variablen:

FUNCTION_BLOCK PID_Param

VAR_INPUT

    Actual: REAL; (*Aktualwert*)
    Tol_Max: REAL; (*Toleranzband oben*)
    Tol_Min: REAL; (*Toleranzband unten*)

END_VAR

VAR_OUTPUT
    Kp_Out: REAL; (*KP-Anteil*)
    Tn_Out: TIME; (*Nachstellzeit*)
    Tv_Out: TIME; (*Vorhaltezeit*)
END_VAR

VAR
    Flanke1: BOOL; (*Flanke für Zeitmessung*)
    VZ_Zeit: TIME; (*Verzugszeit Messung*)
    Deriv1_Run: BOOL; (*Start Differentiation 1*)
    Deriv2_Run: BOOL; (*Start Differentiation 1*)
    Deriv3_Run: BOOL; (*Start Differentiation 1*)

    Deriv1_Out: REAL;
    Deriv2_Out: REAL;
    Deriv3_Out: REAL;


    Deriv1: FT_DERIV;
    Deriv2: FT_DERIV;
    Deriv3: FT_DERIV;
END_VAR

VAR RETAIN PERSISTENT
    VZ_Zeit_Neu: TIME; (*Speicher aktuelle Verzugszeit*)
    N_Neu: REAL; (*Steigung der Wendetangente*)
END_VAR

ST-Code:

IF Actual<Tol_Max AND Actual>Tol_Min THEN

    Flanke1 := TRUE;
    M_T(In:=Flanke1, PT:=VZ_Zeit); (*Diese Funktion misst die Zeit zwischen einer pos. Flanke an In und einer negativen Flanke an In*)

        ELSIF Actual>Tol_Max OR Actual<Tol_Min THEN
            Flanke1:=FALSE;

            VZ_Zeit_Neu := VZ_Zeit;

            Deriv1_Run := TRUE;
            Deriv2_Run := TRUE;

            Deriv1.in:=Actual;
            Deriv1.K:=1;
            Deriv1.run:=Deriv1_Run;

            Deriv1();

            Deriv1.out:=Deriv1_Out;

            Deriv2.in := Deriv1_Out;
            Deriv2.K := 1;
            Deriv2.run := Deriv2_Run;

            Deriv2();

            Deriv2.out := Deriv2_Out;

                IF Deriv2_Out = 0 THEN

                    Deriv3_Run := TRUE;

                    Deriv3.in := Deriv2_Out;
                    Deriv3.K := 1;
                    Deriv3.run := Deriv3_Run;

                    Deriv3();

                    Deriv3.out := Deriv3_Out;

                        IF Deriv3_Out < 0 THEN

                            N_Neu := Deriv1_Out;

                        END_IF

                    Kp_Out := 1.2 / (TIME_TO_REAL(VZ_Zeit_Neu)*N_Neu);
                    Tn_Out := MULTIME(VZ_Zeit_Neu, 2);
                    Tv_Out := MULTIME(VZ_Zeit_Neu, 0.5);

                END_IF

END_IF


----------



## suud (14 Dezember 2008)

Hat jemand von euch zufällig ein paar Online-Dokumente oder eine Web-Adresse mit einer Beschreibung zu diesem Auto-Tuning-Verfahren?


----------



## Majestic_1987 (14 Dezember 2008)

Habe ein Word-Dokument dazu im Web gefunden....

ich habs dir mal auf meinen Webserver gestellt:

http://www.sven-haan.com/IMS2006-030.doc


----------



## Thomas_v2.1 (14 Dezember 2008)

Falls ihr Step7 installiert habt, steht in der Dokumentation zum FB58 auch einges dazu. Dieser hat auch die Option die Regelstrecke auszumessen.



> Fakt ist aber, dass ich den Wendepunkt ja garnicht suche!
> 
> Was ich suche ist die maximale Steigung des rückgeführten Wertes!


Also der Wendepunkt ist doch der Punkt an dem die Steigung wieder abnimmt, also der Punkt der maximalen Steigung.

Wenn bei deiner Strecke zwei Wendepunkte vorliegen sollten ist das natürlich was anderes. Dann ist aber auch die Frage, ob die errechneten Streckendaten überhaupt aussagekräftig sind.
Dieser Siemens FB fährt zum ausmessen der Strecke auch nur bis an den Wendepunkt, und geht dann in den Regelbetrieb über.


----------



## Thomas_v2.1 (14 Dezember 2008)

Hier mal der Link zur Siemens Dokumentation:

http://support.automation.siemens.com/WW/llisapi.dll/18652438?func=ll&objId=18652438&lang=de


----------



## Larry Laffer (14 Dezember 2008)

Hallo,
nach Durchlesen dieses Beitrages fällt mir dazu spontan ein :
Warum zeichnest du nicht die Antwort-Kurve auf und wertest die dann aus ?

Mein Vorschlag hier wäre :
Für die Dauer der Antwortzeit mit festen Zeitraster die Kurve (x- und y-Werte) aufzeichnen. Nach Ende der Aufzeichnung die aufgezeichneten Daten glätten. Auf Basis der nun vorhandenen Kurve die max-Steigung (zwischen 2 Punkten oder ggf. auch über einen größeren Bereich) ermitteln. Vielleicht ist hier auch die mittlere Steigung hilfreich. Auch ein Trägheits-Verhalten ist so zu ermitteln.
Ich selber erstelle für Prüf-Aufgaben häufiger Kraft-Weg-Messungen nach diesem Schema. Hier ist die Betrachtung von 2 banchbarenden Werten nicht hilfreich.

Vielleicht ist dies als Anregung dienlich.
Gruß und schönen Sonntag
LL


----------



## Majestic_1987 (14 Dezember 2008)

Du hast vollkommen recht *grummel*

Ich hatte die ganze zeit bei der Überlegung die an ihn angelegte Tangente vor dem geistigen Auge und dachte mir "nein, kann nicht sein, in einem wendepunkt ist die Steigung =0, die tangete steigt dort aber" *lach*

Nach ner kurzen Skizze von f(x) und f'(x) ist mir aufgefallen dass das ja stimmt...

Also 2-malige ableitung. Dann kann ich ja theoretisch auch wie folgt vorgehen:

1. zeitmessung starten....sobald Regelgröße auf den Stellwertsprung reagiert Zeitmessung stoppen und die Zeit als Verzugszeit des Reglers speichern. 

2. Zweite Zeitmessung starten. Dann Differentiation des Messwertes nach der Zeit

3. Vergleich der Ableitung auf 0. Wenn =0 Schritt 4 starten

4. Zweite Ableitung bilden und auf 0 Vergleichen.

5. Wenn 2. Ableitung =0 Zeitmessung stoppen und Gemessene Zeit als Nachstellzeit des Reglers speichern

Und dann nehme ich den Oscat-Baustein, der aus diesen Werten die Verstärkung, etc. berechnet.

Könnte ich theoretisch sogar in AS programmieren.


----------



## Thomas_v2.1 (14 Dezember 2008)

Majestic_1987 schrieb:


> 4. Zweite Ableitung bilden und auf 0 Vergleichen.



Nur zur Info:
Vergleiche auf == 0 bei Gleitpunktzahlen sind bei berechneten Werten immer zu vermeiden. Da kommt nie etwas sinnvolles bei raus. Also wenn dann >= oder <=.

Irgendwo gabs mal eine Webseite zu verschiedenen Unfällen oder Maschinenstörungen die Aufgrund von Softwarefehlern (u.A. wegen Gleitpunktzahlen) auftraten.

Edit:
Link http://www.ima.umn.edu/~arnold/455.f96/disasters.html


----------



## Majestic_1987 (14 Dezember 2008)

Dann halt Vergleich auf ein gewisses Toleranzband rund um 0. 

Soll mir auch recht sein ;-)

Aber prinzipiell MUSS die Ableitung durch 0 gehen, WENN ein Wendepunkt vorhanden ist.

Edit: Zum Crash der Ariane 5....wie kann man so blöd sein, 64Bit Real auf 16Bit Int umrechnen zu wollen??


----------



## drfunfrock (15 Dezember 2008)

Larry Laffer schrieb:


> Hallo,
> nach Durchlesen dieses Beitrages fällt mir dazu spontan ein :
> Warum zeichnest du nicht die Antwort-Kurve auf und wertest die dann aus ?



Das geht mit dem program "Scope", welches dabei ist, ganz einfach.


----------



## Majestic_1987 (15 Dezember 2008)

Das ist doch die gleiche Frage wie "Warum fertigt BMW mit Robotern, gibt doch Menschen"

Antwort: Weil es geht :-D

Erstens bin ich zu faul, bei ner eventuellen Veränderung der Regelstrecke jedes mal nen Trace zu machen und auszumessen und dann zu rechnen.

Und zweitens ist es ein Proof of Concept. Der Beitrag weiter oben stimmte schon, in Step7 gibts einen Baustein mit Auto-Tune..und dann möchte ich sowas auch programmieren können. 

Habe das Problem jetzt in AS zu lösen versucht, werde in den nächsten Tagen mal einen Test mit ner simulierten PT2-Strecke fahren, und schauen, was passiert.


----------

