MATLAB——读取MDF/MF4文件和BLF文件

一、读取MDF/MF4文件

1.1 从 *.mdf 文件中读取所有数据

mdfObj = mdf('CANape.mdf'); % 打开*.mdf/*.mf4文件
data1 = read(mdfObj);       % 读取所有可用的数据

mdfds = mdfDatastore({'CANape1.MF4','CANape2.MF4','CANape3.MF4'}); % 打开一个文件夹下的多个文件
data2 = readall(mdfds);     % 读取数据存储中的所有数据

1.2 从指定的通道列表读取所有数据

通过channelList( )函数读取数据的信号名、信号所在的组号、信号组样本量等信息。

mdfObj = mdf('CANape.mdf');             % 打开*.mdf/*.mf4文件
chanList = channelList(mdfObj);         % 通道列表
data0 = read(mdfObj,chanList(1:3,:));   % 读取通道列表中的前3个信号
data1 = read(mdfObj,1,'Counter_B4');    % 根据组号和信号名读取指定信号数据
data2 = read(mdfObj,1,{'Channel1','Channel2'}); % 读取多个信号数据

1.3 基于指定的索引值读取一定范围内的数据

mdfObj = mdf('CANape.mdf');                   % 打开*.mdf/*.mf4文件
data1 = read(mdfObj,1,mdfObj.ChannelNames{1},1,10);  % 按索引读取数据子集
data2 = read(mdfObj,1,mdfObj.ChannelNames{1},5);     % 按索引读取特定数据值
data3 = read(mdfObj,1,{'Channel1','Channel2'},1,10); % 按索引读取特定信号

1.4 基于指定的时间值读取一定范围内的数据

mdfObj = mdf('CANape.mdf');                   % 打开*.mdf/*.mf4文件
data1 = read(mdfObj,1,mdfObj.ChannelNames{1},seconds(0.50),seconds(0.60)); % 按时间读取数据子集
data2 = read(mdfObj,1,mdfObj.ChannelNames{1},seconds(0.55));               % 按时间读取特定数据值
data3 = read(mdfObj,1,{'Channel1','Channel2'},seconds(5.5),seconds(7.3));  % 读取特定信号数据 

1.5 其他读取方式

mdfObj = mdf('CANape.mdf'); 
data1 = read(mdfObj,1,'Channel1',1,10,'OutputFormat','timetable');  % 输出格式默认为时间表
data2 = read(mdfObj,1,'Channel1',1,10,'OutputFormat','timeseries'); % 输出时序数据
[data3,time3] = read(mdfObj,1,'Channel1',1,10,'OutputFormat','vector'); % 输出向量数据

1.6 信号可视化(2019版本及以上)

mdfVisualize('CANape.mdf');

1.7 查看文件信息

mdfObj = mdf('CANape.mdf');   % 打开*.mdf/*.mf4文件
mdfObj.Creator                % 查看文件创建详细信息

mdfObj.ChannelGroup(1)        % 查看通道组详细信息
mdfObj.ChannelGroup(2)        % MDF文件中的数据存储在通道组中包含的通道中。

mdfObj.ChannelGroup(1).Channel(1) % 查看通道详细信息,通道组内存储了每个通道的详细信息。

mdfObj.ChannelNames           % 快速访问通道名称
mdfObj.ChannelNames{1}        % 通过 ChannelNames 属性,可以快速访问以查找各个通道组中的特定通道。

1.8  MATLAB自带Demo

脚本文件:ReadingDataFromMDFFilesExample.m

数据文件:CANape.MF4

%% Reading Data from MDF Files
% This example shows you how to read channel data from an MDF file.

%% 打开 MDF 文件
% 在从 MDF 文件读取通道数据之前,使用 mdf 命令开启对该文件的访问权限。
m = mdf('CANape.MF4')

%% 指定要读取的数据
% read 命令用于从 MDF
% 文件中检索数据,它有几种不同的使用方式。它需要两个主要参数。一个是要从中读取数据的通道组的数值索引。另一个是要读取的通道组中通道的名称。有关这些项的信息可从
% MDF 文件中获得。
m.ChannelGroup(1)
m.ChannelNames{1}

%% 按索引读取数据子集
% 要按索引只读取数据的一个子集,请将索引范围作为 read 命令的输入。
data = read(m, 1, m.ChannelNames{1}, 1, 10)

%% 按索引读取特定数据值
% 提供单个数值索引参数将检索在该索引处的数据值。
data = read(m, 1, m.ChannelNames{1}, 5)

%% 按时间读取数据子集
% 要按时间读取数据的一个子集,请将持续时间参数作为 read 命令的输入。
data = read(m, 1, m.ChannelNames{1}, seconds(0.50), seconds(0.60))

%% 按时间读取特定数据值
% 提供单个持续时间将检索在该时间戳处或最接近于该时间戳处的数据值。
data = read(m, 1, m.ChannelNames{1}, seconds(0.55))

%% 输出格式默认为时间表
% read 命令的默认输出格式是时间表。可以使用 OutputFormat 参数来控制此选项。
data = read(m, 1, 'Triangle', 1, 10, 'OutputFormat', 'timetable')

%% 输出时序数据
% 如果需要使用时序作为输出,则可以为 read 命令指定 OutputFormat。当将数据作为时序输出时,一次只能读取一个通道。
data = read(m, 1, 'Triangle', 1, 10, 'OutputFormat', 'timeseries')

%% 输出向量数据
% read 命令的输出也可以指定为向量。将数据作为向量输出时,一次只能读取一个通道。
[data, time] = read(m, 1, 'Triangle', 1, 10, 'OutputFormat', 'vector')

%% 读取整个通道组
% 要在单个调用中快速读取整个通道组中的数据,不需要为 read 命令指定其他参数。
data = read(m, 1, m.ChannelNames{1});


%% 
% Copyright 2012 The MathWorks, Inc.

二、读取BLF文件

2.1 常用函数

  • canDatabase( ):创建一个DBC文件对象,用于解析BLF文件数据
  • blfinfo( ):获取BLF文件信息
  • blfread( ):读取BLF文件数据
  • canSignalTimetable( ):将读出来的BLF文件数据转换成timetable格式

2.2 举个栗子

CanDB = canDatabase('PowerTrain_BLF.dbc');    % 创建DBC文件,用于解析报文的数据结构,文件是MATLAB自带的

binf = blfinfo('Logging_BLF.blf');            % 获取BLF文件,确定数据在哪路CAN通道上

binf.ChannelList                              % 查看通道列表

BLFData = blfread('Logging_BLF.blf',2,'Database',CanDB); % 读取指定CAN通道中的报文数据,2代表通道序号,'Database'是定义好的DBC数据对象,如果选错了通道,那么无法解析报文名和信号名

signalTimetable1 = canSignalTimetable(blfdata,'ABSdata');    % 获取指定报文的timetable格式的数据

参考:

【1】MATLAB官方帮助文档。

你可能感兴趣的:(MATLAB,matlab)