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的几点使用心得,希望可以帮到大家~~

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