题目:根据由阶跃响应曲线确定系统传递函数的方法,在MATLAB 中编写相应的程序,
1)实现阶跃响应曲线对应的一阶惯性环节(包括无滞后和有滞后)和二阶惯性环节的传递函数形式和参数;
2)利用GUI 设计相应的界面,显示相应的模型和曲线,便于分析比较。
1 课程设计目的
过程控制系统的品质,是由组成过程和过程检测控制仪表系统的各环节的特性系统的和系统的结构所决定的。在过程控制系统的分析和设计中,过程的数学模型是极其重要的基础资料。所以,建立过程的数学模型,对于实现生产过程自动化有着十分重要的意义。可以说,一个过程控制系统的优劣,主要取决于对生产工艺过程的了解好建立数学模型。
建立数学模型的目的是:
1)设计过程控制系统和整定调节器参数
2)指导生产工艺设备的设计
3)进行仿真试验研究
建立数学模型有两种方法:
1)分析过程的机理,根据物料平衡和能量平衡等关系,应用数学描述的方法,建立数学模型。(解析法)
优点:较为简单、普遍。
缺点:①由于很多工业过程内部的工艺过程较为复杂,对某些物理、化学过程尚不完全清楚,所以,有些复杂过程的数学模型较难建立;
②工业过程多半有非线性因素,在推到时常常作了一些近似和假设,虽然这些近似和假设具有一定的实际依据,但并不能完全反应实际情况,甚至会带来估计不到的影响。
2)实验方法(系统辨识方)。
由于解析法的缺点,所以即使用解析法得到了过程的数学模型,仍然希望采用实验方法加以检验。尤其当推到不出过程数学模型时,更需要通过实验方法来求得。
常用响应曲线法来辨识过程的数学模型。
2 建立数学模型
2. 1 由过程阶跃响应曲线确定其数学模型
为了研究、分析和设计过程控制系统,需要根据实验取得的阶跃响应曲线来求出过程控制的微分方程和传递函数。
由阶跃响应曲线确定其数学模型,首先要选定模型的结构。
题目中要求选用一阶(包括无滞后和有滞后)和二阶来描述,既:
一阶:W。=
一阶延迟:W。=
二阶::W。=
阶跃信号 响应曲线
2.1.1 由阶跃响应曲线确定一阶环节的特性曲线
(2)取0.632y(∞)时的t,≈t。
一阶响应曲线
2.1.2 由阶跃响应曲线确定一阶滞后环节的特性曲线
(1)Ko=。
(2)取0.39y(∞)时的,
取0.63y(∞)时的,≈2×(-);
≈2-。
一阶滞后响应曲线
2.1.3 由阶跃响应曲线确定二阶环节的特性曲线
(1)Ko=。
(2)取0.4y(∞)时的,
取0.8y(∞)时的, +≈(+);
≈(1.74-0.55)。
二阶响应曲线
3 实验环境
计算机Matlab软件,GUI界面。
MATLAB的优势:工作平台编译环境十分友好,编译语言简单易用,数据的计算处理能力十分强大,图形处理能力强大,模块集合工具箱应用广泛,程序的接口和发布平台很实用,可以开发用户界
GUI是Matlab中面向对象的编程,可以使Matlab程序的终端用户,即使不懂的Matlab也可以轻易操作该程序。
4 设计过程
4. 1 新建GUI界面
GUT控制界面
上述界面包含:1个坐标轴对象、2个静态文本框、2个可编辑文本框、4个按钮。
4. 2 设置控件的相关属性
4.2.1 设置第一个控件的相关属性
文本标签属性设置 菜单编辑
4.2.2 设置第二个控件的相关属性
文本标签属性设置 菜单编辑
4.2.3 设置第三个控件的相关属性
文本标签属性设置
4.2.4 设置第四个控件的相关属性
文本标签属性设置
4.2.5 设置第五个控件的相关属性
文本标签属性设置
4. 3 程序(见附录)
4. 4 仿真
(1)任意输入数据程
(2)按下连线按钮
(3)按下一阶延迟按钮
k = 54.7000
T =0.3971
tao =0.0422
W。=
(4)按下一阶按钮
k = 54.7000
T =0.4480
W。=
(5)按下二阶按钮
k =54.7000
Tb =0.5128
Ta = 0.0149
W。=
(6)按下关闭按钮关闭
5 心得体会
通过为期三周的Matlab课程设计实践,使我对Matlab的使用有了进一步的了解和熟悉,了解了GUI控制界面。增强了我查找资料的能力。
刚开始,我连怎么安装Matlab都不知道,连GUI是什么都不知道;对于这道题目,我更感到一头雾水,无从下手;在查找资料时也常常无功而返……我从一开始就觉得自己根本无法完成这项课题。
但是通过同学的帮助,我终于安装了Matlab,经过老师的和同学的讲解,我慢慢理解了题目。我减少了搜索关键词的字数,扩大了搜索范围,终于找到了很多我所需要的资料。我还去了自己很少去的图书馆,发现了很多与这个题目相关的书籍
但是面对陌生的GUI,我又不得不停下了脚步。在老师的建议下,我通过观看教学视频了解GUI。通过慢慢摸索,终于学会了一些简单的GUI设计。
编程并不是一件有趣的事情,相反,它十分枯燥无味。在调试的过程中我常常遇到一些很难发现的问题,我只能逐字逐句地反复检查(例如数字1和字母l弄混,一些固定的函数名写漏了一些字母等等)。为了方便调试,我设计了多个按钮,一个功能一个功能地实现。面对大量的资料,如何找到你所需要的内容细心和耐心是关键。
学习是没有捷径的。
终于还算圆满地完成了这份工程设计,它鞭策着我去巩固Matlab的基础理论知识,还提高了我对Matlab的实际操作运用,使得理论与实践相结合,为进一步学习Matlab打下坚实的基础;在实践的工程中,也让我体会到一种努力付出并得到回报的满足感觉;面对这个不得不面对的难题我知道了逃避是解决不了问题的,只有迎难而上才能收获成功之花的道理……感谢老师和同学在这个过程中对我的鼓励和帮助。
参 考 文 献
[1]邵裕森. 过程控制及仪表-2版(修定版). 上海:上海交通大学出版社,1995.7(2010重印)。11-26
[2]陈垚光,毛涛涛,王正林,王玲. 精通MATLAB GUI 设计-2版. 北京:电子工业出版社,2011. 1279-280
[3]方康玲,王新民,潘炼,吴怀宇,刘晓玉. 过程控制及其MATLAB实现-2版. 北京:电子工业出版社,2013.9. 353-364
[4]杨佳,许强,徐鹏,余成波. 控制系统MATLAB仿真与设计. 北京:清华大学出版社. 2014.4. 49
附录
function varargout = kcsj(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @kcsj_OpeningFcn, ...
'gui_OutputFcn', @kcsj_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State,varargin{:});
end
function kcsj_OpeningFcn(hObject, eventdata, handles, varargin)
set(handles.edit_x,'string');
set(handles.edit_y,'string');
handles.output = hObject;
guidata(hObject, handles);
function varargout = kcsj_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
function pushbutton_start_Callback(hObject, eventdata, handles)
x=str2num(get(handles.edit_x ,'string'));
y=str2num(get(handles.edit_y ,'string'));
plot(x,y ,'k:','marker','o');
axes(handles.axes1)
hold on;
function pushbutton_yjyc_Callback(hObject, eventdata, handles)
t=str2num(get(handles.edit_x ,'string'));
h=str2num(get(handles.edit_y ,'string'));
delta_u=20/100;
k=(h(end)-h(1))/delta_u
y=h/h(end);
t_tau=10;
tw=t(2:end)-t_tau;
yw=y(2:end);
h1=0.39;t1=interp1(yw,tw,h1)+t_tau;
h2=0.63;t2=interp1(yw,tw,h2)+t_tau;
T=2*(t2-t1)
tao=2*t1-t2
G=tf(k,[T,1],'inputdelay',tao);
[yG,tG]=step(G,linspace(t(1),t(end),50));
yG=yG*delta_u;
plot(tG,yG,'--');
axes(handles.axes1)
hold on;
function pushbutton_close_Callback(hObject, eventdata, handles)
close
function start_menu_Callback(hObject, eventdata, handles)
pushbutton_start_Callback(hObject, eventdata, handles)
function close_mune_Callback(hObject, eventdata, handles)
close
function Untitled_1_Callback(hObject, eventdata, handles)
function edit_x_Callback(hObject, eventdata, handles)
function edit_x_CreateFcn(hObject, eventdata, handles)
if ispc
set(hObject,'BackgroundColor');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
function edit_y_Callback(hObject, eventdata, handles)
function edit_y_CreateFcn(hObject, eventdata, handles)
if ispc
set(hObject,'BackgroundColor');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
function pushbutton_yj_Callback(hObject, eventdata, handles)
t=str2num(get(handles.edit_x ,'string'));
h=str2num(get(handles.edit_y ,'string'));
delta_u=20/100;
k=(h(end)-h(1))/delta_u
y=h/h(end);
t_tau=10;
tw=t(2:end)-t_tau;
yw=y(2:end);
h1=0.632;
T=interp1(yw,tw,h1)+t_tau
G=tf(k,[T,1],'inputdelay',0);
[yG,tG]=step(G,linspace(t(1),t(end),50));
yG=yG*delta_u;
plot(tG,yG,'g ');
axes(handles.axes1)
hold on;
function pushbutton_ej_Callback(hObject, eventdata, handles)
t=str2num(get(handles.edit_x ,'string'));
h=str2num(get(handles.edit_y ,'string'));
delta_u=20/100;
k=(h(end)-h(1))/delta_u;
y=h/h(end);
t_tau=10;
tw=t(2:end)-t_tau;
yw=y(2:end);
h1=0.4;t1=interp1(yw,tw,h1)+t_tau;
h2=0.8;t2=interp1(yw,tw,h2)+t_tau;
Tb=(t1+t2)/2.16
Ta=sqrt(((1.74*t1/t2-0.55)*Tb^2)^2)
G=tf(k,[Ta Tb 1],'inputdelay',0);
[yG,tG]=step(G,linspace(t(1),t(end),50));
yG=yG*delta_u;
plot(tG,yG,'m');
axes(handles.axes1)
hold on;