mcpField
S
simulating-simulink-models

simulating-simulink-models

github.com/matlab开发1.3k132 次安装1 周前更新
代码仓库

关于 simulating-simulink-models

simulating-simulink-models 是用于配置和运行 Simulink 仿真的技能,面向需要参数覆盖、自定义输入或批量运行的模型使用者。它支持读取仿真输出中的日志信号。

主要功能

  1. 01非破坏性覆盖仿真参数
  2. 02传入自定义输入信号
  3. 03运行批量或并行仿真
  4. 04使用 Fast Restart 加速迭代
  5. 05读取日志信号数据

适用场景

  1. 01比较不同参数值下的模型输出
  2. 02向模型输入自定义信号
  3. 03批量运行参数扫描
  4. 04提取日志信号供后续分析

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/matlab/simulink-agentic-toolkit --skill simulating-simulink-models

安装后在 Claude Code 中输入/simulating-simulink-models确认已加载。

附带文件manifest.yaml

详细介绍

使用 sim 命令仿真 Simulink 模型

当你需要以非破坏性方式配置仿真时,请使用此技能——例如覆盖参数、自定义输入、批量执行或访问结构化输出。对于持久、可复用的通过/失败行为测试(尤其是针对单个子系统的测试),请改用 testing-simulink-models。对于无需配置的简单一次性仿真,直接调用 sim() 即可,无需使用此技能。

适用场景

  • 以非破坏性方式覆盖模型或模块参数(setVariable、setBlockParameter、setModelParameter),而不修改 .slx 文件
  • 使用 Dataset 通过 setExternalInput 向根级 Inport 模块传递自定义输入信号
  • 运行参数扫描或批量仿真(SimulationInput 数组、parsim、Fast Restart)
  • 访问记录的信号数据(logsout),以便在仿真后进行分析

不适用场景

  • 无需覆盖参数或自定义输入的简单一次性仿真——直接调用 sim('ModelName') 即可,无需使用此技能
  • 编写基于 Gherkin 的声明式测试 → 使用 testing-simulink-models
  • 测试单个子系统或组件 → 使用 testing-simulink-models(需要 Simulink Test;会自动创建测试框架,且只编译子系统——比 sim() 快得多,因为 sim() 总是编译整个模型)
  • 添加、连接或删除模块 → 使用 building-simulink-models
  • 检查模型结构中是否存在未连接的端口 → 直接使用 model_check 工具
  • 根据模型行为生成需求 → 使用 generate-requirement-drafts

最简工作模式

始终使用 Simulink.SimulationInput 和 Simulink.SimulationOutput 进行仿真:

in = Simulink.SimulationInput('MyModel');
in = in.setModelParameter('StopTime', '10');
out = sim(in);

设置参数

使用 SimulationInput 方法配置仿真:

% Model-level parameters (StopTime, SolverType, SimulationMode, etc.)
in = in.setModelParameter('StopTime', '10', 'SolverType', 'Fixed-step');

% Block parameters — resolve path from blk_X ID (never type block names manually)
blkPath = Simulink.ID.getFullName('MyModel:5');
in = in.setBlockParameter(blkPath, 'Gain', '5');

% MATLAB workspace variables used by the model
in = in.setVariable('Kp', 1.2);

输入信号

使用 Simulink.SimulationData.Dataset 通过 Inport 模块传递输入信号。元素按索引位置与 Inport 模块匹配——第一个元素对应端口号为 1 的 Inport,第二个元素对应端口号为 2 的 Inport,以此类推。

dt = 0.01;
N = 1000;
t = dt*(0:N)';
u = sin(2*pi*t);

ts = timeseries(u, t);

ds = Simulink.SimulationData.Dataset;
ds{1} = ts;

in = in.setExternalInput(ds);
out = sim(in);

也可以使用 timetable 作为输入格式:

secs = seconds(t);
tt = timetable(secs, u);

ds = Simulink.SimulationData.Dataset;
ds{1} = tt;

in = in.setExternalInput(ds);

探索记录的数据

首先使用 who 确定模型会生成哪些类型的记录数据,然后检查 logsout 中的信号名称:

in = Simulink.SimulationInput('MyModel');
out = sim(in);

% See what logging properties exist (logsout, yout, tout, etc.)
who(out)

% List individual signal names within logsout
disp(out.logsout.getElementNames);

访问记录的数据

记录的信号可通过 out.logsout 访问。按名称直接访问:

% Plot a logged signal
plot(out.logsout.get('signalName').Values)

% Get time and data separately
sig = out.logsout.get('signalName').Values;
plot(sig.Time, sig.Data)

多次仿真

运行多次仿真时,请创建一个 Simulink.SimulationInput 对象数组:

in = repmat(Simulink.SimulationInput('MyModel'),N,1);
for k = 1:N
    in(k) = Simulink.SimulationInput('MyModel');
    in(k) = in(k).setVariable('gain', gains(k));
end
out = sim(in);

若要在迭代扫描中启用快速重启(只编译模型一次):

out = sim(in, 'UseFastRestart', 'on');

并行仿真(parsim)

若要并行运行多次仿真,请使用 parsim,而不要循环调用 sim:

for k = 1:N
    in(k) = Simulink.SimulationInput('MyModel');
    in(k) = in(k).setVariable('gain', gains(k));
end
out = parsim(in);

parsim 也支持 'UseFastRestart','on',可加快批量运行速度。

注意事项

  • 切勿使用 set_param、load_system 或 open_system 来驱动仿真——SimulationInput 可替代它们。
  • 切勿使用 try-catch 或 isfield 包装对 SimulationOutput 的访问——sim 要么返回有效对象,要么抛出错误。SimulationOutput 没有 isfield 方法。
  • 切勿为记录的数据创建不必要的中间变量——直接通过 out.logsout.get('name').Values 访问。
  • 始终将 in/out 用作 SimulationInput/SimulationOutput 的变量名。
  • 始终将 setExternalInput 与 Dataset 配合使用——不要传递以逗号分隔的变量列表。

版权所有 2026 The MathWorks, Inc.


评论

支持 Markdown