3. Simulink基础模块:常用模块库(Sources、Sinks、Math Operations等)的功能与参数设置
Simulink 的建模本质是将复杂的物理系统或控制算法拆解为信号流图,而信号流图的基本构成单元就是模块(Block)。在 Simulink 的模块浏览器(Library Browser)中,模块按功能被组织为不同的库(Library),其中 Sources(信号源)、Sinks(信号接收/显示) 与 Math Operations(数学运算) 是使用频率最高、构成绝大多数模型骨架的三大基础库。本章将深入剖析这三个库中核心模块的功能定位、参数配置方法、信号维度匹配规则,并结合实际工程场景讲解如何避免常见建模错误。
上图展示了三大模块库在模型中的典型信号流关系:Sources 产生激励信号,Math Operations 对信号进行运算处理,Sinks 负责将结果可视化或导出。理解这一基本链路是掌握 Simulink 建模的起点。下面我们将逐一剖析各库的核心模块。
3.1 Sources(信号源)模块库:为模型注入激励
3.1.1 核心原理与模块分类
Sources 库中的模块用于生成仿真所需的输入信号。这些信号可以是常数、时间函数、随机序列,也可以是从工作区(Workspace)或文件读取的数据。根据信号生成方式,可分为三类:
- 固定波形发生器:Step(阶跃)、Sine Wave(正弦波)、Ramp(斜坡)、Pulse Generator(脉冲)等,适合标准测试信号。
- 常数与随机源:Constant(常数)、Random Number(随机数)、Band-Limited White Noise(带限白噪声),用于稳态分析或噪声注入。
- 外部数据接口:From Workspace(从工作区)、From File(从文件)、Signal Builder(信号构建器),用于导入真实采集数据或复杂自定义波形。
3.1.2 关键参数设置与操作流程
以最常用的 Step(阶跃) 模块为例,双击模块打开参数对话框,需要配置以下核心参数:
| 参数名 | 含义 | 典型值/示例 | 注意事项 |
|---|---|---|---|
| Step time | 阶跃发生时刻(秒) | 1.0 | 必须大于等于仿真起始时间 |
| Initial value | 阶跃前的输出值 | 0 | 可为负数或非零值 |
| Final value | 阶跃后的输出值 | 1 | 决定信号幅值 |
| Sample time | 采样周期 | 0(连续) | 0 表示连续信号;大于 0 表示离散采样 |
对于 Sine Wave(正弦波),参数包括 Amplitude(幅值)、Bias(偏置)、Frequency(角频率,rad/s)、Phase(初相,rad)和 Sample time。注意:若 Sample time 设为 0,则输出连续正弦波;若设为大于 0 的值,则输出离散采样点。
3.1.3 案例拆解:使用 Signal Builder 构造多段自定义波形
场景:某电机驱动系统需要测试在不同转速指令下的响应。要求输入信号在 0~2s 为 500 rpm,2~5s 线性上升至 1000 rpm,5~8s 保持 1000 rpm,8~10s 阶跃下降至 300 rpm。
操作步骤:
- 从 Sources 库拖入 Signal Builder 模块,双击打开信号编辑界面。
- 在左侧信号列表中点击 "New Signal",命名为 "Speed_Command"。
- 在右侧波形编辑区,使用 "Point" 工具添加关键点:(0,500)、(2,500)、(5,1000)、(8,1000)、(8,300)、(10,300)。
- 点击 "File → Save" 保存信号组,关闭编辑器。
- 将 Signal Builder 输出连接到后续模型。仿真时,该模块会按时间轴输出插值后的信号。
结果对比:相比使用多个 Step 和 Ramp 模块组合,Signal Builder 将波形定义集中在一个界面,修改方便且直观。但需注意,Signal Builder 输出的是离散时间序列,默认采样时间由 "Sample Time" 参数控制(默认 0.1s),若需要更平滑的曲线,可减小采样步长。
3.1.4 常见误区与总结
另外,From Workspace 模块默认按 "时间-数据" 两列矩阵读取数据,若数据格式不符(如只有一列),会报错。建议使用 timeseries 对象或 [t, data] 两列矩阵。
3.2 Sinks(信号接收/显示)模块库:观测与导出仿真结果
3.2.1 核心原理与模块功能
Sinks 库的模块是信号的终点,用于显示、存储或终止信号。它们不改变信号值,但影响仿真效率与结果可读性。主要模块包括:
- Scope(示波器):最常用的可视化工具,可显示信号随时间变化的波形,支持多通道、缩放、游标测量。
- Display(数值显示):在仿真过程中实时显示当前时刻的信号数值,适合快速检查稳态值。
- To Workspace(导出到工作区):将信号数据保存为 MATLAB 变量,便于后续分析或绘图。
- Outport(输出端口):用于子系统(Subsystem)的对外接口,将信号传递到模型上层。
- Terminator(终止器):用于吸收未连接的输出信号,避免警告信息。
3.2.2 参数配置与操作流程
Scope 模块的参数设置重点:
| 配置项 | 位置 | 说明 |
|---|---|---|
| Number of input ports | Scope 工具栏 → 参数 | 设置输入通道数,可同时显示多路信号 |
| Time span | Scope 工具栏 → 参数 → Time | 设置时间轴显示范围,默认 "Auto" |
| Y-limits | Scope 工具栏 → 参数 → Axes | 手动设置纵轴范围,避免自动缩放导致波形失真 |
| Save data to workspace | Scope 参数 → Logging | 勾选后可将波形数据导出为变量 |
To Workspace 模块参数:Variable name(变量名)、Save format(Timeseries / Array / Structure)、Sample time(-1 表示继承输入信号采样时间)。推荐使用 Timeseries 格式,因为它保留时间信息,便于后续用 plot() 绘图。
3.2.3 案例拆解:多信号对比与数据导出
场景:验证 PID 控制器对阶跃输入的跟踪效果,需要同时观察参考输入、控制输出和系统响应三条曲线。
实施步骤:
- 在模型中将参考信号(Step)、控制器输出(PID 模块输出)、系统响应(被控对象输出)分别引出信号线。
- 从 Sinks 库拖入一个 Scope,双击打开,点击参数图标,将 "Number of input ports" 改为 3。
- 将三条信号线分别连接到 Scope 的三个输入端口。
- 在 Scope 参数 → Logging 中勾选 "Log data to workspace",变量名设为
sim_data,格式选 "Timeseries"。 - 运行仿真后,在 MATLAB 中执行
plot(sim_data.signals(1).values)可绘制第一条曲线。
结果对比:通过 Scope 的游标功能,可精确读取超调量峰值时刻与稳态误差。相比使用多个 Display 模块,Scope 能直观展示动态过程,且数据导出后可用 MATLAB 脚本进行量化分析(如计算 ITAE 指标)。
3.2.4 常见误区与总结
另外,Display 模块默认显示的是当前仿真时刻的瞬时值,若需要显示最终值,可在仿真停止后观察。若信号为向量,Display 会显示向量各元素值,注意区分。
3.3 Math Operations(数学运算)模块库:信号处理的核心引擎
3.3.1 核心原理与模块分类
Math Operations 库提供对信号进行数学变换的模块,是构建动态系统方程(如状态空间、传递函数)的基础。主要分类:
- 基本算术:Sum(求和)、Gain(增益)、Product(乘法)、Divide(除法)、Abs(值)、Unary Minus(取反)。
- 数学函数:Math Function(支持 sqrt、exp、log、log10、sin、cos 等)、Trigonometric Function(三角函数)、Sign(符号函数)、MinMax(取最值)。
- 逻辑与关系:Relational Operator(比较)、Logical Operator(与或非)、Combinatorial Logic(组合逻辑)。
- 复数与矩阵运算:Complex to Magnitude-Angle、Matrix Gain、Dot Product 等。
3.3.2 关键参数设置与信号维度匹配
Sum(求和) 模块的参数设置是重点:
| 参数 | 说明 | 示例 |
|---|---|---|
| Icon shape | 选择 "rectangular"(矩形)或 "round"(圆形) | rectangular |
| List of signs | 用 + 和 - 指定输入端口符号,如 "+-+" 表示三个输入,中间为负 | +- |
| Sample time | -1 继承,0 连续,>0 离散 | -1 |
Gain(增益) 模块参数:Gain 值可为标量、向量或矩阵。若输入为向量,Gain 为标量时逐元素相乘;Gain 为矩阵时执行矩阵乘法(需满足维度匹配)。
3.3.3 案例拆解:构建二阶系统的微分方程
场景:使用基础数学模块搭建质量-弹簧-阻尼系统(m=2kg, k=5N/m, c=1N·s/m)的仿真模型,输入为外力 F(t),输出为位移 x(t)。系统方程:m·x'' + c·x' + k·x = F。
建模步骤:
- 将方程改写为 x'' = (F - c·x' - k·x) / m。
- 使用两个 Integrator 模块(位于 Continuous 库)串联,第一个输出 x',第二个输出 x。
- 从 x' 和 x 引出信号线,分别乘以 c 和 k(使用 Gain 模块),再与外力 F(Step 模块)一起输入到 Sum 模块,符号设置为 "+--"(F 正,c·x' 和 k·x 负)。
- Sum 输出除以 m(使用 Gain 模块,增益 1/m=0.5),得到 x'',反馈到第一个 Integrator 的输入。
- 将 x 连接到 Scope 显示。
参数设置:Gain1 设为 1(对应 c),Gain2 设为 5(对应 k),Gain3 设为 0.5(对应 1/m)。Step 模块 Step time=0,Initial value=0,Final value=10(施加 10N 阶跃力)。
结果分析:仿真 10 秒,观察 Scope 中 x 的波形,应呈现衰减振荡,稳态值约为 F/k = 10/5 = 2m。通过调整 c 值可观察阻尼比对超调量的影响。
3.3.4 常见误区与总结
另一个常见错误是 Gain 模块的乘法方向。当输入为行向量时,Gain 为列向量会执行矩阵乘法导致维度错误。建议在模型中使用 size() 函数检查信号维度,或使用 Probe 模块(位于 Signal Attributes 库)查看信号尺寸。
3.4 三大模块库的协同使用与工程实践
3.4.1 模块库协同的典型模式
在实际工程模型中,三大库的模块往往交替使用。例如,一个典型的 PID 控制回路包含:Sources(Step 参考输入)→ Math Operations(Sum 计算误差、Gain 实现 PID 系数)→ 被控对象(由 Integrator、Gain 等构建)→ Sinks(Scope 显示、To Workspace 记录)。
3.4.2 性能优化与调试技巧
- 减少 Scope 数量:使用 "Signal Logging"(信号记录)功能,右键点击信号线选择 "Log Selected Signals",仿真结束后用
Simulink.sdi.View查看。 - 使用 Bus 信号:当多路信号需要同时传递时,使用 Bus Creator(位于 Signal Routing 库)将信号打包,减少连线杂乱。
- 参数批量修改:使用 MATLAB 脚本批量设置 Gain 参数,例如
set_param('model/Gain','Gain','2.5')。
3.4.3 案例复盘:从模型到代码生成的注意事项
若模型最终需要生成嵌入式代码(使用 Simulink Coder),需注意:
- 避免使用 Scope 和 Display 模块,它们不参与代码生成。
- To Workspace 模块在代码生成时会被忽略,应改用 Outport 或信号记录。
- Math Function 模块中的某些函数(如 log10)在嵌入式目标上可能不支持,需查阅目标硬件支持库。
通过本章的学习,读者应能够熟练使用 Sources 库生成各类激励信号,利用 Sinks 库观测和导出仿真结果,并运用 Math Operations 库构建基本的数学运算链路。下一阶段,我们将在此基础上深入连续与离散系统的建模方法,敬请期待。