我是靠谱客的博主 沉静耳机,最近开发中收集的这篇文章主要介绍怎么暂停matlab仿真,[原创]不要s函数,GUI控制simulink,开始、停止与实时更新,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本帖最后由 开启 于 2013-8-14 18:07 编辑

近日逛论坛,发现有人写的GUI控制Simulink的教程,方法很多。思量很久,决定将之前在做某研究所项目时,所获心得写出,若有重复,权当锦上添花,无则,以飨后来人。

开此贴,详述一下功能识现:

1、GUI控制simulink仿真开始与结束;

2、GUI中配置simulink模块参数,通过set_param方式赋值的一般方法;

3、GUI中实时更新任何需要的simulink仿真数据(一招鲜,吃遍天);

4、GUI实时显示仿真时间,定时控制simulink仿真结束;

5、通过调用MATLAB 自带m文件,实时控制scope类模块;

以上功能的实现,尽量简化,不增加代码难度,避开s函数等途径。simulink模型采用一个简单的跳频通信仿真链路,通过GUI控制该链路,并实时显示仿真结果(误比特率等),可通过按钮选择显示scope类对象,如spectrum scope,scatter plot 等。具体运行截图如下:

324619ae995a043bc12bde7d078becb8.gif

1.jpg (31.99 KB, 下载次数: 62)

2013-8-14 16:29 上传

一、点击“开始”与“结束”按钮,启动simulink仿真。此处用的是set_param函数,具体用法,论坛有很多,此处不再赘述。

set_param(handles.HandleOfModel,'SimulationCommand','start');

set_param(handles.HandleOfModel,'SimulationCommand','stop');%stop the simulation复制代码

二、GUI中配置simulink模块参数:使用set_param()函数直接设置参数,本例中用于配置AWGN channel中的SNR, 值得一提的是,配置参数的方法可以采用给变量直接赋值的方法,i.e. 先指定simulink模块中的用到的变量,然后在GUI给该变量赋值,如http://www.matlabsky.com/thread-5832-1-1.html中所用到的给gain参数配置,尽管这样看起来简单,但有时并不是万能的,如果要配置simulink模块中的popupmenu或checkbox,用这种方法就无能为力了,只能用set_param()函数,如本例中的“信噪比模式”的配置,直接通过set_param指定。

三、GUI中实时更新任何需要的simulink仿真数据:尽管matlab中有很多的workspace状态空间,导致各个空间不兼容,但是,这些空间毕竟都是在matlab下的,比在不同程序软件进行传递还是要简单点的,最简单的方法就是使用global变量,贯穿各个空间,simulink仿真说到底还是一堆m文件在运行,既然如此,仿真过程中产生的中间数据,只要将他们指定为global类型,那还不是纵横matlab,随便用!本例中给出了一种调取simulink仿真中间数据的方法,此方法可以在GUI中实时更新,以此打到仿真和GUI同步进行。此时,不用单独去写s函数,只要添加几个小模块即可。

在simulink 需要读取中间数据的地方插入一个

324619ae995a043bc12bde7d078becb8.gif

5.jpg (5.35 KB, 下载次数: 50)

2013-8-14 17:10 上传

模块,通过该模块调用一个简单函数,将其输入的数据定义为global,就可以在各处使用了,并且是随仿真进行实施更新的变量!附件中的time_read.m和ReadSimData.m就是用于此种功能的。

function [ out ] = ReadSimData( in )

global SimData

SimData = in;%simdata变量变为全局变量,在GUI中使用即可。

out = in;

end复制代码

四、有了第三步中的方法,实时更新的功能实现起来就简单多了。将变量抽取出,通过一个循环不断检测仿真运行过程,只要仿真在进行,就不多更新数据。具体做法,请参考m文件相关代码。

本例中采用如下方法,while 1

if(isequal(get_param(handles.HandleOfModel,'SimulationStatus'),'running') && timee <= SimulationTime)

set(handles.time_showor,'string',['T = ' num2str(timee)]);

set(handles.edit4,'string',num2str(SimData(1)));

set(handles.edit5,'string',num2str(SimData(2)));

set(handles.edit6,'string',num2str(SimData(3)));

if mod(kkk,16) == 0

if(iii == 11)

iii = 1;

pause(0.001)

set(color_set_button,'BackgroundColor',[0.94,0.94,0.94])

pause(0.01)

end

set(color_set_button(iii),'BackgroundColor',[0,0.5,0]);

iii = iii + 1;

end

kkk = kkk +1;

if kkk == 32

kkk = 16;

end

pause(0.00001)

else

set(handles.board,'string','OH,已停止!→_←');

break;

end

end

有了以上的认知,用GUI控制simulink就简单多了;很多功能不是matlab达不到,只是我们不熟悉罢了

下面是运行过程及附件:

324619ae995a043bc12bde7d078becb8.gif

2.jpg (34.3 KB, 下载次数: 42)

2013-8-14 17:00 上传

324619ae995a043bc12bde7d078becb8.gif

3.jpg (111.21 KB, 下载次数: 38)

2013-8-14 17:00 上传

324619ae995a043bc12bde7d078becb8.gif

4.jpg (29.69 KB, 下载次数: 32)

2013-8-14 17:00 上传

499e06954e472d6fa8bfc041fe26e10e.gif

示例GUI%simulink.zip

(36.29 KB, 下载次数: 649)

2013-8-14 18:02 上传

点击文件名下载附件

阅读权限: 10

下载积分: 贝壳 -1

补充内容 (2017-5-12 10:56):

Matlb更新频繁,近来几个版本在内部函数、simulink调用机制等方面都有所更新,附件案例涉及的内部自带函数,如控制scope类方法已经失效,使用新版本的同学不要再尝试使用本例的方法控制scope了

补充内容 (2017-5-12 11:03):

附件对应的版本为2012b,可以确定2015、2016版本及之后在uicontrol、scope窗口调用方面都更新了,会报错,需要注意;

最后

以上就是沉静耳机为你收集整理的怎么暂停matlab仿真,[原创]不要s函数,GUI控制simulink,开始、停止与实时更新的全部内容,希望文章能够帮你解决怎么暂停matlab仿真,[原创]不要s函数,GUI控制simulink,开始、停止与实时更新所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部