【Matlab】在 CAN 通信中使用 DBC 文件(车辆网络工具箱)

下面继续学习车辆网络工具箱,在工程中,CAN通信一般都是用 DBC 文件来存储CAN报文和信号。下面看看Matlab如何处理 DBC 文件(创建、接收、处理)。

文章目录

    • 打开 DBC 文件
    • 查看报文信息
    • 查看信号信息
    • 使用数据库定义创建报文
    • 查看新报文信号信息
    • 更改信号信息
    • 接收具有数据库信息的报文
    • 接收报文
    • 检查收到的报文
    • 提取指定报文的所有实例
    • 绘制物理信号值(报文解析)
    • 关闭 DBC 文件

打开 DBC 文件

使用 canDatabase 打开文件 demoVNT_CANdbFiles.dbc,这个文件是官方示例给出的,也可以用自己的DBC文件。接下来我们主要用到 EngineMsg 这个报文:

【Matlab】在 CAN 通信中使用 DBC 文件(车辆网络工具箱)_第1张图片

db = canDatabase("demoVNT_CANdbFiles.dbc")

matlab读取dbc如下:

【Matlab】在 CAN 通信中使用 DBC 文件(车辆网络工具箱)_第2张图片

检查 Messages 属性,可以查看该文件定义的所有报文的名称(与CANoe的一致):

db.Messages

【Matlab】在 CAN 通信中使用 DBC 文件(车辆网络工具箱)_第3张图片

查看报文信息

使用 messageInfo 查看报文 EngineMsg 的信息,包括标识符、数据长度和信号列表。

messageInfo(db, "EngineMsg")

【Matlab】在 CAN 通信中使用 DBC 文件(车辆网络工具箱)_第4张图片

查看信号信息

使用 signalInfo 查看报文 EngineMsg 中信号 EngineRPM 的信息,包括用于将原始信号转换为物理值的类型、字节顺序、大小和系数等。

signalInfo(db, "EngineMsg", "EngineRPM")

【Matlab】在 CAN 通信中使用 DBC 文件(车辆网络工具箱)_第5张图片

使用数据库定义创建报文

通过指定要应用的DBC和报文名称来创建新报文。此报文中的 CAN 信号除了以原始数据字节表示外,还以工程单位来表示。

msgEngineInfo = canMessage(db, 'EngineMsg')

【Matlab】在 CAN 通信中使用 DBC 文件(车辆网络工具箱)_第6张图片

此外,canMessage 还可以创建指定ID的报文:

【Matlab】在 CAN 通信中使用 DBC 文件(车辆网络工具箱)_第7张图片

查看新报文信号信息

查看新报文的信号值,并可以直接对这些信号进行写入和读取,以打包和解包报文中的数据。

msgEngineInfo.Signals

初始值如下:

【Matlab】在 CAN 通信中使用 DBC 文件(车辆网络工具箱)_第8张图片

更改信号信息

直接写入信号以更改其值。可以看到Data处的改动:

msgEngineInfo.Signals.EngineRPM = 5500.25

【Matlab】在 CAN 通信中使用 DBC 文件(车辆网络工具箱)_第9张图片

读回当前信号值:

msgEngineInfo.Signals

在这里插入图片描述
当直接写入信号时,它会自动转换并使用数据库定义打包到报文数据(十进制-十六进制)中。下面再写入VehicleSpeedData

msgEngineInfo.Signals.VehicleSpeed = 70.81

【Matlab】在 CAN 通信中使用 DBC 文件(车辆网络工具箱)_第10张图片
查看当前信号:

msgEngineInfo.Signals

在这里插入图片描述

接收具有数据库信息的报文

将数据库连接到 CAN 通道,该通道接收报文以自动将数据库定义应用于传入报文。数据库仅解析已定义的报文。其他报文则以其原始形式接收。

rxCh = canChannel("MathWorks", "Virtual 1", 2);
rxCh.Database = db

【Matlab】在 CAN 通信中使用 DBC 文件(车辆网络工具箱)_第11张图片

接收报文

启动通道,生成一些报文流(随机),然后通过报文解码来接收报文。并查看接收到的报文的前几行。

start(rxCh);
generateMsgsDb();
rxMsg = receive(rxCh, Inf, "OutputFormat", "timetable");
rxMsg(1:15, :)

【Matlab】在 CAN 通信中使用 DBC 文件(车辆网络工具箱)_第12张图片

停止接收通道并将其从工作区中清除。

stop(rxCh);
clear rxCh

检查收到的报文

检查收到的报文并用DBC解码:

rxMsg(1, :)

在这里插入图片描述

rxMsg.Signals{1}

在这里插入图片描述

提取指定报文的所有实例

提取报文 的所有实例,并查看此特定报文的前几个实例。

allMsgEngine = rxMsg(strcmpi('EngineMsg', rxMsg.Name), :);
allMsgEngine(1:15, :)

【Matlab】在 CAN 通信中使用 DBC 文件(车辆网络工具箱)_第13张图片

绘制物理信号值(报文解析)

使用 canSignalTimetable 将报文中的信号数据重新打包为一个信号时间表,并查看信号时间表的前几行。

signalTimetable = canSignalTimetable(rxMsg, 'EngineMsg');
signalTimetable(1:15, :)

【Matlab】在 CAN 通信中使用 DBC 文件(车辆网络工具箱)_第14张图片
绘制信号随时间变化的曲线:

plot(signalTimetable.Time, signalTimetable.VehicleSpeed)
title('Vehicle Speed from EngineMsg', 'FontWeight', 'bold')
xlabel('Timestamp')
ylabel('Vehicle Speed')

【Matlab】在 CAN 通信中使用 DBC 文件(车辆网络工具箱)_第15张图片

此外,可以在工作区任意修改报文或信号量的值。

【Matlab】在 CAN 通信中使用 DBC 文件(车辆网络工具箱)_第16张图片

关闭 DBC 文件

从工作区中清除 DBC 文件的变量,关闭对该 DBC 文件的访问。

clear db

以上。

你可能感兴趣的:(shell开发及其他,matlab,网络,学习)