1、 第 1 页 共 29 页利用 MATLAB GUI 设计控制系统分析与设计界面1 引言图形用户接口 GUI 是用户和计算机程序之间进行信息交流的方式。通过图形用户界面,用户不需要输入脚本或命令,不需要了解任务的内部运行方式,计算机在屏幕显示图形和文本,若有扬声器还可产生声音。用户通过输入设备,键盘,鼠标,麦克风等与计算机进行通信。图形用户界面 GUI 中包含多个图形对象,如图标,菜单,文本的用户界面。以某种方式选择或激活这些对象,引起相应的动作或变化,最常用的激活方式是用鼠标控制屏幕上的鼠标指针运动。图形用户界面 GUI 具有操作方便,控制灵活的特点,已成为现代应用程序的主要方式。用 MAT
2、LAB GUI 设计一个控制系统分析与设计界面,将系统的传递函数输入到 GUI 中,可以方便的绘制系统的各种常用曲线,如阶跃响应曲线,Nyquist曲线可以用于系统稳定性的分析,我们可以有意识的输入系统的开环传递函数或是闭环传递函数,分别对应 Nyquist 曲线和阶跃响应图。根轨迹对控制系统的分析和设计也很有价值。零极点图可以方便的查看系统的零极点分布,对于配置系统的极点进行系统校正具有重要意义。Bode 图和幅频响应图对系统的频率响应分析是一种手段,而阶跃响应指标则可更细致的观察系统的性能。用 GUI 设计控制系设计控制系统分析与设计界面不仅在工程上有参考意义,在我们的学习过程中也很有意义
3、,可以帮助我们更深入更容易理解控制系统的分析与设计意义。传递函数是控制系统的核心,在这里设计了两种常用的传递函数输入形式,第一种可以称为直接形式,因为他的传递函数是已知的,我们可以将系统或以开环传递函数或闭环传递函数的形式输入 GUI 中,进行相应的分析设计;第二种是状态变量形式,这里开环或闭环取决于转换而来的状态空间方程,因为开环和闭环系统都可以转换为状态空间,因而在进行相应的计算和绘图时需注意。2 问题分析题目要求以 MATLAB GUI 设计图形用户界面,设计控制系统分析与设计界面,第 2 页 共 29 页界面中包含控制系统中常见的功能,传递函数的输入和创建,性能指标计数显示,绘制常用曲
4、线等。传递函数是控制系统研究中的核心问题,常用的有 ()numGsde和状态变量形式.XABuyCXDu两种形式,第一种对于具体的某个传递函数而言是单输入但输出的(如果系统是多输入多输出的,则对于不同的输入而言,传递函数一般式不同的。 ) ,第二种形式可以设置 y 和 来实现多输入多输出。u本设计将这些功能具体化如下表格所示:表 1.1传递函数第一种形式 分子矩阵 num 分母矩阵 den状态变量形式 矩阵 A 矩阵 B 矩阵 C 矩阵 D阶跃响应性能指标(performance)峰值 mp 峰值时间 Tp 稳态增益 yss 超调量 Del 上升时间 Tr 调整时间 Ts常用曲线Bode Ny
5、quist RootLocus PoleZero impulse step nichols 幅频特性输入序号 n 指定多输入时是创建哪个输入量的传递函数标志位 k 指定使用第一种形式还是状态变量形式下的传递函数close 按钮 关闭 GUI 的运行3 GUI 设计3.1 启动 GUI启动 MATLAB 后在命令窗口中键入 guide,启动 GUIDE,弹出“GUIDE Quick Start”对话框,或者通过 filenewGUI 进入,在弹出的 GUIDE 模版中创建新的 GUI 或打开已经存在的 GUI,也可以选择一些模版,这里新建一个 GUI,选择 Blank GUI (Default)
6、模版。3.2 GUI 窗口大小设计第 3 页 共 29 页我们可以改变 GUI 输出编辑器的网格区域大小指定 GUI 的大小,操作方法是,单击网格区域的右下角并进行拖拉。另外可以在“View”菜单下选择“Property Inspector”打开属性查看器,选择“Units”后面的按钮,然后选择弹出式菜单的“inches” ,单击“Position”后面的“+”符号,输入 x 和 y的坐标和 GUI 窗口的宽度和高度,再将“Units”属性设为 character,这样可以进行精确地设置 GUI 的位置和大小。本设计采用默认地情况。3.3 添加、对齐组件GUI 输出编辑器中包含了各种组件供用户
7、设计界面,这里从工具箱中选择9 个“Static Text”静态文本框,8 个“Edit Text”可编辑文本框,一个“Pop-up Menu”下拉式列表框,一个“Push Button”按钮和一个“Axes”坐标系,将它们分别拉到设计区。具有相同父对象的组件,可以用对齐工具将他们对齐,例如对第一列的是四个可编辑文本,按住同时连续选择他们,从“Tools”选择“Align Objects显示对齐工具,也可以重工具条上选择“”图标进入对齐工具对话框,从中选择水平左对齐,当然去我们也可以设置他们之间的间隔,对齐工具和各组件布局如下:图 3.1 对齐工具第 4 页 共 29 页图 3.2 组件布局图
8、3.4 设置 GUI 组件属性GUI 中各组件的属性设置很重要,对回调函数的识别,数据的输入都很重要。从“View”菜单中选择“Porperty Inspector”选项,或点击工具条上的“ ”按钮,显示属性对话框,利用属性对话框设置个组件的属性。如果没有选择组件,属性查看器会显示 GUI 图形窗口的属性。在输出编辑器中选择各静态文本,将他们的“String”属性依次设置成“num” 、 “den” 、 “A” 、 “B” 、 “C” 、 “D” 、 “输入序号 n” 、 “标志位 k” 、 “types” ,他们分别指示他们图标位置之下的可编辑文本输入的信息类型,其中“num” 、 “den
9、” 、 “A” 、 “B” 、 “C” 、 “D”对应传递函数的矩阵,如表 1.1 所示。“输入序号 n”表示输入量的顺序号,在多输入创建传递函数时指定创建的是那个输入的传递函数,这里我们不能将输入序号 n 的值设置的比输入个数多,否则可能出错,其初始值为 1,表示单输入的情况或多输入的第一个输入量。“标志位 k”表示传递函数是“num” 、 “den”所确定的还是“A” 、 “B” 、 “C” 、 “D”所创建的,在绘制常用曲线图形以及计算显示性能指标的时候需要指定传递函数是来源于哪种情况,以免发生错误。标志位 k 的初始值为 0,表示使用“num” 、 “den”确定的传递函数,k 值为
10、1 时使用“A” 、 “B” 、 “C” 、 “D”所确定的传递函数。 “types”表示在其图标位置之下的下拉式列第 5 页 共 29 页表框中选择绘图类型和计算性能指标。下拉式列表框的“String”属性设置方法为单击 String 属性后的“ ”图标打开 String 属性的编辑窗口,如图 2.3所示输入。下拉式列表框共有九种类型,即其“String”属性中所列的“Bode” 、 “Nyquist” 、 “RootLocus” 、 “PoleZero” 、 “impulse” 、 “step” 、 “nichols” 、 “幅频特性” 、 “performance”分别表示绘制波德图、奈
11、奎斯特图、根轨迹、零极点图、脉冲响应曲线图、阶跃响应曲线图、nichols图、幅频特性图、计算阶跃响应的性能指标。依据上面得“String”属性顺序依次设置可编辑文本的“Tag”属性为“num_edit” “den_edit”“AA”“BB”“CC”“DD”“n_edit”“k_edit”将下拉式列表框的 Tag 属性设置为“popupmenu”。GUI 根据组件的 Tag 属性值在保存时和第一次运行时自动设置回调函数的名称,如下拉式列表框的回调函数名为“popupmenu_Callback” 。设置按钮的 String 的属性为“close” ,Tag 属性为“pushbutton” 。功能
12、为按下close 按钮结束 GUI 的运行。组件的“String属性见图 3.2.图 3.3 下拉式列表框的 String 属性编辑窗口3.5 对象浏览利用对象浏览器,可查看当前所创建的图形对象,选择 ToolsObject Browser 命令或单击设计编辑器界面工具栏的“ ”按钮,打开对象浏览器,从中可以看出,对象在浏览器中是按创建的先后顺序显示的。见图 3.4.第 6 页 共 29 页图 3.4 对象浏览器3.6 M 文件编写完成 GUI 输出编辑器的设计和属性设置之后,接下来就是进行 M 文件的编辑。第一次保存和运行 GUI 时,GUIDE 会生成一个函数式 M 文件,它包含每个组件要
13、用到的回调函数框架,以及一些初始化代码,一个初始函数回调和一个输出函数回调。生成 M 文件以后,它打开“Save GUI as”对话框,在“File name”文本框中键入文件名,本次设计文件名为“sheji” ,GUIDE 将相同的名称指定给 FIG 文件和 M 文件,单击“Save”按钮时,GUIDE 会保存 M 文件并在M 文件编辑器中打开它。创建了 M 文件以后,就可以通过单击输出编辑器中的工具条上的“ ”按钮来打开 M 文件编辑器。在 M 文件编辑器中可以通过单击工具条上的“ ”按钮,然后在下拉菜单中选择目标回调来将光标移动到指定的回调函数。下面从功能的角度来分析个函数。3.6.1
14、回调间和数据共享通过将数据保存到 MATLAB handles 结构中,可以实现回调间的数据共享。GUI 中的所有组件使用同一个 handles 结构,它会传递一个输入变量给 GUIDE生成的所有回调函数。例如本设计中的一句语句handles.N=str2num(get(handles.n_edit,String),功能为先通过 get 函数命令获得对象属性,将 n 可编辑文本输入的字符转换为数字赋给名称为handles.N 的 handles 结构的字段,用 guidata(hObject, handles)函数保存handles 结构,在其他的回调函数中就可以使用 handles.N,或者
15、赋给某个变量,第 7 页 共 29 页调用这些数据了。3.6.2 初始化为了增加美感,本次设计初始化函数中增加了一个绘制曲面的函数,绘制的是 MathWorks 公司的图标,因而选用了这个函数。使用 surf 命令,数据来源于 membrane。在初始化中设置可编辑文本的初始值时使用 set 函数,例如set(handles.num_edit,String,2 8 6),功能为设置 num 矩阵的初始值为2 8 6,但是需要注意的是这里是文本矩阵。3.6.3 数据输入本设计中需要输入的数据有矩阵和控制数据(n,k) ,输入的形式都是文本字符或字符串的形式,通过可编辑文本 Edit Text 输
16、入的。对于矩阵先要将字符串转换为文本矩阵,再将文本矩阵转换为数字矩阵,例如handles.num0=str2mat(get(handles.num_edit,String); handles.num1=str2num(handles.num0);将 get 获得 num 对象字符串通过 str2mat 命令转为文本矩阵 handles.num0 再将其通过 str2num 命令将其转换为数字矩阵 handles.num1,这样便能在 MATLAB中进行处理了。3.6.4 创建传递函数和输入量的选择这里所用的传递函数有两种两种形式,对于已知传递函数,以分子分母矩阵形式输入的情形比较简单,绘图时都
17、是直接利用分子分母矩阵。对于状态变量形式的情况,需要先将 A,B,C,D 四个矩阵转换为分子分母矩阵形式,以利于以后的绘图和计算性能指标。例如handles.numx,handles.denx=ss2tf(handles.AAA,handles.BBB,handles.CCC,handles.DDD,handles.N);使用 ss2tf 命令将前面程序中获得handles.AAA,handles.BBB,handles.CCC,handles.DDD 矩阵和 handles.N 数字转化为分子矩阵 handles.numx 和分母矩阵 handles.denx,handles.N 为指定ss
18、2tf 命令转换序号为 handles.N(在 GUI 界面中看为输入序号 n)的输入量的数据,这里我们要弄清楚输入量的个数不能将输入序号 n 的值设置的比输入个数还大,输入序号 n 的初始值设为 1,表示单输入或多输入第一个输入量的情况。3.6.5 选择传递函数第 8 页 共 29 页在后面的绘图和计算性能指标中需要选择使用哪种形式下的传递函数,因此设计了一个标志位 k,标志位 k 的可选值为 0 和 1,值 0 时为选择分子分母形式输入的传递函数,值 1 为时选择状态变量形式创建的传递函数,若输入其他值,则不能正确绘图和计算性能指标,且在命令窗口中输出“标志位 k=0or1”以及弹出消息对
19、话框进行提醒,使用 ifelseifelseend 语句结构实现这些功能。例如if handles.K=0bode(handles.num1,handles.den1);elseif handles.K=1bode(handles.numx,handles.denx);elsedisp(标志位 k=0or1);end3.6.6 绘图类型的选择绘图和计算性能指标类型是集中在下拉式列表框中的,因此需要对他们进行选择识别,每次用户选择其中的某项功能时,下拉式列表框的回调函数都会读取下拉式列表框的 Value 属性值,以便执行相应的功能,这里使用分支语句实现实现选择,例如:val=get(hObjec
20、t,Value);str=get(hObject,String);switch strvalcase Nyquisths=figure;if handles.K=0nyquist(handles.num1,handles.den1);elseif handles.K=1nyquist(handles.numx,handles.denx);elsedisp(标志位 k=0or1);endtitle(Nyquist Fig);图 3.5 k 输入其他值时消息提醒3.6.7 性能指标计算第 9 页 共 29 页性能指标是计算系统阶跃响应的相关指标,这里计算了六项,分别为,% mp-峰值% Tp-峰值
21、时间% Tr-上升时间% Del-超调量% Ts-调整时间(2%准则)% yss-稳态值程序中将阶跃响应设置成幅值和时间两者返回数据来表现Y,t=step(sys);,这样就能方便的计算出 mp,Tp,yss。上升时间是定义成幅值从 0.1(t1)达到0.9(t2)的时间,计算式为21Trt调整时间为最后一超出 2%准则区域后再一次进入 2%准则区域时的时间,这里需要用程序进行循环判断,以确定 Ts,具体见附录程序。超调量计算式为 10()mpysDel在这里我们可以在绘制阶跃响应时在程序中加上两条语句hs=figure;step(handles.num1,handles.den1);(对应
22、k=0,当然也可以针对 k=1 加对应的语句)使之在 axes 中绘图的同时也绘制一张 Figure 图,在这张图中,可以点击右键,选择“characteristics”选择相应的性能指标,Peak Response ,Setting Time ,Rise Time ,Steady State ,在选择 Peak Response 时,将鼠标定位在相应的曲线点上还能显示 Overshoot 和 At time 两项指标,我们可以从这张图中得到的信息和命令窗口中输出的指标信息进行对比,发现计算还是比较准确的,初始设置数据生成的传递函数(k=0,n=1 )的计算结果和 Figure 图对比信息如下
23、;Transfer function:2 s2 + 8 s + 6- Figure 图s3 + 8 s2 + 10 s + 6yss=0.9980 1mp=1.0948 1.09Tp=2.8166 2.82第 10 页 共 29页Del=9.7054 9.48Tr=1.2071 1.2Ts=5.2309 5.162.6.8 close 功能close 按钮主要是在点击 close 按钮时关闭 GUI 的运行,它的回调函数如下:function pushbutton_Callback(hObject, eventdata, handles)close;4 GUI 测试4.1 初始化界面设计好 GUI 和编辑好程序后,保存后,接下来就是运行 GUI,测试设计的正确性,查看程序是否能完成设定的功能。从“Tools”菜单中选择“Run”选项,或者单击 GUIDE 工具条中的“ ”按钮,运行 GUI。由于 GUI 界面的 axes坐标系不是复数坐标系,因而在绘制 Nyquist,根轨迹等图时加入一条hs=figure 语句,使得图形绘制在 Figure 中,如果使用 h = axes 语句指定axes,则会出现绘制的图形充满整个 GUI 界面的结果,并不令人满意,因而这里采用绘制在 Figure 中的方法。GUI 运行的初始界面如下