第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环境是好的。

我的小习惯: 每个Constant模块我都重命名,比如“EngineSpeed_RPM”。别偷懒用默认的“Constant1”,否则模型大了你自己都找不到北。

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文件里的定义。

避坑指南: 我曾经在项目里把信号长度设成了15位(奇数位),结果CANalyzer那边怎么都解析不对。后来发现CAN信号长度必须是8的倍数?不,其实可以是任意长度,但很多工具对非标准长度支持不好。建议尽量用8、16、32位。

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报文信号——实战中的那些坑

信号配置看起来简单,但实际项目里花样很多。我总结几个常见问题:

  1. 字节序(Byte Order):Intel格式(小端)还是Motorola格式(大端)?大部分乘用车用Intel,商用车用Motorola。选错了,信号值会差很多。
  2. 缩放因子和偏移量:物理值 = 原始值 × 缩放因子 + 偏移量。比如车速信号,原始值0x0000对应0km/h,0xFFFF对应655.35km/h。这个在DBC文件里都有定义。
  3. 信号方向:发送端用Pack,接收端用Unpack。别搞反了,否则模型跑起来数据流是反的。
实战经验: 我在做ADAS项目时,有个毫米波雷达的信号一直读不到。查了两天,最后发现是CAN Unpack里的信号起始位写错了——DBC里是从0开始数,我习惯从1开始数。从那以后,我每次配置信号都拿DBC文件对照着看,一个位一个位对。

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波形爽多了。

课后练习: 试着在同一个CAN Pack里添加三个信号:车速、转速、水温。配置不同的起始位和长度,然后用CAN Unpack拆出来,看看Scope上三个波形是不是独立的。