2、MATLAB/Simulink基础:Simulink建模环境、常用模块库、信号与数据类型
好,咱们正式开始啃Simulink这块硬骨头。
说实话,我刚开始接触Simulink的时候,觉得它就是个画框框连线的玩具。直到有一次,我在做ADAS的ACC功能开发,模型跑出来的结果跟实车数据差了十万八千里。排查了三天,最后发现是一个数据类型转换的问题。嗯,从那以后,我再也不敢小看这个“玩具”了。
2.1 Simulink建模环境:你的数字试验台
打开Simulink,你看到的其实就是一个数字化的试验台。左边是模块库浏览器,中间是画布,上面是工具栏。我个人习惯先把Library Browser拖出来固定住,这样找模块方便很多。
这里有个小细节:Simulink的启动速度取决于你安装的工具箱数量。如果你只做MIL,装个Simulink和Stateflow就够了。我曾经见过有人把整个MATLAB全家桶都装上,结果启动要等两分钟……
2.2 常用模块库:你的工具箱
Simulink的模块库分类很清晰,但常用的其实就那么几类。我按使用频率给你排个序:
| 模块库 | 常用模块 | 我的使用场景 |
|---|---|---|
| Sources(信号源) | Constant, Sine Wave, Step, From Workspace | 给模型注入测试信号,比如给一个阶跃信号看响应 |
| Sinks(信号接收) | Scope, To Workspace, Display | 看波形、存数据、调试用 |
| Math Operations(数学运算) | Add, Gain, Product, Abs | 加减乘除,最基础的计算 |
| Continuous(连续系统) | Integrator, Derivative, Transfer Fcn | 做车辆动力学模型时必用 |
| Discrete(离散系统) | Unit Delay, Discrete Transfer Fcn | SIL/HIL仿真时,离散化是必须的 |
| Ports & Subsystems(端口与子系统) | Subsystem, Model, Inport, Outport | 模块化设计,把大模型拆成小模块 |
这里我要特别说一下Scope模块。很多人觉得Scope就是看个波形,其实它有个隐藏功能——可以导出数据到工作区。我在做MIL测试时,经常用Scope记录仿真数据,然后拉到MATLAB里做后处理分析。
2.3 信号与数据类型:模型的“血液”
信号在Simulink里就像血液,数据类型就是血型。血型不对,模型就会“溶血”。
Simulink支持的数据类型很多,但常用的就这几个:
- double(双精度浮点):默认类型,精度高,但占用资源多。MIL仿真时我基本都用它。
- single(单精度浮点):精度稍低,但节省内存。SIL/HIL仿真时常用。
- int8/int16/int32(有符号整数):ECU里最常用的类型。做代码生成时,必须搞清楚你的目标芯片支持哪种。
- boolean(布尔型):只有0和1,用于逻辑判断。
- bus(总线型):把多个信号打包成一个,就像快递包裹。我在做整车模型时,经常用Bus把车速、加速度、方向盘转角打包在一起。
信号线的颜色也有讲究:
- 蓝色线:double类型
- 绿色线:整数类型
- 红色线:布尔类型
- 黑色线:总线类型
你想想看,如果模型里突然出现一根红线,那说明有个布尔信号混进来了。我曾经排查过一个bug,就是因为在加法器里混进了一个布尔信号,结果1+1=1,怎么算都不对。
2.4 信号属性与维度
信号除了有类型,还有维度。一维信号就是标量,二维信号就是向量,三维以上就是矩阵。
举个例子:
- 一个车速信号:标量(1x1)
- 四个轮速信号:向量(4x1)
- 一个3x3的旋转矩阵:矩阵(3x3)
在Simulink里,信号维度用方括号表示。比如[4x1]表示4行1列的向量。我刚开始做车辆动力学模型时,经常搞混矩阵乘法和点乘。记住:*是矩阵乘法,.*是元素乘法。这个坑我踩过不止一次。
% 在MATLAB工作区定义信号
vx = 10; % 纵向车速,标量
vy = 0; % 横向车速,标量
yaw_rate = 0.2; % 横摆角速度,标量
% 在Simulink中,可以用From Workspace模块导入这些信号
% 也可以用Bus Creator打包成总线信号
vehicle_state = Simulink.Bus;
vehicle_state.Elements(1) = Simulink.BusElement;
vehicle_state.Elements(1).Name = 'vx';
vehicle_state.Elements(1).DataType = 'double';
vehicle_state.Elements(2).Name = 'vy';
vehicle_state.Elements(2).DataType = 'double';
vehicle_state.Elements(3).Name = 'yaw_rate';
vehicle_state.Elements(3).DataType = 'double';
2.5 实战:搭建一个简单的车辆纵向动力学模型
光说不练假把式。咱们搭一个最简单的车辆纵向动力学模型,把今天学的都用上。
模型功能:输入油门开度(0-100%),输出车速(m/s)。
- 信号源:用Constant模块输入油门开度,数据类型设为double。
- 计算驱动力:用Gain模块,增益设为最大驱动力(比如10000N)。
- 计算阻力:用Math Function模块,选择平方函数,模拟空气阻力。
- 计算加速度:用Add模块,驱动力减去阻力,再除以车辆质量。
- 积分求速度:用Integrator模块,对加速度积分。
- 显示结果:用Scope模块看车速波形。
这个模型虽然简单,但包含了信号源、数学运算、连续系统、信号接收四大类模块。你把这个跑通了,Simulink的基本操作就算入门了。
最后说一句:别怕犯错。我在这个行业干了十几年,每次打开Simulink都还能学到新东西。模型跑不通?那是它在教你。报错信息看不懂?那是你还没跟它混熟。慢慢来,不着急。