Generated banner for Matlab Import Export Vehicle Data
Generated logo for Matlab Import Export Vehicle Data

Matlab Import Export Vehicle Data

MathWorksOfficialCreated by MathWorks

  • Skill
  • Tool integration
  • Software development
  • BSD-2-Clause
  • No issues found

From the author

Use when importing or exporting vehicle data from/to log files (MDF/MF4/DAT, BLF, ASC/TXT), decoding CAN/CAN FD/LIN messages to signals via DBC, ARXML, or LDF databases, writing timetable data to MDF or BLF files, or calling blfread, blfinfo, blfwrite, mdfRead, mdfWrite, mdfCreate, mdfInfo, canSignalImport, canMessageImport, canMessageTimetable, canFDMessageTimetable, canSignalTimetable, or linMessageTimetable.
— the description by MathWorks

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

This skill provides a structured approach to handling vehicle network data within MATLAB. It covers the import and export of various log file formats including MDF/MF4, BLF, ASC, and TXT. It facilitates the decoding of raw CAN, CAN FD, and LIN frames into signals using database files such as DBC, ARXML, and LDF. Additionally, it supports writing timetable data to MDF or BLF files, ensuring proper handling of metadata and data types for vehicle communication analysis.

What it does

  • Reads vehicle bus log files in formats like MDF, BLF, ASC, and TXT.
  • Decodes raw CAN, CAN FD, and LIN frames into signals using database files.
  • Writes MATLAB timetable data to MDF/MF4 and BLF files.
  • Handles polymorphic return types from vehicle network read functions.
  • Provides pipelines for converting raw message timetables into signal data.
  • Supports inspection of BLF file structures and channel configurations.

When to use it

  • When you need to import vehicle network logs into MATLAB for analysis.
  • When you must decode raw bus frames into readable signals using DBC, ARXML, or LDF files.
  • When you need to export processed timetable data back into standard vehicle log formats.
  • When working with multi-channel log files that require specific extraction patterns.

Advantages

  • Integrates directly with MATLAB Vehicle Network Toolbox functionality.
  • Provides standardized workflows for common vehicle network protocols.
  • Supports both raw message access and high-level signal decoding.
  • Includes guidance on handling complex data types and file metadata.

Usage examples

“How do I import a CAN log file and decode it into signals?”
The agent will guide you to load your DBC file using canDatabase, read the log file using the appropriate function (e.g., blfread or canSignalImport), and apply the decoding pipeline to generate a signal timetable.
“Can I write my MATLAB timetable to an MDF file?”
The agent will explain the use of mdfWrite, including the necessary steps to set the RowTimes timezone and convert unsupported data types like logical or categorical columns.

Install

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/matlab/matlab-import-export-vehicle-data/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip matlab-import-export-vehicle-data.zip -d .agents/skills

Documentation by MathWorks

Import, Export, and Decode Vehicle Data

Import, decode, and export vehicle network log files in MATLAB using Vehicle Network Toolbox (VNT).

When to Use

  • Reading .mf4/.mdf/.dat, .blf, .asc, or .txt vehicle bus log files

  • Decoding raw CAN/CAN FD frames to signals via DBC or ARXML databases

  • Demultiplex signals from raw CAN/CAN FD frames via DBC databases in the case of simple multiplexing (R2026a or earlier)

  • Decoding LIN frames via LDF databases (R2025a+)

  • Handling polymorphic return types from VNT read functions

  • Writing MATLAB timetable data to MDF/MF4 files with mdfWrite

  • Writing CAN/CAN FD message data to BLF files with blfwrite

  • Converting unsupported timetable types (logical, categorical, cell, datetime columns) for MDF export

