kramann.info
© Guido Kramann

Login: Passwort:










Regelungssysteme
1 day_by_day
2 Heizregelkreis
3 Verzoegerungsglieder
4 Laplace
..4.1 Eigenwerte
..4.2 PT1
..4.3 PRegler
..4.4 Scilab
5 Regleroptimierung
..5.1 Guetefunktion
..5.2 Heuristiken
..5.3 Scilab
..5.4 Gradientenverfahren
..5.5 ModifizierteG
..5.6 Gleichstrommotor
..5.7 Stoerverhalten
6 Javaanwendung
..6.1 PIDgeregelterAntrieb
..6.2 RungeKuttaIntegrator
..6.3 Gradientenverfahren
7 Einstellregeln
..7.1 Totzeit
..7.2 Methode1
..7.3 Methode2
..7.4 Scilab
..7.5 Daempfungsgrad
..7.6 Uebung
8 Polvorgabe
9 Beobachter
10 AutonomerHackenprosche
..10.1 Herleitung
..10.2 Scilab
..10.3 Modellerweiterung
..10.4 Scilab
..10.5 Modellgueltigkeit
..10.6 java
11 Stabilitaet
..11.1 Beispiele
..11.2 Nyqusitkriterium
..11.3 Windup
..11.4 Bode
12 Adaptiv
..12.1 Definition
..12.2 Einachser
..12.3 Auswertung
..12.4 Identifikation
..12.5 Regleroptimierung
..12.6 Zustandsregler
..12.7 Beobachter
13 Analyse
..13.1 Linear
..13.2 Nichtlinear
14 Kalmanfilter
15 Ue_04_2014
..15.1 Geschwindigkeit
..15.2 Richtung
..15.3 Gesamtsystem
..15.4 RiccatiUSW
..15.5 TdOT
16 Inverses_Pendel
17 Einachser
..17.1 Mechanik
..17.2 Uebung8
18 Fuzzy
..18.1 Fuzzylogik
..18.2 FuzzyRegler
..18.3 Uebung9
..18.5 Softwareentwicklung
....18.5.1 AgileSoftwareentwicklung
....18.5.2 FuzzyRegler
....18.5.3 Uebung
..18.6 Umsetzung
....18.6.1 FuzzyRegler
....18.6.2 Simulation
....18.6.3 Optimierung
....18.6.4 Uebung
..18.7 Haengependel
....18.7.1 Haengependel
....18.7.2 Simulation
....18.7.3 FuzzyRegler
....18.7.4 Optimierer
....18.7.5 Genetisch
..18.8 Information
..18.9 Energie
21 Beispiel1
98 day_by_day_WS2021_SoSe21
99 day_by_day_SoSe2018
kramann.info
© Guido Kramann

Login: Passwort:




Erstellen des Simulationsmodells

  • Die Modellklasse besteht aus einem Antrieb, dessen Übertragungsverhalten einem PT2-Übertragungsglied mit Totzeit entspricht und das durch einen PID-Regler geregelt werden soll.

Da davon ausgegangen wird, dass die PID-Regelung über Software erfolgt, die auf einem Mikrocontroller läuft, ergeben sich für das System besondere Eigenschaften, die gleich mit modelliert werden sollen:

  • Es wird vorausgesetzt, dass die Totzeit Tt hauptsächlich aufgrund der Berechnung des Stellsignals aus dem Sensorsignal entsteht und konstant und bekannt ist.
  • Außerdem wird der I- und der D-Anteil nicht exakt, sondern in Schritten von der Größe der Totzeit Tt berechnet.
  • Die entsprechenden Modellgleichungen im Zeitbereich lauten:
  • (Die verwendeten Skalierungsfaktoren entsprechen denen des zugrundeliegenden realen Systems)
Zu simulierendes Modell mathematisch formuliert.

Bild 0-1: Zu simulierendes Modell mathematisch formuliert.

  • Vorbereitend für die numerische Integration wird die Differentialgleichung in ein Differentialgleichungssystem ersten Grades umgewandelt:
Umwandlung der Modellgleichung in ein DGLS erster Ordnung.

Bild 0-2: Umwandlung der Modellgleichung in ein DGLS erster Ordnung.

  • Für den später erfolgenden Optimierungsvorgang ist es sinnvoll die Parameter so zu substituieren, dass keine sie als Linearfaktoren vor den einzelenen Termen erscheinen:
Substitution der Modellparameter vorbereitend auf die Optimierung.

Bild 0-3: Substitution der Modellparameter vorbereitend auf die Optimierung.

Das vorangegangene Kapitel über die Modellierung eines Elektromotors und die darin ausgedrückten physikalischen Gegebenheiten legen nahe, dass alle Parameter (a, b, c und damit auch K, L, M) als positiv angenommen werden und später entsprechend optimiert werden.
  • Für die angegebenen Beispielwerte ergeben sich folgende konkrete Werte:
  • (Dabei ist zu berücksichtigen, dass beim COACH-Vehikel ein stärkerer Motor verwendet wird, der Fahrwiderstand hinzu kommt und die Wirkung des Getriebes.)
a=0.00009
b=0.24
c=0.98
M=11111
K=2671
L=10833

Code 0-1: Parameter für das Beispiel des besprochenen Elektromotors.

Anmerkungen zur nachfolgenden Java-Basisklasse für das Simulationsmodell:

  • Der aktuelle Steigung (Berechnung der rechten Seite des DGLS) wird im Array f gespeichert.
  • anzahlgleichungen: Anzahl der Simulationsgleichungen im DGLS ersten Grades.
  • Die Berechnungsmethode berechneRechteSeite(..) muß von erbenden Klassen überschrieben werden.
  • Das Modell kann durch Überschreiben der Methode paint(..) in die Lage versetzt werden, seinen aktuellen Systemzustand grafisch darzustellen.
  • Die Methode paint(..) wird von der paint-Methode eines Canvas-Objekts her aufgerufen.
package opti;
import java.awt.*;
public class Simulationsmodell
{
    public double[]   f = null;
    public Simulationsmodell(int anzahlgleichungen)
    {
        f = new double[anzahlgleichungen];        
    }
    public int getAnzahlGleichungen()
    {
        return f.length;
    }
    public double[] berechneRechteSeite(double[] yalt, double t)
    {
        return f;
    } 
    public void paint(Graphics2D g)
    {
    }
}

Code 0-2: Basisklasse des Simulationsmodells in der Java-Quelltext-Datei Simulationsmodell.java

  • Bei der folgenden Modell-Beschreibung als Java-Klasse sind die Eigenheiten der konkreten Umsetzung mit berücksichtigt.
  • Insbesondere kann die Stellgröße nur in einem bestimmten Zeitintervall Tt durchgeführt werden.
  • Siehe auch die Kommentare im Quellcode.
