第三章 Simulink建模基础:常用模块库介绍、信号线与总线、子系统与封装、模型参数设置

好,咱们进入第三章。这一章是真正动手前的“磨刀”环节。很多新手一上来就拖模块、连信号线,结果模型跑起来全是红叉,查错查到崩溃。我当年也干过这种事,后来才明白——先把工具箱里的家伙事儿摸清楚,比什么都重要。

3.1 常用模块库介绍

Simulink的模块库,说白了就是个巨大的工具箱。你不需要全记住,但常用的那几个,得闭着眼睛都能找到。

3.1.1 信源模块(Sources)

信源就是信号的“源头”。我习惯把它们分成三类:

  • 常数信号:比如Constant模块,给个固定值。做MIL测试时,我经常用它来模拟传感器输出的基准值。
  • 激励信号Sine WaveStepRamp。做阶跃响应测试时,Step模块是首选。
  • 随机信号Uniform Random Number。做鲁棒性测试时,我会用它来模拟噪声干扰。
我的小习惯: 测试时,我通常会在信号源后面加一个Data Type Conversion模块。为什么?因为Simulink默认的double类型有时候会跟实际嵌入式代码里的定点数打架。提前转好类型,能省掉后面一堆麻烦。

3.1.2 信宿模块(Sinks)

信宿就是信号的“终点”。最常用的就三个:

  • Scope:看波形。调试时必用。
  • To Workspace:把数据存到MATLAB工作区。做批量数据分析时,我全靠它。
  • Display:显示数值。简单粗暴,适合快速验证。

3.1.3 连续与离散模块

做MIL测试,你一定会碰到这两类模块:

  • 连续模块:比如IntegratorDerivative。它们模拟的是物理世界的真实行为。
  • 离散模块:比如Unit DelayDiscrete-Time Integrator。它们对应的是嵌入式代码里的采样和延时。
注意: 我曾经犯过一个错——在离散系统中用了连续积分器,结果仿真步长一改,结果全变了。记住:做MIL测试时,尽量用离散模块,因为最终代码是离散的。

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改成InheritedFixed-point
  • 在信号线上右键,选Signal Properties,可以强制指定数据类型

我个人习惯是:在模型里显式地加上Data Type Conversion模块,而不是依赖Simulink自动推断。为什么?因为自动推断有时候会“自作聪明”,把类型转成你没想到的样子。

3.4.3 仿真时间设置

仿真时间,就是跑多久。做MIL测试时:

  • 启动时间:通常设0
  • 停止时间:根据测试用例来。比如测阶跃响应,跑个5秒就够了;测长时间稳定性,可能要跑几百秒。

我的经验: 做回归测试时,我会把仿真时间设得比实际需要长一点。比如测试用例只需要10秒,我设12秒。为什么?因为有时候系统在边界处会有“延迟响应”,多跑几秒能发现隐藏问题。

3.5 本章小结

这一章的内容,说白了就是让你学会“搭积木”的基本功。模块库是积木块,信号线是连接件,子系统是组合件,参数设置是搭建规则。把这些搞明白了,后面做MIL测试时,你就能把精力放在“测什么”上,而不是“怎么搭”上。

下一章,咱们开始真正动手——搭建第一个MIL测试模型。到时候,我会带着你一步步走,把今天讲的这些知识点都用上。


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