PID算法通过比例(P)、积分(I)、微分(D)三个部分来控制系统的输出。具体来说,比例部分(P)根据误差的大小直接成比例地调整输出,积分部分(I)根据误差的累积值进行调整,微分部分(D)根据误差的变化速率进行调整。这三个部分通过线性组合构成控制量,对控制对象进行控制。
输出 = Kp * 误差 + Ki * 积分误差 + Kd * 误差的变化率
PID控制通过积分作用消除误差,而微分控制可缩小超调量,加快反应,是综合了PI控制与PD控制长处,并消除其短处。从频域角度看,PID控制通过积分作用于系统的低频段,以提高系统的稳定性,而微分作用于系统的中频段,以改善系统的动态性能。
比例(P)控制能迅速反应误差,从而减小稳态误差。但是,比例控制不能消除稳态误差。比例放大系数的加大.会引起系统的不稳定。积分(I)控制的作用是:只要系统有误差存在,积分控制器就不断地积累,输出控制量,以消除误差。积分作用太强会使系统超调加大,甚至使系统出现振荡。微分(D)控制可以减小超调量,克服振荡,使系统的稳定性提高,同时加快系统的动态响应速度.减小调整时间,从而改善系统的动态性能
以Codesys为例:
PROGRAM PLC_PRG
VAR
SV : REAL;
PV : REAL;
PVt : ARRAY [0..99] OF REAL;
i : INT;
j : INT;
k : INT;
PID : REAL;
err : ARRAY [0..99] OF REAL;
R_TRIG1 : R_TRIG;
sum : REAL;
KD : REAL;
KI : REAL;
KP : REAL := 0.3 ;
TON1 ,TON2 , TON3 : TON;
Direction : BOOL;
END_VAR
//PID采样时间
TON1(IN:= NOT TON1.Q , PT:= T#0.01S , Q=> , ET=> );
R_TRIG1(CLK:= TON1.Q, Q=> );
IF R_TRIG1.Q THEN
FOR i := 1 TO 99 BY 1 DO
PVt[100 -i] := PVt[99 - i];
END_FOR
PVt[0] := PV ;
END_IF
FOR j := 0 TO 99 BY 1 DO
err[j] := SV -PVt[j];
END_FOR
IF KP = 0 THEN
KP := 1;
END_IF
sum := 0;
FOR k := 0 TO 99 BY 1 DO
sum := sum + err[k];
END_FOR
PID := KP * err[0] + KI * sum / 100.0 + KD * (err[0] - err[1]);
//PID运算周期设定
TON2(IN:= NOT TON2.Q, PT:= T#0.01S, Q=> , ET=> );
IF TON2.Q THEN
PV := PV + PID;
END_IF
//模拟设定值的一个变化
TON3(IN:= NOT TON3.Q, PT:= T#10S, Q=> , ET=> );
IF TON3.Q THEN
Direction := NOT Direction ;
IF Direction THEN
SV := 4;
ELSE
SV := 3;
END_IF
END_IF