过程控制系统实验报告
过程控制系统实验报告
姓 名:
指导教师 :
南京理工大学 2015 年 5月
实验二 传感器、执行器实验
一、实验目的
了解传感器、执行器的工作原理,掌握它们在实际过程控制中的应用。
二、实验要求
编程实现系统液位、温度、流量等模拟量的数据采集以及模拟量的输出。 三、实验步骤
1、液位传感器的测试
在水箱内按要求注入不同高度的纯净水,利用万用表和USB-4711A板卡的A/D口分别测出液位传感器的输出电压,并在计算机内将电压转换成对应的高度。将测量数据填入下表。
因为我们使用的实验仪器测高计有明显的机械误差,通过实际0mm时测量高度为192mm,表测电压为-2.4V。所以实际相对误差应是消除高度计所造成的机械误差之后的值,一并在表中列出了。
2、温度传感器的测试
用温度计测量出水温,同时利用万用表和USB-4711A板卡的A/D口测出温度传感器的输出电压,并在计算机内将其转换成相应的温度。将测量数据填入下表。
3、比例阀的控制
通过USB-4711A板卡的D/A口输出控制电压,比较机内控制电压与实际输出电压,并将结果填入下表。
四、思考题
1、用传感器测量过程变量的准确性如何?如果有误差,可以采取什么方法进行修正?
答:在测量过程变量时大量被测量是随时间变化的动态信号,传感器的输入与输出信号是一个时间函数,随着输入信号变化,实际传感器输出与输入不具有相同时间函数,将会产生系统误差和随机误差。
对于系统误差,可以采用差动法补偿来修正,随机误差可以采用统计学中的方法如算数平均或求标准偏差。
实验三 系统动态特性的测试
一、实验目的
学习单容对象动态特性的实验测定方法。
二、实验要求
通过实验的方法建立液位对象的过程数学模型。
三、实验步骤
利用液位对象的液位与输出流量的关系建立其模型 ⑴ 测试系统结构如图3-1所示。
图3-1 利用液位—输出流量关系建立模型的实验原理图
⑵ 原理
对于液位系统,根据动态物料平衡关系有
dh
QiQOA 式 3-1
dt 式中: Qi—输入流量; QO—输出流量; h—液位高度; A—水箱截面积;
Qi、QO、h分别为偏离某一平衡状态Qi0、QO0、h0的增量。
dh
0,当Qi变化时,h、QO也将发生变化,由在静态时,QiQO,dt
流体力学可知,流体在紊流情况下,h与流量之间为非线性关系,为简化起见,作线性化处理。近似认为QO与h在工作点附近成正比,而与出水阀的阻
力R2(称为液阻)成反比,即
QO
hh 或 R2 式 3-2 R2Q0
由式 3-1、式-2,消去中间变量QO,再求拉氏变换得: 单容液位过程的传递函数为:
W(S)
R2H(S)K 式 3-3
Qi(S)R2AS1TS1
⑶ 关闭出水阀,向水箱内注水至260mm左右,将出水阀旋开至适当位置(整个测量过程中保持出水阀开度不变),测量给定液位高度所对应的
其中水箱的截面积A190mm175mm。
R2473473
W(S)
R2AS1473AS1(1.51e7)S1
四、思考题
1、分析可能造成模型不准确的原因。
答:①被控对象有较大的时间常数,导致变化过程较慢; ②单容水箱是一阶系统响应,被控变量的变化比较缓慢; ③被控对象具有传输延迟;
④被控对象不具有非线性,自平衡能力差。
实验四 液位单回路控制系统的设计及参数整定
一、实验目的
掌握过程计算机控制系统的单回路控制方式。
二、实验要求
设计单容水箱的液位单回路控制系统,实现液位的定值控制,并对系统进行参数整定。
三、实验内容
1、按照图4-1,在组合式实验装置上通过选择管路,构造液位单回路控制系统。
图 4-1 液位单回路控制系统原理图
2、画出液位单回路控制系统方框图。
3、根据液位对象的数学模型,选择系统的采样周期 TS。
4、运用经验法确定数字调节器的参数。
根据经验公式,选择调节器参数KC、TI和TD值。观察不同参数情况下的控制效果,最终确定较为满意的调节器参数。
四、思考题
1、在控制过程中遇到了哪些问题,你是如何解决的?为了提高控制效果,你在控制算法上还采取了哪些措施?
答:实验中,开始程序一直记录数据有问题,后来和同学帮助下,原来是fprintf设定不对。最后的实验中,测流量总是开始就达到
最大,然后慢慢向下降落,怎么也搞不懂,在老师的指点下终于解决了问题,完成了实验。
采用了多次实验取较好数据的方法,消除了偶然误差的影响。本来还采用了微分算法,用了之后才知道不好,又去掉了。
实验五 流量单回路控制系统的设计及参数整定
一、实验目的
掌握过程计算机控制系统的一般设计方法。
二、实验要求
根据流量对象的特点,设计流量定值控制系统,并对系统进行参数整定,使系统具有较好的动、静态性能指标和抗干扰能力。
三、实验步骤
1、按照图5-1,在组合式实验装置上通过选择管路,构造流量单回路控制系统。
图5-1 流量单回路控制系统原理图
2、画出流量单回路控制系统方框图。
3、根据流量对象的特点,选择系统的采样控制周期 TS。
4、 选择调节器参数,进行流量控制,记录控制结果,并就不同参数
下的控制效果进行定性讨论
四、思考题
1、流量对象与液位对象有什么区别?流量控制系统的参数整定要注意 哪些问题? 答:(1)
①流量对象应用流量传感器,对于设定的流量值,系统会在达到 该流量时以大致稳定的流速往水箱注水;
②液位对象以设定的液位高度为基准,传感器一直对高度进行测量,达到设定高度后立即停止注水,并一直检测,当液面未达到设定值,
再次
注水以此反复。
(2)注意数学模型的正确建立,在建模过程中减少盲目性,但是该方法较为复杂,在过程控制进行中直接进行工程正定,该方法简单,计算方便,但是参数不一定最佳,但实用;在此采用现场实验整定的方法,这种方法注意改变比例积分的参数,并有比较性地改变,有比较好得效果。
附实验程序:
实验二 传感器、执行器实验
#include
#include
#include
#include
#include
void main()
{ PT_AIConfig ptAIConfig;
PT_AIVoltageIn ptAIVoltageIn;
float advalue;
float h;
float q=0;
FILE *fp=fopen(
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(
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(
Sleep(1000);
ptCounterEventRead.counter=0;
ptCounterEventRead.overflow=&over;
ptCounterEventRead.count=&num2;
DRV_CounterEventRead (DriverHandle, (LPT_CounterEventRead)&ptCounterEventRead);
DRV_CounterEventRead (DriverHandle, &ptCounterEventRead);
printf(
count=num2-num1;
q=0.0122*count+0.3412;
h=advalue*80;
printf(
fprintf(fp,
fprintf(fp,
}
fclose(fp);
DRV_CounterReset(DriverHandle,0);
DRV_DeviceClose( &DriverHandle );
}
实验三 系统动态特性的测试
#include
#include
#include
#include
#include
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(
Sleep(1000);
ptCounterEventRead.counter=0;
ptCounterEventRead.overflow=&over;
ptCounterEventRead.count=&num2;
DRV_CounterEventRead (DriverHandle, (LPT_CounterEventRead)&ptCounterEventRead);
DRV_CounterEventRead (DriverHandle, &ptCounterEventRead);
printf(
count=num2-num1;
printf(
FILE *fp=fopen(
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(
printf(
printf(
printf(
printf(
fprintf(fp,
fprintf(fp,
}
fclose(fp);
DRV_CounterReset(DriverHandle,0);
DRV_DeviceClose( &DriverHandle );
DRV_DeviceClose( &DriverHandle_v ); //关闭设备
}
实验四 液位单回路控制系统的设计及参数整定
#include
#include
#include
#include
#include
#include
void main()
{
FILE *fp=fopen(
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
,+/-10V
ptAIVoltageIn.TrigMode = 0; //内部触发
ptAIVoltageIn.voltage = (FLOAT far *)&height_v_In;//返回电压值
DRV_AIVoltageIn(DriverHandle,(LPT_AIVoltageIn)&ptAIVoltageIn);
ptAIVoltageIn.gain = 4;//Gain Code
if(height_v_In
{
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
height_v_Out=0;
}
else height_v_Out=0;
printf(
printf(
printf(
//电压输出
ptAOVoltageOut.chan = 0;
ptAOVoltageOut.OutputValue = height_v_Out;//所要设置的输出电压值,浮点型数据
DRV_AOVoltageOut(DriverHandle1,(LPT_AOVoltageOut)&ptAOVoltageOut);
fprintf(fp,
time=%f\n
}
//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
#include
#include
#include
#include
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(
while(!kbhit())
{
ptCounterEventStart.counter=0;
DRV_CounterEventStart(DriverHandle,&ptCounterEventStart);
ptCounterEventRead.counter=0;
ptCounterEventRead.overflow=&over;
ptCounterEventRead.count=&num1;
DRV_CounterEventRead
(LPT_CounterEventRead)&ptCounterEventRead);
DRV_CounterEventRead (DriverHandle, &ptCounterEventRead); Sleep(500);
ptCounterEventRead.counter=0;
ptCounterEventRead.overflow=&over;
ptCounterEventRead.count=&num2;
DRV_CounterEventRead
(LPT_CounterEventRead)&ptCounterEventRead);
DRV_CounterEventRead (DriverHandle, &ptCounterEventRead);
count=num2-num1;
Q=0.5+(2*(count-13))*0.0122;
printf(
(DriverHandle, (DriverHandle,
fprintf(fp,
e1=e2;
e2=e3;
e3=Qh-Q;
U+=Kc*(e3-e2)+(Kc*Ts/Ti)*e3;
if(U>=10)
U=10;
if(U
U=0;
t+=0.5;
ptAOVoltageOut.chan = 0;
ptAOVoltageOut.OutputValue=U;//所要设置的输出电压值,浮点型数据 DRV_AOVoltageOut(DriverHandle,(LPT_AOVoltageOut)&ptAOVoltageOut);
printf(
fprintf(fp,
}
fclose(fp);
DRV_CounterReset(DriverHandle,0);
DRV_DeviceClose( &DriverHandle );
}