3. MATLAB/Simulink基础:Simulink界面介绍、常用模块库、信号线连接、子系统封装

好,咱们今天聊聊Simulink。说实话,很多做车辆控制的朋友,一开始接触Simulink都觉得它像个黑盒子——拖拖拽拽就能跑仿真,但真要自己搭个模型,又不知道从哪下手。我当年刚入行时也是这样,看着满屏的模块发懵。别急,咱们一步步来。

3.1 Simulink界面:别被它吓到

打开Simulink,你会看到一个这样的界面:最上面是菜单栏和工具栏,左边是浏览器(Library Browser),中间大片空白就是你的画布——模型编辑区。嗯,就这么简单。

我个人习惯,一上来先做两件事:

  • 设置模型参数:点菜单栏的 Simulation → Model Configuration Parameters,把求解器(Solver)改成固定步长(Fixed-step)。为什么?因为咱们做CarSim联合仿真时,车辆动力学模型通常要求固定步长,否则容易发散。我吃过这个亏,仿真跑到一半直接崩了。
  • 打开Library Browser:快捷键 Ctrl+Shift+L,或者点工具栏那个小图标。所有模块都在这了。
小技巧:在模型编辑区按空格键,可以自动缩放视图。按住鼠标滚轮拖动,可以平移画布。这些快捷键用熟了,效率翻倍。

3.2 常用模块库:你真正需要记住的

Simulink的模块库有几十个,但做车辆仿真常用的,其实就那么几个。我给大家列个表,省得你们一个个翻。

模块库 常用模块 用途
Sources(信号源) Constant, Step, Sine Wave, Ramp 生成输入信号,比如油门开度、制动压力
Sinks(信号接收) Scope, To Workspace, Display 查看仿真结果,或者把数据存到MATLAB工作区
Math Operations(数学运算) Add, Subtract, Gain, Product, Abs 做加减乘除、增益、取绝对值等
Continuous(连续系统) Integrator, Derivative, Transfer Fcn 积分、微分、传递函数——车辆动力学建模必备
Discrete(离散系统) Unit Delay, Discrete Transfer Fcn 离散控制器的实现,比如PID
Signal Routing(信号路由) Mux, Demux, Bus Creator, Switch 把多个信号合并或分开,或者做条件判断
User-Defined Functions(自定义函数) MATLAB Function, S-Function 写自己的算法,比如复杂的控制逻辑

你想想看,一个典型的车辆动力学模型,无非就是:输入信号(油门、刹车、转向)→ 数学运算(计算力、力矩)→ 连续系统(积分求速度、位移)→ 输出显示(Scope看曲线)。说白了,就这几样东西来回组合。

避坑指南:我曾经在项目里用错了模块类型——把连续积分器(Integrator)用在了离散控制器里,结果仿真结果怎么都对不上。后来才发现,连续和离散模块不能混用,除非你明确知道自己在做什么。记住:车辆动力学用连续模块,控制器用离散模块。

3.3 信号线连接:别让线乱成一团

拖模块谁都会,但连线是有讲究的。我见过不少新手,模型搭得跟蜘蛛网似的,自己都看不懂。这里分享几个原则:

  • 从左到右布局:输入在左,处理在中间,输出在右。这是Simulink的默认流向,别反着来。
  • 信号线要直:按住Shift键拖动,可以画直线。别让线拐来拐去。
  • 给信号线命名:双击信号线,输入名字。比如“车速”、“发动机扭矩”。这样模型可读性会好很多。
  • 用Mux合并信号:如果多个信号要一起进Scope,用Mux模块合并成向量,别一根一根地连。

举个例子,假设你要把车速和发动机转速同时显示在Scope里:

1. 拖一个Mux模块到画布
2. 把“车速”信号连到Mux的第一个输入
3. 把“发动机转速”信号连到Mux的第二个输入
4. Mux的输出连到Scope
5. 双击Scope,点工具栏的“参数”图标,把“Number of axes”改成2

这样Scope里就会显示两个独立的子图,一个车速,一个转速。清晰明了。

注意:信号线不能交叉!如果必须交叉,用“Goto”和“From”模块来传递信号。Goto相当于给信号起个名字,From相当于引用这个名字。这样模型看起来清爽,也不会出错。

3.4 子系统封装:让你的模型像乐高一样

模型大了以后,全堆在一个画布里根本没法看。这时候就需要子系统(Subsystem)了。说白了,就是把一组相关的模块打包成一个“黑盒子”,只露出输入输出接口。

创建子系统有两种方式:

  • 方法一:选中你要打包的模块,右键 → Create Subsystem from Selection。Simulink会自动帮你生成一个子系统,并把选中的模块放进去。
  • 方法二:先拖一个Subsystem模块到画布,双击进去,在里面搭模型。

我个人更推荐方法一,因为省事。但方法二适合从头设计。

封装(Mask)是子系统的进阶用法。封装后的子系统,可以有自己的参数对话框、图标、文档。比如你做一个“PID控制器”子系统,封装后可以设置Kp、Ki、Kd三个参数,双击就能改,不用进到里面去。

封装步骤:

1. 右键子系统 → Mask → Create Mask
2. 在“Parameters & Dialog”选项卡里,添加参数(比如Kp, Ki, Kd)
3. 在“Initialization”选项卡里,把参数赋值给内部变量
4. 在“Icon”选项卡里,可以画个图标,比如写个“PID”字样

封装的好处是什么?你想想看,一个整车模型可能有几十个子系统:发动机模型、变速箱模型、制动系统、转向系统……每个都封装好,参数可调,整个模型就像搭乐高一样,清晰、可复用、易维护。

我的经验:在CarSim联合仿真中,我通常会把CarSim的接口封装成一个子系统,叫“CarSim Vehicle”。这样模型里就只有一个模块,输入是油门、制动、转向,输出是车速、横摆角速度等。调试的时候,只需要改这个子系统的参数,不用动其他部分。

3.5 本章知识体系

下面这张图,是我自己总结的Simulink基础知识框架。你可以把它当作一个“地图”,以后遇到问题,先看看自己卡在哪一层。

Simulink基础:知识体系 1. Simulink界面 菜单栏 | 工具栏 | Library Browser | 模型编辑区 | 配置参数 2. 常用模块库 Sources | Sinks | Math Operations | Continuous | Discrete | Signal Routing | User-Defined 3. 信号线连接 从左到右布局 | 直线连接 | 信号命名 | Mux合并 | Goto/From传递 4. 子系统封装 创建子系统 | 封装(Mask) | 参数对话框 | 图标设计 | 可复用模型 从界面到封装,层层递进,每一步都是后面联合仿真的基础

嗯,这张图把咱们今天讲的内容串起来了。从界面认识,到模块库选择,再到信号线连接,最后到子系统封装——这是一个从“会用”到“会搭”再到“会设计”的过程。别小看这些基础,我见过不少做了好几年仿真的工程师,模型依然乱得没法看,就是因为基础没打牢。

好了,今天就到这。记住:Simulink只是个工具,真正值钱的是你脑子里的控制逻辑和车辆动力学知识。工具用得顺手,想法才能跑得快。


公众号:蓝海资料掘金营,微信deep3321