【Matlab】M代码控制Simulink仿真

本文介绍用Matlab代码来控制Simulink仿真的小知识和技巧,持续更新。

1. 仿真控制

可以用matlab命令来控制simulink仿真,举例:

% 设定仿真模式,设置Output输出名为yout
simOut = sim('vdp','SimulationMode','normal',...
            'SaveState','on','StateSaveName','xout',...
            'SaveOutput','on','OutputSaveName','yout',...
            'SaveFormat', 'Dataset');
% 获取yout
outputs = simOut.yout

交互式仿真,可以用set_param和get_param命令,举例:

% 开始仿真
set_param('vdp','SimulationCommand','start')
% 暂停、继续和停止仿真
set_param('vdp','SimulationCommand','pause')
set_param('vdp','SimulationCommand','continue')
set_param('vdp','SimulationCommand','stop')
% 检查仿真状态
get_param('vdp','SimulationStatus')

% 设置 Solver 和 StopTime 参数。使用 bdroot 获取当前顶层模型
set_param(bdroot,'Solver','ode15s','StopTime','3000')

使用回调函数执行仿真任务:当对模型执行各种操作(例如启动、暂停或停止仿真)时,将执行回调。可以使用回调来执行 MATLAB脚本或其他 MATLAB 命令。

示例如何使用模型StartFcn回调函数在仿真开始之前自动执行Matlab代码:

% 为模型设置 StartFcn 参数以调用 openscopes 脚本
set_param('my_model','StartFcn','openscopes')

2. 模块参数设置

可以设置某个Block的参数值,主要用set_param命令,语法是set_param(Object,ParameterName,Value,…ParameterNameN,ValueN)

% vdp为模型名称
%  设置 Mu 模块中设置 Gain 参数值
set_param('vdp/Mu','Gain','10')

如果需要,可以使用 getSimulinkBlockHandle 来加载模型,并获取指定模块的句柄。如果对同一个模块多次调用 set_param,则使用模块句柄比以字符向量形式指定完整模块路径更高效。

% 设置 Mu 模块中设置 Gain 参数值
mublockhandle = getSimulinkBlockHandle('vdp/Mu',true);
% 设置 Mu 模块位置
set_param(mublockhandle,'Position',[50 100 110 120])

寻找某个模块并打开:

% 编写在模型中查找 Scope 模块的 MATLAB 脚本,
% 并在仿真模型时在前台打开这些模块。将脚本保存在当前文件夹中。

blocks = find_system(bdroot,'BlockType','Scope');

% Finds all of the scope blocks in the top level of your model. 
% To find scopes in subsystems, provide the subsystem names. 
% Loops through all of the scope blocks and brings them to the forefront.

for i = 1:length(blocks)
  set_param(blocks{i},'Open','on')
end

3. 获取Simulink输出数据

在Simulink仿真过程中,经常使用Logging的方法来记录信号,如下:
【Matlab】M代码控制Simulink仿真_第1张图片
【Matlab】M代码控制Simulink仿真_第2张图片
通常将Logging的信号保存为logsout结构体,logsout是设置的结构体名称。
仿真结束后,workspace工作空间中可以获得,可以通过Matlab代码获取相关数据:

% 用Matlab控制模型vdp仿真开始
mdl = 'stmp';  % stmp is the model name
simOut = sim(mdl);
data = simOut.get('logsout').get('SinData').Values.Data;

工作空间中的值:

在这里插入图片描述

你可能感兴趣的:(MBD,MBD,Matlab)