过程控制系统实验报告

更新时间:2023-09-25 14:57:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

过程控制系统实验报告

姓 名:

指导教师 :

南京理工大学 2015 年 5月

实验二 传感器、执行器实验

一、实验目的

1

了解传感器、执行器的工作原理,掌握它们在实际过程控制中的应用。

二、实验要求

编程实现系统液位、温度、流量等模拟量的数据采集以及模拟量的输出。 三、实验步骤

1、液位传感器的测试

在水箱内按要求注入不同高度的纯净水,利用万用表和USB-4711A板卡的A/D口分别测出液位传感器的输出电压,并在计算机内将电压转换成对应的高度。将测量数据填入下表。

高度 输出 万用表测量值(伏) A/D 口测量值 (伏) 250 mm 5.53 5.56 200 mm 4.91 4.92 393.36 96.68% 0.68% 150 mm 4.30 4.32 345.31 100 mm 3.68 3.71 296.48 50 mm 3.07 3.09 246.88 0mm -2.4 -2.4 192 / / 机内转换高度(mm) 444.92 相对误差(%) 相对误差(%) (消除仪器误差) 77.97% 1.17% 130.21% 196.48% 393.76% 2.21% 4.68% 8.76%

因为我们使用的实验仪器测高计有明显的机械误差,通过实际0mm时测量高度为192mm,表测电压为-2.4V。所以实际相对误差应是消除高度计所造成的机械误差之后的值,一并在表中列出了。

2、温度传感器的测试

用温度计测量出水温,同时利用万用表和USB-4711A板卡的A/D口测出温度传感器的输出电压,并在计算机内将其转换成相应的温度。将测量数据填入下表。

2

温度计 (度) 万用表测量值 (伏) A/D口测量电压 (伏) 机内转换温度(度) 相对误差(%) / 0.93 3、比例阀的控制

0.96 19.19 / 通过USB-4711A板卡的D/A口输出控制电压,比较机内控制电压与实际输出电压,并将结果填入下表。

控制量(伏) 测量值(伏) 相对误差(%) 0 0 0 2.5 2.49 0.4% 5 4.98 0.4% 7.5 7.47 0.4% 10 9.96 0.4%

四、思考题

1、用传感器测量过程变量的准确性如何?如果有误差,可以采取什么方法进行修正?

答:在测量过程变量时大量被测量是随时间变化的动态信号,传感器的输入与输出信号是一个时间函数,随着输入信号变化,实际传感器输出与输入不具有相同时间函数,将会产生系统误差和随机误差。

对于系统误差,可以采用差动法补偿来修正,随机误差可以采用统计学中的方法如算数平均或求标准偏差。

3

实验三 系统动态特性的测试

一、实验目的

学习单容对象动态特性的实验测定方法。

二、实验要求

通过实验的方法建立液位对象的过程数学模型。

三、实验步骤

利用液位对象的液位与输出流量的关系建立其模型 ⑴ 测试系统结构如图3-1所示。

进水 计算机 LT 出水 图3-1 利用液位—输出流量关系建立模型的实验原理图

FT ⑵ 原理

对于液位系统,根据动态物料平衡关系有

d?h ?Qi??QO?A 式 3-1

dt 式中: Qi—输入流量; QO—输出流量; h—液位高度; A—水箱截面积;

?Qi、?QO、?h分别为偏离某一平衡状态Qi0、QO0、h0的增量。

d?h?0,当Qi变化时,h、QO也将发生变化,由在静态时,Qi?QO,dt流体力学可知,流体在紊流情况下,h与流量之间为非线性关系,为简化起见,作线性化处理。近似认为QO与h在工作点附近成正比,而与出水阀的阻

4

力R2(称为液阻)成反比,即

?QO??h?h 或 R2? 式 3-2 R2?Q0由式 3-1、式-2,消去中间变量QO,再求拉氏变换得: 单容液位过程的传递函数为:

W(S)?R2?H(S)K 式 3-3

???Qi(S)R2AS?1TS?1⑶ 关闭出水阀,向水箱内注水至260mm左右,将出水阀旋开至适当位置(整个测量过程中保持出水阀开度不变),测量给定液位高度所对应的流量值,填入下表。根据式3-3求对象的数学模型。 h (mm) 120 160 200 240 QO(l/min) R2 1.880 471 1.965 541 473 2.039 2.137 408 R2

