PID演算命令
PID演算命令は、与えられた測定値(温度など)とあらかじめ与えられた出力値(20°Cなど)から、プロセス(ヒータなど)を調整する制御に使用します。
入力
パラメータの詳細については、PID_DUT_31の項をご参照ください。
F命令を使用する代わりに、対応するFP7命令を使用することをおすすめします。FP_PID_BASIC
この命令は、30個の要素を持つARRAY型の変数sに入力されたデータテーブルに設定されたパラメータに従って、PIDアルゴリズムを演算します。
パラメータ設定値が指定できる範囲外のとき
パラメータ設定値が指定できる範囲外のとき
グローバル変数リストでは、プロジェクト内のすべてのPOUからアクセスできる変数を宣言します。
POUヘッダには、このプログラムで使用するすべての入力変数と出力変数を宣言します。 POUヘッダは全プログラム言語で使用できます。
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
データ型PID_DUT_31の変数PidParametersの初期化で、MVの上限値が4000に設定されます。比例ゲインKpは80 (8)、Ti、Tdは200 (20s)、サンプリング時間Tsは100 (1s)に設定されています。
実行条件EnableAutoTuningがFALSEからTRUEになると(F355_PID_DUT命令の制御モードオートチューニングがアクティブになると)、MOVE命令によって、値16#8000がDUT PidParametersのControlの要素にコピーされます。
また、変数Set_Value_SP、Process_Value_PVの値が、DUT PidParametersのSPとPVの要素に割り付けられます。これらの値は、A/D変換部のチャンネル0、チャンネル1から取得されます。
F355_PID_DUTファンクションブロックのEN出力は、母線に直接接続されているので、このファンクションは、PLCがRUNモードのとき実行されます。"DUT PidParameters"の要素"MV"にあるコントローラの演算出力値を、変数Output_Value_MVに格納します。この値は、PLCからD/A変換部を経由し出力されます。
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;