huyou
級別: 略有小成
精華主題: 0
發(fā)帖數(shù)量: 152 個
工控威望: 322 點(diǎn)
下載積分: 946 分
在線時間: 161(小時)
注冊時間: 2009-08-04
最后登錄: 2024-09-26
查看huyou的 主題 / 回貼
樓主  發(fā)表于: 2009-08-09 10:27
在學(xué)習(xí)PID指令時,雖然有框圖,但理解還是感覺比較吃力,花了許多功夫最終還是用不好PID指令。對某些有自整定參數(shù)功能的PID指令如何實(shí)現(xiàn)所謂“自整定參數(shù)”的功能也是一頭霧水。反反復(fù)復(fù)地看了許多關(guān)于PID方面的文章,也琢磨了一些自己的理解,下面是用S7-300的“STL源文件”編寫的一段程序,純粹當(dāng)作練習(xí):

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 ; //設(shè)定點(diǎn)
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 =
//積分時間設(shè)定:每次運(yùn)算的周期
A M 0.0; //0.1s脈沖
CD C 0;
A #_1; //設(shè)定時間值
L #I;
S C 0;
AN C 0;
FP #_2;
= #_1;

NETWORK
TITLE =
//PID運(yùn)算: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 =
//設(shè)置上限為100%
//運(yùn)算結(jié)果超出上限是無意義的,例如當(dāng)結(jié)果為150%時,實(shí)際上執(zhí)行的是100%,更重要的是從
//150%返回到100%會使反應(yīng)緩慢。


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 =
//將工程量(如溫度值)轉(zhuǎn)換為數(shù)字量輸出,供數(shù)/模轉(zhuǎn)換(模擬量輸出)
L #MV;
L 2.764800e+002;
*R ;
RND ;
T #out;

NETWORK
TITLE =
//將本次過程值寫入“上次過程值”,以準(zhǔn)備下次運(yùn)算
// ------刷新

L #PV;
T #PV0;

END_FUNCTION_BLOCK
[fly]忽悠,接著忽悠……[/fly]