給你個Step 7寫的PID控制的FC模組。帶"_IN"與帶"_OUT"的變數,如果字首是一樣的,要求連線同一個變數。 FUNCTION FC1 : VOID VAR_INPUT Run:BOOL; //True-執行,False-停止 Auto:BOOL; //True-自動,False-手動 ISW:BOOL; //True-積分有效,False-積分無效 DSW:BOOL; //True-微分有效,False-微分無效 SetMV:REAL; //手動時的開度設定值 SVSW:REAL; //當設定值低於SVSW時,開度為零 PV:REAL; //測量值 SV:REAL; //設定值 DeadBand:REAL; //死區大小 PBW:REAL; //比例帶大小 IW:REAL; //積分帶大小 DW:REAL; //微分帶大小 dErr_IN:REAL; //誤差累積 LastPV_IN:REAL; //上一控制週期的測量值 END_VAR VAR_OUTPUT MV:REAL; //輸出開度 dErr_OUT:REAL; //誤差累積 LastPV_OUT:REAL;//上一控制週期的測量值 END_VAR VAR Err:REAL; //誤差 dErr:REAL; //誤差累積 PBH:REAL; //比例帶上限 PBL:REAL; //比例帶下限 PVC:REAL; //測量值在一個控制週期內的變化率,即測量值變化速率 P:REAL; //比例項 I:REAL; //積分項 D:REAL; //微分項 END_VAR IF Run=1 THEN IF Auto=1 THEN IF SV>=SVSW THEN Err:=SV-PV; PBH:=SV+PBW; PBL:=SV-PBW; IF PVPBH THEN MV:=0; ELSE P:=(PBH-PV)/(PBH-PBL); //計算比例項 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////以下為積分項的計算////////////////////////////////////////////////////////////// IF ISW=1 THEN dErr:=dErr_IN; IF (PV<(SV-DeadBand)) OR (PV>(SV+DeadBand)) THEN IF (dErr+Err)<(0-IW) THEN dErr:=0-IW; ELSIF (dErr+Err)>IW THEN dErr:=IW; ELSE dErr:=dErr+Err; END_IF; END_IF; I:=dErr/IW; dErr_OUT:=dErr; ELSE I:=0; END_IF; /////////////////////////////////////////////以上為積分項的計算////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////以下為微分項的計算////////////////////////////////////////////////////////////// IF DSW=1 THEN PVC:=LastPV_IN-PV; D:=PVC/DW; LastPV_OUT:=PV; ELSE D:=0; END_IF; /////////////////////////////////////////////以上為微分項的計算////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// IF (P+I+D)>1 THEN MV:=1; ELSIF (P+I+D)<0 THEN MV:=0; ELSE MV:=P+I+D; END_IF; END_IF; ELSE MV:=0; END_IF; ELSE MV:=SetMV; END_IF; ELSE MV:=0; END_IF; END_FUNCTION 進行整定時先進行P調節,使I和D作用無效,觀察溫度變化曲線,若變化曲線多次出現波形則應該放大比例(P)引數,若變化曲線非常平緩,則應該縮小比例(P)引數。比例(P)引數設定好後,設定積分(I)引數,積分(I)正好與P引數相反,曲線平緩則需要放大積分(I),出現多次波形則需要縮小積分(I)。比例(P)和積分(I)都設定好以後設定微分(D)引數,微分(D)引數與比例(P)引數的設定方法是一樣的。 當初寫這段程式的就是為了使用調功器來控制爐子的溫度的,已經在我單位的調功器上執行成功了,還有就是我單位的調功器沒有使用微分(D),只是用了比例(P)和積分(I)。
給你個Step 7寫的PID控制的FC模組。帶"_IN"與帶"_OUT"的變數,如果字首是一樣的,要求連線同一個變數。 FUNCTION FC1 : VOID VAR_INPUT Run:BOOL; //True-執行,False-停止 Auto:BOOL; //True-自動,False-手動 ISW:BOOL; //True-積分有效,False-積分無效 DSW:BOOL; //True-微分有效,False-微分無效 SetMV:REAL; //手動時的開度設定值 SVSW:REAL; //當設定值低於SVSW時,開度為零 PV:REAL; //測量值 SV:REAL; //設定值 DeadBand:REAL; //死區大小 PBW:REAL; //比例帶大小 IW:REAL; //積分帶大小 DW:REAL; //微分帶大小 dErr_IN:REAL; //誤差累積 LastPV_IN:REAL; //上一控制週期的測量值 END_VAR VAR_OUTPUT MV:REAL; //輸出開度 dErr_OUT:REAL; //誤差累積 LastPV_OUT:REAL;//上一控制週期的測量值 END_VAR VAR Err:REAL; //誤差 dErr:REAL; //誤差累積 PBH:REAL; //比例帶上限 PBL:REAL; //比例帶下限 PVC:REAL; //測量值在一個控制週期內的變化率,即測量值變化速率 P:REAL; //比例項 I:REAL; //積分項 D:REAL; //微分項 END_VAR IF Run=1 THEN IF Auto=1 THEN IF SV>=SVSW THEN Err:=SV-PV; PBH:=SV+PBW; PBL:=SV-PBW; IF PVPBH THEN MV:=0; ELSE P:=(PBH-PV)/(PBH-PBL); //計算比例項 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////以下為積分項的計算////////////////////////////////////////////////////////////// IF ISW=1 THEN dErr:=dErr_IN; IF (PV<(SV-DeadBand)) OR (PV>(SV+DeadBand)) THEN IF (dErr+Err)<(0-IW) THEN dErr:=0-IW; ELSIF (dErr+Err)>IW THEN dErr:=IW; ELSE dErr:=dErr+Err; END_IF; END_IF; I:=dErr/IW; dErr_OUT:=dErr; ELSE I:=0; END_IF; /////////////////////////////////////////////以上為積分項的計算////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////以下為微分項的計算////////////////////////////////////////////////////////////// IF DSW=1 THEN PVC:=LastPV_IN-PV; D:=PVC/DW; LastPV_OUT:=PV; ELSE D:=0; END_IF; /////////////////////////////////////////////以上為微分項的計算////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// IF (P+I+D)>1 THEN MV:=1; ELSIF (P+I+D)<0 THEN MV:=0; ELSE MV:=P+I+D; END_IF; END_IF; ELSE MV:=0; END_IF; ELSE MV:=SetMV; END_IF; ELSE MV:=0; END_IF; END_FUNCTION 進行整定時先進行P調節,使I和D作用無效,觀察溫度變化曲線,若變化曲線多次出現波形則應該放大比例(P)引數,若變化曲線非常平緩,則應該縮小比例(P)引數。比例(P)引數設定好後,設定積分(I)引數,積分(I)正好與P引數相反,曲線平緩則需要放大積分(I),出現多次波形則需要縮小積分(I)。比例(P)和積分(I)都設定好以後設定微分(D)引數,微分(D)引數與比例(P)引數的設定方法是一樣的。 當初寫這段程式的就是為了使用調功器來控制爐子的溫度的,已經在我單位的調功器上執行成功了,還有就是我單位的調功器沒有使用微分(D),只是用了比例(P)和積分(I)。