mcpField
M
matlab-import-export-vehicle-data

matlab-import-export-vehicle-data

github.com/matlab数据与数据库1.2k42 次安装1 天前更新
代码仓库

关于 matlab-import-export-vehicle-data

这项技能借助 Vehicle Network Toolbox 和 MDF 函数,在 MATLAB 中导入、解码和导出车辆网络日志。它按格式指导 CAN、CAN FD 和 LIN 工作流、数据库解码及 MDF 或 BLF 导出,并考虑 MATLAB 版本限制。

主要功能

  1. 01导入 MDF、MF4、DAT、BLF、ASC 和 TXT 日志
  2. 02解码 CAN、CAN FD 和 LIN 数据
  3. 03使用 DBC、ARXML 和 LDF 数据库
  4. 04处理多态读取结果
  5. 05将 timetable 导出为 MDF 或将 CAN 数据导出为 BLF

适用场景

  1. 01使用 DBC 解码记录的 CAN 信号
  2. 02从 BLF 或 MDF 文件读取 LIN 数据
  3. 03将 MATLAB timetable 导出为 MDF
  4. 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.yaml
references/
asc-import.md
blf-import.md
blf-writing.md
can-decode.md
canfd-decode.md
database-objects.md
dbc-multiplexing-syntax.md
lin-decode.md
mdf-import.md
mdf-writing.md
simple-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 原生不支持多路复用。请对解码后的信号应用下文所述的解复用修改。

解码流程

源格式CANCAN FDLIN原始(不解码)
ASCcanSignalImport(f,"Vector",db)相同--canMessageImport(f,"Vector",OutputFormat="timetable")
TXTcanSignalImport(f,"Kvaser",db)相同--canMessageImport(f,"Kvaser",OutputFormat="timetable")
BLFblfread(f,Database=db) -> canSignalTimetableblfread(f,Database=db) -> canFDMessageTimetable -> canSignalTimetableblfread(f,Database=linDb,ProtocolMode="LIN") -> linMessageTimetableblfread(f)
MDF/MF4/DATmdfRead -> canMessageTimetable(tt,db) -> canSignalTimetablemdfRead -> canFDMessageTimetable(tt,db) -> canSignalTimetablemdfRead -> 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.mdlogical -> 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.

评论

支持 Markdown