如何用C脚本PID控制器控制二阶系统

已锁定

落落小兔

  • 帖子

    6
  • 精华

    0
  • 被关注

    0

论坛等级:游民

注册时间:2010-09-09

普通 普通 如何晋级?

如何用C脚本PID控制器控制二阶系统

718

2

2010-10-18 11:01:42

我要实现用PID控制器和模糊控制器分开来控制一个模拟对象:二阶系统。
PID控制器采用增量型编程。取出二阶系统的输出ky作为PID控制器的输入Temp_Cylinder(也就是采集实际温度),然后PID控制器的输出u_variety作为二阶对象的输入ku0。说明:
CylinderPID_Temp_e1:温度上一时刻偏差;
CylinderPID_Temp_e2:温度上上一时刻偏差;
CylinderPID_Temp_er:温度偏差;
Temp_Cylinder_set:温度设定值(80)
u_variety:U(k)的增量
2秒钟定时运行程序一次:
#include "apdefap.h"
void pid()
{
float CylinderPID_Temp_e1;
float CylinderPID_Temp_e2;
float CylinderPID_Temp_er;
float Temp_Cylinder,Temp_Cylinder_set;
float CylinderPID_Temp_kd,CylinderPID_Temp_ki,CylinderPID_Temp_kp;
float CylinderPID_Temp_T;
float q0,q1,q2;float u_variety;

CylinderPID_Temp_e1=GetTagFloat("CylinderPID_Temp_e1");
CylinderPID_Temp_e2=GetTagFloat("CylinderPID_Temp_e2");
Temp_Cylinder=GetTagFloat("ky");
SetTagFloat("Temp_Cylinder",Temp_Cylinder);
printf("\n");
printf("Temp_Cylinder=%1.2f ",ky);

Temp_Cylinder_set=GetTagFloat("Temp_Cylinder_set");
CylinderPID_Temp_kp=GetTagFloat("CylinderPID_Temp_kp");
CylinderPID_Temp_T=GetTagFloat("CylinderPID_Temp_T");
CylinderPID_Temp_Ti=GetTagFloat("CylinderPID_Temp_Ti");
CylinderPID_Temp_Td=GetTagFloat("CylinderPID_Temp_Td");
CylinderPID_Temp_er=Temp_Cylinder_set - Temp_Cylinder;

q0=CylinderPID_Temp_kp* (1 + CylinderPID_Temp_T/ CylinderPID_Temp_Ti + CylinderPID_Temp_Td/CylinderPID_Temp_T );
q1= -1*CylinderPID_Temp_kp*( 1+ 2*CylinderPID_Temp_Td /CylinderPID_Temp_T);
q2=CylinderPID_Temp_kp*CylinderPID_Temp_Td/CylinderPID_Temp_T ;

u_variety=q0*CylinderPID_Temp_er + q1* CylinderPID_Temp_e1 + q2*CylinderPID_Temp_e2;
printf("\n");
printf(" u_variety=%1.2f ",u_variety);

SetTagFloat("ku0",u_variety);
SetTagFloat("CylinderPID_Temp_e2",CylinderPID_Temp_e1);
SetTagFloat("CylinderPID_Temp_e1",CylinderPID_Temp_er);
}

然后,二阶传递函数为Y(s)/U(s)=110/(200*s*s+90*s+1),用的是双线性变换法离散化,然后用C编程,也是2秒钟定时运行程序。程序如下:ky,ku0分别是Y(k)和u(k),ky1,ky2,ku1,ku2分别是Y(k-1),Y(k-2),U(k-1)和U(k-2)。kp、T、Ti、Td参数分别设置为:0.8、2、0.5和0。
#include "apdefap.h"
void second()
{
float ku0;float ku1;
float ku2;
float ky2;
float ky1;
float ky;

ku0=GetTagFloat("ku0"); //Return-Type: float
ky2=GetTagFloat("ky2"); //Return-Type: float
ky1=GetTagFloat("ky1"); //Return-Type: float
ku2=GetTagFloat("ku2");
ku1=GetTagFloat("ku1");
ky=(39.8*ky1-11.1*ky2+11*ku0+22*ku1+11*ku2)/29.1;
printf("\n");
printf("ku0=%1.2f ku1=%1.2f ku2=%1.2f ky=%1.2f ky1=%1.2f ky2=%1.2f ",ku0,ku1,ku2,ky,ky1,ky2);

SetTagFloat("ky",ky);
SetTagFloat("ky2",ky1); //Return-Type: BOOL
SetTagFloat("ky1",ky); //Return-Type: BOOL
SetTagFloat("ku2",ku1);
SetTagFloat("ku1",ku0);
}
这个二阶系统程序用模糊控制器控制基本可以达到稳定,但是用PID控制时,ky 却总是发散到很大的值稳定不下来。
整个PID + 二阶 系统 在MATLAB仿真里是可以达到稳定的。
这个问题困扰我很久了,希望有这方面经验的高手可以给我帮助。谢谢!

补充:我用MATLAB离散仿真过了,是可以实现的。不知道是什么方面的原因在C脚本里仿真不成功。
如何用C脚本PID控制器控制二阶系统 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54755条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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