simulink和GUI实时通信

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

本文主要采用了监听器的方法来进行simulink和GUI进行通信,采用get_params和set_params进行实时获取数据和修改参数,监听器可以设置一个也可以设置多个。
步骤如下:
1.在simulink中右击,选择ModelProperties.
simulink和GUI实时通信_第1张图片
2.选择callbacks中的startFcn,此时右侧代码区为空白。
simulink和GUI实时通信_第2张图片
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,结果如下:
simulink和GUI实时通信_第3张图片
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这个对象可以,这个根据自己需求而定。
simulink和GUI实时通信_第4张图片

你可能感兴趣的:(matlab)