关于 matlab-import-export-vehicle-data
这项技能借助 Vehicle Network Toolbox 和 MDF 函数,在 MATLAB 中导入、解码和导出车辆网络日志。它按格式指导 CAN、CAN FD 和 LIN 工作流、数据库解码及 MDF 或 BLF 导出,并考虑 MATLAB 版本限制。
主要功能
- 01导入 MDF、MF4、DAT、BLF、ASC 和 TXT 日志
- 02解码 CAN、CAN FD 和 LIN 数据
- 03使用 DBC、ARXML 和 LDF 数据库
- 04处理多态读取结果
- 05将 timetable 导出为 MDF 或将 CAN 数据导出为 BLF
适用场景
- 01使用 DBC 解码记录的 CAN 信号
- 02从 BLF 或 MDF 文件读取 LIN 数据
- 03将 MATLAB timetable 导出为 MDF
- 04将 CAN 或 CAN FD 消息写入 BLF
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ matlab/ matlab-agentic-toolkit --skill matlab-import-export-vehicle-data安装后在 Claude Code 中输入/matlab-import-export-vehicle-data确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
manifest.yamlreferences/asc-import.mdblf-import.mdblf-writing.mdcan-decode.mdcanfd-decode.mddatabase-objects.mddbc-multiplexing-syntax.mdlin-decode.mdmdf-import.mdmdf-writing.mdsimple-demultiplexing.md详细介绍
导入、导出和解码车辆数据
使用 Vehicle Network Toolbox(VNT)在 MATLAB 中导入、解码和导出车辆网络日志文件。
适用场景
- 读取
.mf4/.mdf/.dat、.blf、.asc或.txt车辆总线日志文件 - 通过 DBC 或 ARXML 数据库将原始 CAN/CAN FD 帧解码为信号
- 对于简单多路复用的情况(R2026a 或更早版本),通过 DBC 数据库从原始 CAN/CAN FD 帧中解复用信号
- 通过 LDF 数据库解码 LIN 帧(R2025a+)
- 处理 VNT 读取函数返回的多态类型
- 使用
mdfWrite将 MATLAB timetable 数据写入 MDF/MF4 文件 - 使用
blfwrite将 CAN/CAN FD 消息数据写入 BLF 文件 - 转换不受支持的 timetable 类型(logical、categorical、cell、datetime 列),以便导出为 MDF
不适用场景
- Simulink CAN 配置
- 实时访问 CAN 通道
- XCP/A2L 工作流
- 对层级或扩展多路复用情况下的信号进行解复用
- 通过 ARXML 或 LIN 数据库解复用信号
- 将 LIN 数据写入 BLF(VNT 的
blfwrite不支持——请改用 MDF) - 写入 ASC 或 TXT 文件(不存在
canMessageExport——请改用 BLF 或 MDF)
前置条件
运行任何操作之前,先确定 MATLAB 版本:
r = matlabRelease;
tok = regexp(r.Release, 'R(\d{4})([ab])', 'tokens');
matlabYear = str2double(tok{1}{1});
matlabLetter = tok{1}{2};
调用 BLF/ASC/TXT 导入函数或 CAN/CAN FD/LIN 解码函数之前,请调用 detect_matlab_toolboxes 确认已安装 Vehicle Network Toolbox。如果不可用,请告知用户。在当前会话中确认后,无需再次检查。
MDF 函数(mdfRead、mdfChannelGroupInfo、mdfInfo、mdfChannelInfo)属于基础 MATLAB(R2023a+),不需要 VNT。不要使用已弃用的 mdf() 对象构造函数——始终使用函数式 API。若要直接读取所有组,可以仅使用 mdfRead。若要选择性读取或先检查结构,请使用 mdfChannelGroupInfo 或 mdfInfo。
对于 R2026a 和更早版本,Vehicle Network Toolbox 原生不支持多路复用。请对解码后的信号应用下文所述的解复用修改。
解码流程
| 源格式 | CAN | CAN FD | LIN | 原始(不解码) |
|---|---|---|---|---|
| ASC | canSignalImport(f,"Vector",db) | 相同 | -- | canMessageImport(f,"Vector",OutputFormat="timetable") |
| TXT | canSignalImport(f,"Kvaser",db) | 相同 | -- | canMessageImport(f,"Kvaser",OutputFormat="timetable") |
| BLF | blfread(f,Database=db) -> canSignalTimetable | blfread(f,Database=db) -> canFDMessageTimetable -> canSignalTimetable | blfread(f,Database=linDb,ProtocolMode="LIN") -> linMessageTimetable | blfread(f) |
| MDF/MF4/DAT | mdfRead -> canMessageTimetable(tt,db) -> canSignalTimetable | mdfRead -> canFDMessageTimetable(tt,db) -> canSignalTimetable | mdfRead -> linMessageTimetable(tt,linDb) | mdfRead -> 直接返回 timetable |
加载数据库
db = canDatabase("path/to/file.dbc"); % CAN and CAN FD
db = arxmlDatabase("path/to/file.arxml"); % CAN only (not CAN FD)
linDb = linDatabase("path/to/file.ldf"); % LIN (R2025a+)
加载一次,并传递给所有解码调用。多个数据库:canMessageTimetable(tt, [db1, db2])。
DBC 文件检查与多路复用方案分类
仅针对 DBC 文件,判断文件是否包含使用扩展或分层多路复用的多路复用信号定义。
对于 MATLAB R2026a 或更早版本,无法直接从 canDatabase 对象确定多路复用方案。因此,请通过 fileread() 将 DBC 文件作为文本读取,检查原始 DBC 文本,以对多路复用方案进行分类:
dbcText = fileread("path/to/file.dbc");
检查扩展多路复用标记。完整语法指南请参见 references/dbc-multiplexing-syntax.md;解析不熟悉的 DBC 信号标记或 SG_MUL_VAL_ 条目时,请查阅该指南。
hasSgMulValEntries = ~isempty(regexp(dbcText, '^SG_MUL_VAL_\s+\d+', 'once', 'lineanchors'));
hasNestedMuxor = ~isempty(regexp(dbcText, 'SG_\s+\w+\s+m\d+M\s', 'once'));
hasExtendedMux = hasSgMulValEntries || hasNestedMuxor;
注意:SG_MUL_VAL_ 可能作为关键字声明出现在 NS_(命名空间)部分中——这并不表示存在扩展多路复用。仅匹配实际数据条目,即行首紧接数字消息 ID 的条目。
如果 hasExtendedMux 为 true,请解析 SG_MUL_VAL_ 条目中的消息 ID,确定具体哪些消息受到影响:
sgMulValMsgIds = regexp(dbcText, '^SG_MUL_VAL_\s+(\d+)', 'tokens', 'lineanchors');
extendedMuxMsgIds = unique(cellfun(@(x) str2double(x{1}), sgMulValMsgIds));
对于 R2026a 及更早版本,请筛除具有扩展多路复用的消息(由 extendedMuxMsgIds 标识),并告知用户。
主要限制
- 多态返回值: 所有 VNT 读取函数(
canSignalImport、blfread、mdfRead、canMessageImport)都会根据通道数量和参数返回不同类型。务必使用iscell()/istimetable()/isstruct()进行判断。检查多通道结果时,优先使用iscell(),以区分元胞数组(多通道)和直接返回的 timetable(单通道),然后使用{n}或{i}迭代或提取。 - ARXML + CAN FD: MATLAB 中的
arxmlDatabase不支持 CAN FD。它不能与canFDMessageTimetable一起使用。用户提供 CAN FD 数据的 ARXML 文件时,务必说明 ARXML 不支持 CAN FD,必须改用 DBC 文件和canDatabase。不要在未说明原因的情况下静默切换到 DBC。 - 用于 CAN(非 FD)的 ARXML: 用户提供 ARXML 文件进行标准 CAN 解码时,请仅使用
arxmlDatabase。不要同时加载canDatabase作为备用方案——ARXML 数据库对象在canMessageTimetable和canSignalTimetable中的工作方式相同。只有用户提供 DBC 文件时才使用canDatabase。 - 没有
canFDSignalTimetable: 此函数不存在。CAN 和 CAN FD 信号都使用canSignalTimetable。 - BLF LIN 需要
ProtocolMode="LIN": 如果未设置此项,blfread只会返回 CAN 数据。 - 不支持信号级 LIN 解码: 只有
linMessageTimetable。直接从 timetable 列中读取信号值。 - MDF 原始 CAN 检测: 使用通道名前缀
CAN_DataFrame/LIN_Frame(ASAM 标准)。绝不可使用SourceBusType或AcquisitionSourceType元数据,即使作为备用方案也不行。这些字段因厂商而异且不可靠。 canMessageImport默认格式: 返回旧版can.Message数组。务必传入OutputFormat="timetable"。- 元胞提取: 对多通道调用
blfread、mdfRead和canMessageImport会返回元胞数组。处理前使用{n}提取。 - ASC/TXT 信号使用
canSignalImport: 它可通过一次调用完成解码。只有需要原始消息 timetable 时才使用canMessageImport。
特定文件参考
- ASC 导入 -- 使用 Vector 和 Kvaser 厂商的
canSignalImport/canMessageImport,以及多通道文件的多态返回类型处理 - BLF 导入 -- 使用
blfinfo检查文件,使用带或不带 ChannelID 的blfread,以及 CAN 与 LIN 协议的选择 - MDF 导入 -- 使用
mdfRead/mdfChannelGroupInfo/mdfChannelInfo,根据通道名称检测原始 CAN/LIN 组,读取指定组
协议参考
- CAN 解码 --
canMessageTimetable和canSignalTimetable工作流、DBC 和 ARXML 数据库的使用 - CAN FD 解码 --
canFDMessageTimetable工作流,以及 ARXML 无法用于 CAN FD 的原因 - LIN 解码 --
linMessageTimetable的用法、从 timetable 列访问信号值(不存在信号级函数) - 数据库对象 --
canDatabase、arxmlDatabase和linDatabase的区别,以及各解码函数接受的数据库类型
解复用参考
- 简单解复用 --
canDatabase、canMessageTimetable、canFDMessageTimetable和canSignalTimetable工作流及信号解复用
导出工作流
MDF 写入
使用 mdfWrite 将 MATLAB timetable 数据写入 MDF/MF4 文件。
| 任务 | 函数 | 说明 |
|---|---|---|
| 将 timetable 写入新文件 | mdfWrite(file, tt) | 追加通道组;如果文件不存在,会显示警告并创建文件 |
| 覆盖现有组 | mdfWrite(file, tt, GroupNumber=N) | 必须先使用 IncludeMetadata=true 读取 |
| 设置文件元数据 | mdfCreate(file, FileInfo=minfo),然后调用 mdfWrite() | 支持:Author、Department、Project、Subject、Comment |
| 转换不受支持的类型 | 参见 references/mdf-writing.md | logical -> uint8(),categorical -> double()(存储类别索引),cell -> string(),datetime 列 -> posixtime() |
| 写入原始 CAN 帧 | 使用 CAN_DataFrame.ID/DLC/DataLength/DataBytes 列命名(ASAM 标准) | 4 列均为必需项(ID、DLC、DataLength、DataBytes)。缺少其中任意一列都会导致 canMessageTimetable 重新导入失败。 |
| 写入原始 LIN 帧 | 使用 LIN_Frame.ID/ReceivedDataByteCount/DataLength/DataBytes 列命名 | ASAM 标准 LIN 帧命名 |
| 处理 datetime RowTimes | 必需步骤: 写入前设置 .TimeZone = 'UTC':tt.Properties.RowTimes.TimeZone = 'UTC'; | 也可以转换为 duration,两种方法都有效。若省略此步骤,mdfWrite 可能报错或生成无法读取的时间戳。 |
BLF 写入
使用 blfwrite 将 CAN 和 CAN FD 消息数据写入 BLF 文件。
| 任务 | 函数 | 说明 |
|---|---|---|
| 写入 CAN 消息 | blfwrite(file, tt, chanID, 'CAN') | 使用 canMessageTimetable 格式化 tt;不要手动构建列 |
| 写入 CAN FD 消息 | blfwrite(file, tt, chanID, 'CAN FD') | 使用 canFDMessageTimetable 格式化 tt;负载最多可达 64 字节。从头构建时所需的 13 列请参见 references/blf-writing.md。 |
| 混合 CAN/CAN FD | 单个 BLF 文件支持两者 | 每次调用都使用明确的协议字符串 |
VNT 的 blfwrite 不支持 LIN。LIN 日志记录请使用 MDF。当用户要求将 LIN 数据写入 BLF 时,应立即说明此限制,不要在解释限制之前尝试变通方法或提供不完整的解决方案。
不支持写入 ASC/TXT。 没有与 canMessageImport 对应的 canMessageExport 函数。导出请使用 BLF 或 MDF。
导出参考
- MDF 写入 --
mdfWrite/mdfCreate、类型转换、ASAM CAN/LIN 命名、覆盖组、元数据保留 - BLF 写入 -- 使用
blfwrite写入 CAN/CAN FD、canMessageTimetable/canFDMessageTimetable格式化、通道回调
版权所有 2026 The MathWorks, Inc.