第1章:Simulink基础建模(上)
各位同学,欢迎来到Simulink建模的世界。我是你们的老朋友,一个在汽车电子嵌入式领域摸爬滚打了十几年的工程师。今天咱们聊聊Simulink最基础的东西——库浏览器、常用模块、模型搭建,还有子系统。
说实话,很多人觉得基础模块没啥好讲的,不就是拖拖拽拽吗?但我见过太多项目,因为基础不牢,后期改模型改到崩溃。所以,咱们还是踏踏实实把地基打牢。
1.1 Simulink库浏览器详解
打开MATLAB,在命令行输入 simulink,或者直接点工具栏上的Simulink图标,就会弹出库浏览器。嗯,这里就是你的“零件仓库”。
我个人习惯把库浏览器固定在桌面左侧,方便随时拖模块。库浏览器按功能分类,比如:
- Commonly Used Blocks:常用模块,新手可以先看这里。
- Sources:信号源,产生各种输入信号。
- Sinks:接收器,显示或保存信号。
- Continuous / Discrete:连续与离散系统模块。
- Math Operations:数学运算模块。
你想想看,这就像乐高积木,每个模块都有特定的功能。双击模块可以设置参数,右键可以查看帮助。我在项目中遇到过一位同事,拖了个积分模块直接用,结果仿真报错——他没设置初始条件。所以,别小看这些细节。
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 模型的创建、连接与仿真
好,模块认识了,咱们开始搭模型。步骤很简单:
- 新建模型:在库浏览器点“New Model”,或者按Ctrl+N。
- 拖模块:从库浏览器拖到模型画布上。
- 连信号线:鼠标左键点住输出端口,拖到输入端口松开。
- 设置参数:双击模块,填参数。
- 仿真:点工具栏的“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键,在线上点一下,就能拉出分支线。我在项目中经常用分支,把同一个信号送给多个模块。
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基础建模的核心逻辑。
这张图把本章的知识点串起来了。你从库浏览器拿模块,搭好模型,仿真看结果。模型复杂了,就用子系统打包。环环相扣,缺一不可。
好了,第一章的内容就到这里。记住,基础模块虽然简单,但每个参数、每个连线方式都可能影响仿真结果。多动手,多试错,慢慢就有感觉了。