计算机控制系统实习报告1.docx
《计算机控制系统实习报告1.docx》由会员分享,可在线阅读,更多相关《计算机控制系统实习报告1.docx(20页珍藏版)》请在冰豆网上搜索。
计算机控制系统实习报告1
1实习内容及要求
1.1实习内容
通过温度的设定值和反馈值,计算其偏差,并使用基本PID、或不完全微分PID或微分先行PID或死区PID或积分分离PID或积分限幅PID控制算法输出控制信号,整定PID参数,使被控的温度达到设定值。
具体实训内容包括AC6611过程卡的接线和测试、数据采集程序设计、PID算法程序设计、控制输出程序设计、人机界面程序设计、PID参数整定、实训报告。
1.2实习要求
完成一个基本PID或不完全微分PID或微分先行PID或死区PID或积分分离PID或积分限幅PID单回路温度控制系统的设计和调试过程。
通过实训,让学生了解计算机控制系统的基本组成,提出计算机控制系统的设计思路,初步学会计算机控制系统软硬件设计及调试的方法,具备技术实现能力;基本上能够处理实践过程中出现的问题并提出解决办法,进一步提高学生的计算机应用水平。
2AC6611多功能过程通道卡
2.1功能特点及技术指标
AC6611是一款廉价通用A/D、D/A板,AD工作在查询方式,采用PCI总线支持即插即用、无需地址跳线。
AC6611具有16路单端模拟输入、32路开关量(16路输入及16路输出)、一路12位D/A。
AC6611采用大规模可编程门阵列设计。
AC6611性能参数
(1)模拟量输入(A/D)
●A/D转换器:
120KHZ,12位A/D,ADS7816,A/D内置采样保持器。
●工作方式:
软件查询。
●16路单端输入,输入阻抗:
1MΩ
●最大输入耐压电压:
<+12V/-5.5V,瞬时输入耐压:
-25V-+30V
●连接器:
DB25孔式输入连接器。
●A/D最大通过率:
70KHZ,输入通道建立时间<8uS。
●双极性输入范围:
5V,单极性输入范围:
5V、10V。
输入范围跳线器选择,对应输入幅度及精度如下:
输入
系统精度(FSR)
跳字
0-10V
0.1%
1LSB
0-5V
0.1%
1.5LSB
-5V-+5V
0.1%
1LSB
(2)模拟量输出(D/A)
●1路12位DA,分辨率12位,精度:
0.2%,
●电压输出,最大输出电流:
5毫安。
●输出零点误差小于±10毫伏。
●输出范围:
10伏、±10伏,跳线器选择。
●输出建立时间小于:
50微秒。
●输出插座:
DB25(孔)连接器。
(3)开关量输入/输出
●16路开关量输入(2个8位),16路开关量输出(2个8位)
●TTL电平(兼容3伏逻辑)
●开关量输出复位后为输出为低电平“0”。
●输出高电压>2.5V,低电压<0.5V,最大输出电流:
8mA
●输入电流:
<0.1mA输入高电压门限:
〉2V,低电压:
〈0.8V。
●输入耐压:
高电平最大耐压:
8伏,低电平:
-0.4伏。
●连接器:
40脚扁平电缆插座。
(4)其它
●符合PCIV2.1标准,供电:
+5伏、+12伏、-12伏。
●AC6611占用64个I/O选通空间(自动分配)。
●工作温度:
0-70℃,尺寸:
12(W)X9(H)(厘米)
2.2应用方法及步骤
1.以Windows2000平台下安装AC6611驱动程序为例:
①关闭计算机的电源;
②将ac6611板卡插入PCI槽中;
③打开计算机电源,启动Windows2000;
④Windows2000将会显示找到新硬件,可按找到新硬件向导进行下一步;
⑤选择搜索适用与我的设备的驱动程序(推荐),下一步;
⑥选择驱动所在目录,进行安装(\ac6611\driver\);
⑦按找到新硬件向导的提示进行下一步;
⑧Windows2000将显示完成添加/删除硬件向导,单击完成即可完成安装过程;
安装完毕后将在设备管理器中出现一个其他设备(其他设备是问号,不表示设备有问题,只是表示系统不知道ac6611板卡是何种类型设备)
2.以WindowsXP平台下安装AC6611驱动程序为例:
①关闭计算机的电源;
②将ac6611板卡插入PCI槽中;
③打开计算机电源,启动WindowsXP,WindowsXP将会显示找到新硬件;
④在“找到新硬件向导”对话窗中选择“从列表或指定位置安装”,下一步;
⑤选择驱动所在目录,进行安装(\ac6611\driver\);
⑥按找到新硬件向导的提示进行下一步;
⑦WindowsXP将显示完成添加/删除硬件向导,单击完成即可完成安装过程
安装完毕后将在设备管理器中出现一个其他设备(其他设备是问号,不表示设备有问题,只是表示系统不知道ac6611板卡是何种类型设备)
驱动安装后,ac6611.sys,ac6611.dll文件就自动被复制到系统中去了,可以进行其他测试、开发工作了。
若无法正常安装,请换一台机器再尝试安装过程,若安装成功,说明安装不成功的机器系统有问题,考虑重装系统,在进行安装AC6611驱动。
注意:
一般情况下,实验室已经安装好AC6611的驱动程序,只是在驱动程序出现问题或在没有驱动程序的机器上使用AC6611时才需要重新安装驱动程序。
3方案设计
3.1加热器的过程特性
指被控过程输入量发生变化时,过程输出量的变化规律。
加热器的过程特性是带滞后的一阶对象。
也就是它不能发生突变,温度不能在很短的时间升高达到一个比较大的值,只能通过PID的运算后慢慢的升至设定温度。
同时也不能达到瞬间降温的效果,加热器内没有安装专门的散热装置,只有通过自然冷却达到设定的温度值(这个值一般不能低于室内温度),这个过程比较缓慢,等待的时间会比较长。
在实验中就得注意,设定的温度最好从小到大以此进行设定,这样方便操作也节约了时间。
3.2加热器温度控制系统的实现方案
硬件连接好后通过静态测试软件测试硬件与电脑能正常通信后,通过可视化程序软件对系统的设计。
利用AC6611板卡采集数据,通过总线送入PC,将设定值和采样值进行比较,经过程序设定的算法后输出一个偏差,得出控制量通过AC6611板卡送达加热器,如果偏差大,温度加热器将对装置的温度进行加热达到设定的温度值,如果偏差为0,说明设定的温度比采样温度低,加热器不会加热,而通过自然冷却的方式使加热器降温从而达到设定的温度值。
我们这组是采用带死区的PID控制算法的方式来达到控制温度的目的的。
3.3AC6611和加热器接线图的设计
实验室用的加热器是通过温度传感器,转换成了标准的工业标准(4mA—20mA)。
参照AC6611板卡手册。
最大输入耐压电压:
<+12V/-5.5V;
瞬时输入耐压:
-25V-+30V,DB25孔式输入连接器;
输入:
双极性
输入范围:
5V,单极性
输入幅度:
5伏、10伏。
为此我们选择0—10V为益。
所以AC6611和加热器接线图要满足要求,可以做一个I/V变换在变送器的输出端串一个500欧的电阻,板卡采集的范围就在2—10V,这样在程序中做一个转换就能实现温度0度—100度的显示。
所以接线如图
(1)所示。
图
(1)AC157与加热器的接线图
3.4控制程序的方案设计和模块的划分
控制程序可以分为A/D、PID、D/A、以及人机交互部分。
四大部分A/D进行数据采集
基本PID算法得出控制量,D/A输出加热器能接收的控制信号。
人机交互则是可以设置一个合理的温度,人能直接看到控制的结果。
下面是带死区PID控制算法的流程图:
Fabs(En)>PID_DB
图2死区PID控制算法流程图
4数据采集及输出程序设计
4.1AC6611数据采集程序与温度换算程序
温度换算程序的设计要考虑到我们采集的数据是2—10V,而实际的温度则是0—100度,如果要达到可视化的目的,必须做一个转换算法:
adv=adc*10.0/4095.0;
//标度变换成温度,4~20mA对应0~100度,adv输出为2~10V
PV=(adv-2)*100/(10-2);//PV的实际输出值
4.2控制量与D/A代码换算及输出程序
控制量与D/A转换代码如下:
void__fastcallTForm1:
:
Timer1Timer(TObject*Sender)
{
unsignedlongadc;
unsignedlongda;
AC6611_AD(hDevice,4,&adc);
En=SP-PV;
if(fabs(En)>PID_DB)//PID死区判定
{
DeltaUn=q0*En+q1*En1+q2*En2;//Δu(k)=q0*e(k)+q1*e(k-1)+q2*e(k-2)
Un=Un1+DeltaUn;//u(k)=u(k-1)+Δu(k)
if(Un>100.0)
Un=100.0;
if(Un<0)
Un=0;
Un1=Un;
En2=En1;
En1=En;
}
Else
Un=Un1;
da=(unsignedshortint)(Un*4095.0/100.0);
AC6611_DA(hDevice,da);
···
···
}
5控制算法的程序设计
5.1显示曲线的程序设计
for(inti=0;i<479;i++)
{
tr1[i]=tr1[i+1];
tr1[479]=30*SP/(HS-LS);
tr2[i]=tr2[i+1];
tr2[479]=30*PV/(HS-LS);
tr3[i]=tr3[i+1];
tr3[479]=300*Un/100.0;
}
//绘制趋势曲线
Image1->Picture->LoadFromFile("qushi.bmp");
Image1->Canvas->Pen->Width=2;
if(CheckBox1->Checked==true)
{
Image1->Canvas->Pen->Color=clRed;
Image1->Canvas->MoveTo(0,300);
for(inti=0;i<480;i++)
Image1->Canvas->LineTo(i,300-tr1[i]);
}
if(CheckBox2->Checked==true)
{
Image1->Canvas->Pen->Color=clBlue;
Image1->Canvas->MoveTo(0,300);
for(inti=0;i<480;i++)
Image1->Canvas->LineTo(i,300-tr2[i]);
}
if(CheckBox3->Checked==true)
{
Image1->Canvas->Pen->Width=1;
Image1->Canvas->Pen->Color=clGreen;
Image1->Canvas->MoveTo(0,300);
for(inti=0;i<480;i++)
Image1->Canvas->LineTo(i,300-tr3[i]);
}
//绘制棒图
Image2->Picture->LoadFromFile("bangtu.bmp");
Image2->Canvas->Pen->Width=5
if(CheckBox1->Checked==true)
{
Image2->Canvas->Pen->Color=clRed;
Image2->Canvas->MoveTo(30,300);
Image2->Canvas->LineTo(30,300-SP*30/(HS-LS));
}
if(CheckBox2->Checked==true)
{
Image2->Canvas->Pen->Color=clBlue;
Image2->Canvas->MoveTo(45,300);
Image2->Canvas->LineTo(45,300-PV*30/(HS-LS));
}
if(CheckBox3->Checked==true)
{
Image2->Canvas->Pen->Color=clGreen;
Image2->Canvas->MoveTo(65,300);
Image2->Canvas->LineTo(65,300-Un*300/100.0);
}
//Edit3->Text=FloatToStrF(SP,2,3,4);
Edit4->Text=FloatToStrF(PV,2,3,4);
Edit5->Text=FloatToStrF(Un,2,3,4);
}
5.2死区PID算法程序设计
En=SP-PV;
if(fabs(En)>PID_DB)//PID死区判定
{
DeltaUn=q0*En+q1*En1+q2*En2;//Δu(k)=q0*e(k)+q1*e(k-1)+q2*e(k-2)
Un=Un1+DeltaUn;//u(k)=u(k-1)+Δu(k)
if(Un>100.0)
Un=100.0;
if(Un<0)
Un=0;
Un1=Un;
En2=En1;
En1=En;
}
Else
Un=Un1;
da=(unsignedshortint)(Un*4095.0/100.0);
AC6611_DA(hDevice,da);
5.3PID基本算法
基本PID把连续的温度数据离散化,并用来得出控制量。
6控制程序的调试
6.1主要调试的内容
(1)通道数据的采集以及输出控制,
(2)曲线的显示走向和棒图
(3)人机交互数据输入输出部分
6.2调试方法
通道数据的采集以及输出控制的调试,在程序中加入代码:
hDLL=LoadLibrary("ac6611.dll");
if(hDLL!
=NULL)Label30->Caption="AC6611.dllloadok!
";
hDevice=AC6611_CreateDevice(0,&ErrorOf6611);//创建驱动,选择第0块卡
if(hDevice!
=-1)
{Label31->Caption="AC6611CardIsExist!
";}
Else
{Label31->Caption="AC6611CardIsnotExist!
";}
便可以检测通道是否和计算机成功连接。
人机交互数据输入输出部分
人机交互要求一目了然,简单明了没有计算机内的那些复杂的数据,同时人为的设置也要简单易懂。
这些要求的实现就靠数据转换的算法了,我们调试的方法就直接观察,看是否符合客观实际。
7PID参数的整定
7.1PID各个参数的影响
(1)比例调节的特点:
1、调节作用快,系统一出现偏差,调节器立即将偏差放大100/Kp倍输出;2、系统中还存在着余差。
K越大,过渡过程越平稳,但余差越大;K减小,余差将减小,但是不能完全消除余差,只能起到粗调的作用,但是K过小,过渡过程易振荡,K太小时,就可能出现发散振荡,系统将失去平衡。
(2)积分调节的特点:
积分调节作用的输出变化与输入偏差的积分成正比,积分的作用是能消除余差,不过同事也降低了系统的稳定性,Ti由大变小时,积分作用由弱到强,消除余差的能力由弱到强,只有消除偏差后,积分作用的输出才停止变化。
(3)微分调节的特点:
微分调节的输出是与被调量的变化率成正比,在引入微分作用后能全面提高控制质量,但是微分作用太强,会引起控制阀时而全开时而全关,这样的滞后现象就会很严重,系统的偏差会很大。
因此不能把TD取的太大,当TD由小到大变化时,微分作用由弱到强,对容量滞后有明显的作用,但是对纯滞后没有效果。
7.2整定结果与分析
通过自己的慢慢的尝试,根据显示曲线的情况和各个参数对曲线的影响,改变各个参数的值来观察曲线的走势。
观察系统响应效果,可以通过查看控制回路细目画面中的实时趋势曲线和根据整定的方法得出一组比较合适的PID数据:
KP=20;Ti=2;TD=0.1。
8技术小结
在本次的计算机控制系统综合实训中,我做的课题是关于死区PID温度控制系统的设计。
刚开始,我遇到的难题就是关于CB的编程和运用,尽管在大三的时候上过CB的课程,但是现在我已经不能熟练地运用它了,所以就再次的去复习了以前所学的知识。
关于PID控制,我们也有这样的课程,经过一段时间的巩固和思考。
对本次的课程设计有了比较清晰的思路和想法。
经过老师耐心对本次课程设计任务和要求的讲解之后,我们就各自开始进行程序设计,通过对《CB》和《计算机控制技术》的复习,我很快完成了界面设计和基本的程序编写。
后来在编写控制算法的程序时由于没有弄清楚控制对象与被控对象的关系,在调试的过程中,控制量和被控量不能有机的衔接起来,输入量和输出量没有直接的联系。
经过仔细对算法的思考和同学们的帮助后,发现这是我在编写代码的时候弄错了对象。
经过修改以后,能基本达到目的。
然后是在运行的过程中,不论怎么改变SP的值,PV的采样值一直保持在一个稳定值不变,并且PV的值明显高于室内温度,达到了56度左右。
我仔细检查了好几遍都没有找到原因,也不知道该怎样做下去了。
后来我在看变量初始值的时候发现,我错将PV的变量错误指到了一个常数。
还有PID各个参数的理解不够,导致在调节显示曲线时没有目标的随机改变参数来观察曲线,这样大大地增加了我们的工作量。
在整个的调试过程中还遇到了其他一些小的问题,可能是粗心的缘故。
最后都通过老师或同学的帮助修改正确了并且达到了本次实训的目的。
最后通过这两周的实习,让我巩固了CB的运用,进一步地了解了CB程序设计,对PID控制有了更深入的了解和认识,了解了AC6611的功能,板卡AC6611和温度加热器的连接方法,他们的接法一定要正确,不然显示的曲线就不符合要求。
对死区PID控制系统的算法有了更充分的了解,外部硬件(板卡)与PC的底层硬件连接,windows操作系统对这两部分的硬件通过硬件商提供的硬件驱动和动态链接库实现数据交换,实际是windows与板卡的寄存器实现数据交换,同时增加了我的实践能力,为以后出去从事这方面的工作打下了坚实的基础,十分感谢学院安排这样的实习,感谢刘显荣老师、胡文金老师的细心指导,也感谢我的同学为我提供的帮助。
参考文献:
(1)于海生.计算机控制技术.北京.机械工业出版社,2007.
(2)陆卫忠.C++Builder程序设计教程.2版.北京.科学出版社,2009.
(3)何钦铭.C语言程序设计.北京高等教育出版社.2008.
控制程序清单
//---------------------------------------------------------------------------
#include
#include
#pragmahdrstop
#include"EX1.h"
//---------------------------------------------------------------------------
#pragmapackage(smart_init)
#pragmaresource"*.dfm"
floatSP=25,PV=0,MV;
inttr1[480],tr2[480],tr3[480];
floatHS=10.0,LS=0.0,HL=9.0,LL=1.5,DH=0.2;
floatPID_DB=1,Kp=20,TI=2,TD=0.1,KD=5;
floatUn=0.0,DeltaUn=0.0,Un1=0.0,En=0.0,En1=0.0,En2=0.0;
floatq0,q1,q2;
floatTS=0.1;
TForm1*Form1;
//---------------------------------------------------------------------------
__fastcallTForm1:
:
TForm1(TComponent*Owner)
:
TForm(Owner)
{
}
//---------------------------------------------------------------------------
void__fastcallTForm1:
:
FormCreate(TObject*Sender)
{
q0=(100.0/Kp)*(1+TS/TI+TD/TS);
q1=-(100.0/Kp)*(1+2*TD/TS);
q2=(100.0/Kp)*TD/TS;
//--------------------------------------------------------------------------
hDLL=LoadLibrary("ac6611.dll");
if(hDLL!
=NULL)Label1->Caption="AC6611.dllloadok!
";
(FARPROC&)AC6611_CreateDevice=GetProcAddress(hDLL,"AC6611_CreateDevice");//创建驱动句柄
(FARPROC&)AC6611_CloseDevice=GetProcAddress(hDLL,"AC6611_CloseDevice");//关闭驱动句柄
(FARPROC&)AC6611_DI=GetProcAddress(hDLL,"AC6611_DI");//数字量输入,port=0-1两个通道,8位数据由DiData返回
(FARPROC&)AC6611_DO=GetProcAddress(hDLL,"AC6611_DO");//数字量输出,port=0-1两个通道,8位数据由DoData输出
(FARPROC&)AC6611_DiBit=GetProcAddress(hDLL,"AC6611_DiBit");//数字量输入,port=0-1两个通道,指定位输入
(FARPROC&)AC6611_DoBit=GetProcAddress(hDLL,"AC6611_DoBit");//数字量输出,port=0-1两个通道,指定位输出
(FARPROC&)AC6611_DA=GetProcAddress(hDLL,"AC6611_DA");
//DA输出,0-4095
(FARPROC&)AC6611_VoltageToDA=GetProcAddress(hDLL,"AC6611_VoltageToDA");
(FARPROC&)AC6611_AD=GetProcAddress(hDLL,"AC6611_AD");//通用AD采样
(FARPROC&)AC6611_AD_CHN=GetProcAddress(hDLL,"AC6611_AD_CHN");//设置AD通道0-15
(FARPROC&)AC6611_ADS=GetProcAddress(hDLL,"AC6611_ADS");//直接AD采样,为单通道AD采样设计
(FARPROC&)AC6611_ADToVoltage=GetProcAddress(hDLL,"AC6611_ADToVoltage");
hDe