发表于:2004-02-17 15:44:00
楼主
大家好:
好多人要pid程序,我不能一一答复,现把源程序发在论坛上
希望大家能把好的程序共享.
也希望能交一些工控朋友.本人qq117084743
//*************************************** //
//以下为增量式pid源程序,增量式pid源程序的基础上,//
//可以进行多种改造,变成一些新型pid功能 //
//*************************************** //
FUNCTION_BLOCK FB 40
TITLE =PID
// KNOW_HOW_PROTECT
AUTHOR: XGZ
FAMILY: AUTOCON
NAME: PID_CONTROLLER
VERSION: 1.0
VAR_INPUT
PV : WORD ; //整形PV值输入(0~27648)
PV_PER : BOOL ;
END_VAR
VAR_OUTPUT
MVINT : WORD ;//整形MV值输出(0~27648)
END_VAR
VAR_IN_OUT
PVIN : REAL ; //浮点型PV值输入(0~100.0)
SVOUT : REAL ; //外部设定值输入(0~100.0)
MV : REAL ; //PID运算输出值(0~100.0)
END_VAR
VAR
PVH : REAL : =90.0 ;//测量值高限报警
PVL : REAL : =10.0 ;// 测量值低限报警
SVH : REAL : =110.0 ;//设定值高限幅
SVL : REAL : =-10.0 ; //设定值低限幅
MVH : REAL : =103.0 ; //输出值高限幅
MVL : REAL : =-3.0 ; //输出值低限幅
TS : TIME : =T#200MS; //运算采样时间
SVIN : REAL ;//内部设定值输入
PVSUM : REAL ;//PV累计值
MANON : BOOL : =TRUE; //手自动开关
CASON : BOOL ;//串级开关
PVHO : BOOL ;//测量值高限报警
PVLO : BOOL ; //测量值低限报警
SVHO : BOOL ; //设定值高限幅报警
SVLO : BOOL ; //设定值低限幅报警
MVHO : BOOL ; //输出值高限幅报警
MVLO : BOOL ; //输出值低限幅报警
DEAD_EN : REAL : =0.0 ; //报警死区值
DEAD_ALARM : REAL : =0.2 ; //报警死区值
DEAD_SUM : REAL : =0.2 ; //累积小信号切除值
KP : REAL : =2.0 ;//增益系数
TI : TIME : =T#30S ;//积分时间
TD : TIME : =T#10S ;//微分时间
BASET : TIME ;//采样基准时间
PVN : REAL ;//当前PV值
PVN_1 : REAL ;//前一周期pv采样值
PVN_2 : REAL ; //前两个周期pv采样值
DPVN : REAL ;//pv值变化量
DPVN_1 : REAL ;//前一周期pv变化量
STEP : BYTE ;
END_VAR
VAR_TEMP
DUKPN : REAL ;//比例增量
DUIN : REAL ;//积分增量
DUDN : REAL ;//微分增量
DUN : REAL ;//增量值
EN : REAL ;//误差
TP1 : DWORD ;
TP2 : WORD ;
END_VAR
BEGIN
L #STEP;
JL LIST;
JU STP0;
LIST: JU STP1;
STP0: NOP 0;
CALL "TIME_TCK" ;
RET_VAL:=#BASET ;
L "SYS_DB".ttime;
T #BASET;
L 1;
T #STEP;
JU COM;
STP1: NOP 0;
L "SYS_DB".ttime;
L #BASET;
-D;
T #TP1;
L L#0;
<D;
JC REP; //修正
JU A03;
REP: NOP 0; //修正程序
L #TP1;
L L#2147483647;
+D;
T #TP1;
A03: L #TP1;
L TS;
>=D;
JC A04;
JU END;
A04: NOP 0;//采样时间到,运行累积、PID等运算
L PVIN ;
L DEAD_SUM ;
<=R ;
JC CLR ;
L PVIN ;
T TP2 ;
JU A05 ;
CLR: L 0.0 ;
T TP2 ;
A05: L #TP1;
DTR;
L #TP2;
*R;
L 3.600000e+006;
/R;
L #PVSUM;
+R;
T #PVSUM;//运行累积运算,并有小信号切除功能
//***************************************************************//
L PVN_1 ;
T PVN_2 ;
L PVN ;
T PVN_1 ;
L PVIN ;
T PVN ;//往后推一周期
A MANON;
JC MAN;
L SVIN ;
L PVN ;
-R ;
T EN ;//En=SV(n)-PV(n)
L PVN_1 ;
L PVN ;
-R ;
T DPVN ;//△PV(n)= PV(n-1)- PV(n)
L PVN_2 ;
L PVN_1 ;
-R ;
T DPVN_1 ; //△PV(n-1)= PV(n-2)- PV(n-1)
L KP ;
L DPVN ;
*R ;
T DUKPN ;// △Ukp=Kp*△PV(n)
L TP1 ;
DTR ;
L TI ;
DTR ;
/R ;
L KP ;
*R ;
L EN ;
*R ;
T DUIN ; // △Ui=(Kp*Ts/Ti)*E(n)
L DPVN ;
L DPVN_1 ;
-R ;
L TD ;
DTR ;
*R ;
L TP1 ;
DTR ;
/R ;
L KP ;
*R ;
T DUDN ;//△Ud=Kp*Td/Ts*(△PV(n)- △PV(n-1))
L DUKPN ;
L DUIN ;
+R ;
L DUDN ;
+R ;
T DUN;// △U(n)= △Ukp+△Ui+△Ud
L EN ;
ABS;
L DEAD_EN;
<R;
JC COMM;
L MV ;
L DUN ;
+R ;
T MV ; //MV=MV+△U(n)
JU COMM ;
MAN: L #PVIN ;
T #SVIN ;
JU COMM ;
COMM: NOP 0 ;
//****************************************************************//
L 0;
T #STEP;
COM: NOP 0;
L #PVIN;
L