第三章 Simulink建模基础:常用模块库介绍、信号线与总线、子系统与封装、模型参数设置
好,咱们进入第三章。这一章是真正动手前的“磨刀”环节。很多新手一上来就拖模块、连信号线,结果模型跑起来全是红叉,查错查到崩溃。我当年也干过这种事,后来才明白——先把工具箱里的家伙事儿摸清楚,比什么都重要。
3.1 常用模块库介绍
Simulink的模块库,说白了就是个巨大的工具箱。你不需要全记住,但常用的那几个,得闭着眼睛都能找到。
3.1.1 信源模块(Sources)
信源就是信号的“源头”。我习惯把它们分成三类:
- 常数信号:比如
Constant模块,给个固定值。做MIL测试时,我经常用它来模拟传感器输出的基准值。 - 激励信号:
Sine Wave、Step、Ramp。做阶跃响应测试时,Step模块是首选。 - 随机信号:
Uniform Random Number。做鲁棒性测试时,我会用它来模拟噪声干扰。
Data Type Conversion模块。为什么?因为Simulink默认的double类型有时候会跟实际嵌入式代码里的定点数打架。提前转好类型,能省掉后面一堆麻烦。
3.1.2 信宿模块(Sinks)
信宿就是信号的“终点”。最常用的就三个:
Scope:看波形。调试时必用。To Workspace:把数据存到MATLAB工作区。做批量数据分析时,我全靠它。Display:显示数值。简单粗暴,适合快速验证。
3.1.3 连续与离散模块
做MIL测试,你一定会碰到这两类模块:
- 连续模块:比如
Integrator、Derivative。它们模拟的是物理世界的真实行为。 - 离散模块:比如
Unit Delay、Discrete-Time Integrator。它们对应的是嵌入式代码里的采样和延时。
3.2 信号线与总线
信号线就是模块之间的“电线”。但这里有几个坑,我得跟你聊聊。
3.2.1 信号线的类型
Simulink里的信号线,其实是有“颜色”的:
- 实线:普通信号。最常见。
- 虚线:控制信号。比如使能信号、触发信号。
- 粗线:总线信号。里面包了一堆信号。
嗯,这里要注意:如果你看到信号线变成了红色,那说明数据类型不匹配。别慌,双击看错误提示,通常就是类型没转对。
3.2.2 总线(Bus)的使用
总线,说白了就是把一堆信号打包在一起。我为什么喜欢用总线?
- 整洁:模型不会乱成一团麻。
- 可维护:改一个信号,不用到处找线。
- 标准化:做MIL测试时,我习惯把所有的传感器信号打包成一个总线,把所有的控制信号打包成另一个总线。这样测试用例写起来也清晰。
避坑指南: 我曾经在总线里塞了20多个信号,结果忘了给其中一个赋值,仿真直接报错。后来我养成了一个习惯——每次建完总线,先用Bus Selector拉出来看看,确认每个信号都有值。
3.3 子系统与封装
子系统,就是把一堆模块打包成一个“黑盒子”。封装,就是给这个黑盒子做个“外壳”,让它看起来像个正经模块。
3.3.1 子系统的三种类型
| 类型 | 用途 | 我常用的场景 |
|---|---|---|
| 普通子系统 | 把功能相关的模块打包 | 把PID控制器打包成一个子系统 |
| 使能子系统 | 只有使能信号为真时才执行 | 模拟故障注入,只有故障标志位为1时才触发 |
| 触发子系统 | 在触发信号边沿执行一次 | 模拟中断处理,每次中断来临时执行一次 |
3.3.2 封装(Mask)
封装,说白了就是给子系统做个“参数面板”。你想想看,一个PID控制器,如果每次都要打开子系统去改Kp、Ki,那多麻烦?封装之后,双击就能改参数。
我做MIL测试时,特别喜欢用封装来做“参数化测试”。比如:
- 把控制器的增益做成可调参数
- 把滤波器的截止频率做成可调参数
- 把测试用例的输入条件做成可调参数
Documentation选项卡里写清楚这个模块是干嘛的。我见过太多封装完就不管了的模型,三个月后自己都看不懂。
3.4 模型参数设置
模型参数设置,是MIL测试里最容易忽略、也最容易出问题的地方。我见过有人仿真步长设错了,结果跑出来的结果跟实际代码差了十万八千里。
3.4.1 求解器设置
求解器,就是Simulink用来算下一步结果的“算法”。做MIL测试时,我建议:
- 固定步长:选
Fixed-step。因为嵌入式代码是固定周期执行的。 - 离散求解器:选
discrete (no continuous states)。因为MIL测试里,我们通常只关心离散行为。 - 步长:跟实际代码的采样周期一致。比如代码是10ms跑一次,步长就设0.01。
Auto步长做MIL测试!我踩过这个坑——自动步长会为了精度把步长缩得很小,结果仿真时间巨长,而且跟实际代码的行为对不上。
3.4.2 数据类型设置
Simulink默认是double,但嵌入式代码里常用的是single、int16、uint8。所以:
- 在
Model Settings里,把Default parameter behavior改成Inherited或Fixed-point - 在信号线上右键,选
Signal Properties,可以强制指定数据类型
我个人习惯是:在模型里显式地加上Data Type Conversion模块,而不是依赖Simulink自动推断。为什么?因为自动推断有时候会“自作聪明”,把类型转成你没想到的样子。
3.4.3 仿真时间设置
仿真时间,就是跑多久。做MIL测试时:
- 启动时间:通常设0
- 停止时间:根据测试用例来。比如测阶跃响应,跑个5秒就够了;测长时间稳定性,可能要跑几百秒。
我的经验: 做回归测试时,我会把仿真时间设得比实际需要长一点。比如测试用例只需要10秒,我设12秒。为什么?因为有时候系统在边界处会有“延迟响应”,多跑几秒能发现隐藏问题。
3.5 本章小结
这一章的内容,说白了就是让你学会“搭积木”的基本功。模块库是积木块,信号线是连接件,子系统是组合件,参数设置是搭建规则。把这些搞明白了,后面做MIL测试时,你就能把精力放在“测什么”上,而不是“怎么搭”上。
下一章,咱们开始真正动手——搭建第一个MIL测试模型。到时候,我会带着你一步步走,把今天讲的这些知识点都用上。
公众号:蓝海资料掘金营,微信deep3321