Beiträge anzeigen

Diese Sektion erlaubt es ihnen alle Beiträge dieses Mitglieds zu sehen. Beachten sie, dass sie nur solche Beiträge sehen können, zu denen sie auch Zugriffsrechte haben.


Themen - ja

Seiten: [1]
1
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.

Seiten: [1]