本文主要采用了监听器的方法来进行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这个对象可以,这个根据自己需求而定。