求一段VB编写的增量式PID控制程序

求一段VB编写的增量式PID控制程序,第1张

#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.

要用到2个API函数

1.Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long 从窗口句并获取进程PID

2.Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 查找窗口句柄

pw = FindWindow(vbNullString, "连连看 v4.1")‘'查找连连看把找到的结果存在PW是保存窗口句柄GetWindowThreadProcessId pw, pid '从窗口句柄获取进程ID,PID是保存进程ID


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存