MATLAB技术论坛标题: GUI指导教程系列(9)——在GUI中调用Simulink模型
作者: dynamic 时间: 2010-3-25 22:40 标题: GUI指导教程系列(9)——在GUI中调用Simulink模型
本节教程主要向大家演示使用三种不同的方法,在GUIDE中嵌入Simulink模块。关于原理大家可以参考http://www./access/ ... g_guis/f6-8865.html 在Simulink中能够直观快速的搭建系统模型,如果再联合GUIDE的面向对象可视化编程,可以说是锦上添花!将Simulink融入到GUIDE中可以方便模型的终端用户,很容易直接可视化的操控模型参数和显示仿真结果,而此时并不需要进入Simulink环境。 构建Simulink模型 该部分我们将快速的构建一个Simulink模型方便在后面的GUIDE中使用。本次我们就使用一个简单的二阶“质量-弹簧-阻尼”系统作为示例吧。 ![]() 在使用该教程时,我们假定您已经具备Simulink相关建模基础和了解“质量-弹簧-阻尼”系统的理论。因此在这里我就不深入介绍Simulink模型的建立和“质量-弹簧-阻尼”系统的数学推导。如果的确需要,建议您参考下http://edu./Tutorials/Matlab/Simulink/index.html 1、先下载论坛为您制作好的Simulink和GUI模型 ![]() 2、在Simulink中打开模型,框图如下所示 3、请注意增益(Gain)模块的增益使用的是变量1/m、c/m和k/m,而不是数值。因为Simulink默认使用基本状态空间(Base WorkSpace)的数据,因此在仿真之前必须先在状态空间定义参数m、c和k,否则将出错。当然我们可以使用set_param()函数直接设置参数,这个将会在后面讲解。 4、由于函数有自己的状态空间(不是Base Workspace),因此在函数中使用sim()函数进行模型仿真,即使你在函数中定义了模型的必要参数,但是这些参数只存在于函数状态空间中,模型在仿真是没法获取。比如下面的代码将会导致错误
5、由于函数状态空间和基本状态空间的变量和数据不兼容,这就增加了在GUIDE中调用Simulink模型的难度。在接下来的教程中,我们将讨论使用三种方法来解决这个问题!
GUIDE调用Simulink 方法一: 主要使用set_param函数设置仿真参数 方法二: Simulink中提供的simset()函数,可以让用户自定Simulink模型的运行空间(默认是Base Workspace),我们只要将Simulink设置为从当前工作空间运行就Ok了。关于simset的更多用法,感兴趣的网友可以自己参考Matlab帮助! 1、在GUIDE中打开simulink_gui.fig文件(不会使用GUIDE,那先看下http://www./thread-5217-1-1.html),GUI布局如下所示 2、打开simulink_gui.m文件定位到Simulate!按钮的回调函数simulate_pushbutton_Callback,在后面添加如下代码
3、保存修改,再运行GUI。在文本框中输入“质量-弹簧-阻尼”系统的三个参数(注意不要输入字母、符号或负数),然后点击“Simulate!”按钮,看看我们的劳动成果吧!
方法三: 1、同样在GUIDE中打开未经有修改的simulink_gui.fig文件 2、双击“Simulate!”按钮打开属性查看器,将Callback属性修改为simulateButton。以后每次点击“Simulate!”按钮时,则GUI只响应simlateButton中定义的操作,而不是simulate_pushbutton_Callback。 注意:simulateButton是另外编写的一个M脚本文件,MATLAB中脚本文件(不同于函数文件)中的所有变量和数据共用基本状态空间。 ![]() 3、其实simulateButton.m脚本的代码如下
其实方法二的一种变形就是,跨空间计算Simulink模型所需要的参数,比如evalin('base','m=5'),就表示在基本工作空间运行m=5这条命令。
4、保存下对GUI的修改,验证下我们的成果吧! ![]() http://www./forum.php?mod=attachment&aid=NDQ0NHwyYzg5NTYyY3wxMzA0MDc3ODI0fDkwMDk5 ![]() ![]() http://image28.360doc.com/DownloadImg/2011/04/2919/11332968_3 ![]() ![]() http://image28.360doc.com/DownloadImg/2011/04/2919/11332968_4 ![]() ![]() http://www./forum.php?mod=attachment&aid=NDQ0N3wzZDlkNzA3NHwxMzA0MDc3ODI0fDkwMDk5 ![]() ![]() http://image28.360doc.com/DownloadImg/2011/04/2919/11332968_5 ![]() ![]() http://www./forum.php?mod=attachment&aid=NDQ0OXw2ZDE0NDQwNHwxMzA0MDc3ODI0fDkwMDk5 ![]() http://image28.360doc.com/DownloadImg/2011/04/2919/11332968_6 ![]() ![]() http://image28.360doc.com/DownloadImg/2011/04/2919/11332968_7 ![]() assignin('base','m',m);
assignin('base','c',c); assignin('base','k',k); sim('massspring');也可以 |
|