package opti;
import java.awt.*;
public class PIDgeregelterAntrieb extends Simulationsmodell
{
    /**
    Die folgenden Variablen sind die Modellparameter, die später
    optimiert werden können.<br/>
    Als Startwert sind die zu erwartenden Extremwerte eingestellt, damit
    später automatisiert GUI-Elemente erzeugt werden können.<br/>
    Da positive Extremwerte vorgegeben sind, ist damit festgelegt, dass
    alle Modell-Parameter nicht negativ werden dürfen.
    */
    public double K = 100000.0;
    public double L = 100000.0;
    public double M = 100000.0;
    /**
    Die folgenden Variablen sind die Parameter des PID-Reglers, die später
    ebenfalls optimiert werden können.<br/>
    Als Startwert sind die zu erwartenden Extremwerte eingestellt, damit
    später automatisiert GUI-Elemente erzeugt werden können.<br/>
    Da positive Extremwerte vorgegeben sind, ist damit festgelegt, dass
    alle Modell-Parameter nicht negativ werden dürfen.<br/>
    Für die Parameteridentifikation des Modells (Bestimmung von K,L und M)
    können die Parameter des Reglers (P, I, D) zunächst zu Null gesetzt werden.<br/>
    Für die Identifikation der Regelstrecke wird zunächst die Totzeit Tt zu Null gesetzt.<br/>
    In einem ersten Ansatz für die Identifikation der Regelparameter wird Tt auf 0,01s gesetzt.
    */
    public double P = 1000.0;
    public double I = 10.0; //Faktor 0.01, da Tt=0.01s mit enthalten
    public double D = 100000.0; //Faktor 100, da 1/Tt=100.0 1/s enthalten
    public double Tt = 0.01;
    /**Sollwert für den Regler:*/
    public double omega_viertel_soll = 100.0;
    /**
    Bei jeder Aktualisierung des Stellwertes wird der Zeitpunkt registriert.<br/>
    Eine neue Aktualisierung findet erst statt, 
    wenn seit dem ein Zeitintervall von der Dauer der Totzeit Tt vergangen ist.<br/>
    Um eine konsistente Simulation zu gewährleisten, wird vorausgesetzt, dass eine
    neue Simulation immer bei t=0s startet.
    */
    private double t_aktualisiert = 0.0;
    private double e_alt = 0.0; //Alte Regeldifferenz.
    private double e_sum = 0.0; //Aufsummierte Regeldifferenz.
    private double pwm_alt = 0.0; //gemerkte Stellgröße, bleibt bis zur nächsten Aktualisierung erhalten.
    public PIDgeregelterAntrieb()
    {
        super(2); //Zwei Simulationsgleichungen
    }
    public double[] berechneRechteSeite(double[] yalt, double t)
    {
        /**temporäre Variablen deklarieren:<br/>
           Die verwendete Zustandsgröße omega_viertel (y[0]) hat die Einheit Omega/4, 
           d.h. die tatsächliche Winkelgeschwindigkeit kann zu omega = 4*omega_viertel bestimmt werden.<br/>
           Damit werden genau die im Mikrocontrollerprogramm verfügbaren Größen simuliert.
        */
        double e             = e_alt;   //Regeldifferenz
        double pwm           = pwm_alt; //Stellgröße -1023..+1023, entspricht u im Standardregelkreis.
        double omega_viertel = yalt[0]; //für eine bessere Lesbarkeit 
        double v             = yalt[1]; //für eine bessere Lesbarkeit
        /**Notwendige Initialisierungen bei Start einer neuen Simulation durchführen.*/
        if(t==0.0)
        {
            t_aktualisiert = 0.0;
            e       = 0.0;
            e_alt   = 0.0;      
            e_sum   = 0.0;
            pwm     = 0.0;
            pwm_alt = 0.0;
        }
        /**Bedingungen für die Aktualisierung der Stellgröße.*/
        if(t==0.0 || t_aktualisiert+Tt<=t)
        {
            e = omega_viertel_soll - omega_viertel;
            pwm = P*e + I*e_sum + D*(e-e_alt);
            t_aktualisiert=t; //Merken dieses neuen Aktualisierungszeitpunktes.
            e_alt = e;           //Merken der neuen aktuellen Regeldifferenz für D-Anteil          
            e_sum += e;          //Aktualisierung der Summe der Regeldifferenzen für I-Anteil 
            pwm_alt =  pwm;      //Merken/Aktualisierung der Stellgröße
        } 
        /**Eigentliche Bestimmung der rechten Seite (Steigungsvektor)*/
        f[0] = v;
        f[1] = - K*v - L*omega_viertel + M*pwm;
        return f;
    } 
    /** paint(..) wird bei der Konsolenanwendung nicht verwendet.*/
    public void paint(Graphics2D g)
    {
    }
}

Code 0-3: Simulationsmodell der Regelstrecke mit PID-Regler als Java-Quelltextdatei PIDgeregelterAntrieb.java