When Not To Use

  • Simulink CAN configuration

  • Live CAN channel access

  • XCP/A2L workflows

  • Demultiplexing of signals in the case of hierarchical or extended multiplexing

  • Demultiplexing of signals via ARXML or LIN databases

  • Writing LIN data to BLF (unsupported by VNT's blfwrite -- use MDF instead)

  • Writing to ASC or TXT files (no canMessageExport exists -- use BLF or MDF instead)

Prerequisites

Before running any operations, determine the MATLAB version:

r = matlabRelease;
tok = regexp(r.Release, 'R(\d{4})([ab])', 'tokens');
matlabYear = str2double(tok{1}{1});
matlabLetter = tok{1}{2};

Before calling BLF/ASC/TXT import or CAN/CAN FD/LIN decode functions, call detect_matlab_toolboxes to confirm Vehicle Network Toolbox is installed. If unavailable, tell the user. Once confirmed in a session, do not re-check.

MDF functions (mdfRead, mdfChannelGroupInfo, mdfInfo, mdfChannelInfo) are base MATLAB (R2023a+) and do not require VNT. Do not use the deprecated mdf() object constructor -- always use the functional API. For reading all groups blindly, mdfRead alone is acceptable. To selectively read or inspect structure first, use mdfChannelGroupInfo or mdfInfo.

For R2026a and earlier, multiplexing is not natively supported in Vehicle Network Toolbox. Apply the demultiplexing modifications described below to decoded signals.

Decode Pipeline

Source FormatCANCAN FDLINRaw (no decode)
ASCcanSignalImport(f,"Vector",db)same--canMessageImport(f,"Vector",OutputFormat="timetable")
TXTcanSignalImport(f,"Kvaser",db)same--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 directly

Database Loading

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+)

Load once, pass to all decode calls. Multiple databases: canMessageTimetable(tt, [db1, db2]).

Database inspection for DBC files and classification of the multiplexing scheme

In case of DBC files only, determine whether the file contains definitions of multiplexed signals that use extended or hierarchical multiplexing. For MATLAB R2026a or earlier, it is not possible to determine the multiplexing scheme from the canDatabase object directly. Therefore, inspect the raw DBC text to classify the multiplexing scheme, by reading the DBC file as text using fileread():

dbcText = fileread("path/to/file.dbc");

Check for extended multiplexing indicators. See references/dbc-multiplexing-syntax.md for the full syntax guide — consult it when parsing unfamiliar DBC signal markers or SG_MUL_VAL_ entries.

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;

Note: SG_MUL_VAL_ may appear in the NS_ (namespace) section as a keyword declaration — this does NOT indicate extended multiplexing. Only match actual data entries that start at the beginning of a line followed by a numeric message ID. If hasExtendedMux is true, identify which specific messages are affected by parsing the message IDs from SG_MUL_VAL_ entries:

sgMulValMsgIds = regexp(dbcText, '^SG_MUL_VAL_\s+(\d+)', 'tokens', 'lineanchors');
extendedMuxMsgIds = unique(cellfun(@(x) str2double(x{1}), sgMulValMsgIds));

For R2026a and earlier, filter out messages with extended multiplexing (identified in extendedMuxMsgIds) and inform the user.

Key Constraints

  • Polymorphic returns: All VNT read functions (canSignalImport, blfread, mdfRead, canMessageImport) return different types based on channel count and parameters. Always guard with iscell()/istimetable()/isstruct(). When checking multi-channel results, use iscell() as the primary guard to branch between cell array (multi-channel) vs direct timetable (single channel), then iterate or extract with {n} or {i}.

  • ARXML + CAN FD: arxmlDatabase does not support CAN FD in MATLAB. It cannot be used with canFDMessageTimetable. When the user provides an ARXML file for CAN FD data, always explain that ARXML does not support CAN FD and they must use canDatabase with a DBC file instead. Do not silently switch to DBC without explaining why.

  • ARXML for CAN (non-FD): When the user provides an ARXML file for standard CAN decode, use arxmlDatabase exclusively. Do not also load canDatabase as a fallback -- the ARXML database object works identically in canMessageTimetable and canSignalTimetable. Only use canDatabase when the user provides a DBC file.

  • No canFDSignalTimetable: This function does not exist. Use canSignalTimetable for both CAN and CAN FD signals.

  • BLF LIN requires ProtocolMode="LIN": Without it, blfread returns only CAN data.

  • No signal-level LIN decode: Only linMessageTimetable exists. Access signal values from timetable columns directly.

  • MDF raw CAN detection: Use channel name prefixes CAN_DataFrame / LIN_Frame (ASAM standard). NEVER use SourceBusType or AcquisitionSourceType metadata -- not even as a fallback. These fields are vendor-specific and unreliable.

  • canMessageImport default format: Returns legacy can.Message array. Always pass OutputFormat="timetable".

  • Cell extraction: Multi-channel calls to blfread, mdfRead, and canMessageImport return cell arrays. Extract with {n} before processing.

  • Use canSignalImport for ASC/TXT signals: It decodes in one call. Only use canMessageImport when raw message timetables are needed.

