PID-Regler mit Auto-Tuning
Die PID-Regelung wird verwendet, um mit Hilfe eines gemessenen Istwerts (z.B. Temperatur) und eines vorgegebenen Sollwertes (z.B. 20°C) eine Stelleinrichtung (z.B. Heizung) zu regeln.
Eingang
Detaillierte Erläuterungen zu den Parametern finden Sie unter PID_DUT_31.
Wir empfehlen, anstelle von diesem F-Befehl den entsprechenden FP7-Befehl zu verwenden: FP_PID_BASIC
Die Funktion berechnet einen PID-Algorithmus, dessen Parameter als Datentabelle (d.h. in Form eines ARRAY) mit 30 Elementen am Eingang s eingegeben werden.
wenn die Parameterwerte außerhalb ihres erlaubten Bereichs sind.
wenn die Parameterwerte außerhalb ihres erlaubten Bereichs sind.
In der globalen Variablenliste können Sie Variablen festlegen, die von allen POEs des Projekts verwendet werden können.
Im POE-Kopf werden alle Ein- und Ausgangsvariablen deklariert, die für die Programmierung dieser Funktion verwendet werden. Für alle Programmiersprachen wird der gleiche POE-Kopf verwendet.
VAR_EXTERNAL
EnableAutoTuning: BOOL:=FALSE;
(*Switch Auto Tuning On *)
Set_Value_SP: WORD:=0;
(*A/D CH0*)
Process_Value_PV: WORD:=0;
(*A/D CH1*)
Output_Value_MV: WORD:=0;
(*D/A*)
END_VAR
VAR
PidParameters: PID_DUT_31;
(*PID Parameters*)
END_VAR
Bei der Initialisierung der Variablen PidParameters vom Datentyp PID_DUT_31, wird die Obere Grenze der Stellgröße MV auf 4000 gesetzt. Der Proportionalbeiwert Kp ist ursprünglich auf 80 (8) gesetzt, Ti und Td auf 200 (20s) und die Regelzykluszeit Ts auf 100 (1s).
Die Standardfunktion MOVE kopiert den Wert 16#8000 in das Element Control des SDT PidParameters, wenn die Variable EnableAutoTuning von FALSE auf TRUE gesetzt wird (aktiviert die Betriebsart Auto-Tuning in der Funktion F355_PID_DUT).
Die Variablen Set_Value_SP und Process_Value_PV werden den Elementen SP und PV des SDTs PidParameters zugeordnet. Sie erhalten ihre Werte durch die A/D-Wandler Kanäle 0 und 1.
Da der EN-Ausgang des Funktionsbausteins F355_PID_DUT direkt mit der Stromlinie verbunden ist, wird der PID-Regler immer ausgeführt, wenn sich die Steuerung im RUN-Modus befindet. Die berechnete Stellgröße wird im Element MV des SDTs PidParameters gespeichert und der Variablen Output_Value_MV zugeordnet. Ihr Wert wird durch einen D/A-Wandler am Ausgang der Steuerung zurückgegeben.
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_F,E_MOVE,,10,2,17,6,,?DEN?Da_Num?AENO?C);
B(B_VAROUT,,PidParameters.Control,17,4,19,6,);
B(B_VARIN,,16#8000,8,4,10,6,);
B(B_CONTACT,,EnableAutoTuning,5,3,7,5,R);
B(B_COMMENT,,Enable Auto Tuning,2,1,12,2,);
L(1,4,5,4);
L(7,4,10,4);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 4 ;
NETWORK_BODY
B(B_VARIN,,Set_Value_SP,9,2,11,4,);
B(B_VAROUT,,PidParameters.SP,11,2,13,4,);
B(B_COMMENT,,Fill the DUT PID_DUT_31 with the corresponding values,2,1,24,2,);
L(1,0,1,4);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 2 ;
NETWORK_BODY
B(B_VARIN,,Process_Value_PV,9,0,11,2,);
B(B_VAROUT,,PidParameters.PV,11,0,13,2,);
L(1,0,1,2);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 7 ;
NETWORK_BODY
B(B_VARIN,,PidParameters,8,5,10,7,);
B(B_F,F355_PID_DUT!,Instance,10,3,18,7,,?DEN?D@'s'?AENO);
B(B_COMMENT,,Carry out the PID arithmetic,2,1,21,2,);
L(1,5,10,5);
L(1,0,1,7);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 4 ;
NETWORK_BODY
B(B_VARIN,,PidParameters.MV,9,2,11,4,);
B(B_VAROUT,,Output_Value_MV,11,2,13,4,);
B(B_COMMENT,,Write manipulated value to the output,2,1,21,2,);
L(1,0,1,4);
END_NETWORK_BODY
END_NET_WORK
END_BODY
(* Auto Tuning: *)
if DF(EnableAutoTuning) then
PidParameters.Control:=16#8000;
end_if;
(* Fill the DUT PidParameters with the corresponding input values: *)
PidParameters.SP:=Set_Value_SP;
PidParameters.PV:=Process_Value_PV;
(* Carry out the PID arithmetic: *)
F355_PID_DUT(PidParameters);
(* Write the manipulated value to the output: *)
Output_Value_MV:=PidParameters.MV;