
matlab app designer使用心得
matlab app designer使用心得最近导师让我在simulink仿真的基础上整一个仿真软件,然后就发现现在matlab已经把之前的GUIDE升级成了app designer,一番摸索踩坑之后,总算整了出来,首先先放几张图。文章目录matlab app designer使用心得前言一、读取app的输入参数二、实时更新数据2.1 simulink中的设置2.2 app designer中的
matlab app designer使用心得
最近导师让我在simulink仿真的基础上整一个仿真软件,然后就发现现在matlab已经把之前的GUIDE升级成了app designer,一番摸索踩坑之后,总算整了出来,首先先放几张图。
文章目录
前言
其实也比较简单,总结以下需求。
1.能通过滑动条设置合适的模型输入参数。
2.能实时更新仿真时的系统数据及绘制曲线。
一、读取app的输入参数
读取滑动条的输入参数还是比较简单的,直接写在开始按钮的回调中就可:
function StartSimPushed(app, event)
% 获取输入参数
Ist = app.ISlider.Value;
Tst = app.TSlider.Value;
Vcm = app.VSlider.Value;
Hdes = app.HSlider.Value;
% 设置simulink模型参数
set_param([bdroot,'/电堆电流Ist'],'Value',num2str(Ist));
set_param([bdroot,'/电堆温度Tst'],'Value',num2str(Tst));
set_param([bdroot,'/空压机控制电压vcm'],'Value',num2str(Vcm));
set_param([bdroot,'/指定相对湿度phi,des'],'Value',num2str(Hdes));
% 启动仿真
sim("PEMFC_stack");
end
二、实时更新数据
主要是参考了mathwork官方论坛的这个回答How do I update a GUI designed in App Designer with data from a running Simulink model?
2.1 simulink中的设置
simulink中右键>模型属性>回调>InitFcn:
hApp = fuel_cell_app;
hApp不要改,等号后面的是自己app的名字。
接着,simulink中右键>模型属性>回调>StartFcn:
blk = 'PEMFC_stack/Display';
event = 'PostOutputs';
listener = @(app, event) updateGUI(hApp);
h = add_exec_event_listener(blk, event, listener);
要改的是blk等号右边接受实时更新数据模块的simulink路径,其他的不要改。
比如,这里我使用了display模块接收要实时观测的电压数值,blk后面就是display模块的路径。
2.2 app designer中的设置
在左上角菜单栏选择函数>公共函数,添加一个公共函数,用来接收指定仿真模块的实时数据,并传给APP。
function updateGUI(app, varargin)
% Create an object that gets the run-time value of the specified block
rto = get_param([bdroot,'/Display'],'RuntimeObject');
rto1 = get_param([bdroot,'/Display1'],'RuntimeObject');
rto2 = get_param([bdroot,'/Display2'],'RuntimeObject');
rto3 = get_param([bdroot,'/Display3'],'RuntimeObject');
% Update the GUI accordingly. In this case a the value of an EditField is being updated.
app.StackVoltage.Value = num2str(rto.InputPort(1).Data);
app.OER.Value = num2str(rto1.InputPort(1).Data);
app.AnodePressure.Value = num2str(rto2.InputPort(1).Data);
app.CathodePressure.Value = num2str(rto3.InputPort(1).Data);
......
end
三、实时更新曲线
其实原理和实时更新数据差不多,只是在simulink中的操作不太一样。
参考了这篇文章分享一个gui或app designer实时显示simulink仿真波形和实时进度的方法
3.1 simulink中的设置
将需要实时绘制曲线的信号连接到to file模块,并像下图一样设置to file模块。
3.2 app designer中的设置
这里我没有像参考链接中那样使用定时器来更新曲线,试了很多次都没成功,最后发现直接把绘图命令写在updateGUI函数中就可以达到效果~
function updateGUI(app, varargin)
% Create an object that gets the run-time value of the specified block
rto = get_param([bdroot,'/Display'],'RuntimeObject');
rto1 = get_param([bdroot,'/Display1'],'RuntimeObject');
rto2 = get_param([bdroot,'/Display2'],'RuntimeObject');
rto3 = get_param([bdroot,'/Display3'],'RuntimeObject');
% Update the GUI accordingly. In this case a the value of an EditField is being updated.
app.StackVoltage.Value = num2str(rto.InputPort(1).Data);
app.OER.Value = num2str(rto1.InputPort(1).Data);
app.AnodePressure.Value = num2str(rto2.InputPort(1).Data);
app.CathodePressure.Value = num2str(rto3.InputPort(1).Data);
% plot the anode gas pressure
load pH2_an.mat;
load pv_an.mat;
plot(app.AnodePlot_1,pH2_an.time,pH2_an.data/1000);
app.AnodePlot_1.XLim = [0,max(pH2_an.time)];
app.AnodePlot_1.XTick = [0:max(pH2_an.time)/10:max(pH2_an.time)];
app.AnodePlot_1.XTickLabelMode = 'auto';
app.AnodePlot_1.YLim = [0,1000];
app.AnodePlot_1.YTick = [0:100:1000];
app.AnodePlot_1.YTickLabelMode = 'auto';
plot(app.AnodePlot_2,pv_an.time,pv_an.data/1000);
app.AnodePlot_2.XLim = [0,max(pv_an.time)];
app.AnodePlot_2.XTick = [0:max(pv_an.time)/10:max(pv_an.time)];
app.AnodePlot_2.XTickLabelMode = 'auto';
app.AnodePlot_2.YLim = [0,100];
app.AnodePlot_2.YTick = [0:10:100];
app.AnodePlot_2.YTickLabelMode = 'auto';
% Pause to see the changes
pause(0.0001);
总结
本文简单介绍了一下下app designer的几点使用心得,希望可以帮到大家~~
更多推荐
所有评论(0)