印刷机张力控制一般都用速度PI控制(没有D),长期以来一直用PLC的标准PID功能块来实现,后来根据PID的公式原理自己做了一个,半年来已经用在多台机器上,自我感觉简单高效,而且效果很好,拿出来和大家分享一下。
这个功能块SCL编写, 放在100mS的中断中来用
VAR_INPUT
EN: BOOL:=FALSE;
运算使能: BOOL:=FALSE;
逆动作: BOOL:=FALSE;
检测值: INT:=0;
设定值: INT:=0;
P值: INT:=0;
I值: INT:=0;
限幅: INT:=0;
线速度mm_min_f: REAL:=0.0;
END_VAR
VAR_OUTPUT
ENO: BOOL:=FALSE;
PI输出值: INT:=0;
整定后速度mm_min_f: REAL:=0.0;
END_VAR
VAR
偏差E: INT:=0;
下限幅: INT:=0;
比例值: REAL:=0;
积分值: REAL:=0;
END_VAR
BODY
if (运算使能) then
偏差E:=设定值-检测值;
下限幅:=0-限幅;
比例值:=INT_TO_real(P值)*INT_TO_real(偏差E); (* 比例值=P*偏差 *)
if (PI输出值<限幅 and PI输出值>下限幅) then
积分值:=比例值/INT_TO_real(I值)+积分值; (* 积分值=(比例值/I)+
积分值 *)
end_if;
PI输出值:=LIMIT(MN:=下限幅,IN:=real_TO_INT(比例值+积分值) ,MX:=限幅);(* PI输出值=比例值+积分值 *)
if (逆动作) then PI输出值:=0-PI输出值; (*方向 *)
end_if;
else
积分值:=0; 比例值:=0; PI输出值:=0; (*复位 *)
end_if;
整定后速度mm_min_f:=线速度mm_min_f+INT_TO_REAL(PI输出值);
END_BODY