Drehzahlregelung mit einem PID-Regler
Verfasst: Samstag 10. Oktober 2020, 18:57
Hallo zusammen,
für die folgende Aufgabenstellung habe ich Verzweifel, ob meine Lösung im Anhang korrekt ist oder doch korrigiert werden soll.
Hier die Aufgabenstellung:
Die Drehzahl eines Gleichstrommotors mit Fremderregung soll mit einem P-Regler geregelt werden.
Die Drehzahl n hängt von der Erregerspannung Ue und dem Lastmoment ML nach folgender Beziehung ab.
n / % = 5000 / (Ue / V) - 1082 * (ML / Nm) / (Ue / V) 2.
In dieser Gleichung wurden die physikalischen Variablen durch deren jeweilige physikalische Einheit dividiert, wodurch alle Summanden dimensionslos wurden.
Die Dynamik der Rotationsmasse aus Anker und angeschlossener Last kann durch ein PT1-Verhalten mit T1 = 5 s beschrieben werden. Eine zweite Verzögerung 1. Ordnung muss man wegen der elektrischen Eigenschaft aus Induktivität der Ankerwicklung und ihres ohmschen Widerstandes ansetzen. Diese Zeitkonstante wird hier mit T2 = 1 s angenommen.
In dem Funktionsbaustein "Motor" muss nun diese Dynamik realisiert werden. Dazu müssen neben den beiden Zeitkonstanten die Zykluszeit "Zyklus" (in s) und das boolesche Signal "Run" zum ein- und ausschalten der Dynamik vorgegeben werden. Zeigen Sie hier den Deklarationsteil und den Rumpf des in SCL programmierten FB
"Motor"
FUNCTION_BLOCK Motor
VAR_INPUT
Ue: REAL; (* Erregerspannung in V *)
ML: REAL; (* Lastmoment in Nm *)
Run: BOOL;
Zyklus: REAL;
END_VAR
VAR_OUTPUT
n: REAL; (* Drehzahl in % *)
END_VAR
VAR
nst: REAL;
DB_Mein_PT1_1: Mein_PT1;
DB_Mein_PT1_2: Mein_PT1;
END_VAR
==================================================================
IF Ue > 0.0 THEN
nst := 5000 / Ue - 1082 * ML / (Ue * Ue);
DB_Mein_PT1_1(Run:=Run, Xe:=nst, T1:=5, Zyklus:=Zyklus);
DB_Mein_PT1_2(Run:=Run, Xe:=DB_Mein_PT1_1.Xa, T1:=1, Zyklus:=Zyklus);
n := DB_Mein_PT1_2.Xa;
END_IF;
IF n > 100.0 THEN n := 100.0;
ELSIF n < 0.0 THEN n := 0.0;
END_IF;
Wäre das so korrekt ?
Vielen Dank für die Unterstützung
für die folgende Aufgabenstellung habe ich Verzweifel, ob meine Lösung im Anhang korrekt ist oder doch korrigiert werden soll.
Hier die Aufgabenstellung:
Die Drehzahl eines Gleichstrommotors mit Fremderregung soll mit einem P-Regler geregelt werden.
Die Drehzahl n hängt von der Erregerspannung Ue und dem Lastmoment ML nach folgender Beziehung ab.
n / % = 5000 / (Ue / V) - 1082 * (ML / Nm) / (Ue / V) 2.
In dieser Gleichung wurden die physikalischen Variablen durch deren jeweilige physikalische Einheit dividiert, wodurch alle Summanden dimensionslos wurden.
Die Dynamik der Rotationsmasse aus Anker und angeschlossener Last kann durch ein PT1-Verhalten mit T1 = 5 s beschrieben werden. Eine zweite Verzögerung 1. Ordnung muss man wegen der elektrischen Eigenschaft aus Induktivität der Ankerwicklung und ihres ohmschen Widerstandes ansetzen. Diese Zeitkonstante wird hier mit T2 = 1 s angenommen.
In dem Funktionsbaustein "Motor" muss nun diese Dynamik realisiert werden. Dazu müssen neben den beiden Zeitkonstanten die Zykluszeit "Zyklus" (in s) und das boolesche Signal "Run" zum ein- und ausschalten der Dynamik vorgegeben werden. Zeigen Sie hier den Deklarationsteil und den Rumpf des in SCL programmierten FB
"Motor"
FUNCTION_BLOCK Motor
VAR_INPUT
Ue: REAL; (* Erregerspannung in V *)
ML: REAL; (* Lastmoment in Nm *)
Run: BOOL;
Zyklus: REAL;
END_VAR
VAR_OUTPUT
n: REAL; (* Drehzahl in % *)
END_VAR
VAR
nst: REAL;
DB_Mein_PT1_1: Mein_PT1;
DB_Mein_PT1_2: Mein_PT1;
END_VAR
==================================================================
IF Ue > 0.0 THEN
nst := 5000 / Ue - 1082 * ML / (Ue * Ue);
DB_Mein_PT1_1(Run:=Run, Xe:=nst, T1:=5, Zyklus:=Zyklus);
DB_Mein_PT1_2(Run:=Run, Xe:=DB_Mein_PT1_1.Xa, T1:=1, Zyklus:=Zyklus);
n := DB_Mein_PT1_2.Xa;
END_IF;
IF n > 100.0 THEN n := 100.0;
ELSIF n < 0.0 THEN n := 0.0;
END_IF;
Wäre das so korrekt ?
Vielen Dank für die Unterstützung