Simulink CAN 通信
本章节介绍如何使用 MATLAB、Simulink 及 Vehicle Network Toolbox 与 CAN/CAN FD 设备建立 CAN 总线通信,包括软件环境配置、设备识别、Simulink 模型搭建以及报文发送与接收等内容。
概述
MATLAB 是用于算法开发、数据分析和自动化测试的工程计算平台,Simulink 是 MATLAB 的图形化建模与仿真环境。借助 Vehicle Network Toolbox,用户可以在 MATLAB 或 Simulink 中访问 CAN/CAN FD 网络,实现报文收发、总线监控、数据记录以及 DBC 信号解析等功能;如需实时仿真或硬件在环(HIL)测试,还需要结合对应的实时仿真平台和项目硬件环境。
Vehicle Network Toolbox 支持多种主流 CAN 接口设备,常见包括 PEAK-System PCAN、Vector 和 Kvaser 等。不同 MATLAB 版本的硬件支持范围可能不同,实际项目中应以 MathWorks 当前支持列表和本机识别结果为准。
核心功能:
- 支持 CAN 2.0 与 CAN FD 通信(取决于硬件、驱动和 MATLAB 版本)
- 支持 MATLAB 脚本和 Simulink 模型两种使用方式
- 支持 DBC 文件导入、信号解析和报文打包/解包
- 支持多通道 CAN 网络通信
- 支持报文记录、分析和回放
- 可配合实时仿真平台用于 HIL 或自动化测试场景
前置条件
在使用 MATLAB / Simulink 进行 CAN 通信前,请确保已具备以下条件:
硬件环境
- 已连接 CAN 或 CAN FD 接口设备
- CAN 总线连接正常
- 总线终端电阻配置正确
驱动环境
根据所使用设备安装对应厂商驱动,确认设备已被操作系统正常识别。
MATLAB 安装
前往 MathWorks 官网下载并安装 MATLAB。
安装过程中建议勾选以下组件:
| 组件 | 用途 |
|---|---|
| MATLAB | 编程与数据分析环境 |
| Simulink | 图形化建模与仿真 |
| Vehicle Network Toolbox | CAN/CAN FD 通信 |
| Simulink Coder | 代码生成(可选) |
| Embedded Coder | 嵌入式开发(可选) |
安装完成后,可在 MATLAB 命令窗口执行:
ver列表中应当存在 Vehicle Network Toolbox 、Simulink
Simulink CAN 通信搭建
本节以 Classic CAN 收发模型为例,演示在 Simulink 中完成 CAN Configuration、发送链路和接收链路的基本配置。MathWorks 官方搭建流程可参考:
https://ww2.mathworks.cn/help/vnt/ug/build-can-communication-simulink-models.html
创建Simulink工程
在 MATLAB® 命令提示符下输入以下内容:
simulink
在 Simulink 起始页对话框中,点击空白模型,然后点击创建模型。将打开一个空的“编辑器”窗口。

在“编辑器”工具条的仿真选项卡上,点击保存 > 另存为为新模型指定名称。
模型结构
模型整体由两部分组成:
- 发送链路:
Constant->CAN Pack->CAN Transmit - 接收链路:
CAN Receive->Function-Call Subsystem->CAN Unpack->Scope
配置完成后的模型结构如下:

发送链路配置
- 添加 CAN Configuration 模块,选择对应设备、波特率和模式。

- 添加 Constant 模块作为发送数据源,并配置要发送的字节数据和类型。


- 添加 CAN Pack 模块,配置报文 ID、帧类型、DLC 和输入信号映射。

- 添加 CAN Transmit 模块,选择与 CAN Configuration 一致的设备和通道。

接收链路配置
- 添加 CAN Receive 模块,配置接收通道、采样方式和过滤条件。

- 添加 Function-Call Subsystem,用于在收到报文后触发解析逻辑。

- 在子系统中添加 CAN Unpack 模块,配置要解析的报文 ID 和输出信号。

模型设置与运行
打开模型设置,确认求解器、步长和运行时间满足测试需求。CAN 通信模型通常建议使用固定步长离散求解器。

配置完成后,打开 Scope,点击 Run 运行模型,即可观察接收链路解析后的数据变化。

MATLAB 脚本方式
除 Simulink 模型外,也可以在 MATLAB 脚本中创建 CAN 通道并收发报文。典型流程如下:
% 先查看本机可用通道,再按实际识别结果填写 vendor、device 和 channel
canChannelList
ch = canChannel("VendorName", "DeviceName", 1);
configBusSpeed(ch, 500000);
start(ch);
msg = canMessage(100, false, 8);
msg.Data = uint8([1 2 3 4 5 6 7 8]);
transmit(ch, msg);
rx = receive(ch, 1);
stop(ch);CAN FD 脚本应使用 CAN FD 对应的通道和报文接口,并分别配置仲裁域和数据域波特率。具体函数名称和参数以当前 MATLAB 版本文档为准。