File-Specific References

  • ASC import -- canSignalImport/canMessageImport with Vector and Kvaser vendors, polymorphic return type handling for multi-channel files

  • BLF import -- blfinfo for file inspection, blfread with and without ChannelID, CAN vs LIN protocol selection

  • MDF import -- mdfRead/mdfChannelGroupInfo/mdfChannelInfo, detecting raw CAN/LIN groups by channel name, reading specific groups

Protocol References

  • CAN decode -- canMessageTimetable and canSignalTimetable pipelines, DBC and ARXML database usage

  • CAN FD decode -- canFDMessageTimetable pipeline, why ARXML does not work for CAN FD

  • LIN decode -- linMessageTimetable usage, accessing signal values from timetable columns (no signal-level function exists)

  • Database objects -- canDatabase vs arxmlDatabase vs linDatabase, which decode functions accept which database type

Demultiplexing References

  • Simple demultiplexing -- canDatabase, canMessageTimetable, canFDMessageTimetable, canSignalTimetable pipelines and signal demultiplexing

Export Workflows

MDF Writing

Writing MATLAB timetable data to MDF/MF4 files with mdfWrite.

TaskFunctionNotes
Write timetable to new filemdfWrite(file, tt)Appends channel group; file created with warning if missing
Overwrite existing groupmdfWrite(file, tt, GroupNumber=N)Must read with IncludeMetadata=true first
Set file metadatamdfCreate(file, FileInfo=minfo) then mdfWrite()Supported: Author, Department, Project, Subject, Comment
Convert unsupported typesSee references/mdf-writing.mdlogical -> uint8(), categorical -> double() (stores category index), cell -> string(), datetime col -> posixtime()
Write raw CAN framesUse CAN_DataFrame.ID/DLC/DataLength/DataBytes column naming (ASAM standard)All 4 columns mandatory (ID, DLC, DataLength, DataBytes). Omitting any one breaks canMessageTimetable re-import.
Write raw LIN framesUse LIN_Frame.ID/ReceivedDataByteCount/DataLength/DataBytes column namingASAM standard LIN frame naming
Handle datetime RowTimesRequired step: Set .TimeZone = 'UTC' before writing: tt.Properties.RowTimes.TimeZone = 'UTC';Alternatively convert to duration -- both work. Omitting this causes mdfWrite to error or produce unreadable timestamps.
BLF Writing

Writing CAN and CAN FD message data to BLF files with blfwrite.

TaskFunctionNotes
Write CAN messagesblfwrite(file, tt, chanID, 'CAN')Use canMessageTimetable to format tt; do not manually build columns
Write CAN FD messagesblfwrite(file, tt, chanID, 'CAN FD')Use canFDMessageTimetable to format tt; up to 64-byte payloads. See references/blf-writing.md for the 13 required columns when building from scratch.
CAN/CAN FD mixedBoth supported in one BLF fileUse explicit protocol string per call

LIN is not supported by VNT's blfwrite. Use MDF for LIN logging. When the user asks to write LIN data to BLF, state this limitation immediately -- do not attempt workarounds or partial solutions before explaining the constraint.

ASC/TXT writing is not supported. There is no canMessageExport counterpart to canMessageImport. Use BLF or MDF for export.

Export References

  • MDF writing -- mdfWrite/mdfCreate, type conversion, ASAM CAN/LIN naming, overwriting groups, metadata preservation

  • BLF writing -- blfwrite with CAN/CAN FD, canMessageTimetable/canFDMessageTimetable formatting, channel callbacks


