-> Hier kostenlos registrieren
Danke für die Zahlreichen Anmerkungen und Korrekturen.
Ich bekomme die Variante die ich simulieren möchte einfach nicht zum Laufen. Einfach ein PID der auf einer P-T1 Strecke arbeitet.
Ich habe den simpelst möglichen Algortithmus herausgezogen (den fertigen Basis-PID könnte ich nat. nehmen, aber das muss doch zu Fuss hin zu bekommen sein
) und trotzdem viel zu grosse alternierende Werte in der runtime. Erwarten würde ich ein einschwingen auf den Sollwert hier fiktiv eine Drehzahl 400 rpm.
Ich möchte hier Auszüge zeigen, vlt. sieht jemand meinen Gedankenfehler. Ich beschränke mich mal auf die nötigsten Variablen. Initialisierungen und Limitierungen hier mal weggelassen.
Der Ausgang des PID geht auf den Eingang des P-T1. Der Ausgang des P-T1 geht als Istwert auf den Eingang des PID.
Eine Simulation des P-T1 in Excel funktioniert mit eine Sprung auf 400 wie es ein P-T1 soll, weich ansteigen bis auf Sollwert.

Ich bekomme die Variante die ich simulieren möchte einfach nicht zum Laufen. Einfach ein PID der auf einer P-T1 Strecke arbeitet.
Ich habe den simpelst möglichen Algortithmus herausgezogen (den fertigen Basis-PID könnte ich nat. nehmen, aber das muss doch zu Fuss hin zu bekommen sein

Ich möchte hier Auszüge zeigen, vlt. sieht jemand meinen Gedankenfehler. Ich beschränke mich mal auf die nötigsten Variablen. Initialisierungen und Limitierungen hier mal weggelassen.
Der Ausgang des PID geht auf den Eingang des P-T1. Der Ausgang des P-T1 geht als Istwert auf den Eingang des PID.
Eine Simulation des P-T1 in Excel funktioniert mit eine Sprung auf 400 wie es ein P-T1 soll, weich ansteigen bis auf Sollwert.
Code:
Program Controller
Var
rpm: REAL :=400; (*Sollwert*)
TA: REAL:=0.02; (* 20ms Cycluszeit ist hier nur vereinfacht fest eingesetzt *)
t: REAL:=0.2; (* sample intervall*)
kp: REAL:=1.0;
ki: REAL:=1.0;
kd: REAL:=1.0;
k: REAL:=1.0;
PIDout: REAL;
PT1out: REAL;
END_VAR
Code:
PID(
w:= rpm,
x:= PT1out ,
Ta:= Ta,
KP:= kp ,
KI:= ki,
KD:= kd,
Y=>PIDout );
PT1(
y:=PIDout ,
Ta:= Ta ,
T:= t,
K:= k,
RST:= rst ,
out=>PT1out );
Code:
FUNCTION_BLOCK FB_PID
VAR_INPUT
w : REAL;
x : REAL;
Ta : real;
KP : REAL;
KI : REAL;
KD : REAL;
END_VAR
VAR_OUTPUT
Y : REAL;
END_VAR
VAR
e: REAL;
de: REAL;
esum: REAL;
ealt: REAL;
END_VAR
Code:
e:=w-x;
IF Ki > 0 THEN
esum := esum + e * Ta;
ELSE
esum := 0;
END_IF
IF Kd > 0 THEN
de:= (e-ealt) / Ta;
ELSE
de := 0;
END_IF
y := (KP * e) + (KI * esum ) + (KD * de);
ealt:=e;
Code:
FUNCTION_BLOCK FB_PT1
VAR_INPUT
y : REAL;
Ta : REAL;
T : REAL;
K : REAL;
RST : BOOL;
END_VAR
VAR_OUTPUT
out : REAL;
END_VAR
out := out + (y * K - out) * Ta / T;

Zuletzt bearbeitet: