Erstellen des Simulationsmodells
|
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:
|
Bild 0-1: Zu simulierendes Modell mathematisch formuliert.
|
Bild 0-2: Umwandlung der Modellgleichung in ein DGLS erster Ordnung.
|
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.
|
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:
|
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
|
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