simulink和GUI实时通信

simulink与matlab-GUI通信:实时绘制曲线

本文主要采用了监听器的方法来进行simulink和GUI进行通信,采用get_params和set_params进行实时获取数据和修改参数,监听器可以设置一个也可以设置多个。
步骤如下:
1.在simulink中右击,选择ModelProperties.
在这里插入图片描述
2.选择callbacks中的startFcn,此时右侧代码区为空白。
在这里插入图片描述
3.添加代码

set(0,'ShowHiddenHandles','on');
blk='DNMPC/position1';
event='PostOutputs';
listener=@hhh;
h=add_exec_event_listener(blk,event,listener);

这里的
blk=‘simulink_name/模块_name’
event有很多参数,这里的’PostOutputs‘意思是监听模块的输出。
listener是监听函数
最后add_exec_event_listener生成监听器
具体的用法可以help add_exec_event_listener,结果如下:
在这里插入图片描述
4.在matlab-GUI中的****_OpeningFcn写入

guidata(hObject, handles);
load_system('DNMPC');
line_p1 = line('Parent',handles.axes1,...
 'XData',[],...
 'YData',[],...
 'Color','blue',...
 'EraseMode','xor',...
 'Tag','line_p1')
 line_p2 = line('Parent',handles.axes1,...
 'XData',[],...
 'YData',[],...
 'Color','red',...
 'EraseMode','xor',...
 'Tag','line_p2')

line_p1、line_p2是创建了一个绘图对象,画两张图
5.在matlab-GUI中创建监听函数

function hhh(block,eventdata)
hf = findall(0,'Tag','figure1');
ax = findall(hf,'Tag','axes1');
title(ax,'位置图');
thisLineHandle1 = findall(hf,'Tag','line_p1');
xdata1 = get(thisLineHandle1,'XData');
ydata1 = get(thisLineHandle1,'YData');
sTime1 = block.CurrentTime;
data1 =block.OutputPort(1).Data;
if length(xdata1) < 100001
newXData1 = [xdata1 sTime1];
newYData1 = [ydata1 data1];
else
newXData1 = [xdata1(2:end) sTime1];
newYData1 = [ydata1(2:end) data1];
end
set(thisLineHandle1,...
'XData',newXData1,...
'YData',newYData1);


thisLineHandle2 = findall(hf,'Tag','line_p2');
xdata2 = get(thisLineHandle2,'XData');
ydata2 = get(thisLineHandle2,'YData');
rto2= get_param('DNMPC/position2','RuntimeObject')%获得simulink中的gain
sTime2 = rto2.CurrentTime;
data2 =rto2.OutputPort(1).Data;
if length(xdata2) < 100001
newXData2 = [xdata2 sTime2];
newYData2 = [ydata2 data2];
else
newXData2 = [xdata2(2:end) sTime2];
newYData2 = [ydata2(2:end) data2];
end
set(thisLineHandle2,...
'XData',newXData2,...
'YData',newYData2);


这个需要介绍一下,监听器就是每个simulink周期就会调用一次监听函数,在监听函数中获取simulink数据,之后进行画图。
如果需要监听多个数据,有两种方法:
(1).设置多个监听器和多个监听函数
(2).设置一个监听器和一个监听函数,在一个监听函数中获取其他模块的数据:
采用rto2= get_param(‘DNMPC/position2’,‘RuntimeObject’)的方式,我个人推荐这种,上述代码就是这样的思路。同时如果需要更改simulink参数则可以调用set_param这个函数进行修改参数。
画图的方式有很多,不是只有line这个对象可以,这个根据自己需求而定。
在这里插入图片描述

  • 7
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
通过GUI来控制Simulink进行系统仿真-GUI控制钟摆动画.rar 通过GUI来控制Simulink进行系统仿真,仿真的对象是动态地钟摆系统.别看题目是GUISimulink,其实最重要的中心内容在于S-function.Math大哥说过,S-function的本质就是系统状态的更新,这话总结了一切,系统的更新也就是采样点的刷新,计算当前采样点的全部输出或者包含其微分积分信息,然后到下一个时间点,再刷新.而区分其工作阶段的标志flag的值分别对应各个工作状态:初始化,连续状态微分更新,离散状态更新,输出更新,采样时刻更新,仿真结束这六种状态.其调用格式就不详细介绍了,大家自己调用模版文件出来瞧瞧就很明白了(edit sfintempl.m或者open sfintempl.m或者type sfintempl.m).   大概的原理就讲这么多,下面进入到我的作品,<>.在这个作品中,我使用了两个S-function,一个是来描述钟摆本身的运动学特性,一个是模仿硬件(单片机的外部中断)来控制整个仿真的进行与终止.制作过程比较麻烦,程序大概四五百行,我大致说说核心的东西就应付过去吧.核心:S-function早软件中实现硬件支持的中断功能,通过刷新系统状态和检测全局变量stopf来确定是继续执行仿真还是终止动画进行.它的每次更新都把stopf变为0,但控制器的按钮按下把stopf变成1,在S-function每次计算输出时会对stopf检测,若为1,那么动画会静止.先给大家看看控制版面,带有仿真时间的输入,如果想保持仿真,那么可以输入inf. 1.jpg 2.jpg 打开模型按钮可以打开.mdl的单摆系统结构图,下面的就是检测停止状态stopf的S-function结构图,需要与系统本身放在一个.mdl文件中,否则只程序的编写是不足够的. 摆过去之后还回循环往复: 3.jpg 4.jpg 按照这种语法介绍有没有什么理解上的误会,希望大家留下宝贵意见,帮助我提高,感谢拉! GUI控制钟摆动画.rar

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值