水至清 主题:口诀:PID参数的设定经验
参数整定找最佳,从小到大顺序查
先是比例后积分,最后再把微分加
曲线振荡很频繁,比例度盘要放大
曲线漂浮绕大湾,比例度盘往小扳
曲线偏离回复慢,积分时间往下降
曲线波动周期长,积分时间再加长
曲线振荡频率快,先把微分降下来
动差大来波动慢。微分时间应加长
理想曲线两个波,前高后低4比1
一看二调多分析,调节质量不会低
经典的PID公式:U(k)=U(k-1) +Kc[E(k)-E(k-1)]+KcTs/Ti[E(k-1)]+KcTd/Ts[E(k)-2E(k-1)+E(k-2)]
Kc 增益
Ti 积分
Td 微分
Ts 采样时间
依默 这是我原来做恒压供水时自己写的增量式的PI控制(没有用微分)
INTERRUPT_BLOCK PI:INT0
TITLE=VD2000 过程变量 VD2004 过程前项 VD2008 设定值 VD2012 比例系数 VD2016 积分系数 VD2020 输出
BEGIN
Network 1
// 滤波
LD SM0.0
MOVD 16#080007EE, LD0
MOVD +0, LD4
MOVW +0, LW8
Network 2
LD SM0.0
FOR LW12, +1, +3
Network 3
LD SM0.0
MOVD LD0, LD14
+D +2, LD0
MOVW *LD0, *LD14
MOVW *LD0, LW10
+D LD8, LD4
Network 4
NEXT
Network 5
// 采样
LD SM0.0
MOVW AIW0, *LD0
MOVW *LD0, LW10
+D LD8, LD4
SRD LD4, 2
DTR LD4, VD2000 //过程变量
MOVR VD2008, LD18
-R VD2000, LD18 //偏差
MOVR LD18, VD2040
Network 6
// 手动
LDN I1.5
LDN Q0.0
AN Q0.2
AN Q0.4
AN Q0.6
OLD
MOVR 19200.0, VD2020
CRETI
Network 7
// 死区
LDR> LD18, -200.0
AR< LD18, 200.0
JMP 0
Network 8
// PI
LD SM0.0
-R VD2000, VD2004
*R VD2012, VD2004
+R VD2004, VD2020 //+P
*R VD2016, LD18
+R LD18, VD2020 //+I
MOVR VD2000, VD2004 //过程前值
Network 9
// 上限
LDR> VD2020, 32000.0
MOVR 32000.0, VD2020
Network 10
// 下限
LDR< VD2020, 19200.0
MOVR 19200.0, VD2020
Network 11
// 标准化
LD SM0.0
ROUND VD2020, LD22
DTI LD22, VW2024
Network 12
LBL 0
Network 13
// 输出
LD SM0.0
MOVW VW2024, AQW0
Network 14
END_INTERRUPT_BLOCK
SUBROUTINE_BLOCK STRAIN:SBR1
TITLE=
VAR_INPUT
Sv:INT; //设定值
Pv:INT; //采样值
Kc:INT; //比例系数
Ki:INT; //积分系数(注意不是积分时间)
END_VAR
VAR_IN_OUT
PvLast:INT; //上一次采样值
OutLast:DINT; //上一次输出值
END_VAR
VAR_OUTPUT
Out:INT; //输出值
END_VAR
BEGIN
Network 1
// Pv(k-1)-Pv(k)
LD SM0.0
MOVW #PvLast, LW32
-I #Pv, LW32
Network 2
// 输入滤波
LDW> LW32, 1000 //若两次采样值之差的绝对值大于1000则表示是扰动。
OW< LW32, -1000
CRET
Network 3
// U(k)=U(k-1) + △U , △U= Kc(Sv-Pv)+ Ki[Pv(k-1)-Pv(k)]
LD SM0.0
MOVW #Pv, #PvLast //把当前采样值存为上一次采样值,为下一次准备
MOVW #Sv, LW36
-I #Pv, LW36 //得到偏差值
MUL #Kc, LD34 //Kc(Sv-Pv)
MUL #Ki, LD30 //Ki[Pv(k-1)-Pv(k)]
+D LD34, LD30 //△U= Kc(Sv-Pv)+ Ki[Pv(k-1)-Pv(k)]
/D 1000,LD30 //注意触摸屏内Kc和Ki带三位小数,所以要除以1000
+D LD30, #OutLast //U(k)=U(k-1) + △U
Network 4
// 上限限幅
LDD> #OutLast, 32760
MOVD 32760, #OutLast
Network 5
// 下限限幅
LDD< #OutLast, 0
MOVD 0, #OutLast
Network 6
// 输出
LD SM0.0
DTI #OutLast, #Out
END_SUBROUTINE_BLOCK
布什 [精] 主题:给十分吧,俺化一下午写的PID函数,总该赚10分吧。
FUNCTION FC100:REAL
VAR_INPUT
sp_Input:REAL; //设定值。
pv_Input:REAL; //实际值。
p_Value:REAL; //“P”参数。
I_Value:REAL; //”I“参数。
D_Value:REAL; //”D“参数。
Lo_Limit_Val:REAL; //最小输出。
Ho_Limit_Val:REAL; //最大输出。
Ds_Lo,DS_Ho:Real; //高低粗调设定。
Cs_Lo,Cs_Ho:REAL; //高低细调设定。
Bs_Lo,Bs_Ho:REAL; //高,低刹车量。
END_VAR
VAR_OUTPUT
out_Pid:REAL; //PID输出
END_VAR
VAR
Delta_Pid:REAL; //差量值。
Step1_Value:REAL; //前差量。
Step2_Value:REAL; //后差量。
END_VAR
LABEL
Label_Result;
END_LABEL
BEGIN
IF Pv_Input<(sp_Input-Cs_Lo-Ds_Lo) THEN
Out_Pid:=Ho_Limit_Val;
GOTO Label_Result;
END_IF;
IF pv_Input>(sp_Input-Cs_Lo-Ds_Lo) AND pv_Input<(sp_Input-Cs_Lo) THEN
out_pid:=Ho_Limit_Val*(1-Bs_Lo);
GOTO Label_Result;
END_IF;
IF pv_Input>(sp_Input-Cs_Lo) AND pv_Input<(sp_Input+Cs_Ho) THEN
Delta_Pid:=sp_Input-pv_Input;
out_pid:=p_Value*(Delta_Pid-Step1_Value)+I_Value*(Delta_Pid)
+D_Value*(Delta_Pid-2*Step1_Value+Step2_Value);
Step2_Value:=Step1_Value;
Step1_Value:=Delta_Pid;
IF Out_Pid>Ho_Limit_val THEN
Out_Pid:=Ho_Limit_val;
ELSIF out_Pid
Out_Pid:=Lo_Limit_val;
END_IF;
GOTO Label_Result;
END_IF;
IF pv_Input>(sp_Input+Cs_Ho) AND pv_Input<(sp_Input+Cs_Ho+Ds_Ho) THEN
Out_Pid:=Ho_Limit_Val*(1-Bs_Ho);
GOTO Label_Result;
END_IF;
IF pv_Input>(sp_Input+Cs_Ho+Ds_Ho) THEN
out_Pid:=Lo_Limit_val;
GOTO Label_Result;
END_IF;
Label_Result:
FC100:=out_Pid;
END_FUNCTION
步进的PID控制,用SCL写的
Q:PID采样时间的定义是"PID控制回路对反馈采样和重新计算输出值的时间间隔。"
如果我设置SMB34=100ms,采样时间=1s,是否意味着虽然PID每隔0.1s被调用一次,但是实际上调用10次,即每隔1s才重新计算一次。
利用向导设置的时候,输出类型我需要选择开关量,这时又涉及到设定占空比周期的问题。占空比周期应该等于采样时间还是可以任取?
A:PID的在线帮助PID Loop Algorithm中,你可以看到,积分和微分的计算是和Ti有关的,该Ti只是一个用来计算的参数,和多数时间计算一次没有关系,执行一次就计算一次。占空比周期可以不同于Ti。
Q:那SMB34对占空比周期有什么影响?因为如果0.1s计算一次,而占空比周期设定为1s,PLC怎么执行呢??
A:PID的参数采样要和PID的运算周期一致。PID指令1s运算一次,采样时间就是1s。
“PID采样时间”是"重新计算输出的时间间隔",这个时间才是PID算法的"执行周期"。而“PID执行周期”只是说调用PID模块的时间间隔。
举例说SMB34=100ms,Ts=1s,那么计算机每隔100ms调用一次PID模块,但只有当SMB34=Ts时,计算机才执行一次PID算法,不影响离散效果。所以PID采样时间和PID执行周期可以不一样。
“占空比” PID输出0-100%,那么输出的占空比也是0-100%。这跟PID刷新没关系。PID输出在变,那么输出的占空比也在变。阀门跟着占空比动作就是了。
dinbin 主题:PID向导注意的问题
PID向导比较方便但是使用中,最好要将PV和SP范围设成一致,如都设成0-100,或0-32000,不要将一个设成0-100,另一个设成0-32000,数字量周期设置比较关键,另外PID参数可以在数据块中向导里查看和修改。