概述
本帖最后由 开启 于 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 等。具体运行截图如下:
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 需要读取中间数据的地方插入一个
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达不到,只是我们不熟悉罢了
下面是运行过程及附件:
2.jpg (34.3 KB, 下载次数: 42)
2013-8-14 17:00 上传
3.jpg (111.21 KB, 下载次数: 38)
2013-8-14 17:00 上传
4.jpg (29.69 KB, 下载次数: 32)
2013-8-14 17:00 上传
。
示例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,开始、停止与实时更新所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复