本文介绍用Matlab代码来控制Simulink仿真的小知识和技巧,持续更新。
可以用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')
可以设置某个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
在Simulink仿真过程中,经常使用Logging的方法来记录信号,如下:
通常将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;
工作空间中的值: