4、模型构建基础:模块的添加、连接、信号线操作、子系统创建与模型注释
Simulink 的建模过程本质上是在图形化画布上构建“数据流 + 控制流”的运算网络。无论是简单的数学运算 y = ax + b,还是复杂的车辆动力学模型,其底层操作都离不开四个基本动作:添加模块、连接信号线、组织子系统以及添加注释。本章将围绕这四个核心操作展开,帮助读者建立规范的建模习惯,为后续的连续系统仿真、离散系统设计以及代码生成打下坚实基础。我们将从模块库的检索与放置讲起,深入信号线的数据流语义,再通过一个实际的“信号滤波与增益”案例演示子系统的封装过程,最后总结模型注释的工程价值。
4.1 模块的添加:从库浏览器到模型画布
核心原理:Simulink 的模块库(Library Browser)是建模的“零件仓库”,其中包含了连续系统(Continuous)、离散系统(Discrete)、数学运算(Math Operations)、信号路由(Signal Routing)、Sinks(输出)和 Sources(信号源)等十余个分类。每个模块本质上是一个封装好的数学函数或系统模型,其行为由模块参数(Parameters)控制。添加模块的过程,就是将“零件”从仓库中取出并放置到模型画布(Model Canvas)上的过程。
操作流程:添加模块有三种常用方式,读者可根据习惯选择:
- 库浏览器拖拽:在 MATLAB 命令行输入
simulink打开库浏览器,展开对应分类,将模块拖拽至模型窗口。这是最直观的方式,适合初学者熟悉模块位置。 - 快速搜索添加:在模型窗口中双击空白处,弹出快速搜索框,直接输入模块名称(如
Gain、Integrator),回车即可添加。这种方式效率最高,适合熟练用户。 - 命令行添加:使用
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)——内部有成千上万个晶体管,但外部只看到引脚功能。
创建流程:子系统有两种创建方式:
- 自上而下:先拖入一个 Subsystem 模块,双击进入内部,再添加 In1/Out1 端口和内部逻辑。这种方式适合先定义接口再实现细节。
- 自下而上(推荐):先在模型画布中搭建好完整的模块组,然后框选所有模块,右键选择
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 | 外部可通过参数对话框调整增益,无需进入内部 |
4.4 模型注释:让模型“会说话”
核心原理:模型注释是工程文档的一部分。在代码生成、团队协作、模型审查等场景中,注释的质量直接影响沟通效率。Simulink 支持三种注释形式:模块注释(模块名称下方)、信号线标签(线上文字)、画布注释(模型空白处的文本框)。
操作与规范:
- 画布注释:双击模型画布空白处,输入文字即可创建。建议在模型顶部添加“模型名称、版本号、作者、创建日期、修改记录”等元信息。
- 模块注释:在模块下方自动显示模块名称。若需补充说明,可在模块属性(
Ctrl+M)的 Description 字段中填写,鼠标悬停时显示。 - 信号线标签:除了物理量名称,还可标注单位,如
Current_A、Pressure_Pa。对于总线信号,建议标注总线名称。
Gain_Cal_SteerRatio)。整改后,同类问题排查时间缩短至 20 分钟。这说明注释不是“锦上添花”,而是工程效率的刚需。
4.5 常见误区与总结复盘
常见误区:
- 信号线交叉即连接:在 Simulink 中,信号线交叉并不代表连接。只有端口与端口直接相连,或通过分支线连接才算有效。交叉线只是视觉上的重叠。
- 忽略数据类型:默认情况下,Simulink 使用 double 类型。但嵌入式代码生成时,可能需要定点数或整数。若在建模初期不关注类型,后期转换成本极高。
- 子系统嵌套过深:虽然子系统支持无限嵌套,但超过 3 层后,模型导航和调试难度急剧增加。建议保持扁平化,必要时使用 Model Reference 代替子系统。
- 注释与模型不同步:修改了模块参数但未更新注释,导致注释成为“误导信息”。应养成“先改模型,再改注释”的习惯。
总结复盘:本章的核心操作可以概括为“放模块、连线路、建子系统、写注释”四步。这四步看似简单,但决定了模型的可读性、可维护性和可复用性。在实际工程中,建议遵循以下建模规范:
- 每个子系统完成一个独立功能,端口数量控制在 5 个以内;
- 信号线标签覆盖率不低于 90%,关键信号必须标注单位;
- 模型顶层保留画布注释,记录版本和修改说明;
- 定期使用
Model Advisor检查模型规范性。
掌握这些基础操作后,读者已经具备了构建中等复杂度模型的能力。下一阶段,我们将深入探讨连续系统与离散系统的建模差异,以及如何通过 Simulink 的求解器设置获得高精度仿真结果。但在此之前,请务必通过实际建模练习,将本章的四个核心操作内化为肌肉记忆。