4、模型构建基础:模块的添加、连接、信号线操作、子系统创建与模型注释

Simulink 的建模过程本质上是在图形化画布上构建“数据流 + 控制流”的运算网络。无论是简单的数学运算 y = ax + b,还是复杂的车辆动力学模型,其底层操作都离不开四个基本动作:添加模块、连接信号线、组织子系统以及添加注释。本章将围绕这四个核心操作展开,帮助读者建立规范的建模习惯,为后续的连续系统仿真、离散系统设计以及代码生成打下坚实基础。我们将从模块库的检索与放置讲起,深入信号线的数据流语义,再通过一个实际的“信号滤波与增益”案例演示子系统的封装过程,最后总结模型注释的工程价值。

Simulink 模型构建核心操作链路 ① 模块添加 库浏览器 / 快速搜索 ② 信号线连接 端口匹配 / 分支 / 标签 ③ 子系统创建 In/Out 端口 / 封装 ④ 模型注释 文档化 / 可读性 信号线操作关键细节 分支线(Ctrl+拖动) 信号标签:双击线输入 输出端口 输入端口 维度/数据类型必须匹配 子系统创建流程 1. 选中多个模块 → 右键 Create Subsystem 2. 自动生成 In1/Out1 端口 3. 重命名、添加 Mask 封装 4. 双击进入内部查看逻辑 注释规范建议 • 模块名称:简洁且反映物理含义 • 信号线标签:标注单位/物理量 • 模型级注释:版本、作者、修改日期 • 子系统内部:关键参数说明

4.1 模块的添加:从库浏览器到模型画布

核心原理:Simulink 的模块库(Library Browser)是建模的“零件仓库”,其中包含了连续系统(Continuous)、离散系统(Discrete)、数学运算(Math Operations)、信号路由(Signal Routing)、Sinks(输出)和 Sources(信号源)等十余个分类。每个模块本质上是一个封装好的数学函数或系统模型,其行为由模块参数(Parameters)控制。添加模块的过程,就是将“零件”从仓库中取出并放置到模型画布(Model Canvas)上的过程。

操作流程:添加模块有三种常用方式,读者可根据习惯选择:

  1. 库浏览器拖拽:在 MATLAB 命令行输入 simulink 打开库浏览器,展开对应分类,将模块拖拽至模型窗口。这是最直观的方式,适合初学者熟悉模块位置。
  2. 快速搜索添加:在模型窗口中双击空白处,弹出快速搜索框,直接输入模块名称(如 Gain、Integrator),回车即可添加。这种方式效率最高,适合熟练用户。
  3. 命令行添加:使用 add_block 函数,例如 add_block('simulink/Math Operations/Gain', 'myModel/Gain'),适合脚本化批量建模。
模块类别典型模块用途说明常见参数
Sources(信号源)Sine Wave, Step, Constant产生仿真输入信号幅值、频率、相位、阶跃时间
Math Operations(数学运算)Gain, Sum, Product, Abs执行算术与逻辑运算增益系数、运算符号列表
Continuous(连续系统)Integrator, Transfer Fcn, State-Space描述连续时间动态行为初始条件、分子分母系数
Discrete(离散系统)Unit Delay, Discrete Filter描述离散采样系统采样时间、初始条件
Sinks(输出)Scope, To Workspace, Display观察或导出仿真结果变量名、采样间隔、显示格式
Signal Routing(信号路由)Mux, Demux, Switch, Bus Creator信号合并、选择与路由输入数量、判断条件
经验提醒:在大型模型中,建议使用“快速搜索”方式添加模块,并配合 Ctrl+F 在模型内查找已有模块。同时,为每个模块设置一个有意义的名称(如 PID_Controller 而非 Gain1),这是模型可读性的第一道保障。

4.2 信号线连接与操作:数据流的“血管”

核心原理:信号线(Signal Line)承载着模块之间的数据传递。在 Simulink 中,信号线是有方向的,从输出端口指向输入端口。信号线的粗细和颜色可以反映数据类型(如 double 为黑色实线,uint8 为浅蓝色),但更重要的是,信号线所携带的维度信息(标量、向量、矩阵)和采样时间(连续、离散)必须与输入端口的要求匹配。

操作流程:连接信号线的基本操作如下:

  • 基本连接:将鼠标移至输出端口,光标变为十字形,按住左键拖动至目标输入端口,松开即可。若端口类型不匹配,Simulink 会显示红色虚线提示。
  • 信号线分支:当同一信号需要传递给多个模块时,在已有信号线上右键拖动(或按住 Ctrl 拖动),即可拉出分支线。分支线共享同一数据源,但可以分别连接不同的输入端口。
  • 信号线标签:双击信号线,输入文本即可添加标签。标签应描述信号的物理含义,如 Speed_kmh、Error。标签不仅增强可读性,还能在 Signal Properties 中设置信号名称,便于在 MATLAB 工作区中引用。
  • 信号线删除与重连:选中信号线按 Delete 删除;若需改变连接路径,可拖动信号线中间的节点进行弯曲调整。
关键判断方法:当连接失败时,优先检查以下三项:
① 端口维度:输出为 3×1 向量,输入端口可能只接受标量;
② 数据类型:输出为 uint8,输入端口要求 double,需插入 Data Type Conversion 模块;
③ 采样时间:连续信号不能直接连接离散模块的输入,需通过 Zero-Order Hold 或 Rate Transition 模块转换。

