第3章 Simulink模型基础:创建简单的Simulink模型、添加CAN Pack/Unpack模块、配置CAN报文信号
好,咱们进入正题。这一章,我带你亲手搭建第一个能用的Simulink模型。别小看这一步,很多新手上来就搞复杂逻辑,结果CAN报文怎么都发不出去——其实就是最基础的Pack/Unpack没搞对。
3.1 从零搭建一个Simulink模型
打开MATLAB,在命令行敲个simulink,或者直接点工具栏上的图标。新建一个空白模型,我习惯先保存一下,比如叫CAN_Demo.slx。为什么?因为Simulink偶尔会崩溃,你懂的。
模型里先拖几个基础模块进来:
- Constant(常数模块)——用来模拟传感器信号,比如车速、转速
- Scope(示波器)——看波形,调试用
- Outport(输出端口)——把信号引出到工作空间
连起来很简单:Constant → Scope。跑一下仿真,你会看到一条直线。嗯,这没什么好激动的,但至少证明你的Simulink环境是好的。
3.2 添加CAN Pack模块——把信号打包成报文
现在来点真格的。从Simulink库浏览器里找到Vehicle Network Toolbox,拖一个CAN Pack模块到模型里。
双击打开配置界面,你会看到:
- CAN Identifier:报文ID,比如0x123(标准帧)或0x18FF1234(扩展帧)
- Message Length:数据长度,单位字节。一般8字节,但有些ECU只认特定长度
- Signals:信号列表,这里要手动添加
点“Add”按钮,添加一个信号。我举个例子:
| 信号名 | 起始位 | 长度(bit) | 数据类型 | 缩放因子 | 偏移量 |
|---|---|---|---|---|---|
| VehicleSpeed | 0 | 16 | uint16 | 0.01 | 0 |
| EngineRPM | 16 | 16 | uint16 | 0.125 | 0 |
注意起始位和长度。我见过有人把两个信号重叠了,结果报文解析出来全是乱码。嗯,这里要仔细核对DBC文件里的定义。
3.3 配置CAN Unpack模块——从报文里拆出信号
有打包就有拆包。拖一个CAN Unpack模块进来,配置方式和Pack几乎一样。区别在于:
- Pack的输入是信号值,输出是CAN报文
- Unpack的输入是CAN报文,输出是信号值
我习惯把Pack和Unpack放在同一个模型里,方便做回环测试。比如:
Constant(车速值) → CAN Pack → CAN Unpack → Scope
跑一下仿真,如果Scope里看到的波形和输入一致,说明配置没问题。
这里有个细节:CAN Unpack的输出信号名要和Pack里定义的一致,否则Simulink会报错。我刚开始学的时候,经常因为大小写不匹配折腾半天。
3.4 配置CAN报文信号——实战中的那些坑
信号配置看起来简单,但实际项目里花样很多。我总结几个常见问题:
- 字节序(Byte Order):Intel格式(小端)还是Motorola格式(大端)?大部分乘用车用Intel,商用车用Motorola。选错了,信号值会差很多。
- 缩放因子和偏移量:物理值 = 原始值 × 缩放因子 + 偏移量。比如车速信号,原始值0x0000对应0km/h,0xFFFF对应655.35km/h。这个在DBC文件里都有定义。
- 信号方向:发送端用Pack,接收端用Unpack。别搞反了,否则模型跑起来数据流是反的。
3.5 完整示例:一个简单的车速发送模型
来,咱们搭一个完整的例子。假设你要发送车速信号(ID=0x123,标准帧,8字节数据):
1. 拖入Constant模块,设置常数值为500(代表50.0 km/h,缩放因子0.1)
2. 拖入CAN Pack模块,配置:
- ID: 0x123
- 长度: 8
- 信号: VehicleSpeed, 起始位0, 长度16bit, uint16, 缩放0.01, 偏移0
3. 连接 Constant → CAN Pack
4. 拖入CAN Unpack模块,配置相同信号
5. 拖入Scope,连接 CAN Unpack → Scope
6. 运行仿真,看Scope波形是不是500
如果Scope显示500,恭喜你,第一个CAN通信模型跑通了。如果显示的不是500,检查一下缩放因子和数据类型。
嗯,到这里你已经掌握了Simulink里CAN通信的基本操作。下一章咱们会把这个模型和CANalyzer连起来,真正实现联合仿真。到时候你会看到,模型里的信号变成真实的CAN报文在总线上跑——那感觉,比看Scope波形爽多了。