1. Simulink自动化基础:认识Simulink API、模型对象层次结构、通过命令行创建/打开/保存模型
做仿真做了这么多年,我越来越觉得一个道理:能用脚本解决的问题,就别用手点。你想想看,一个复杂的模型,几十个模块,参数调一遍就得半天。要是客户说「换个版本重新跑」,那感觉……嗯,懂的都懂。
所以这一章,咱们就来聊聊Simulink自动化的基本功。说白了,就是学会用MATLAB命令行去操控Simulink模型。别怕,这东西没那么玄乎。
1.1 Simulink API是什么?
API,全称是Application Programming Interface。翻译成人话就是:MATLAB给Simulink开了一扇后门,让你用代码去控制它。
我个人习惯把Simulink API分成三类:
- 模型操作类:创建、打开、保存、关闭模型
- 模块操作类:添加、删除、连接、配置模块
- 仿真控制类:设置参数、运行仿真、获取结果
这三类API,基本覆盖了你在Simulink里99%的操作。我在项目中遇到过最典型的场景:一个通信系统模型,需要跑200组参数组合。要是手动改参数再点仿真,估计得干到天亮。用API写个循环,泡杯咖啡的功夫就搞定了。
3.2 模型对象层次结构
要玩转API,必须先搞懂Simulink的「家谱」。这个家谱长什么样?我画了张图,你看一眼就明白了。
这张图你得记住。为什么?因为所有API操作,都是沿着这个树状结构往下找的。比如你想改一个Gain模块的参数,路径就是:root → 模型名 → Block → Parameter。
get_param 和 set_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 返回当前选中模块路径 |
这张表里的命令,我几乎每天都在用。尤其是 gcs 和 gcb,写脚本时特别方便——不用硬编码模型名,脚本通用性更强。
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_block、set_param、add_line 这几个命令,十分钟就能上手。
公众号:蓝海资料掘金营,微信deep3321