我在论坛中搜到的有关PID的帖子

已锁定

qiali

  • 帖子

    322
  • 精华

    0
  • 被关注

    1

论坛等级:游侠

注册时间:2005-09-29

普通 普通 如何晋级?

我在论坛中搜到的有关PID的帖子

675

3

2006-02-26 09:27:45

水至清 主题:口诀: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参数可以在数据块中向导里查看和修改。

我在论坛中搜到的有关PID的帖子 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-200

共有33257条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。