DDC单回路PID闭环控制系统的设计及实时仿真课程设计报告
- 格式:docx
- 大小:120.05 KB
- 文档页数:25
DDC 单回路PID 控制实验实验报告一、对象动态特性实验22111121()1(2)1(1)(G −−++−+=ZZ K z T T T T G(s)离散化得: 差分方程:Y(k)=a0*Y(k-1)+b0*Y(k-2)+c0*R(k) 其中:a0=2.0*T1/T/(1+T1/T)b0=0.0-pow(T1/T,2.0)/(1+T1/T)/(1+T1/T)c0=K1/(1+T1/T)/(1+T1/T)程序框图:相关源程序段:double T,r0,K1,T1,Kp,Ti,Td,Beta;//定义全局变量便于参数传递void CMainFrame::OnDrawObject() { // TODO: Add your command handler code here if(T==0){ ErrorDlg errorDlg; errorDlg.DoModal(); } else{CDC * pDC=GetDC(); CPen pen1,* oldpen;oldpen=pDC->SelectObject(&pen1);//画坐标轴pen1.CreatePen(PS_SOLID,1,RGB(0,0,255));pDC->SelectObject(&pen1);pDC->MoveTo(50,50);pDC->LineTo(50,300);pDC->MoveTo(50,50);pDC->LineTo(46,58);pDC->MoveTo(50,50);pDC->LineTo(54,58);pDC->MoveTo(50,300);pDC->LineTo(490,300);pDC->LineTo(482,295);pDC->MoveTo(490,300);pDC->LineTo(482,305);pDC->SetTextColor(RGB(0,0,255));pDC->TextOut(40,298,"0");pDC->TextOut(56,48,"Y");pDC->TextOut(492,300,"t");pDC->MoveTo(50,180);pen1.DeleteObject();pen1.CreatePen(PS_DASH,1,RGB(0,0,255));pDC->SelectObject(&pen1);pDC->LineTo(480,180);pDC->TextOut(35,174,"r0");pen1.DeleteObject();pen1.CreatePen(PS_SOLID,1,RGB(255,0,0));pDC->SelectObject(&pen1);y=300,t,unity,unitt=2;//两坐标轴单位长intunity=120.0/r0;a0,b0,c0,y0=0,y1=0,y2;doublea0=2.0*T1/T/(1+T1/T);b0=0.0-pow(T1/T,2.0)/(1+T1/T)/(1+T1/T);c0=K1/(1+T1/T)/(1+T1/T);text;CStringtext.Format("对象动态特性曲线:K1=%4.1f, T1=%3.2f, T=%3.2f, r0=%3.1f",K1,T1,T,r0);pDC->TextOut(80,320,text);pDC->MoveTo(50,300);for(t=52;t<=480;t+=unitt){y2=a0*y1+b0*y0+c0*r0;pDC->LineTo(t,y-unity*y2);y0=y1;y1=y2;}pDC->SelectObject(oldpen);}}程序界面及实验输出响应曲线:二、单回路PID控制实验采用增量式:delta_u=a*e(k)+b*e(k-1)+c*e(k-2)其中:a=Kp*(1+T/Ti*L+Td/T) L为积分分离系数b=0.0-Kp*(1+2*Td/T)c=Kp*Td/T;程序框图:相关源程序段:double T,r0,K1,T1,Kp,Ti,Td,Beta;//定义全局变量便于参数传递bool pid=FALSE;void CMainFrame::OnDrawU() // CMainFrame::OnDrawY()基本相同,不再另附源程序{// TODO: Add your command handler code hereif(T==0||(!pid)){ErrorDlgerrorDlg;errorDlg.DoModal();}else{pDC=GetDC();*CDCCPen pen1,* oldpen;oldpen=pDC->SelectObject(&pen1);//画坐标轴pen1.CreatePen(PS_SOLID,1,RGB(0,0,255));pDC->SelectObject(&pen1);pDC->MoveTo(50,50);pDC->LineTo(50,300);pDC->MoveTo(50,50);pDC->LineTo(46,58);pDC->MoveTo(50,50);pDC->LineTo(54,58);pDC->MoveTo(50,300);pDC->LineTo(490,300);pDC->LineTo(482,295);pDC->MoveTo(490,300);pDC->LineTo(482,305);pDC->SetTextColor(RGB(0,0,255));pDC->TextOut(40,298,"0");pDC->TextOut(56,48,"U");pDC->TextOut(492,300,"t");pDC->MoveTo(50,180);pen1.DeleteObject();pen1.CreatePen(PS_DASH,1,RGB(0,0,255));pDC->SelectObject(&pen1);pDC->LineTo(480,180);pDC->TextOut(35,174,"r0");pen1.DeleteObject();pen1.CreatePen(PS_SOLID,1,RGB(0,124,111));pDC->SelectObject(&pen1);u=300,t,unitt=2;//两坐标轴单位长intdoubleunitu=120.0/r0;a,b,c,e0=0,e1=0,e2=r0,u1=0,u2,delta_u;doublea0,b0,c0,y0=0,y1=0,y2;doubleL=1;//积分分离逻辑系数inta0=2.0*T1/T/(1+T1/T);b0=0.0-pow(T1/T,2.0)/(1+T1/T)/(1+T1/T);c0=K1/(1+T1/T)/(1+T1/T);b=0.0-Kp*(1+2*Td/T);c=Kp*Td/T;text1,text2;CStringtext1.Format("PID控制u(t)阶跃响应曲线:Kp=%4.1f, Ti=%3.2f, Td=%3.2f",Kp,Ti,Td);text2.Format("K1=%4.1f, T1=%3.2f, T=%3.2f, r0=%3.1f",K1,T1,T,r0);pDC->TextOut(80,320,text1);pDC->TextOut(120,340,text2);pDC->MoveTo(50,300);for(t=52;t<=480;t+=unitt){if(Beta==0||e2<Beta)L=1;else L=0;a=Kp*(1+T/Ti*L+Td/T);delta_u=a*e2+b*e1+c*e0;u2=u1+delta_u;pDC->LineTo(t,u-unitu*u2);y2=a0*y1+b0*y0+c0*u2;e0=e1;e1=e2;e2=r0-y2;u1=u2;y0=y1;y1=y2;}}}用工程整定法整定PID参数:令T=1,r0=1,K1=1,T1=10取消积分部分作用(取极小Beta值),令Td=0,试得Kp=5时为临界状态,输出曲线:由图知此时周期Tu约为29推算出PID调节时的整定参数Kp=3.125,Ti=14.5,Td=3.625整定后的输出曲线:采用具有积分分离的数字PID算法:对象及PID控制参数均不变,以便与以上无积分分离曲线进行比较β适中(0.8)情况下得曲线β过小(0.2)时得曲线:取Ti=14.5, Td=3.625,改变Kp观察y(t)变化:Kp=10观察图中曲线研Kp=3.125 Kp=1究Kp对调节品质的影响:随着Kp增大,超调量增加,响应速度加快。
设计 一 DDC 单回路PID 控制器的设计一、设计目的通过设计掌握DDC 单回路PID 控制程序编制。
二、设计内容1控制系统如图所示G(S )=K 1/(T 1S +1)D (Z )采用数字PID 控制规律,T 为采样周期。
2对象动态特性仿真设计(1) 将G (S )离散化,写出输入/输出采样方程(考虑零阶保侍器)。
(2) 画出详细程序框图。
3单回路PID 控制设计(1) 由键盘输入PID 参数:K P 、T I 、T D ,设计D (Z ),写出输入/输出采样方程。
(2) 采用具有不完全微分的数字PID 算法,D(s)= K P (1+s/ T I + sT D )/ (1+sT f ), T f 由键盘输入。
(3) 画出详细程序框图。
(4) 可自选编程语言及调试。
三、设计要求1、采用简单人机对话的方式,输入采样周期T ,阶跃量R (S ),对象参数K 1 和T 1 (实验报告中取K 1 =1,T 1 =10S ),及PID 控制器参数K P 、T I 、T D 。
2、设计报告要详尽,要求提供的材料要齐全。
3、设计应独立完全。
设计二Smith预估控制设计一、设计目的通过设计掌握Smith预估控制的方法。
二、设计内容1、smith预估控制系统如图所示R(s)T对象G(S )= K1e-τs /(T1S +1),K=1,T1=10s,τ=5sD (Z )采用数字PI 控制规律。
2、Smith预估控制(1) 构造Dτ(s ),求出Dτ(s ),(3)按图设计Smith预估控制器。
(4)画出详细程序框图,参数K 、T1、τ由键盘输入。
三设计步骤1、拟定设计方案。
2、推导公式,确定系统。
3、画出详细的流程框图,编程调试。
三、设计要求1、采用简单人机对话的方式,输入采样周期T ,预估器参数K 和τ,及PI 控制器参数K P、T I。
2、设计报告要详尽,要求提供的材料要齐全。
3、设计应独立完全。
单闭环直流调速系统的设计与仿真实验报告摘要:本文基于基本原理和方法,设计和仿真了一个单闭环直流调速系统。
首先介绍了直流电机调速的基本原理,然后根据系统要求,设计了控制系统的结构和参数,包括PID控制器的参数调整方法。
接下来使用Matlab/Simulink软件进行系统仿真实验,对系统的性能进行评估。
最后根据仿真结果对系统进行分析和总结,并提出了可能的改进方法。
关键词:直流电机调速、单闭环控制系统、PID控制器、仿真实验一、引言直流电机广泛应用于机械传动系统中,通过调节电机的电压和电流实现电机的调速。
在实际应用中,需要确保电机能够稳定运行,并满足给定的转速要求。
因此,设计一个高性能的直流调速系统至关重要。
本文基于单闭环控制系统的原理和方法,设计和仿真了一个直流调速系统。
首先介绍了直流电机调速的基本原理,然后根据系统要求,设计了控制系统的结构和参数,并采用PID控制器进行调节。
接着使用Matlab/Simulink软件进行系统仿真实验,并对系统的性能进行评估。
最后根据仿真结果对系统进行分析和总结,并提出了可能的改进方法。
二、直流电机调速的基本原理直流电机调速是通过调节电机的电压和电流实现的。
电压变化可以改变电机的转速,而电流变化可以改变电机的转矩。
因此,通过改变电机的电压和电流可以实现电机的调速。
三、控制系统设计和参数调整根据系统的要求,设计一个单闭环控制系统,包括传感器、控制器和执行器。
传感器用于测量电机的转速,并将信息传递给控制器。
控制器根据测量的转速和给定的转速进行比较,并调节电机的电压和电流。
执行器根据控制器的输出信号来控制电机的电压和电流。
在本实验中,采用PID控制器进行调节。
PID控制器的输出信号由比例项、积分项和微分项组成,可以根据需要对各项参数进行调整。
调整PID控制器的参数可以使用试错法、频率响应法等方法。
四、系统仿真实验使用Matlab/Simulink软件进行系统仿真实验,建立直流调速系统的模型,并对系统进行性能评估。
《计算机控制技术》数字PID控制器设计与仿真实验报告课程名称:计算机控制技术实验实验类型:设计型实验项目名称:数字PID控制器设计与仿真一、实验目的和要求1. 学习并掌握数字PID以及积分分离PID控制算法的设计原理及应用。
2. 学习并掌握数字PID控制算法参数整定方法。
二、实验内容和原理图3-1图3-1是一个典型的 PID 闭环控制系统方框图,其硬件电路原理及接线图可设计如图1-2所示。
图3-2中画“○”的线需用户在实验中自行接好,对象需用户在模拟实验平台上的运放单元搭接。
图3-2上图中,ADC1为模拟输入,DAC1为模拟输出,“DIN0”是C8051F管脚 P1.4,在这里作为输入管脚用来检测信号是否同步。
这里,系统误差信号E通过模数转换“ADC1”端输入,控制机的定时器作为基准时钟(初始化为10ms),定时采集“ADC1”端的信号,得到信号E的数字量,并进行PID计算,得到相应的控制量,再把控制量送到控制计算机及其接口单元,由“DAC1”端输出相应的模拟信号,来控制对象系统。
本实验中,采用位置式PID算式。
在一般的PID控制中,当有较大的扰动或大幅度改变给定值时,会有较大的误差,以及系统有惯性和滞后,因此在积分项的作用下,往往会使系统超调变大、过渡时间变长。
为此,可采用积分分离法PID控制算法,即:当误差e(k)较大时,取消积分作用;当误差e(k)较小时才将积分作用加入。
图3-3是积分分离法PID控制实验的参考程序流程图。
图3-3三、主要仪器设备计算机、模拟电气实验箱四、操作方法与实验步骤1.按照图3-2搭建实验仿真平台。
2.确定系统的采样周期以及积分分离值。
3.参考给出的流程图编写实验程序,将积分分离值设为最大值0x7F,编译、链接。
4.点击,使系统进入调试模式,点击,使系统开始运行,用示波器分别观测输入端R以及输出端C。
5.如果系统性能不满意,用凑试法修改PID参数,再重复步骤3和4,直到响应曲线满意,并记录响应曲线的超调量和过渡时间。
单闭环直流调速系统PID控制器参数设计仿真一、引言PID控制器是一种经典的控制方法,广泛应用于各种调节系统中。
在单闭环直流调速系统中,PID控制器可以根据给定的转速和实际测量的转速之间的误差,通过计算控制输出来实现对转速的控制。
本文将通过仿真的方式,进行PID控制器参数设计。
二、系统建模G(s)=k/(T*s+1)其中k为增益,T为时间常数。
三、PID控制器参数设计在设计PID控制器参数之前,需要首先选择合适的性能指标,常用的性能指标有超调量、调整时间和稳态误差。
本文选择超调量和调整时间作为性能指标,通过这两个指标可以综合评估系统的动态响应。
1.超调量的计算超调量是指实际过程响应曲线峰值与稳态值之间的差值的百分比。
超调量可以通过以下公式来计算:PO=(M-1)*100%其中PO为超调量,M为峰值与稳态值之间的差值与稳态值的比值。
2.调整时间的计算调整时间是指实际过程从初始值达到稳态值所需的时间。
调整时间可以通过以下方法来计算:标定点到极值点的时间为t1,稳定范围(0.9M,1.1M)的时间为t2,调整时间可定义为t1+t23.参数选择根据超调量和调整时间的要求,可以选择合适的PID控制器参数。
一般情况下,P参数用于控制系统的超调量,I参数用于控制系统的调整时间,D参数用于控制系统的稳定性。
四、仿真结果分析通过Matlab/Simulink进行仿真,得到了PID控制器的参数设计结果。
根据系统传递函数G(s) = k / (T * s + 1),设置k = 1,T = 11.超调量为5%,调整时间为2s的情况下,选取合适的PID控制器参数为:P=1.2I=1.4D=0.12.超调量为10%,调整时间为1.5s的情况下,选取合适的PID控制器参数为:P=1.2I=1.6D=0.153.超调量为15%,调整时间为2.5s的情况下P=1.4I=1.8D=0.2根据上述参数进行仿真,通过绘制转速曲线,可以观察到系统的动态响应。
DDC单回路PID闭环控制系统设计及实时仿真课程设计报告(2022--2022年度第2学期)名称:计算机控制系统A题目:DDC单回路PID闭环控制系统的设计及实时仿真院系:自动化系班级:自动班学号:学生姓名:指导教师:设计周数:一周成绩:日期:2022年X月X日《计算机控制系统A》课程设计任务书一、目的与要求1.学习并了解用高级语言(C语言)实现数字PID控制算法模块程序的方法;2.比较验证理想微分PID和实际微分PID控制算法阶跃响应,加深对上述两种算法各自特点的认识;3.学习了解用模拟计算机使用方法;4.学习掌握A/D、D/A转换接口板的使用方法;5.了解一种微机中断定时的方法;6.学习掌握通过A/D、D/A转换用计算机获取被控对象动态特性的方法;7.通过实时仿真实验掌握DDC单回路控制程序编制及调试方法。
二、主要内容1.用C语言分别编写理想微分PID和实际微分PID控制算法模块,在微机中调试实现,并编写简单的计算机绘图程序,分别绘制并打印出上述两种算法的单位阶跃响应曲线(课外上机完成);2.用模拟计算机搭接成一个二阶惯性环节,作为一个模拟仿真的被控对象;3.用C语言编写使用HY-6060进行定时采样、定时输出的接口程序,并在微机中调试实现;4.由D/A输出阶跃信号,同时由A/D采集模拟的被控对象的响应,绘制并打印出采集获得的飞升曲线,并初步计算出对象模型;y5.由模拟计算机搭接的二阶惯性环节作为系统中的被控对象,用计算机作为DDC控制器,通过HY-6060接口板实现对模拟机的实时控制。
仿真实验系统的框图如下:r+uPID模拟机D/A-A/D6.整定控制器PID参数,在设定值阶跃情况下,打印控制量u和被控量y的曲线。
三、进度计划序号设计内容完成时间备注1编写数字PID控制算法模块本设计开始前在课程要求的8学时课外上机时间完成2本设计其它内容按小组分工协作完成设计周五3验收、答辩设计周末前四、设计(实验)成果要求1.根据个人在设计小组中的分工,完成设计内容;2.分析实时仿真结果,每人完成设计报告。
本科课程设计报告目录控制系统课程设计报告 (1)课程设计题目 (3)实验设备 (3)实验目的 (3)实验背景 (3)实验内容 (3)任务一: (3)了解MATLAB的使用环境,掌握基本的MATLAB编程语法和语句 (3)任务二: (5)了解Simulink的使用环境,掌握Simulink的模块化编程步骤 (5)任务三: (5)对所有过程控制系统对象进行分析,分析所有参数的变化情况 (5)1.一阶系统 (6)2.二阶系统 (7)3.多阶系统 (9)任务四-六: (10)单回路控制系统仿真,PID控制原理,PID参数对控制系统性能的影响 (10)1.被控对象特性在系统中的仿真分析研究 (10)2.执行器在系统中的仿真分析研究 (12)3.控制器特性在系统中的仿真分析研究 (13)4.变送器特性在系统中的仿真分析研究 (15)任务七-八: (17)根轨迹法的基本原理;根轨迹的绘制方法、增益的选择、稳态误差的消除措施 (17)1.根轨迹理论的仿真分析 (17)2.减小消除稳态误差的措施 (18)任务九-十一: (21)频域响应法的基本原理;Bode图的绘制、带宽频率的选择;频率法校正 (21)1.利用伯德图观察幅频与相频特性 (21)2.基于bode图对系统相关指标分析 (22)任务十二-十四: (25)串级控制系统、前馈控制系统、比值控制系统设计,与单回路比较 (25)1.串级控制系统 (25)2.前馈控制系统 (26)3.比值控制系统 (28)任务十五: (29)数字PID控制算法的实验研究 (29)实验总结 (29)参考文献 (29)课程设计题目: 控制系统设计与仿真实验设备:含有MATLAB R2008a 的HP计算机一台.实验目的:通过实验,深入了解MATLAB矩阵实验室的操作,simulink仿真的使用以及各种控制系统的特性,从而为接下来的实体实验打下坚实的基础.有利于学习通过仿真对不能很轻易实现的实验进行分析研究,理解仿真与实际实验的密切关系.实验背景:一学期的自动控制原理课程修习;一学期的过程控制课程修习;一学期的控制系统设计与仿真课程修习;简单的MA TLAB程序应用.实验内容:任务一:了解MATLAB的使用环境,掌握基本的MATLAB编程语法和语句;MATLAB简介:MATLAB是矩阵实验室(Matrix Laboratory)的简称,是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。
ddc控制系统课程设计一、课程目标知识目标:1. 学生能理解DDC控制系统的基本原理和组成,掌握其工作流程。
2. 学生能掌握DDC控制系统的编程与调试方法,了解其在智能建筑中的应用。
3. 学生能了解DDC控制系统在我国的发展现状及趋势。
技能目标:1. 学生能运用所学知识对DDC控制系统进行简单编程与调试。
2. 学生具备分析DDC控制系统故障并进行排查的能力。
3. 学生能运用DDC控制系统进行简单的自动化控制项目设计。
情感态度价值观目标:1. 培养学生对DDC控制系统及智能建筑领域的兴趣,激发学习热情。
2. 培养学生团队合作精神,提高沟通协调能力。
3. 增强学生环保意识,认识到DDC控制系统在节能减排方面的重要性。
课程性质:本课程为专业选修课,旨在让学生了解并掌握DDC控制系统的基础知识,提高实际操作能力。
学生特点:学生为高年级本科生,具备一定的电子、电气和控制理论基础,对实际操作有较高的兴趣。
教学要求:注重理论与实践相结合,强调实际操作能力的培养,结合案例分析,提高学生的应用能力。
通过本课程的学习,使学生能够具备从事DDC控制系统相关领域工作的基本技能。
二、教学内容1. DDC控制系统概述:介绍DDC控制系统的基本概念、发展历程、应用领域及发展趋势。
教材章节:第一章2. DDC控制系统组成与原理:讲解DDC控制系统的硬件组成、软件结构、工作原理及性能指标。
教材章节:第二章3. DDC控制系统的编程与调试:学习DDC控制系统的编程方法、调试技巧及在实际项目中的应用。
教材章节:第三章4. DDC控制系统在智能建筑中的应用:分析DDC控制系统在建筑自动化、能源管理等方面的应用案例。
教材章节:第四章5. DDC控制系统故障分析与排查:介绍DDC控制系统常见故障现象、原因及排查方法。
教材章节:第五章6. DDC控制系统项目实践:设计实际项目,让学生动手操作,提高实践能力。
教材章节:第六章教学内容安排与进度:第1周:DDC控制系统概述第2周:DDC控制系统组成与原理第3-4周:DDC控制系统的编程与调试第5周:DDC控制系统在智能建筑中的应用第6周:DDC控制系统故障分析与排查第7-8周:DDC控制系统项目实践三、教学方法针对DDC控制系统课程的特点,采用以下多样化的教学方法,以激发学生的学习兴趣和主动性:1. 讲授法:用于讲解DDC控制系统的基本概念、原理和组成等理论知识。
自动控制原理实验报告PID 控制系统的Simulink 仿真1.实验目的1)掌握PID 控制规律及控制器的实现。
控制规律及控制器的实现。
2)对给定系统合理地设计PID 控制器。
控制器。
3)掌握对给定系统进行PID 控制器参数在线实验工程整定的方法。
控制器参数在线实验工程整定的方法。
2.实验原理在串联校正中,比例控制可提高系统开环增益,减少系统稳态误差,提高系统的控制精度,但会降低系统的相对稳定性,甚至可能造成系统闭环系统不稳定,积分控制可以提高系统的型别,有利于提高系统稳定性能,有利于提高系统稳定性能,但积分控制增加了一个位于原点的开环极点,但积分控制增加了一个位于原点的开环极点,但积分控制增加了一个位于原点的开环极点,使信号产生使信号产生90度的相位滞后,对系统的稳定不利,故不宜采用单一的积分控制器;微分控制规律能反映输入信号的变化趋势,映输入信号的变化趋势,产生有效的早期修正信号,产生有效的早期修正信号,产生有效的早期修正信号,以增加系统的阻尼程度,以增加系统的阻尼程度,以增加系统的阻尼程度,从而改善系统从而改善系统的稳定性,但微分控制增加了一个(-1/t)的开环极点,使系统的相角裕度提高,因此有助于系统动态性能的改善。
系统动态性能的改善。
在串联校正中,PI 控制器增加了一个位于原点的开环极点,同时也增加了一个位于s 左半平面的开环零点。
位于原点的开环极点可以提高系统的型别(无差度),减小稳态误差,有利于提高系统稳定性能;负的开环零点可以减小系统的阻尼,缓和PI 极点对系统产生的不利影响。
只要积分时间常数Ti 足够大,PI 控制器对系统的不利影响可大大减小。
PI 控制器主要用来改善控制系统的稳态性能。
主要用来改善控制系统的稳态性能。
在串联校正中,PID 控制器增加了一个位于原点的开环极点和两个位于s 左半平面的开环零点。
除了具有PI 控制器的优点外,还多了一个负实零点,动态性能比PI 更具有优越性。
课程设计(综合实验)报告( 2011-- 2012 年度第二学期)名称:过程计算机控制系统题目:DDC单回路PID闭环控制系统的设计及实时仿真院系:控制与计算机工程学院班级:学号:学生姓名:指导教师:朱耀春设计周数:一周成绩:日期:2012 年 6 月20 日一、 课程设计的目的与要求1.设计目的在计算机控制系统课程学习的基础上,加强学生的实际动手能力,通过对DDC 直接数字闭环控制的仿真加深对课程内容的理解。
2.设计要求本次课程设计通过多人合作完成DDC 直接数字闭环控制的仿真设计,学会A/D 、D/A 转换模块的使用。
通过手动编写PID 运算式掌握数字PID 控制器的设计与整定的方法,并做出模拟计算机对象飞升特性曲线,熟练掌握DDC 单回路控制程序编制及调试方法。
二、 设计正文1.设计思想本课程设计利用Turboc2.1开发环境,通过手动编写C 语言程序完成PID 控制器的设计,A/D 、D/A 转换,绘出PID 阶跃响应曲线与被控对象动态特性曲线。
整个设计程序模块包含了PID 配置模块,PLCD-780定时采样、定时输出模块,PID 手/自动切换模块(按键控制)及绘图显示模块。
设计中,通过设定合理的PID 参数,控制PLCD-780完成模拟计算机所搭接二阶惯性环节数据的采集,并通过绘图程序获得对象阶跃响应曲线。
2. 设计步骤(1)前期准备工作(1.1)配备微型计算机一台,系统软件Windows 98或DOS (不使用无直接I/O 能力的NT 或XP 系统), 内装Turbo C 2.0/3.0集成开发环境软件;(1.2)配备模拟计算机一台(XMN-1型), 通用数据采集控制板一块(PLCD-780型); (1.3)复习Turboc2.0并参照说明书学习PLCD-780的使用(2) PID 的设计(2.1)PID 的离散化理想微分PID 算法的传递函数形式为:⎪⎪⎭⎫ ⎝⎛++=s T s T K s G d i p 11)( 采用向后差分法对上式进行离散,得出其差分方程形式为:u[k]=u[k-1]+q0*e[2]+q1*e[1]+q2*e[0];其中各项系数为:q0=kp*(1+T/Ti+Td/T);q1=-kp*(1+2*Td/T);q2=kp*Td/T;实际微分PID 算法的传递函数形式为:⎪⎪⎭⎫ ⎝⎛+++=s T s T s T K s G d i f p 111)( 采用向后差分法对上式进行离散化,写成差分方程的形式为:u[k]=c0*(Δu[k-1])+c1*e[k]+c2*e[k-1]+c3*e[k-2]+u[k-1];其中各项系数为:c0=Tf/(T+Tf);c1=kp*T/(T+Tf)*(1+T/Ti+Td/T);c2=-kp*T/(T+Tf)*(1+2*Td/T);c3=kp*Td/(T+Tf);(2.2)数字PID 算法的改进○1积分分离算法积分分离算法通过控制PID 输入偏差e 达到优化目的,当偏差较大时停止积分作用,只有当偏差较小时才投入积分,算法如下表示:当|e(k)|>β时,采用PD 控制;当|e(k)|<β时, 采用PID 控制;β的值根据具体对象及要求确定。
课程设计(综合实验)报告( 2011-- 2012 年度第二学期)名称:过程计算机控制系统题目:DDC单回路PID闭环控制系统的设计及实时仿真院系:控制与计算机工程学院班级:学号:学生姓名:指导教师:朱耀春设计周数:一周成绩:日期:2012 年 6 月20 日一、 课程设计的目的与要求1.设计目的在计算机控制系统课程学习的基础上,加强学生的实际动手能力,通过对DDC 直接数字闭环控制的仿真加深对课程内容的理解。
2.设计要求本次课程设计通过多人合作完成DDC 直接数字闭环控制的仿真设计,学会A/D 、D/A 转换模块的使用。
通过手动编写PID 运算式掌握数字PID 控制器的设计与整定的方法,并做出模拟计算机对象飞升特性曲线,熟练掌握DDC 单回路控制程序编制及调试方法。
二、 设计正文1.设计思想本课程设计利用Turboc2.1开发环境,通过手动编写C 语言程序完成PID 控制器的设计,A/D 、D/A 转换,绘出PID 阶跃响应曲线与被控对象动态特性曲线。
整个设计程序模块包含了PID 配置模块,PLCD-780定时采样、定时输出模块,PID 手/自动切换模块(按键控制)及绘图显示模块。
设计中,通过设定合理的PID 参数,控制PLCD-780完成模拟计算机所搭接二阶惯性环节数据的采集,并通过绘图程序获得对象阶跃响应曲线。
2. 设计步骤(1)前期准备工作(1.1)配备微型计算机一台,系统软件Windows 98或DOS (不使用无直接I/O 能力的NT 或XP 系统), 内装Turbo C 2.0/3.0集成开发环境软件;(1.2)配备模拟计算机一台(XMN-1型), 通用数据采集控制板一块(PLCD-780型);(1.3)复习Turboc2.0并参照说明书学习PLCD-780的使用(2) PID 的设计(2.1)PID 的离散化理想微分PID 算法的传递函数形式为:⎪⎪⎭⎫⎝⎛++=s T s T K s G d i p 11)(采用向后差分法对上式进行离散,得出其差分方程形式为: u[k]=u[k-1]+q0*e[2]+q1*e[1]+q2*e[0];其中各项系数为:q0=kp*(1+T/Ti+Td/T);q1=-kp*(1+2*Td/T);q2=kp*Td/T;实际微分PID 算法的传递函数形式为:⎪⎪⎭⎫ ⎝⎛+++=s T s T s T K s G d i f p 111)( 采用向后差分法对上式进行离散化,写成差分方程的形式为:u[k]=c0*(Δu[k-1])+c1*e[k]+c2*e[k-1]+c3*e[k-2]+u[k-1];其中各项系数为:c0=Tf/(T+Tf);c1=kp*T/(T+Tf)*(1+T/Ti+Td/T);c2=-kp*T/(T+Tf)*(1+2*Td/T);c3=kp*Td/(T+Tf);(2.2)数字PID 算法的改进○1积分分离算法 积分分离算法通过控制PID 输入偏差e 达到优化目的,当偏差较大时停止积分作用,只有当偏差较小时才投入积分,算法如下表示:当|e(k)|>β时,采用PD 控制;当|e(k)|<β时, 采用PID 控制;β的值根据具体对象及要求确定。
○2抗积分饱和算法 抗积分饱和算法依据控制系统最终的控制输出量u 达到优化目的,当控制量u 较大且超出执行机构与A/D 转换范围时,控制器停止积分作用,保证输出超限时不积分;○3带死区的数字PID 算法 在实际控制系统中,计算机控制为了避免控制动作过于频繁,以消除系统振荡,就会采用带死区的PID 算法。
该算法是在原PID 算法前加一个不灵敏区来实现,即当|e(k)|>C 时,|e(k)|=|e(k)|;当|e(k)|<C 时,|e(k)|=0其中C 代表不灵敏区值;(2.3) 手动/自动双向无扰切换自动切手动:系统处于自动时,手操器实时跟踪自动PID 调节器的输出,切换瞬间由于手操器内部电路起保持作用,使得切换没有扰动产生,此时对象处于手操器的开环控制,调节器跟踪手操器的输出。
手动切自动:手动到自动的切换过程主要由计算机软件实现,一方面PID 调节器获得手操器输出,同时软件使得算法中的Δu[k -1])、e[k]、e[k-1]、e[k-2]等历史状态清零。
程序中通过设置键盘,使的按下手动键H 时,系统处于手动状态,按下自动键A 时,系统处于自动状态。
(3)硬件二阶惯性环节搭建利用模拟计算机中的电容电阻及运算放大器,搭接二阶惯性环节,仿真一个被控对象。
其传递函数为2)1()(+=Ts K s G ,硬件电路如下:图中各元件参数如下:R3=R2=510K ;R1=R4=R5=R6=R7=1M ;C1=C2=C=4.7uF ;则可得:K=(R5/R1)*(R6/R4)=1T1=T2=R5*C1=R6*C2=1000000*0.0000047=4.7s所以G (s )=1/(4.7s+1)*(4.7s+1)搭建好硬件电路后,将PLCD-780插入IPC 机箱插槽,用导线将PLCD-780中的A/D 、D/A 、电源的接线端子与所搭二阶惯性环节的输出、输入端口及机箱上的电源连接,组成一个完整的PID 闭环控制系统,为通信做好准备。
(4)PID 参数的整定8.75,6.6*1.2,6.6*04运用过程控制中PID 参数的工程整定方法,运用衰减曲线法对PID 参数进行整定。
在matlab 中,设置PID 参数为Td=0,Ti=∞,设置合适的比例带使得对象闭环阶跃响应曲线衰减率为0.9,从而确定PID 的整定参数为:P=0.8δ,Ti=1.2t r , Td=0.4t r ;matlab 中对象响应曲线为:由曲线可得PID参数为:P=0.8 =0.8×5=4,Ti=1.2t r=1.2×10=12,Td=0.4t r=0.4×10=4(5)实验结果输出通过在程序中编写相应的绘图模块子程序,在需要画图时调用相应的子程序实现曲线的绘制。
同时在程序中,本小组采用按键实现了PID手自动切换,理想PID与实际PID的切换,以及在手自动状态下由按键改变PID参数,使得调节方式更加的灵活。
3.设计结果(1)PID阶跃响应曲线调用程序,向PID模块输入一个阶跃信号,绘出PID阶跃响应曲线如下:(1.1)理想PID阶跃响应图:(1.2)实际PID阶跃响应图:(2)被控对象(惯性环节)阶跃响应曲线上图通过D/A输出一个1伏左右的信号输入模拟的被控对象(惯性环节),A/D采集对象的输入信号及其响应,再使D/A输出一个幅度为2伏左右的阶跃信号,同时采集输入输出信号。
然后,D/A再反向在输出一个幅度为2伏左右负的阶跃信号,同时采集输入输出信号,得出仿真对象飞升特性曲线。
程序中,通过按键实现模拟对象输入信号的加减。
当按下H按键时,且按下U键时,D/A输出一个1伏阶跃信号,再次按下按键时阶跃信号累加。
每次按下D键时,D/A输出的阶跃信号递减1。
(3)设定值r、控制量u和被控对象输出y的响应曲线:4.程序清单/*---------------头文件定义---------------*/#include<conio.h>#include<graphics.h>#include <stdio.h>#include <dos.h>/*---------------定义绘图坐标---------------*/#define ox 8 /*-----原点横坐标-------*/#define oy 440 /*------原点纵坐标------*/#define xx 620 /*------x轴顶点横坐标--*/#define xy 440 /*-----x轴顶点纵坐标---*/#define lenx 580#define leny 400#define yx 8 /*-----y轴顶点横坐标----*/#define yy 15 /*------y轴顶点纵坐标----*//*-----------------定义绘图区域----------------*/#define left 20#define top 20#define right 620#define bottom 460/*----------------坐标轴注释---------------------*/#define xtext1x 450#define xtext1y 450#define ytext1x 10#define ytext1y 60#define xtext2x 610#define xtext2y 450#define ytext2x 10#define ytext2y 20/*-------------------------理想PID运算式--------------------------*/ float lxpid(float kp,float td,float ti,float e[3],float u1){int t=1;float u;float q0=kp*(1+t/ti+td/t);float q1=-kp*(1+2*td/t);float q2=kp*td/t;u=q0*e[0]+q1*e[1]+q2*e[2]+u1;return u;}/*-------------------------实际PID运算式--------------------------*/ float sjpid(float kp,float tf,float td,float ti,float e[3],float du1,float u1) {int t=1,k=1000;float u2;float c1=tf/(t+tf);float c2=kp*t*(1+t/ti+td/t)/(t+tf);float c3=-kp*t*(1+2*td/t)/(t+tf);float c4=kp*td/(t+tf);u2=c1*du1+c2*e[0]+c3*e[1]+c4*e[2]+u1;return u2;}/*-------------------------绘图初始化--------------------------*/void Initial_Sys(void){int GraphDriver;int GraphMode;detectgraph(&GraphDriver,&GraphMode);initgraph(&GraphDriver,&GraphMode,"C:\\TC201E\\BGI");cleardevice();}/*-------------------------绘制坐标系------------------*/void DrawAxis(void){int i;setbkcolor(15);setcolor(5);line(ox,oy,xx,xy); /*x_axis*/line(xx-5,xy-5,xx,xy);line(xx,xy,xx-5,xy+5);line(ox,oy,yx,yy); /*y_axis*/line(yx-5,yy+10,yx,yy);line(yx+5,yy+10,yx,yy);for(i=0;i<51;i++){line(ox+10*i,oy,ox+10*i,oy-10);line(ox+10*i+5,oy,ox+10*i+5,oy-5); }for(i=1;i<=8;i++)line(ox,oy-50*i,ox+10,oy-50*i);outtextxy(ox+50*0-7,oy+20,"0");outtextxy(ox+50*1-7,oy+20,"5");outtextxy(ox+50*2-7,oy+20,"10");outtextxy(ox+50*3-7,oy+20,"15");outtextxy(ox+50*4-7,oy+20,"20");outtextxy(ox+50*5-7,oy+20,"25");outtextxy(ox+50*6-7,oy+20,"30");outtextxy(ox+50*7-7,oy+20,"35");outtextxy(ox+50*8-7,oy+20,"40");outtextxy(ox+50*9-7,oy+20,"45");outtextxy(ox+50*10-7,oy+20,"50");outtextxy(ox-10,oy-50*1,"1");outtextxy(ox-10,oy-50*2,"2");outtextxy(ox-10,oy-50*3,"3");outtextxy(ox-10,oy-50*4,"4");outtextxy(ox-10,oy-50*5,"5");outtextxy(ox-10,oy-50*6,"6");outtextxy(ox-10,oy-50*7,"7");outtextxy(ox-10,oy-50*8,"8");settextstyle(SMALL_FONT,HORIZ_DIR,5); outtextxy(xtext1x,xtext1y,"Time");outtextxy(xtext2x,xtext2y,"t\/s");settextstyle(SMALL_FONT,VERT_DIR,5);outtextxy(ytext1x,ytext1y,"The output (Response)");outtextxy(ytext2x,ytext2y,"U(t)\/V");}main(){float kp,ti,td,tf,e[3]={0},ee[3]={0},u[6]={0},au1=0;int r=1,k=1;Initial_Sys();DrawAxis();while(k<100){u[0]=lxpid(1,3.0,10,e,u[1]);e[0]=r;/*printf("%f\n",u[0]);*/u[3]=sjpid(1,5,3.0,10,ee,au1,u[4]);setcolor(5);line((k-1)*10,130-u[1]*100,k*10,130-u[1]*100);line(k*10,130-u[1]*100,k*10,130-u[0]*100);delay(10000);u[2]=u[1];u[1]=u[0];e[2]=e[1];e[1]=e[0];ee[0]=r;setcolor(3);line((k-1)*10,150-u[4]*100,k*10,150-u[4]*100);line(k*10,150-u[4]*100,k*10,150-u[3]*100);delay(10000);u[5]=u[4];u[4]=u[3];ee[2]=ee[1];ee[1]=ee[0];au1=u[4]-u[5];k++;}}/*---------------头文件定义---------------*/#include "stdio.h"#include "math.h"#include "graphics.h" /*for graph driver installing,only can be called in Turbo C*/#include "string.h"#include "dos.h"#include "bios.h"#include "conio.h" /*for interrupt program 头文件定义* /#include "stdlib.h"#include "io.h"/*--------------按键地址区定义--------------------*//*statements*/double key_ESC=0x011b; /*define can not suit the length of bioskey 键盘内存定义*/ double key_E=0x1265;double key_A=0x1e61;double key_H=0x2368;double key_U=0x1675;double key_D=0x2064;double key_I=0x1769;double key_P=0x1970;double key_up=0x4800;double key_down=0x5000;double key_left=0x4b00;double key_right=0x4d00;double key_pgup=0x4900;double key_pgdown=0x5100;/*--------------PLCD780基址定义--------------------*/#define BASE 0x220 /*------------PCL812G need 16 addresses in a row,from 220H to 3F0H*/ #define REG 0/*---------------定义绘图坐标---------------*/#define ox 40 /*------------原点横坐标-------------*/#define oy 440 /*------------原点纵坐标------------*/#define xx 600 /*------------x轴顶点横坐标--------*/#define xy 440 /*------------x轴顶点纵坐标--------*/#define yx 40 /*------------y轴顶点横坐标--------*/#define yy 40 /*------------y轴顶点纵坐标---------*//*---------------PID参数定义---------------*/float Kp=1.0;float Ti=10.0;float Td=3.0;float Tf0=15.0;float Tf=0;float T=0.1; /*---------------采样时间------------*/float ad,e,pv0;float u=0.0;float pv=0.0;float sp=0.0;char A_H='H';int key=0;int time_counter=0; /*times of interrupt*/int cj_counter=0; /*sampling counter*/int Q_counter=800; /* 采集步长赋初始值*/int stepdata[800];int slopedata[800];int error[800];/*--------------函数声明-----------------*/void interrupt (*fadd1C)(void);void loop();float AD(unsigned char channal); /*A/D*/void DA(float pv1); /*D/A*/void interrupt INT_1C(void); /*8259,reset interrupt controller*/int scankey();float DelayAction(float y0);void PIDset(void);float PID(float sp1,float pv1,float Kp1,float Ti1,float Td1,float Tf1,char A_H1,float T1); float Object(float u1,float T1);void Initial_Sys(void); /*Initiate graph display*/void axis(void);void Drawline(int cj,float pv1,float sp1,float u1,float e1);/*主函数*/void main(void){for(i=0;i<500;i++){stepdata[i]=10;slopedata[i]=i;error[i]=0;}/* Set new INT_1C and save old */disable();fadd1C=getvect(0x1C);/*1C为定时器控制的软中断,平均一秒发生18.2次,即周期为55ms 中断程序*//* 开启中断服务*/setvect(0x1C,INT_1C);enable();axis();loop();}/*主函数结束下面为定时采值输出程序*/void loop(){ do{if((cj_counter*T)<(time_counter/18.2)){PIDset(); /*Introduction:Exit-E/ESC,A_H-A/H,Ideal/Parallel PID,sp-U/D*/u=PID(sp,pv,Kp,Ti,Td,Tf,A_H,T);/*DA(u); */pv=Object(u,T);/*ad=AD(O);*//*pv=DelayAction(u);*/e=error[cj_counter];Drawline(cj_counter,pv,sp,u,e);manu=0;/*status bar,at the top of the screen--------------how to express %.2f*/if(Tf==0)printf("IdealPID,Mode:%c,sp=%.1f,pv=%2.1f,u=%.1f,error=%.1f,Kp=%.1f,Ti=%.1f,Td=%.1f\t\r",A_H,sp,p v,u,e,Kp,Ti,Td);else if(Tf>0)printf("Parallal,Mode:%c,sp=%.1f,pv=%2.1f,u=%.1f,error=%.1f,Kp=%.1f,Ti=%.1f,Td=%.1f\t\r",A_H,sp,pv, u,e,Kp,Ti,Td);else printf("\t\tTf got a wrong value! Please exit and restart this program.\r");cj_counter++;}}while(cj_counter<500);disable();/* 恢复中断*/setvect(0x1C,fadd1C);enable();}/*D/A conversion program,0 to 4095 -- 0to +5*/float AD(unsigned char channal){float result=0;int i;unsigned char hb=0,lb=0,ok=0x10;/*12bit AD/high 4 bits and low 8 bits*/outportb(BASE+11,REG); /*软件程序触发*/delay(10); /*here,'delay(int ms)' is used long before,and we just need some time for hardware working*/outportb(BASE+10,channal); /*进行通道设置.选择通道0*/delay(10);outportb(BASE+9,1); /*设置增益通道增益*/delay(10);outportb(BASE+12,0); /*触发A/D转换*/delay(10);do{ok=inportb(BASE+5);}while(ok&0x10);hb=inportb(BASE+5);delay(10);lb=inportb(BASE+4);result = lb + ((hb&0x0F)<<8); /*0 to 4095*/result=result*5/4096; /*0 V to +5V*/return result;}/*A/D conversion program,0 to +5 -- 0 to 4095*/void DA(float pv1){int temp,i;unsigned char hb,lb;if (pv1>5) /* make the output real */pv1=5;else if (pv1<0)pv1=0;temp=(int)(4095*pv1/5.0);hb=temp<<8;lb=temp-(hb<<8);outportb(BASE,1);delay(10);outportb(BASE+4,lb); /* low 8 */delay(10);outportb(BASE+5,hb); /* high 4 */}void interrupt INT_1C(void){time_counter++;outportb(0x20,0x20);}/*键盘控制*/int scankey(void){int key0;key0=bioskey(1); /* function 1 returns 0 until a key is pressed */ if(key0!=0)key0=bioskey(0); /* function 0 returns the key that is waiting */ return key0;}/*DelayAction*//*tao=(int)(18.2*2) Delay action=2 seconds*/float DelayAction(float y0){float y_out;static float y_old[36]={0};int cyc;y_out=y_old[36-1];for(cyc=1;cyc<36;cyc++)y_old[36-cyc]=y_old[36-cyc-1];y_old[0]=y0;return y_out;}/*PID 主程序*/void PIDset(void){key=scankey();if(A_H=='H'){if(key==key_up)Kp+=0.2;else if(key==key_down)Kp-=0.2;else if(key==key_left)Ti-=0.2;else if(key==key_right)Ti+=0.2;else if(key==key_pgup)Td+=0.2;else if(key==key_pgdown)Td-=0.2;else if(key==key_U)manu='+';else if(key==key_D)manu='-';}if(A_H=='A'){if(key==key_U)sp+=10;if(key==key_D)sp-=10;}if(key==key_E||key==key_ESC)exit(1);if(key==key_A)A_H='A';if(key==key_H)A_H='H';if(key==key_I)Tf=0;if(key==key_P)Tf=Tf0;}/*PID-default:IdealPID*/float PID(float sp1,float pv1,float Kp1,float Ti1,float Td1,float Tf1,char A_H1,float T1) {float delta_u,u0,e,C1,C2,C3,C4;static float e1,e2,u1,delta_u1; /*here,u1 stands for the previous value of u*/if(Kp1<0) printf("Kp becomes a negative number,please restart.");else if(Ti1<0) printf("Ti becomes a negative number,please press restart.");else if(Td1<0) printf("Td becomes a negative number,please press restart.");else{C1=Tf1/(T1+Tf1);C2=Kp1*T1*(1+T1/Ti1+Td1/T1)/(T1+Tf1);C3=-Kp1*T1*(1+2*Td1/T1)/(T1+Tf1);C4=Kp1*Td1/(T1+Tf1);/*自动控制*/if(A_H1=='A'){e=sp1-pv1;delta_u=C1*delta_u1+C2*e+C3*e1+C4*e2; /*here,delta_u1 stands for the previous value of delta_u*/u0=u1+delta_u;e2=e1;e1=e;delta_u1=delta_u;u1=u0;error[cj_counter]=sp1-pv1;return u0;}/*手动控制*/else if(A_H1=='H'){if(manu=='+')u+=10;if(manu=='-')u-=10;sp1=pv1;u1=u;e1=0;e2=0;delta_u1=0;error[cj_counter]=sp1-pv1;return u;}}}/*object:二阶惯性环节*/float Object(float u1,float T1){/*G(s)=1/(4.7s+1)^2,K=1,Tp1=Tp2=4.7*/static float y1,y2;float y;y=1/(31.49+T1)*(-22.09*y2+53.58*y1+T1*u1);y2=y1;y1=y;return y;}/*显示与画图*//*初始化CRT*/void Initial_Sys(void){int GraphDriver;int GraphMode;detectgraph(&GraphDriver,&GraphMode);initgraph(&GraphDriver,&GraphMode,"C:\\TC201E\\BGI"); }/*draw basic coordinate axis*/void axis(void){Initial_Sys();setbkcolor(15); /*white0/black15*/setcolor(9); /*linght blue*/rectangle(10,20,630,470); /*zone of drawing*/line(ox,oy,xx,xy); /*axis and arrow*/line(xx-5,xy-5,xx,xy);line(xx,xy,xx-5,xy+5);line(ox,oy,yx,yy);line(yx-5,yy+5,yx,yy);line(yx+5,yy+5,yx,yy);settextstyle(2,1,5); /*Small font,vert,5 times bigger*/outtextxy(20,100,"The Output (Response)");outtextxy(20,40,"U(t)");settextstyle(2,0,5); /*Small font,horiz,5 times bigger*/outtextxy(300,455,"Time");outtextxy(590,455,"t/sec");setlinestyle(1,0,1); /*dot line,none,width*/for(i=1;i<4;i++) /*each inport starting position*/ line(ox,oy-100*i,ox+500,oy-100*i);outtextxy(ox-16,oy-100*0,"0");outtextxy(ox-16,oy-100*1,"1");outtextxy(ox-16,oy-100*2,"2");outtextxy(ox-16,oy-100*3,"3");for(i=1;i<=500/50;i++) /*scale*/{line(ox+50*i,oy,ox+50*i,oy-400); /*1/T=10,that is 10px=1sec*/line(ox+50*i-25,oy,ox+50*i-25,oy-10);}setlinestyle(0,0,1); /*real line,none,width*/outtextxy(ox-8+100,oy+2,"10");outtextxy(ox-8+150,oy+2,"15");outtextxy(ox-8+200,oy+2,"20");outtextxy(ox-8+250,oy+2,"25");outtextxy(ox-8+300,oy+2,"30");outtextxy(ox-8+350,oy+2,"35");outtextxy(ox-8+400,oy+2,"40");outtextxy(ox-8+450,oy+2,"45");outtextxy(ox-8+500,oy+2,"50");}/*line-drawing and notes*/void Drawline(int cj1,float pv1,float sp1,float u1,float e1){static int cj_0=0,cj_1=0,pv_0=0.0,pv_1=0.0,sp_0=0.0,sp_1=0.0,u_0=0.0,u_1=0.0,e_0=0.0,e_1=0.0;cj_1=cj1; /*X coordinate*/pv_1=(int)(pv1*10);sp_1=(int)(sp1*10);u_1=(int)(u1*10);e_1=(int)(e1*10);setcolor(2); /*green*/line(ox+cj_0,oy-pv_0,ox+cj_1,oy-pv_1);outtextxy(590,30,"pv");setcolor(8); /*dark gray*/line(ox+cj_0,oy-sp_0,ox+cj_1,oy-sp_1);outtextxy(590,45,"sp");setcolor(3); /*cyan*/line(ox+cj_0,oy-u_0,ox+cj_1,oy-u_1);outtextxy(590,60,"u");setcolor(4); /*red*/line(ox+cj_0,oy-e_0,ox+cj_1,oy-e_1);cj_0=cj_1;pv_0=pv_1;sp_0=sp_1;u_0=u_1;e_0=e_1;}三、课程设计(综合实验)总结或结论1.正文为宋体,五号字行间距为211.1------------1.2------------四、参考文献[1] 作者1, 作者2 书名. 出版单位, 版本. 出版日期附录(设计流程图、程序、表格、数据等)注:根据课程设计、综合实验的内容将标题任选其一。