第1章:Simulink基础建模(上)

各位同学,欢迎来到Simulink建模的世界。我是你们的老朋友,一个在汽车电子嵌入式领域摸爬滚打了十几年的工程师。今天咱们聊聊Simulink最基础的东西——库浏览器、常用模块、模型搭建,还有子系统。

说实话,很多人觉得基础模块没啥好讲的,不就是拖拖拽拽吗?但我见过太多项目,因为基础不牢,后期改模型改到崩溃。所以,咱们还是踏踏实实把地基打牢。

1.1 Simulink库浏览器详解

打开MATLAB,在命令行输入 simulink,或者直接点工具栏上的Simulink图标,就会弹出库浏览器。嗯,这里就是你的“零件仓库”。

我个人习惯把库浏览器固定在桌面左侧,方便随时拖模块。库浏览器按功能分类,比如:

  • Commonly Used Blocks:常用模块,新手可以先看这里。
  • Sources:信号源,产生各种输入信号。
  • Sinks:接收器,显示或保存信号。
  • Continuous / Discrete:连续与离散系统模块。
  • Math Operations:数学运算模块。

你想想看,这就像乐高积木,每个模块都有特定的功能。双击模块可以设置参数,右键可以查看帮助。我在项目中遇到过一位同事,拖了个积分模块直接用,结果仿真报错——他没设置初始条件。所以,别小看这些细节。

小技巧: 在库浏览器搜索框里直接输入模块名(比如“Gain”),比翻目录快得多。我每次建模型都靠这个省时间。

1.2 常用模块详解

咱们挑几个最常用的模块,一个一个说清楚。

1.2.1 信号源(Sources)

信号源就是给模型“喂数据”的。常用的有:

  • Constant:输出一个常数。比如给个5V参考电压。
  • Sine Wave:正弦波。做信号处理时经常用。
  • Step:阶跃信号。测试系统响应,比如看它从0跳到1时怎么反应。
  • Ramp:斜坡信号。模拟缓慢变化的输入。

我记得有一次做电机控制仿真,需要模拟一个缓慢加速的指令。用Ramp模块设置斜率,比手动写信号方便多了。

1.2.2 数学运算(Math Operations)

数学运算模块,说白了就是做加减乘除、三角函数这些。常用的有:

  • Gain:增益模块,乘一个常数。比如把传感器信号放大10倍。
  • Sum:求和模块,可以加减多个信号。
  • Product:乘法模块,两个信号相乘。
  • Trigonometric Function:三角函数,比如sin、cos。

这里有个坑:Gain模块默认是矩阵乘法,如果你只想标量乘,记得在参数里选“Multiplication: Element-wise(K.*u)”。我曾经因为没注意这个,仿真结果完全不对,排查了半天。

1.2.3 连续/离散系统(Continuous / Discrete)

这部分是控制系统的核心。连续系统模块包括:

  • Integrator:积分器。比如速度积分得到位置。
  • Derivative:微分器。比如位置微分得到速度。
  • Transfer Fcn:传递函数。用拉普拉斯形式描述系统。

离散系统模块包括:

  • Unit Delay:单位延迟。相当于Z变换中的z⁻¹。
  • Discrete-Time Integrator:离散积分器。
  • Discrete Transfer Fcn:离散传递函数。

为什么要有连续和离散之分?因为实际控制器是数字的(离散),而被控对象往往是物理的(连续)。仿真时混用要小心,我建议统一用离散模块,更贴近真实代码。

1.2.4 接收器(Sinks)

接收器用来“看”仿真结果。常用的有:

  • Scope:示波器。实时显示波形,最常用。
  • Display:数字显示。看当前数值。
  • To Workspace:把数据存到MATLAB工作区,方便后续分析。
  • To File:保存到文件。

我个人习惯用Scope看趋势,用To Workspace存数据做后处理。注意,Scope默认只显示最近5000个点,如果仿真时间长,记得在参数里改大。

1.3 模型的创建、连接与仿真

好,模块认识了,咱们开始搭模型。步骤很简单:

  1. 新建模型:在库浏览器点“New Model”,或者按Ctrl+N。
  2. 拖模块:从库浏览器拖到模型画布上。
  3. 连信号线:鼠标左键点住输出端口,拖到输入端口松开。
  4. 设置参数:双击模块,填参数。
  5. 仿真:点工具栏的“Run”按钮,或者按Ctrl+T。

举个例子,搭一个最简单的模型:正弦波 -> 增益 -> 示波器。

1. 拖一个Sine Wave模块(Sources库)
2. 拖一个Gain模块(Math Operations库),双击设Gain=2
3. 拖一个Scope模块(Sinks库)
4. 连线:Sine Wave输出 -> Gain输入,Gain输出 -> Scope输入
5. 点Run,看Scope里波形幅值翻倍了

是不是很简单?但别急,这里有个细节:信号线可以分支。按住Ctrl键,在线上点一下,就能拉出分支线。我在项目中经常用分支,把同一个信号送给多个模块。

注意: 连线时别连错端口。Simulink会检查数据类型,如果类型不匹配,线会变成红色虚线。我曾经因为把double信号连到int输入上,仿真直接报错。

1.4 子系统(Subsystem)的概念与创建

模型一复杂,画布上全是模块,看着就头疼。这时候就需要子系统了。子系统,说白了就是把一组模块打包成一个“黑盒子”,让模型更整洁。

创建子系统有两种方法:

  • 方法一:先画好模块,再打包。 选中要打包的模块,右键 -> Create Subsystem。Simulink会自动生成一个子系统,并把选中的模块放进去。
  • 方法二:先拖一个Subsystem模块,再往里放模块。 从Ports & Subsystems库拖一个Subsystem模块,双击打开,在里面搭模型。

我个人更推荐方法一,因为不用提前规划端口。子系统默认有输入输出端口(In1, Out1),你可以根据需要添加或删除。

举个例子,把刚才的正弦波增益模型打包成子系统:

1. 选中Sine Wave和Gain模块(按住Shift多选)
2. 右键 -> Create Subsystem
3. 双击子系统,看到里面有两个模块,外面多了一个输入端口和一个输出端口
4. 把子系统的输入连到Sine Wave,输出连到Scope

子系统还有个好处:可以设置参数。比如把Gain的值暴露到子系统外面,方便上层修改。这个叫“参数化”,后面章节会细讲。

核心要点: 子系统不是必须的,但它是模块化设计的基础。我见过一个项目,整个模型就一个层级,上千个模块堆在一起,改个参数要找半天。用了子系统后,结构清晰,团队协作也方便。

知识体系总览

为了让你更直观地理解本章内容,我画了一张图,展示Simulink基础建模的核心逻辑。

Simulink基础建模知识体系 Simulink库浏览器 信号源 / 数学运算 连续/离散系统 / 接收器 模型创建与连接 仿真与结果查看 子系统(Subsystem) 模块化封装 层级化设计 从库浏览器取模块 -> 搭建模型 -> 仿真验证 -> 用子系统管理复杂度

这张图把本章的知识点串起来了。你从库浏览器拿模块,搭好模型,仿真看结果。模型复杂了,就用子系统打包。环环相扣,缺一不可。

好了,第一章的内容就到这里。记住,基础模块虽然简单,但每个参数、每个连线方式都可能影响仿真结果。多动手,多试错,慢慢就有感觉了。


专注资料整理