Hallo zusammen,
ich probiere gerade einen PI-Regler mit dem FB FT_PI ans Laufen zu bringen. Dabei fällt auf, dass beim Signalwechsel am Eingang RST von FALSE auf TRUE der Ausgang Y in die Höhe schießt. Verantwortlich dafür ist der Ausgang Y des FT_INT. Der I-Regler zieht den Ausgang zwar dann wieder runter, aber für den Prozess kann ich so ein Verhalten nicht gebrauchen. Das Verhalten ist unabhängig von der Einstellung der Regelparameter Kp und Ki. Ich habe auch sehr kleine Einstellungen probiert.
Meiner Meinung nach liegt das an einem Fehler im FT_INT. Während "RST = TRUE" ist wird die Instanz "integ" von INTEGRATE nicht aufgerufen. Deshalb wird dort drin nicht mehr "last := tx" ausgeführt. Beim ersten Zyklus mit "RST = FALSE" wird die neue Systemzeit "tx" gelesen und in der Berechnung davon "last" abgezogen: Y := (X + X_LAST) * 0.5E-3 * DWORD_TO_REAL(tx-last) * K + Y
Erst danach wird wieder "last := tx" ausgeführt. Die Differenz in diesem ersten Zyklus ist also ungültig.
Bitte berichtigt mich, wenn ich das falsch lese.
Mein Baustein sieht so aus:
FUNCTION_BLOCK INTEGRATE
VAR_INPUT
E : BOOL := TRUE;
X : REAL;
K : REAL := 1.0;
END_VAR
VAR_IN_OUT
Y : REAL;
END_VAR
VAR
X_last : REAL;
init: BOOL;
last: DWORD;
tx: DWORD;
fp : BOOL;
END_VAR
tx := T_PLC_MS();
IF NOT init THEN
init := TRUE;
X_last := X;
fp := FALSE;
ELSIF E AND NOT fp THEN
fp := TRUE;
ELSIF E AND fp THEN
Y := (X + X_LAST) * 0.5E-3 * DWORD_TO_REAL(tx-last) * K + Y;
X_last := X;
ELSE
fp := FALSE;
END_IF;
last := tx;
Bitte um Kommentare.
Danke.
ich probiere gerade einen PI-Regler mit dem FB FT_PI ans Laufen zu bringen. Dabei fällt auf, dass beim Signalwechsel am Eingang RST von FALSE auf TRUE der Ausgang Y in die Höhe schießt. Verantwortlich dafür ist der Ausgang Y des FT_INT. Der I-Regler zieht den Ausgang zwar dann wieder runter, aber für den Prozess kann ich so ein Verhalten nicht gebrauchen. Das Verhalten ist unabhängig von der Einstellung der Regelparameter Kp und Ki. Ich habe auch sehr kleine Einstellungen probiert.
Meiner Meinung nach liegt das an einem Fehler im FT_INT. Während "RST = TRUE" ist wird die Instanz "integ" von INTEGRATE nicht aufgerufen. Deshalb wird dort drin nicht mehr "last := tx" ausgeführt. Beim ersten Zyklus mit "RST = FALSE" wird die neue Systemzeit "tx" gelesen und in der Berechnung davon "last" abgezogen: Y := (X + X_LAST) * 0.5E-3 * DWORD_TO_REAL(tx-last) * K + Y
Erst danach wird wieder "last := tx" ausgeführt. Die Differenz in diesem ersten Zyklus ist also ungültig.
Bitte berichtigt mich, wenn ich das falsch lese.
Mein Baustein sieht so aus:
FUNCTION_BLOCK INTEGRATE
VAR_INPUT
E : BOOL := TRUE;
X : REAL;
K : REAL := 1.0;
END_VAR
VAR_IN_OUT
Y : REAL;
END_VAR
VAR
X_last : REAL;
init: BOOL;
last: DWORD;
tx: DWORD;
fp : BOOL;
END_VAR
tx := T_PLC_MS();
IF NOT init THEN
init := TRUE;
X_last := X;
fp := FALSE;
ELSIF E AND NOT fp THEN
fp := TRUE;
ELSIF E AND fp THEN
Y := (X + X_LAST) * 0.5E-3 * DWORD_TO_REAL(tx-last) * K + Y;
X_last := X;
ELSE
fp := FALSE;
END_IF;
last := tx;
Bitte um Kommentare.
Danke.