1. Simulink自动化基础:认识Simulink API、模型对象层次结构、通过命令行创建/打开/保存模型

做仿真做了这么多年,我越来越觉得一个道理:能用脚本解决的问题,就别用手点。你想想看,一个复杂的模型,几十个模块,参数调一遍就得半天。要是客户说「换个版本重新跑」,那感觉……嗯,懂的都懂。

所以这一章,咱们就来聊聊Simulink自动化的基本功。说白了,就是学会用MATLAB命令行去操控Simulink模型。别怕,这东西没那么玄乎。

1.1 Simulink API是什么?

API,全称是Application Programming Interface。翻译成人话就是:MATLAB给Simulink开了一扇后门,让你用代码去控制它

我个人习惯把Simulink API分成三类:

  • 模型操作类:创建、打开、保存、关闭模型
  • 模块操作类:添加、删除、连接、配置模块
  • 仿真控制类:设置参数、运行仿真、获取结果

这三类API,基本覆盖了你在Simulink里99%的操作。我在项目中遇到过最典型的场景:一个通信系统模型,需要跑200组参数组合。要是手动改参数再点仿真,估计得干到天亮。用API写个循环,泡杯咖啡的功夫就搞定了。

核心思想:Simulink API让你从「图形界面操作者」变成「脚本指挥官」。

3.2 模型对象层次结构

要玩转API,必须先搞懂Simulink的「家谱」。这个家谱长什么样?我画了张图,你看一眼就明白了。

root (根) Simulink.BlockDiagram (模型) SubSystem (子系统) Block (模块) Line (信号线) Port (端口) Parameter (参数) Annotation (注释) Simulink模型对象层次结构 根 → 模型 → 子系统/模块/信号线 → 端口/参数/注释

这张图你得记住。为什么?因为所有API操作,都是沿着这个树状结构往下找的。比如你想改一个Gain模块的参数,路径就是:root → 模型名 → Block → Parameter

小技巧:get_paramset_param 这两个函数,就能读写任意模块的任意参数。这是最常用的两个API,没有之一。

3.3 通过命令行创建模型

好,理论说完了,咱们直接上手。创建一个新模型,代码简单到让你怀疑人生:

% 创建一个新模型
new_system('my_model');

% 打开模型窗口
open_system('my_model');

% 保存模型
save_system('my_model');

就三行代码,一个空模型就出来了。但空模型有啥用?咱们得往里加东西。

我记得第一次用API建模型时,犯了个低级错误——忘了加 open_system。结果模型创建了,但窗口没打开,我还以为代码写错了。后来养成习惯:创建完模型,顺手打开看一眼

加个正弦波和示波器,代码长这样:

% 添加正弦波模块
add_block('simulink/Sources/Sine Wave', 'my_model/Sine Wave');

% 添加示波器模块
add_block('simulink/Sinks/Scope', 'my_model/Scope');

% 连线
add_line('my_model', 'Sine Wave/1', 'Scope/1');

% 保存
save_system('my_model');

你看,add_block 的第一个参数是模块库路径,第二个参数是目标路径。这个套路记住了,所有模块都能加。

注意:模块库路径里的斜杠是正斜杠 /,不是反斜杠 \。我曾经因为这个报错,查了半天才发现是路径写反了。

3.4 打开和保存模型的正确姿势

打开已有模型,用 open_system

% 打开模型
open_system('existing_model.slx');

% 如果模型不在当前路径,需要指定完整路径
open_system('C:\Projects\my_model.slx');

保存模型时,有几个选项你得知道:

命令 作用 说明
save_system('model') 保存模型 覆盖原文件
save_system('model', 'new_name') 另存为 保存为新文件
save_system('model', [], 'SaveAsVersion', 'R2020a') 指定版本保存 兼容旧版本
close_system('model', 0) 关闭不保存 第二个参数0表示不保存

这里有个坑,我吃过亏:保存时如果不指定版本,默认用当前MATLAB版本。如果你把R2023b的模型发给用R2020a的同事,他打不开。所以团队协作时,建议统一保存为低版本。

实战建议:写自动化脚本时,开头加一句 save_system(gcs, [], 'SaveAsVersion', 'R2020a'),保证兼容性。

3.5 常用API速查表

我把最常用的API整理成了一张表,你直接收藏就行:

功能 API命令 示例
创建模型 new_system new_system('test')
打开模型 open_system open_system('test.slx')
保存模型 save_system save_system('test')
关闭模型 close_system close_system('test', 0)
添加模块 add_block add_block('src', 'dst')
删除模块 delete_block delete_block('test/Gain')
添加连线 add_line add_line('test', 'p1', 'p2')
读取参数 get_param get_param('test/Gain', 'Gain')
设置参数 set_param set_param('test/Gain', 'Gain', '5')
获取当前模型 gcs gcs 返回当前模型名
获取选中模块 gcb gcb 返回当前选中模块路径

这张表里的命令,我几乎每天都在用。尤其是 gcsgcb,写脚本时特别方便——不用硬编码模型名,脚本通用性更强。

3.6 一个完整的自动化示例

说了这么多,咱们来写个完整的脚本。这个脚本会:创建模型 → 添加模块 → 设置参数 → 运行仿真 → 保存结果。

%% 自动化创建并仿真一个简单模型

% 1. 创建新模型
modelName = 'auto_demo';
new_system(modelName);

% 2. 添加模块
add_block('simulink/Sources/Sine Wave', [modelName '/Sine']);
add_block('simulink/Math Operations/Gain', [modelName '/Gain']);
add_block('simulink/Sinks/Out1', [modelName '/Output']);

% 3. 设置参数
set_param([modelName '/Gain'], 'Gain', '10');

% 4. 连线
add_line(modelName, 'Sine/1', 'Gain/1');
add_line(modelName, 'Gain/1', 'Output/1');

% 5. 设置仿真时间
set_param(modelName, 'StopTime', '10');

% 6. 运行仿真
sim(modelName);

% 7. 保存模型
save_system(modelName, [], 'SaveAsVersion', 'R2020a');

disp('自动化完成!');

这个脚本跑完,你会得到一个完整的、可运行的模型。而且整个过程不到1秒。你想想看,要是手动操作,光拖模块就得半分钟。

我的习惯:写自动化脚本时,每步都加个 disp 打印进度。这样脚本跑崩了,你能立刻知道卡在哪一步。

3.7 避坑指南

最后,分享几个我踩过的坑:

  • 路径问题:模块库路径区分大小写吗?分!simulink/Sources/Sine Wave 写成 Simulink/Sources/Sine Wave 就报错。
  • 参数类型set_param 的参数值必须是字符串。数字要加引号,比如 '10' 而不是 10
  • 模型锁定:如果模型被其他进程打开,save_system 会失败。关掉其他窗口再试。
  • 版本兼容:高版本MATLAB创建的模型,低版本打不开。保存时指定版本是个好习惯。

嗯,这一章的内容就到这。API这东西,光看没用,你得动手敲一遍。找个空模型,试试 add_blockset_paramadd_line 这几个命令,十分钟就能上手。


公众号:蓝海资料掘金营,微信deep3321