在學習PID指令時,雖然有框圖,但理解還是感覺比較吃力,花了許多功夫最終還是用不好PID指令。對某些有自整定參數功能的PID指令如何實現所謂“自整定參數”的功能也是一頭霧水。反反復復地看了許多關于PID方面的文章,也琢磨了一些自己的理解,下面是用S7-300的“STL源文件”編寫的一段程序,純粹當作練習:
FUNCTION_BLOCK FB 1
TITLE =
//KNOW_HOW_PROTECT
VERSION : 0.1
VAR_INPUT
PV : REAL ;
END_VAR
VAR_OUTPUT
out : INT ;
END_VAR
VAR
I : INT ; //積分時間(0.1s)
Kp : REAL ; //比例
Kd : REAL ; //微分增益
PV0 : REAL ; //上次過程值
SP : REAL ; //設定點
MV : REAL ; //輸出值
_1 : BOOL ;
_2 : BOOL ;
EV : REAL ; //靜差
END_VAR
VAR_TEMP
temp0 : REAL ;
temp1 : REAL ;
temp2 : BOOL ;
temp3 : BOOL ;
END_VAR
BEGIN
NETWORK
TITLE =
//積分時間設定:每次運算的周期
A M 0.0; //0.1s脈沖
CD C 0;
A #_1; //設定時間值
L #I;
S C 0;
AN C 0;
FP #_2;
= #_1;
NETWORK
TITLE =
//PID運算:MV=MV+Kp{(SP-PV)-Kd(PV-PV0)}
//
A #_1;
JNB _001;
L #PV;
L #PV0;
-R ;
L #Kd;
*R ;
T #temp0;
L #SP;
L #PV;
-R ;
T #EV;
L #temp0;
-R ;
L #Kp;
*R ;
T #temp1;
L #MV;
+R ;
T #MV;
_001: NOP 0;
NETWORK
TITLE =
//設置上限為100%
//運算結果超出上限是無意義的,例如當結果為150%時,實際上執(zhí)行的是100%,更重要的是從
//150%返回到100%會使反應緩慢。
A( ;
L #MV;
L 1.000000e+002;
>=R ;
) ;
JNB _002;
L 1.000000e+002;
T #MV;
_002: NOP 0;
NETWORK
TITLE =
A( ;
L #MV;
L 0.000000e+000;
<=R ;
) ;
JNB _003;
L 0.000000e+000;
T #MV;
_003: NOP 0;
NETWORK
TITLE =
//將工程量(如溫度值)轉換為數字量輸出,供數/模轉換(模擬量輸出)
L #MV;
L 2.764800e+002;
*R ;
RND ;
T #out;
NETWORK
TITLE =
//將本次過程值寫入“上次過程值”,以準備下次運算
// ------刷新
L #PV;
T #PV0;
END_FUNCTION_BLOCK