【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的方法来记录信号,如下:
在这里插入图片描述
在这里插入图片描述
通常将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;

工作空间中的值:

在这里插入图片描述

  • 9
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
以下是一个简单的 Simulink 仿真实验示例,其中包含一个简单的 PID 控制器和一个带有扰动的物理系统: 1. 首先,在 MATLAB 中创建一个新的 Simulink 模型。在 Simulink 库浏览器中选择 "Sources",将 "Step" 模块拖放到模型中。 2. 将 "Step" 模块连接到一个 "PID Controller" 模块。将 "PID Controller" 模块连接到一个 "Transfer Function" 模块。 3. 将 "Transfer Function" 模块连接到一个 "Scope" 模块,并将 "Scope" 模块连接回 "PID Controller" 模块。 4. 在 "Step" 模块的参数中,将 "Step time" 设置为 0, "Initial value" 设置为 0, "Final value" 设置为 1。 5. 在 "PID Controller" 模块的参数中,将 "Proportional gain"、"Integral gain" 和 "Derivative gain" 设置为合适的值。 6. 在 "Transfer Function" 模块的参数中,输入物理系统的传递函数,例如 "1 / (s^2 + 2s + 1)"。 7. 在模型中添加一个 "Noise" 模块,将其连接到 "Transfer Function" 模块的输出。 8. 在 "Noise" 模块的参数中,选择 "Uniform" 噪声类型,并设置其幅度和频率。 9. 在 "Scope" 模块的参数中,调整 "Time range" 和 "Y-range" 以适应输出信号。 10. 运行模型并观察输出结果。 以下是 MATLAB 代码实现: ```matlab % 创建新的 Simulink 模型 model = 'mySimulinkModel'; open_system(new_system(model)); % 添加 "Step" 模块 add_block('simulink/Sources/Step', [model '/Step']); set_param([model '/Step'], 'Time', '0', 'Before', '0', 'After', '1'); % 添加 "PID Controller" 模块 add_block('simulink/Discrete/Discrete PID Controller', [model '/PID Controller']); set_param([model '/PID Controller'], 'P', '0.5', 'I', '0.1', 'D', '0.01'); % 添加 "Transfer Function" 模块 add_block('simulink/Continuous/Transfer Fcn', [model '/Transfer Function']); set_param([model '/Transfer Function'], 'Numerator', '1', 'Denominator', '[1 2 1]'); % 添加 "Scope" 模块 add_block('simulink/Sinks/Scope', [model '/Scope']); % 连接模块 add_line(model, 'Step/1', 'PID Controller/2'); add_line(model, 'PID Controller/1', 'Transfer Function/1'); add_line(model, 'Transfer Function/1', 'Scope/1'); add_line(model, 'Scope/1', 'PID Controller/1'); % 添加 "Noise" 模块 add_block('simulink/Sources/Noise', [model '/Noise']); set_param([model '/Noise'], 'Distribution', 'Uniform', 'Amplitude', '0.1', 'Frequency', '10'); % 连接 "Noise" 模块 add_line(model, 'Transfer Function/1', 'Noise/1'); add_line(model, 'Noise/1', 'Scope/2'); % 运行模型 sim(model); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CrazyRabbit0823

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值