西门子S7-300 PLC 中如何自己编制PID程序?

西门子S7-300 PLC 中如何自己编制PID程序?,第1张

单就程序说一下思路:

首先用fc105模块将第一条的模拟量,二、三条的压力等转换为对应的宴喊数字量。然后用这个转换后的数字量作为fb41的参考输入,这样pid会根据这个参考输入(即目标值)计算pid的控制量。然后将此控制量利用fc106转换为模拟量输出给阀门来改变阀门开度即可。

这里面你的问题比较笼统,主要是你进来晌袭野的模拟量的量程,然后就是你控制阀门的类型,比如说用4-200ma控制阀门,还是1-5v控制阀门,这个还要具体讨论。

fc105

106是模数、数模转换模块。因为plc不能直接处理模拟量,所以要通过模块来转换,如果你禅友要完成具体程序,就要知道你用的模拟量的类型、量程。

另外fb41的背景db你分配后它里面就含有fb41的具体参数,作为一般应用其实可以不用通过背景db来编程。用梯形图基本就可以处理你的问题。

#include

#include

"global_varible.h"

/****************************************************************************

*

模块名:

pid

*

描述:

pid调节子程序

*

采用pid-pd算法。在偏差绝对值大于△e时,用pd算法,以改善动态品质。

*

当偏差绝对值小于△e时,用pid算法,提高稳定精度。

*

pidout=kp*e(t)+ki*[e(t)+e(t-1)+...+e(1)]+kd*[e(t)-e(t-1)]

*============================================================================

*

入口:

*

出口:

*

改变:

pid_t_run=加热时间控制

*****************************************************************************/

void

pid_math(void)

{

signed

long

ee1

//偏差一阶

//signed

long

ee2

//偏差二阶

signed

long

d_out

//积分输出

if(!flag_pid_t_ok)

return

flag_pid_t_ok=0

temp_set=3700

//温度控制设定值37.00度

pid_e0

=

temp_set-temp_now

//本次偏差

ee1

=

pid_e0-pid_e1

//计算一阶偏差

//ee2

=

pid_e0-2*pid_e1+pid_e2

//计算二阶偏差

if(ee1

>

500)

//一阶偏差的限制范围

ee1

=

500

if(ee1

<

-500)

ee1

=

-500

pid_e_sum

+=

pid_e0

//偏差之和

if(pid_e_sum

>

200)

//积分最多累计的温差

pid_e_sum

=

200

if(pid_e_sum

<

-200)

pid_e_sum

=

-200

pid_out

=

pid_kp*pid_e0+pid_kd*ee1

//计算pid比例和微分输出

if(abs(pid_e0)

<

200)

//如果温度相差小于1.5度则计入pid积分输出

{

if(abs(pid_e0)

>

100)

//如果温度相差大于1度时积分累计限制

{

if(pid_e_sum

>

100)

pid_e_sum

=

100

if(pid_e_sum

<

-100)

pid_e_sum

=

-100

}

d_out

=

pid_ki*pid_e_sum

//积分输出

if(pid_e0

<

-5)

//当前温度高于设定温度0.5度时积分累计限制

{

if(pid_e_sum

>

150)

pid_e_sum

=

150

if(pid_e_sum

>

0)

//当前温度高于设定温度0.5度时削弱积分正输出

d_out

>>=

1

}

pid_out

+=

d_out

//pid比例,积分和微分输出

}

else

pid_e_sum=0

pid_out/=100

//恢复被pid_out系数放大的倍数

if(pid_out

>

200)

pid_out=200

if(pid_out<0)

pid_out=0

if(pid_e0

>

300)

//当前温度比设定温度低3度则全速加热

pid_out=200

if(pid_e0

<

-20)

//当前温度高于设定温度0.2度则关闭加热

pid_out=0

hot_t_run=pid_out

//加热时间控制输出

pid_e2

=

pid_e1

//保存上次偏差

pid_e1

=

pid_e0

//保存当前偏差

}

////////////////////////////////////////////////////////////void

pid_math()

end.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8244648.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存