Copyright 2026 The MathWorks, Inc.

Files

references/blf-writing.md

BLF Writing Reference

Detailed patterns and examples for writing MATLAB timetable data to Vector BLF (Binary Logging Format) files using blfwrite.

Scope: CAN and CAN FD only. LIN is not supported by VNT's blfwrite.

Key points:

  • All four arguments are required: blfwrite(blffile, msgtable, chanID, protocol)

    • blffile: Output BLF file path

    • msgtable: Timetable containing message data

    • chanID: Channel ID (integer)

    • protocol: 'CAN' or 'CAN FD'

  • BLF files are created automatically if they do not exist.

  • Repeated blfwrite calls append messages (not replace).

Writing CAN Messages to BLF

Convert CAN message timetable to BLF format. Provide the timetable, channel ID, and network protocol:

% From canMessageTimetable output
msgTT = canMessageTimetable(rawMsgs, canDb);

% Write to BLF (chanID=1 for first channel)
blfwrite('can_data.blf', msgTT, 1, 'CAN');
Formatting timetables for blfwrite

Always use canMessageTimetable or canFDMessageTimetable to create timetables for blfwrite. Do not manually construct timetables with raw ID, DLC, Data columns -- blfwrite expects the internal format produced by these functions, and manual construction fails silently or errors.

% From raw CAN message objects
msgTT = canMessageTimetable(canMsgs);
blfwrite('can_output.blf', msgTT, 1, 'CAN');

% From raw CAN FD message objects
fdTT = canFDMessageTimetable(canFDMsgs);
blfwrite('canfd_output.blf', fdTT, 1, 'CAN FD');

If you have signal data in a plain timetable (e.g., decoded signals), you must first encode it back into CAN message objects using a DBC database, then convert to a message timetable:

db = canDatabase('myNetwork.dbc');
msgs = canMessage(db, 'EngineData', numFrames);
% Pack signals into messages, then:
msgTT = canMessageTimetable(msgs);
blfwrite('encoded.blf', msgTT, 1, 'CAN');

Writing CAN FD Messages to BLF

CAN FD extends classical CAN with up to 64-byte payloads. Use canFDMessageTimetable to format data, then specify 'CAN FD' as the protocol:

% From CAN FD message objects (up to 64 bytes per message)
fdMsgs = canFDMessage(db, 'HighSpeedData', numFrames);
% ... pack signal data into messages ...
fdTT = canFDMessageTimetable(fdMsgs);
blfwrite('canfd_output.blf', fdTT, 1, 'CAN FD');
Constructing CAN FD Message Timetables from Scratch

When you don't have existing CAN FD message objects, you must build a raw timetable with all required columns before calling canFDMessageTimetable. The function validates that every column exists.

Required columns for canFDMessageTimetable input:

ColumnTypeDescription
IDuint32CAN identifier (11-bit or 29-bit)
Extendedlogicaltrue for 29-bit extended IDs
Namecell of charMessage name (e.g., {'RadarMsg'})
Datacell of uint8 row vectorsPayload bytes (up to 64 per message)
Lengthuint8Actual data length in bytes
DLCuint8DLC code (0-15 for CAN FD)
Signalscell of structSignal decode info (use {struct()} if none)
ErrorlogicalError frame flag
RemotelogicalRemote frame flag
ProtocolModecell of charMust be {'CAN FD'}
BRSlogicalBit Rate Switch flag
EDLlogicalExtended Data Length flag (true for FD)
ESIlogicalError State Indicator

Important: Name, Data, Signals, and ProtocolMode must be cell arrays (not string arrays). Use {'text'} syntax, not "text".

