第3章Simulink及GUI 3.1Simulink简介和启动 Simulink是MATLAB的一种可视化仿真工具,它提供了系统建模、仿真和综合分析的集成环境。在该环境中,无须编写大量程序,只需通过简单直观的鼠标操作,选择适当的模块并进行连线,就可以构造出复杂的仿真模型。 Simulink具有以下特点:  适应面广,可用于各种系统建模。  结构和流程清晰,以方块图形式呈现。  仿真精细。  可访问MATLAB,且便于移植。 在MATLAB命令窗口输入Simulink,或者在MATLAB主页菜单栏单击Simulink按钮,即可出现如图3.1.1所示的Simulink启动界面。单击其中的Blank Model图标即可新建一个如图3.1.2所示的空白模型窗。 图3.1.1Simulink启动界面 图3.1.2新建模型窗 单击空白模型窗工具条上的Library Browser(模块库浏览器)按钮,即可打开模块库,如图3.1.3所示。左侧的树状图显示本机安装的Simulink模块库; 右侧显示当前库中的所有模块,可以用左键拖曳或将它们复制到空白模型窗; 最上方的编辑框用于搜索模块,在这里输入模块名后再按回车键,即可找到该模块。 图3.1.3Simulink模块库浏览器 3.2Simulink基本模块 图3.2.1展示了Simulink模型的一般性结构,其通常包含3部分: 信源(Source)、系统(System)以及信宿 (Sink)。信源可以是正弦信号、门信号等信号源; 系统是指Simulink模块搭建的框图; 信宿可以是示波器、存储器等。信源、系统、信宿都可以从Simulink库中直接得到,或利用库中的模块搭建得到。 图3.2.1Simulink模型的一般性结构 3.2.1Sources库 Sources(输入源)库主要提供输入信号,详见图3.2.2。每个模块下面的英文名称简要说明了其功能,比如Clock输出每个仿真点的时刻,Constant输出常数,Sine Wave输出正弦波等。 图3.2.2Sources库中包含的信号源模块 3.2.2Sinks库 Sinks(接收)库用来输出和显示信号。常用的接收模块作用详见表3.2.1。 表3.2.1常用的接收模块 名称作用名称作用 Display数值显示Terminator接收终端 Floating Scope游离示波器To Workspace向工作空间写入数据 Out1输出端口To File向文件写入数据 Scope示波器XY Graph显示两路输入信号的xy图形 Stop Simulation输入不为0时停止仿真 除Sources库、Sinks库外,Simulink还提供了Continuous(连续系统)库、Discrete(离散系统)库、Math Operations(数学运算)库、Ports & Subsystems(端口和子系统)库、Discontinuities(非线性)库,用户可以利用这些库中的模块搭建需要的系统。 3.3Simulink实例 下面举例说明如何利用Simulink进行仿真。 例3.3.1假定两个输入信号分别是x1(t)=2cos(200πt)、x2(t)=sin(1000πt),用Simulink计算y(t)=x1(t)×x2(t),将结果存入工作空间变量sinprod中并显示波形。仿真频率10000Hz,仿真时间1s。 第一步,选择模块。 在Sources库中选择两个Sine Wave模块,在Math库中选择Product模块,在Sinks库中选择Scope和To Workspace模块。选中模块后用左键将其拖曳到空白模型窗中,并按照输入在左、输出在右的顺序放置好这些模块。每个模块的图标大小、名称都可以修改,只要用鼠标拖曳边框或双击模块下方的文字即可。 第二步,连接模块。 (1) 将光标指向源模块的输出端口,此时光标变成“+”。 (2) 单击并拖动,这时会出现一端连接源模块输出端口的红色虚线; 按住左键不放,将光标拖动到目标模块的输入端口,在足够接近时,红色虚线会变成黑色实线,松开左键,连接完成。 在部分高版本的Simulink中,也可以单击源模块,保持Ctrl键处于按下状态,再单击目标模块,完成连接。 有些情况下,源模块的输出同时要作为多个模块的输入,这时可以交换连线的起点和终点。将前面选择的模块按要求进行连接,结果如图3.3.1所示。 图3.3.1连接后的模块 第三步,设置模块参数。 以x1(t)=2cos(200πt)为例介绍输入信号的设置。双击Sine Wave模块,即可得到参数设置窗口,如图3.3.2所示。Amplitude为sine信号的振幅; Bias为直流偏置; Frequency虽然汉语意思是频率,但通过单位rad/s或o(t)=Amp*sin(Freq*t+Phase)+Bias可知,其表示的是角频率; Phase为初始相位,Sample time是抽样间隔。将Amplitude修改为2,Frequency修改为200*pi,Phase修改为pi/2,即可得到x1(t)=2cos(200πt)。 图3.3.2Sine Wave模块参数设置窗口 由于在观察输出信号的同时要将其与两路输入信号进行比较,选中Scope模块后右击,将 弹出菜单中的Signals&Ports→Number of Input Ports改为3。完成连线,使其分别观察两个输入信号和一个输出信号。 双击To Workspace模块,将Variable Name改为sinpord。 第四步,运行仿真。 为了对系统进行正确的仿真与分析,必须设置系统仿真参数。单击Simulation菜单栏下的Configuration Parameters按钮,得到参数设置窗口。将参数按照要求进行修改,如图3.3.3所示。 图3.3.3系统参数设置窗口 单击工具条上的“开始”按钮进行仿真。仿真结束后,双击Scope模块观察仿真结果,可以观察到3个不同颜色的信号波形,但不知道每个波形对应哪个信号。这时可以单击View→Layout命令,选择三行一列; 单击View→Legend命令,显示图例,即可得到系统仿真结果,如图3.3.4所示。 图3.3.4Simulink系统仿真的结果 3.4GUI简介 图形用户界面(Graphical User Interface, GUI)是由窗口、图标、按钮、菜单、文本等控件构成的应用程序界面。选中或者激活这些对象通常会导致某个动作或变化的发生。GUI可以方便地进行某种技术、方法的演示。MATLAB本身提供的很多服务就是由GUI实现的,比如帮助系统的demo,滤波器设计和分析工具filterDesigner等。 3.5GUI启动 在MATLAB命令窗口输入guide命令,就会出现“GUIDE快速入门”对话框。该对话框有两个选项卡: “新建GUI”和“打开现有GUI”。在“新建GUI”选项卡中,选择“Blank GUI(Default)”,单击“确定”按钮后会弹出页面编辑器,如图3.5.1所示,主要由工具栏、控件和布局设计区组成。控件面板包含了所有的GUI控件,用户可以将其拖曳到右侧设计区。常用控件的作用见表3.5.1。 图3.5.1页面编辑器 表3.5.1常用控件的作用 类型作用 按钮按钮是最常见的控件,通常用于执行某一个操作。用户通过单击按钮,使MATLAB执行定义在该按钮上的回调函数。按钮被按下去后,会立即恢复到弹起状态 单选按钮单选按钮是由标签和一个很小的圆圈组成的控件。当被选中时,圆圈会呈现填充的状态,取消选中时,又会恢复到无填充状态 编辑框/可编辑文本用户可以修改编辑框中的内容。在多行输入时,如果输入的文本超出文本框的范围,该文本框会自动生成一个纵向的滚动条。用户按回车键即可执行该控件的回调函数 弹出式菜单该菜单向用户提供了多个选项,但用户只能从中选择一项。当没被激活时,它是一个包含当前用户选择项的矩形或按钮; 当单击其向下的箭头时,就会弹出其他各个选项。只需单击希望的选项,就可以完成新的选择并执行该控件的回调函数 切换按钮切换按钮与普通按钮的不同点是,当单击一次切换按钮时,会交替呈现两种不同的状态(弹起和按下),而普通的按钮会在单击后立即弹起。相同点是,每单击一次就执行一次相应的回调函数 坐标区为画图提供图形窗口 按钮组/面板提供可视化的分割 滑动条通常由3部分构成: 滑杆、指示器以及位于滑杆两端的箭头。滑动条通常用于在数据范围内选择一个数据值,方法有3种: ①按住左键并使光标在滑动框内移动,当移动到希望的数据位置时,松开鼠标。②当鼠标指针位于滑杆内时单击。③将鼠标指针放在滑杆两端的其中一个箭头上并单击 复选框复选框通常包含多个复选项,每个复选项由一个方形的选择框和一个紧随其后的标签组成。当一个复选项被激活后,该项将会在选中和清除之间切换 静态文本通常用于显示标题、标签、用户信息或当前值。用户无法对其进行编辑或选择 列表框列表框看起来与多行文本框类似。其中的文本只能用于选择,不能进行编辑 3.6GUI设计步骤 下面以绘制正弦波为例介绍GUI的设计步骤。 3.6.1分析需求 首先确定希望通过GUI完成何种功能、需要进行何种操作,这是最重要也是最难的一步。很多情况下,在用户创建GUI的过程中还可能出现一些新的想法或发现一些新的问题,这时需要重新回到这一步进行思考。 为了实现绘制正弦波的目的,需要通过人机交互确定正弦信号的角频率、振幅、初相以及时间长度。 3.6.2完成布局 分析需求后,将需要的控件拖到布局设计区中,修改控件属性,完成布局。 (1) 根据3.6.1节的分析,计划用到的控件包括: 4个编辑框用来输入角频率、振幅、初相和时间长度,5个静态文本说明编辑框的作用以及整个GUI的作用,1个图形窗用来画图,1个按钮发出绘图命令。 (2) 逐一选择所需控件,将其摆放到合适的位置并调整大小。可利用工具栏的对齐对象按钮辅助完成界面布局。界面布局建议遵循简单性、一致性、习常性(尽量使用人们熟悉的标志和符号)等原则。 3.6.3修改控件属性 双击布局设计区的空白处或任意控件,会弹出如图3.6.1所示属性编辑器。页面、不同控件的属性数量和类别各不相同,但有些属性是共有的。在众多属性中,最常用的如表3.6.1所示。如果需要批量将不同控件的属性设为同一值,则可全选后双击其中一个控件,此时会显示其共同属性,在相应属性位置进行修改即可,如图3.6.2所示。 图3.6.1属性编辑器 表3.6.1常用的控件属性及含义 名称含义 FontSize控件上文字的大小 FontUnits文字单位,建议选择normalized,这样控件放大或缩小时,文字会等比例放大或缩小 String控件上显示的文字 Tag控件的唯一标识,编程访问和控制该控件的唯一途径 Units单位,建议选择normalized,这样GUI页面放大或缩小时,控件会等比例放大或缩小 图3.6.2批量进行属性修改 属性修改后的最终布局如图3.6.3所示,主要控件标签和设计功能见表3.6.2。 图3.6.3正弦波绘制界面的控件布局 表3.6.2主要控件的标签和设计功能 Tag类型设 计 功 能 omega amp fai tmax编辑框 指定正弦信号角频率 指定正弦信号振幅 指定正弦信号初相 指定画图时间长度 axes1坐标区为画图提供图形窗 SinPlot按钮发送画图命令 3.6.4保存GUI 完成控件布局、属性修改后,单击工具条上的保存按钮,输入要保存的文件名并单击“确定”按钮。由于要画正弦波,所以将上述GUI界面保存为sinPlot.fig,同时会生成与之对应的sinPlot.m文件(*.m会自动生成并且与*.fig同名)。.fig文件用于产生界面,M文件用于保存运行该.fig文件所需的程序代码,如回调函数。注意.fig文件的文件名一般不要修改,因为所有控件的回调函数名都与最初的文件名有关。 3.7回调函数编写 用户在GUI界面对控件进行某种操作后,需要相应的M文件配合执行一段代码以完成该控件希望的功能,这个功能是通过编写控件的回调函数实现的。选中该控件,右击选择“查看回调”命令,就会看到回调函数Callback、CreatFcn、DeleteFcn、ButtonDownFcn和KeyPressFcn。选择其中一个后,会自动跳转到M文件中对应的函数上。 以绘制正弦波为例,只需要编写SinPlot按钮的回调函数,源代码如下。 function PlotSin_Callback(hObject, eventdata, handles) % hObject handle to PlotSin (see GCBO) % eventdatareserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) amp =str2num(get(handles.amp,'string')); %读取振幅,amp是振幅编辑框的标签 omega = str2num(get(handles.omega,'string'));%读取角频率,omega是角频率编辑框的标签 theta = str2num(get(handles.fai,'string'));%读取初相,fai是初相编辑框的标签 tend = str2num(get(handles.tmax,'string'));%读取t最大值,tmax是时间长度编辑框的标签 Fs = omega/(2*pi)*30;%自适应选择抽样频率 t = 0:1/Fs:tend; %自变量 xt = amp * sin(omega*t+theta);%产生正弦信号 axes(handles.axes1) %选择图形窗 plot(t,xt); title('正弦信号'); xlabel('t') 3.8GUI运行 编写完所有控件的回调函数后,单击.fig文件工具条上的运行按钮,或直接运行M文件,会发现界面无法最大化。双击.fig布局设计区的空白处,会弹出属性界面,将Resize属性由off变成on后再次运行程序,这时界面可以最大化。单击画图按钮,得到最终的画图结果,如图3.8.1所示。可以根据需要修改参数,再次单击画图按钮,即可实现参数修改后的正弦波绘制。 图3.8.1正弦波绘制的GUI界面