4.3 子系统创建:从“电路图”到“黑盒”

核心原理:子系统(Subsystem)是 Simulink 实现模型层次化管理的核心机制。它将一组相关的模块封装成一个独立的“黑盒”,对外只暴露输入/输出端口。子系统内部可以包含任意复杂的逻辑,但外部模型只关心其端口行为。这类似于电路设计中的集成电路(IC)——内部有成千上万个晶体管,但外部只看到引脚功能。

创建流程:子系统有两种创建方式:

  1. 自上而下:先拖入一个 Subsystem 模块,双击进入内部,再添加 In1/Out1 端口和内部逻辑。这种方式适合先定义接口再实现细节。
  2. 自下而上(推荐):先在模型画布中搭建好完整的模块组,然后框选所有模块,右键选择 Create Subsystem from Selection。Simulink 会自动将选中模块的边界端口转换为 In1/Out1 端口,并生成子系统。

案例拆解:信号滤波与增益子系统

假设我们需要构建一个“传感器信号调理”子系统,输入为原始电压信号(含噪声),输出为放大后的滤波信号。初始模型包含:一个 Sine Wave(模拟传感器信号)、一个 Band-Limited White Noise(模拟噪声)、一个 Sum(叠加)、一个 Transfer Fcn(低通滤波)、一个 Gain(放大)。

步骤操作结果
1框选 Sum、Transfer Fcn、Gain 三个模块三个模块被高亮选中
2右键 → Create Subsystem from Selection生成 Subsystem 模块,自动创建 In1(接 Sum 输入)和 Out1(接 Gain 输出)
3重命名子系统为 Signal_Conditioning模型顶层显示简洁的子系统图标
4双击子系统,内部保留原逻辑,端口自动连接内部可继续修改滤波参数
5在子系统上右键 → Mask → Create Mask,添加参数 Gain_Value外部可通过参数对话框调整增益,无需进入内部
风险提示:创建子系统时,务必检查端口顺序。Simulink 默认按端口编号排列,但若模块连接复杂,可能出现 In1 对应错误信号的情况。创建后应双击子系统,确认 In1 连接的是预期信号源。此外,避免在子系统内部使用 Goto/From 标签跨层传递信号,这会破坏层次结构的清晰性。

4.4 模型注释:让模型“会说话”

核心原理:模型注释是工程文档的一部分。在代码生成、团队协作、模型审查等场景中,注释的质量直接影响沟通效率。Simulink 支持三种注释形式:模块注释(模块名称下方)、信号线标签(线上文字)、画布注释(模型空白处的文本框)。

操作与规范:

  • 画布注释:双击模型画布空白处,输入文字即可创建。建议在模型顶部添加“模型名称、版本号、作者、创建日期、修改记录”等元信息。
  • 模块注释:在模块下方自动显示模块名称。若需补充说明,可在模块属性(Ctrl+M)的 Description 字段中填写,鼠标悬停时显示。
  • 信号线标签:除了物理量名称,还可标注单位,如 Current_A、Pressure_Pa。对于总线信号,建议标注总线名称。
实战复盘:在某车辆动力学建模项目中,工程师在 200 多个模块的模型中仅依赖默认命名(Gain1、Gain2...)。当仿真结果异常时,排查信号链路耗时 3 小时。后来团队规定:所有信号线必须标注物理量名称,所有增益模块必须注明标定编号(如 Gain_Cal_SteerRatio)。整改后,同类问题排查时间缩短至 20 分钟。这说明注释不是“锦上添花”,而是工程效率的刚需。

4.5 常见误区与总结复盘

常见误区:

  1. 信号线交叉即连接:在 Simulink 中,信号线交叉并不代表连接。只有端口与端口直接相连,或通过分支线连接才算有效。交叉线只是视觉上的重叠。
  2. 忽略数据类型:默认情况下,Simulink 使用 double 类型。但嵌入式代码生成时,可能需要定点数或整数。若在建模初期不关注类型,后期转换成本极高。
  3. 子系统嵌套过深:虽然子系统支持无限嵌套,但超过 3 层后,模型导航和调试难度急剧增加。建议保持扁平化,必要时使用 Model Reference 代替子系统。
  4. 注释与模型不同步:修改了模块参数但未更新注释,导致注释成为“误导信息”。应养成“先改模型,再改注释”的习惯。

总结复盘:本章的核心操作可以概括为“放模块、连线路、建子系统、写注释”四步。这四步看似简单,但决定了模型的可读性、可维护性和可复用性。在实际工程中,建议遵循以下建模规范:

  • 每个子系统完成一个独立功能,端口数量控制在 5 个以内;
  • 信号线标签覆盖率不低于 90%,关键信号必须标注单位;
  • 模型顶层保留画布注释,记录版本和修改说明;
  • 定期使用 Model Advisor 检查模型规范性。

掌握这些基础操作后,读者已经具备了构建中等复杂度模型的能力。下一阶段,我们将深入探讨连续系统与离散系统的建模差异,以及如何通过 Simulink 的求解器设置获得高精度仿真结果。但在此之前,请务必通过实际建模练习,将本章的四个核心操作内化为肌肉记忆。