其中水箱的截面积A?190mm?175mm。

R2473473W(S)???R2AS?1473AS?1(1.51e7)S?1

四、思考题

1、分析可能造成模型不准确的原因。

答:①被控对象有较大的时间常数,导致变化过程较慢; ②单容水箱是一阶系统响应,被控变量的变化比较缓慢; ③被控对象具有传输延迟;

④被控对象不具有非线性,自平衡能力差。

5

实验四 液位单回路控制系统的设计及参数整定

一、实验目的

掌握过程计算机控制系统的单回路控制方式。

二、实验要求

设计单容水箱的液位单回路控制系统,实现液位的定值控制,并对系统进行参数整定。

三、实验内容

1、按照图4-1,在组合式实验装置上通过选择管路,构造液位单回路控制系统。

计算机

M 进水 LI 出水 图 4-1 液位单回路控制系统原理图

2、画出液位单回路控制系统方框图。

3、根据液位对象的数学模型,选择系统的采样周期 TS? 。

6

4、运用经验法确定数字调节器的参数。

根据经验公式,选择调节器参数KC、TI和TD值。观察不同参数情况下的控制效果,最终确定较为满意的调节器参数。

调节器参数 实验次数 性能指标 KC 1 2 3 4 1 2 2 1 TI 1 1 0.5 0.5 TD / / / / ?00 6.1% 6.3% 5.9% 5.3% tS 55 54 48 52

7

四、思考题

1、在控制过程中遇到了哪些问题,你是如何解决的?为了提高控制效果,你在控制算法上还采取了哪些措施?

答:实验中,开始程序一直记录数据有问题,后来和同学帮助下,原来是fprintf设定不对。最后的实验中,测流量总是开始就达到

最大,然后慢慢向下降落,怎么也搞不懂,在老师的指点下终于解决了问题,完成了实验。

采用了多次实验取较好数据的方法,消除了偶然误差的影响。本来还采用了微分算法,用了之后才知道不好,又去掉了。

实验五 流量单回路控制系统的设计及参数整定

一、实验目的

掌握过程计算机控制系统的一般设计方法。

二、实验要求

根据流量对象的特点,设计流量定值控制系统,并对系统进行参数整定,使系统具有较好的动、静态性能指标和抗干扰能力。

三、实验步骤

1、按照图5-1,在组合式实验装置上通过选择管路,构造流量单回路控制系统。

8

计算机

M 进水 FT 出水

图5-1 流量单回路控制系统原理图

2、画出流量单回路控制系统方框图。

3、根据流量对象的特点,选择系统的采样控制周期 TS? 。

4、 选择调节器参数,进行流量控制,记录控制结果,并就不同参数

下的控制效果进行定性讨论

控制器 实验次数 1 2 PID 3 4 0.5 1 0.5 0.5 / / 3.08% 7.95% 3.5 4.5 KC 0.5 1 TI 1 1 TD / / ?00 1.86% 4.3% tS 13.5 4.5 9

四、思考题

1、流量对象与液位对象有什么区别?流量控制系统的参数整定要注意 哪些问题? 答:(1)

①流量对象应用流量传感器,对于设定的流量值,系统会在达到 该流量时以大致稳定的流速往水箱注水;

②液位对象以设定的液位高度为基准,传感器一直对高度进行测量,达到设定高度后立即停止注水,并一直检测,当液面未达到设定值,再次

10

注水以此反复。

(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;

11

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);

12

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); //打开设备

13

//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;

14

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(\

15

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; //误差

16

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 17

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(\ printf(\ printf(\

//电压输出 ptAOVoltageOut.chan = 0; ptAOVoltageOut.OutputValue = height_v_Out;//所要设置的输出电压值,浮点型数据 DRV_AOVoltageOut(DriverHandle1,(LPT_AOVoltageOut)&ptAOVoltageOut); fprintf(fp,\h=%f, 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;//所要设置的输出电压值,浮点型数

18

据 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;

19

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(\

20 (DriverHandle, (DriverHandle,

本文来源:https://www.bwwdw.com/article/vhnd.html

Top