过程控制系统实验报告汇总
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
过程控制系统实验报告
姓名:
指导教师:
南京理工大学2015年5月
实验二传感器、执行器实验
一、实验目的
了解传感器、执行器的工作原理,掌握它们在实际过程控制中的应用。
二、实验要求
编程实现系统液位、温度、流量等模拟量的数据采集以及模拟量的输出。
三、实验步骤
1、液位传感器的测试
在水箱内按要求注入不同高度的纯净水,利用万用表和USB-4711A板卡的A/D口分别测出液位传感器的输出电压,并在计算机内将电压转换成对应的高度。
将测量数据填入下表。
因为我们使用的实验仪器测高计有明显的机械误差,通过实际0mm时测
量高度为192mm,表测电压为-2.4V。
所以实际相对误差应是消除高度计所造
成的机械误差之后的值,一并在表中列出了。
2、温度传感器的测试
用温度计测量出水温,同时利用万用表和USB-4711A板卡的A/D口测
出温度传感器的输出电压,并在计算机内将其转换成相应的温度。
将测量数据填入下表。
3、比例阀的控制
通过USB-4711A板卡的D/A口输出控制电压,比较机内控制电压与实际输出电压,并将结果填入下表。
四、思考题
1、用传感器测量过程变量的准确性如何?如果有误差,可以采取什么
方法进行修正?
答:在测量过程变量时大量被测量是随时间变化的动态信号,传感器的输入与输出信号是一个时间函数,随着输入信号变化,实际传感器输出与输入不具有相同时间函数,将会产生系统误差和随机误差。
对于系统误差,可以采用差动法补偿来修正,随机误差可以采用统计学中的方法如算数平均或求标准偏差。
在静态时,Q
i =Q O,=0,当Q
i
变化时,h、Q
O
也将发生变化,实验三系统动态特性的测试
一、实验目的
学习单容对象动态特性的实验测定方法。
二、实验要求
通过实验的方法建立液位对象的过程数学模型。
三、实验步骤
利用液位对象的液位与输出流量的关系建立其模型
⑴测试系统结构如图3-1所示。
图3-1利用液位—输出流量关系建立模型的实验原理图
⑵原理
对于液位系统,根据动态物料平衡关系有
∆Q i-∆Q O=A d∆h
dt
式3-1
式中:Q
i
—输入流量;
h—液位高度;Q O—输出流量;A—水箱截面积;
∆Q i、∆Q O、∆h分别为偏离某一平衡状态Q i0、Q O0、h0的增量。
d∆h
dt
由流体力学可知,流体在紊流情况下,h与流量之间为非线性关系,为简化
的流量值,填入下表。
根据式 3-3 求对象的数学模型。
其中水箱的截面积 A = 190mm ⨯175mm 。
=
起见,作线性化处理。
近似认为 Q O 与 h 在工作点附近成正比,而与出水阀
的阻力 R 2 (称为液阻)成反比,即
∆Q O =
∆h R 2
或
R 2 =
∆h ∆Q 0
式 3-2
由式 3-1、式-2,消去中间变量 Q O ,再求拉氏变换得: 单容液位过程的传递函数为:
W (S ) = ∆H (S ) ∆Q i (S )
= R 2
R 2 AS + 1
= K
TS + 1
式 3-3
⑶ 关闭出水阀,向水箱内注水至 260mm 左右,将出水阀旋开至适当 位置(整个测量
过程中保持出水阀开度不变),测量给定液位
高度所对应
W (S ) =
R 2 R 2 AS
+ 1
=
473 473
473AS + 1 (1.51e 7)S + 1
四、思考题
答:①被控对象有较大的时间常数,导致变化过程较慢;
②单容水箱是一阶系统响应,被控变量的变化比较缓慢;
③被控对象具有传输延迟;
④被控对象不具有非线性,自平衡能力差。
5
实验四液位单回路控制系统的设计及参数整定
一、实验目的
掌握过程计算机控制系统的单回路控制方式。
二、实验要求
设计单容水箱的液位单回路控制系统,实现液位的定值控制,并对系统进行参数整定。
三、实验内容
1、按照图4-1,在组合式实验装置上通过选择管路,构造液位单回路
控制系统。
图4-1液位单回路控制系统原理图
2、画出液位单回路控制系统方框图。
3、根据液位对象的数学模型,选择系统的采样周期
T S 。
的控制效果,最终确定较为满意的调节器参数。
4、 运用经验法确定数字调节器的参数。
根据经验公式,选择调节器参数 K C 、 T I 和 T D 值。
观察不同参数情况下
四、思考题
1、在控制过程中遇到了哪些问题,你是如何解决的?为了提高控制效
果,你在控制算法上还采取了哪些措施?
答:实验中,开始程序一直记录数据有问题,后来和同学帮助下,原来是fprintf设定不对。
最后的实验中,测流量总是开始就达到最大,然后慢慢向下降落,怎么也搞不懂,在老师的指点下终于解决了问题,完成了实验。
采用了多次实验取较好数据的方法,消除了偶然误差的影响。
本来还采用了微分算法,用了之后才知道不好,又去掉了。
实验五流量单回路控制系统的设计及参数整定
一、实验目的
掌握过程计算机控制系统的一般设计方法。
二、实验要求
根据流量对象的特点,设计流量定值控制系统,并对系统进行参数整定,使系统具有较好的动、静态性能指标和抗干扰能力。
三、实验步骤
1、按照图5-1,在组合式实验装置上通过选择管路,构造流量单回路
控制系统。
图5-1流量单回路控制系统原理图
2、画出流量单回路控制系统方框图。
3、根据流量对象的特点,选择系统的采样控制周期
T S=。
4、选择调节器参数,进行流量控制,记录控制结果,并就不同参数
下的控制效果进行定性讨论
四、思考题
1、流量对象与液位对象有什么区别?流量控制系统的参数整定要注意哪些问题?
答:(1)
①流量对象应用流量传感器,对于设定的流量值,系统会在达到该流量时以大致稳定的流速往水箱注水;
②液位对象以设定的液位高度为基准,传感器一直对高度进行测量,达到设定高度后立即停止注水,并一直检测,当液面未达到设定值,
再次注水以此反复。
(2)注意数学模型的正确建立,在建模过程中减少盲目性,但是该方法较为复杂,在过程控制进行中直接进行工程正定,该方法简单,计算方便,但是参数不一定最佳,但实用;在此采用现场实验整定的方法,这种方法注意改变比例积分的参数,并有比较性地改变,有比较好得效果。
附实验程序:
实验二传感器、执行器实验
#include<stdio.h>
#include<windows.h>
#include<time.h>
#include"driver.h"
#include"conio.h"
void main()
{PT_AIConfig ptAIConfig;
PT_AIVoltageIn ptAIVoltageIn;
float advalue;
float h;
float q=0;
FILE*fp=fopen("test.txt","w");
long DriverHandle;
ULONG num1=0,num2=0;
int count;
USHORT over=0;
PT_CounterEventStart ptCounterEventStart;
PT_CounterEventRead ptCounterEventRead;
DRV_DeviceOpen(0,&DriverHandle);
while(!kbhit())
{ptAIConfig.DasChan=0;//AI通道0
ptAIConfig.DasGain=0;//Gain Code,+/-5V
DRV_AIConfig(DriverHandle,(LPT_AIConfig)&ptAIConfig);
//读取指定AI通道的电压值
ptAIVoltageIn.chan=0;//通道0
ptAIVoltageIn.gain=0;//Gain Code,+/-5V
ptAIVoltageIn.TrigMode=0;//内部触发
ptAIVoltageIn.voltage=(FLOAT far*)&advalue;//返回电压值
DRV_AIVoltageIn(DriverHandle,(LPT_AIVoltageIn)&ptAIVoltageIn);
printf("AD value=%f!\n",advalue);
ptCounterEventStart.counter=0;
DRV_CounterEventStart(DriverHandle,&ptCounterEventStart);
ptCounterEventRead.counter=0;
ptCounterEventRead.overflow=&over;
ptCounterEventRead.count=&num1;
DRV_CounterEventRead(DriverHandle, (LPT_CounterEventRead)&ptCounterEventRead);
DRV_CounterEventRead(DriverHandle,&ptCounterEventRead);
printf("%lu\n",num1);
Sleep(1000);
ptCounterEventRead.counter=0;
ptCounterEventRead.overflow=&over;
ptCounterEventRead.count=&num2;
DRV_CounterEventRead(DriverHandle, (LPT_CounterEventRead)&ptCounterEventRead);
DRV_CounterEventRead(DriverHandle,&ptCounterEventRead); printf("%lu\n",num2);
count=num2-num1;
q=0.0122*count+0.3412;
h=advalue*80;
printf("%d\n",count);
fprintf(fp,"q=%f\n",q);
fprintf(fp,"h=%f\n",h);
}
fclose(fp);
DRV_CounterReset(DriverHandle,0);
DRV_DeviceClose(&DriverHandle);
}
实验三系统动态特性的测试
#include<stdio.h>
#include<windows.h>
#include<time.h>
#include"driver.h"
#include"conio.h"
void main()
{
long DriverHandle_v;
PT_AIConfig ptAIConfig;
PT_AIVoltageIn ptAIVoltageIn;
float advalue;
DRV_DeviceOpen(0,&DriverHandle_v);//打开设备
//AI配置
ptAIConfig.DasChan=0;//AI通道0
ptAIConfig.DasGain=0;//Gain Code,+/-5V
DRV_AIConfig(DriverHandle_v,(LPT_AIConfig)&ptAIConfig);
//读取指定AI通道的电压值
ptAIVoltageIn.chan=0;//通道0
ptAIVoltageIn.gain=0;//Gain Code,+/-5V
ptAIVoltageIn.TrigMode=0;//内部触发
ptAIVoltageIn.voltage=(FLOAT far*)&advalue;//返回电压值
DRV_AIVoltageIn(DriverHandle_v,(LPT_AIVoltageIn)&ptAIVoltageIn);
long DriverHandle;
ULONG num1=0,num2=0;
int count;
USHORT over=0;
PT_CounterEventStart ptCounterEventStart;
PT_CounterEventRead ptCounterEventRead;
DRV_DeviceOpen(0,&DriverHandle);
ptCounterEventStart.counter=0;
DRV_CounterEventStart(DriverHandle,&ptCounterEventStart);
ptCounterEventRead.counter=0;
ptCounterEventRead.overflow=&over;
ptCounterEventRead.count=&num1;
DRV_CounterEventRead(DriverHandle, (LPT_CounterEventRead)&ptCounterEventRead);
DRV_CounterEventRead(DriverHandle,&ptCounterEventRead);
printf("num1=%lu\n",num1);
Sleep(1000);
ptCounterEventRead.counter=0;
ptCounterEventRead.overflow=&over;
ptCounterEventRead.count=&num2;
DRV_CounterEventRead(DriverHandle, (LPT_CounterEventRead)&ptCounterEventRead);
DRV_CounterEventRead(DriverHandle,&ptCounterEventRead);
printf("num2=%lu\n",num2);
count=num2-num1;
printf("count=%d\n",count);
FILE*fp=fopen("me.txt","w");
float fluid;
while(!kbhit()){
DRV_AIVoltageIn(DriverHandle,(LPT_AIVoltageIn)&ptAIVoltageIn);
ptCounterEventStart.counter=0;
DRV_CounterEventStart(DriverHandle,&ptCounterEventStart);
ptCounterEventRead.count=&num1;
DRV_CounterEventRead(DriverHandle, (LPT_CounterEventRead)&ptCounterEventRead);
DRV_CounterEventRead(DriverHandle,&ptCounterEventRead);
Sleep(1000);
ptCounterEventRead.count=&num2;
DRV_CounterEventRead(DriverHandle, (LPT_CounterEventRead)&ptCounterEventRead);
DRV_CounterEventRead(DriverHandle,&ptCounterEventRead);
count=num2-num1;
fluid=(14.5*(count-13)/(1200-13)+0.5);
printf("Height=%f\t",advalue*80);
printf("num1=%lu\n",num1);
printf("num2=%lu\n",num2);
printf("Count=%d\n",count);
printf("Fluid=%f\n\n",fluid);
fprintf(fp,"Height=%f\t",advalue*80);
fprintf(fp,"Fluid=%f\n",fluid);
}
fclose(fp);
DRV_CounterReset(DriverHandle,0);
DRV_DeviceClose(&DriverHandle);
DRV_DeviceClose(&DriverHandle_v);//关闭设备
}
实验四液位单回路控制系统的设计及参数整定#include<stdio.h>
#include<windows.h>
#include"driver.h"
#include<conio.h>
#include"time.h"
#include<math.h>
void main()
{
FILE*fp=fopen("test1.txt","w");
long DriverHandle;
PT_AIConfig ptAIConfig;
PT_AIVoltageIn ptAIVoltageIn;
float height_v_In;
float m_h;
float e1=0,e2=0,e3=0;//误差
float seth=200;
float setv=0;
float k=1,ti=0.5,td=0;//PID系数
int n=0;
float time;
long DriverHandle1;
PT_AOConfig ptAOConfig;
PT_AOVoltageOut ptAOVoltageOut;
float height_v_Out=0;
DRV_DeviceOpen(0,&DriverHandle);//打开设备
DRV_DeviceOpen(0,&DriverHandle1);//打开设备
ptAIConfig.DasChan=0;//AI通道0
ptAIConfig.DasGain=4;//Gain Code,+/-10V
DRV_AIConfig(DriverHandle,(LPT_AIConfig)&ptAIConfig);
ptAOConfig.chan=0;//AO通道0
ptAOConfig.RefSrc=0;//内部参考源
ptAOConfig.MaxValue=10;
ptAOConfig.MinValue=0;
DRV_AOConfig(DriverHandle1,(LPT_AOConfig)&ptAOConfig);
setv=seth/80;
while(!kbhit())
{
Sleep(300);
n++;
time=n*0.3;
//读取指定AI通道的电压值
ptAIVoltageIn.chan=0;//通道0
ptAIVoltageIn.gain=4;//Gain Code,+/-10V
ptAIVoltageIn.TrigMode=0;//内部触发
ptAIVoltageIn.voltage=(FLOAT far*)&height_v_In;//返回电压值DRV_AIVoltageIn(DriverHandle,(LPT_AIVoltageIn)&ptAIVoltageIn);
if(height_v_In<setv)
{
e3=setv-height_v_In;
height_v_Out+=k*((e3-e2)+0.3/ti*e3+td/0.3*(e3-2*e2+e1));//增量式PID控制
e1=e2;//前两次值
e2=e3;//前一次值
if(height_v_Out>10)
height_v_Out=10;
else if(height_v_Out<0)
height_v_Out=0;
}
else height_v_Out=0;
printf("height_v_Out=%f!\t",height_v_Out);
printf("time=%f!\t",time);
printf("hight=%f!\n\n",height_v_In/5*400);
//电压输出
ptAOVoltageOut.chan=0;
ptAOVoltageOut.OutputValue=height_v_Out;//所要设置的输出电压值,浮点型数据
DRV_AOVoltageOut(DriverHandle1,(LPT_AOVoltageOut)&ptAOVoltageOut);
fprintf(fp,"U=%f,h=%f,
time=%f\n",height_v_Out,height_v_In*80,time);
}
//AO配置
ptAOConfig.chan=0;//AO通道0
ptAOConfig.RefSrc=0;//内部参考源
ptAOConfig.MaxValue=10;
ptAOConfig.MinValue=0;
DRV_AOConfig(DriverHandle1,(LPT_AOConfig)&ptAOConfig);
ptAOVoltageOut.chan=0;
height_v_Out=0;
ptAOVoltageOut.OutputValue=height_v_Out;//所要设置的输出电压值,浮点型
数据
DRV_DeviceClose(&DriverHandle);//关闭设备
DRV_DeviceClose(&DriverHandle1);//关闭设备
}
实验五流量单回路控制系统的设计及参数整定
#include<stdio.h>
#include<windows.h>
#include"driver.h"
#include<time.h>
#include<conio.h>
PT_CounterEventStart ptCounterEventStart;
PT_CounterEventRead ptCounterEventRead;
long DriverHandle;
PT_AOConfig ptAOConfig;
PT_AOVoltageOut ptAOVoltageOut;
float davalue;
float Q=0;
float Qh=2;
float t=0,U=0;
float e1=0,e2=0,e3=0;
float Kc=0.5,Ti=1,Ts=0.5;
void main()
{
ULONG num1=0,num2=0;
int count;
USHORT over=0;
DRV_DeviceOpen(0,&DriverHandle);
ptAOConfig.chan=0;//AO通道0
ptAOConfig.RefSrc=0;//内部参考源
ptAOConfig.MaxValue=10;
ptAOConfig.MinValue=0;
DRV_AOConfig(DriverHandle,(LPT_AOConfig)&ptAOConfig);
//电压输出
FILE*fp;
fp=fopen("text1.txt","w");
while(!kbhit())
{
ptCounterEventStart.counter=0;
DRV_CounterEventStart(DriverHandle,&ptCounterEventStart);
ptCounterEventRead.counter=0;
ptCounterEventRead.overflow=&over;
ptCounterEventRead.count=&num1;
DRV_CounterEventRead(DriverHandle, (LPT_CounterEventRead)&ptCounterEventRead);
DRV_CounterEventRead(DriverHandle,&ptCounterEventRead);
Sleep(500);
ptCounterEventRead.counter=0;
ptCounterEventRead.overflow=&over;
ptCounterEventRead.count=&num2;
DRV_CounterEventRead(DriverHandle, (LPT_CounterEventRead)&ptCounterEventRead);
DRV_CounterEventRead(DriverHandle,&ptCounterEventRead);
count=num2-num1;
Q=0.5+(2*(count-13))*0.0122;
printf("Q=%f",Q);
fprintf(fp,"Q=%f",Q);
e1=e2;
e2=e3;
e3=Qh-Q;
U+=Kc*(e3-e2)+(Kc*Ts/Ti)*e3;
if(U>=10)
U=10;
if(U<=0)
U=0;
t+=0.5;
ptAOVoltageOut.chan=0;
ptAOVoltageOut.OutputValue=U;//所要设置的输出电压值,浮点型数据
DRV_AOVoltageOut(DriverHandle,(LPT_AOVoltageOut)&ptAOVoltageOut);
printf("t=%f,U=%f\n",t,U);
fprintf(fp,"t=%f\n",t);
}
fclose(fp);
DRV_CounterReset(DriverHandle,0);
DRV_DeviceClose(&DriverHandle);
}。