numMsgs = 50;
timestamps = seconds((0:numMsgs-1)' / 100);

rawTT = timetable( ...
    repmat(uint32(hex2dec('2A0')), numMsgs, 1), ...    % ID
    false(numMsgs, 1), ...                              % Extended
    repmat({'RadarMsg'}, numMsgs, 1), ...               % Name
    arrayfun(@(~) uint8(randi([0 255], 1, 64)), ...
        (1:numMsgs)', 'UniformOutput', false), ...      % Data
    repmat(uint8(64), numMsgs, 1), ...                  % Length
    repmat(uint8(15), numMsgs, 1), ...                  % DLC
    repmat({struct()}, numMsgs, 1), ...                 % Signals
    false(numMsgs, 1), ...                              % Error
    false(numMsgs, 1), ...                              % Remote
    repmat({'CAN FD'}, numMsgs, 1), ...                 % ProtocolMode
    true(numMsgs, 1), ...                               % BRS
    true(numMsgs, 1), ...                               % EDL
    false(numMsgs, 1), ...                              % ESI
    'VariableNames', {'ID','Extended','Name','Data','Length','DLC', ...
        'Signals','Error','Remote','ProtocolMode','BRS','EDL','ESI'}, ...
    'RowTimes', timestamps);

fdTT = canFDMessageTimetable(rawTT);
blfwrite('canfd_output.blf', fdTT, 2, 'CAN FD');

Logging CAN Messages via Channel Callbacks

Vector BLF files are well-suited for real-time logging via channel callbacks. This is a common use case:

% Create a callback to log messages
function logCANMessages(msgs, fileName, chanID)
    % msgs is a canMessage array
    if isempty(msgs)
        return
    end
    msgTT = canMessageTimetable(msgs);
    % Always specify all four arguments: file, table, chanID, protocol
    blfwrite(fileName, msgTT, chanID, 'CAN');
end

% Set up channel listener
chan = canChannel(...);
addlistener(chan, 'MessageReceived', @(src, evt) logCANMessages(evt.Message, 'logged.blf', 1));

Type Compatibility

BLF has fewer type restrictions than MDF:

  • Supported: uint8, uint32, arrays (for data bytes)

  • RowTimes: Both duration and datetime work; datetime does not require TimeZone specification

Conversion recommendations:

  • Use uint32 for CAN IDs (allows 29-bit extended IDs)

  • Use uint8 arrays for data payload (up to 64 bytes in CAN FD)

  • Use uint8 for DLC (0-8 for CAN, 0-15 for CAN FD when encoded with FDF flag)

BLF Format Limitations

Vehicle Network Toolbox has known constraints for BLF:

  1. No metadata storage -- BLF does not store signal names, units, or descriptions for decoded signals. Metadata must be preserved separately (e.g., in a companion DBC file or CSV).

  2. LIN not supported by blfwrite -- The Vehicle Network Toolbox does not support writing LIN messages to BLF files. Use MDF for LIN logging.

  3. Read-back with database required -- To recover signal names and scaling info, you must provide a CAN database (DBC) file when reading with blfread.

Edge Cases

  • Empty timetable: Rejected. Use height(tt) > 0 check.

  • Appending to existing BLF: Repeated blfwrite calls append new messages (not replace).

  • Mixed CAN and CAN FD: BLF can store both in one file, but use explicit NetworkType to avoid ambiguity.

Common Mistakes

MistakeSymptomFix
Missing chanID or protocol argumentFunction call failsAll four args required: blfwrite(file, tbl, chanID, protocol)
DLC value >8 for classical CANTruncated or corrupted framesUse 'CAN FD' as protocol if DLC >8
Assuming metadata in BLF after writeSignal names/units missing on readProvide external DBC file to blfread for metadata
Trying to write LIN to BLF"LIN not supported" errorUse MDF for LIN; BLF is CAN/CAN FD only in VNT
Writing cell or string types"unexpected type" errorUse uint8 arrays for binary data
Manually building timetable with custom columnsblfwrite errorsUse canMessageTimetable or canFDMessageTimetable to format data

Copyright 2026 The MathWorks, Inc.


Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Security

No issues found by our static scan· No issues found

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Created by
MathWorks
Publisher
MathWorks (Official)
Source
matlab/matlab-agentic-toolkit · skills-catalog/test-and-measurement/matlab-import-export-vehicle-data · commit 2a7f215
Licence
BSD 2-Clause License (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE.md)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by MathWorks or MathWorks.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download matlab-import-export-vehicle-data.zip