QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1352|回复: 0
打印 上一主题 下一主题

[教程] GUI指导教程:在GUI中调用含未知参数的Simulink模型

[复制链接]
字体大小: 正常 放大

2620

主题

162

听众

1万

积分

升级  0%

  • TA的每日心情
    开心
    2015-3-12 15:35
  • 签到天数: 207 天

    [LV.7]常住居民III

    社区QQ达人 发帖功臣 新人进步奖 优秀斑竹奖 金点子奖 原创写作奖 最具活力勋章 助人为乐奖 风雨历程奖

    群组第六届国赛赛前冲刺培

    群组国赛讨论

    群组2014美赛讨论

    群组2014研究生数学建模竞

    群组数学中国试看培训视频

    跳转到指定楼层
    1#
    发表于 2014-7-24 09:02 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    [教程] GUI指导教程:在GUI中调用含未知参数的Simulink模型

    本节教程主要向大家演示使用三种不同的方法,在GUIDE中嵌入Simulink模块。关于原理大家可以参考http://www.mathworks.com/access/ ... g_guis/f6-8865.html

    在Simulink中能够直观快速的搭建系统模型,如果再联合GUIDE的面向对象可视化编程,可以说是锦上添花!将Simulink融入到GUIDE中可以方便模型的终端用户,很容易直接可视化的操控模型参数和显示仿真结果,而此时并不需要进入Simulink环境。


    构建Simulink模型


    该部分我们将快速的构建一个Simulink模型方便在后面的GUIDE中使用。本次我们就使用一个简单的二阶“质量-弹簧-阻尼”系统作为示例吧。 100325224254d22c08163a5e36.gif

    在使用该教程时,我们假定您已经具备Simulink相关建模基础和了解“质量-弹簧-阻尼”系统的理论。因此在这里我就不深入介绍Simulink模型的建立和“质量-弹簧-阻尼”系统的数学推导。如果的确需要,建议您参考下http://edu.levitas.net/Tutorials/Matlab/Simulink/index.html
    1、先下载论坛为您制作好的Simulink和GUI模型 [img]file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\TempPic\DIBWT_XL{9JH_`1BP[2KL06.tmp[/img] simulink-gui.zip (13.04 KB, 下载次数: 1552) ,包含simulink_gui.fig、simulink_gui.m、 simulateButton.m和 mass_spring.mdl四个文件,将其解压到MATLAB工作目录。

    2、在Simulink中打开模型,框图如下所示

    1003252242dd59c4b487c0c326.png.thumb.jpg

    3、请注意增益(Gain)模块的增益使用的是变量1/m、c/m和k/m,而不是数值。因为Simulink默认使用基本状态空间(Base WorkSpace)的数据,因此在仿真之前必须先在状态空间定义参数m、c和k,否则将出错。当然我们可以使用set_param()函数直接设置参数,这个将会在后面讲解。

    4、由于函数有自己的状态空间(不是Base Workspace),因此在函数中使用sim()函数进行模型仿真,即使你在函数中定义了模型的必要参数,但是这些参数只存在于函数状态空间中,模型在仿真是没法获取。比如下面的代码将会导致错误。

    01.function runSimulinkModel(m,c,k)
    02.% 即使在函数中有模型的参数输入或定义,但是Simulink默认只使用基本状态空间的数据
    03.sim('mass_spring');
    复制代码

    5、由于函数状态空间和基本状态空间的变量和数据不兼容,这就增加了在GUIDE中调用Simulink模型的难度。在接下来的教程中,我们将讨论使用三种方法来解决这个问题!


    GUIDE调用Simulink



    方法一:

    主要使用set_param函数设置仿真参数,具体参考http://www.matlabsky.com/thread-17464-1-1.html


    方法二:

    Simulink中提供的simset()函数,可以让用户自定Simulink模型的运行空间(默认是Base Workspace),我们只要将Simulink设置为从当前工作空间运行就Ok了。关于simset的更多用法,感兴趣的网友可以自己参考Matlab帮助!

    1、在GUIDE中打开simulink_gui.fig文件(不会使用GUIDE,那先看下http://www.matlabsky.com/thread-5217-1-1.html),GUI布局如下所示

    10032522424315a247ffb14a2c.png.thumb.jpg
    2、打开simulink_gui.m文件定位到Simulate!按钮的回调函数simulate_pushbutton_Callback,在后面添加如下代码
    01.axes(handles.axes1) % 将axes1设置为当前坐标系,便于绘制仿真结果
    02.m=str2num(get(handles.mass_editText,'String')); % 获取质量
    03.c=str2num(get(handles.damping_editText,'String')); % 获取阻尼
    04.k=str2num(get(handles.spring_editText,'String')); % 获取劲度系数
    05.
    06.% 配置Simulink仿真选项,使其使用当前工作空间
    07.% 设置Simulink从当前工作空间运行
    08.options = simset('SrcWorkspace','current');
    09.
    10.% 使用sim()函数对模型进行仿真
    11.% 第一参数是模型名称
    12.% 第二个参数是向量,指定仿真开始和结束时间
    13.% 如果设置为[],则使用在Simulink中设置的始末时间
    14.% 第三个参数设置Simulink仿真选项
    15.sim('mass_spring',[],options);
    16.
    17.% 绘制图形% 模型中有一个OUT模块,使用它我们可以设置输出变量为tout和yout
    18.% 然后就可以直接调用Simulink的获取仿真结果tout和yout进行绘图了
    19.plot(tout,yout)
    20.xlabel('Time')
    21.ylabel('Displacement')
    22.Title('2nd Order Mass Spring System')
    23.grid on
    复制代码

    3、保存修改,再运行GUI。在文本框中输入“质量-弹簧-阻尼”系统的三个参数(注意不要输入字母、符号或负数),然后点击“Simulate!”按钮,看看我们的劳动成果吧!
    1003252242264a69752a58d5aa.png.thumb.jpg
    方法三:

    1、同样在GUIDE中打开未经有修改的simulink_gui.fig文件

    10032523092331d2b96dbed967.png.thumb.jpg
    2、双击“Simulate!”按钮打开属性查看器,将Callback属性修改为simulateButton。以后每次点击“Simulate!”按钮时,则GUI只响应simlateButton中定义的操作,而不是simulate_pushbutton_Callback。

    注意:simulateButton是另外编写的一个M脚本文件,MATLAB中脚本文件(不同于函数文件)中的所有变量和数据共用基本状态空间。

    10032522427c8d7752cfef9c3d.png
    3、其实simulateButton.m脚本的代码如下
    • % 注意到simulateButton.m文件不是一个M函数(以function开头的为M函数),而是M脚本!
    • % Matlab脚本将在基本工作空间运行,它涉及到所有的变量和数据都保存在基本工作空间!
    • % 而Simulink所有参数默认调用基本工作空间的数据,所以此时我们就可以直接使用sim()函数进行模型仿真了!
    • clear all
    • % 获取当前GUI窗体的句柄
    • h =gcf;
    • % 获取GUI的handles结构体,它包含了所有控件的信息
    • handles = guidata(h);
    • % 选择当前坐标系,由于后面的绘图
    • axes(handles.axes1);
    • % 获取文本框中的Simulink仿真参数
    • m=str2num(get(handles.mass_editText,'String')); % 注意获取的string是一个字符串,需要使用str2num将其转换为数值
    • c=str2num(get(handles.damping_editText,'String'));
    • k=str2num(get(handles.spring_editText,'String'));
    • % 仿真系统
    • sim('mass_spring');
    • % 绘制仿真结果图形
    • plot(tout,yout)
    • xlabel('Time')
    • ylabel('Displacement')
    • Title('2nd Order Mass Spring System')
    • grid on

    其实方法二的一种变形就是,跨空间计算Simulink模型所需要的参数,比如evalin('base','m=5'),就表示在基本工作空间运行m=5这条命令。

    4、保存下对GUI的修改,验证下我们的成果吧!

    100325230901deb5f8b417f1a2.png.thumb.jpg

    100325224254d22c08163a5e36.gif (5.23 KB, 下载次数: 143)

    100325224254d22c08163a5e36.gif

    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2025-11-9 22:00 , Processed in 1.747510 second(s), 54 queries .

    回顶部