下面继续学习车辆网络工具箱,在工程中,CAN通信一般都是用 DBC 文件来存储CAN报文和信号。下面看看Matlab如何处理 DBC 文件(创建、接收、处理)。
使用 canDatabase
打开文件 demoVNT_CANdbFiles.dbc
,这个文件是官方示例给出的,也可以用自己的DBC文件。接下来我们主要用到 EngineMsg 这个报文:
db = canDatabase("demoVNT_CANdbFiles.dbc")
matlab读取dbc如下:
检查 Messages 属性,可以查看该文件定义的所有报文的名称(与CANoe的一致):
db.Messages
使用 messageInfo
查看报文 EngineMsg 的信息,包括标识符、数据长度和信号列表。
messageInfo(db, "EngineMsg")
使用 signalInfo
查看报文 EngineMsg 中信号 EngineRPM 的信息,包括用于将原始信号转换为物理值的类型、字节顺序、大小和系数等。
signalInfo(db, "EngineMsg", "EngineRPM")
通过指定要应用的DBC和报文名称来创建新报文。此报文中的 CAN 信号除了以原始数据字节表示外,还以工程单位来表示。
msgEngineInfo = canMessage(db, 'EngineMsg')
此外,canMessage
还可以创建指定ID的报文:
查看新报文的信号值,并可以直接对这些信号进行写入和读取,以打包和解包报文中的数据。
msgEngineInfo.Signals
初始值如下:
直接写入信号以更改其值。可以看到Data处的改动:
msgEngineInfo.Signals.EngineRPM = 5500.25
读回当前信号值:
msgEngineInfo.Signals
当直接写入信号时,它会自动转换并使用数据库定义打包到报文数据(十进制-十六进制)中。下面再写入VehicleSpeedData
:
msgEngineInfo.Signals.VehicleSpeed = 70.81
msgEngineInfo.Signals
将数据库连接到 CAN 通道,该通道接收报文以自动将数据库定义应用于传入报文。数据库仅解析已定义的报文。其他报文则以其原始形式接收。
rxCh = canChannel("MathWorks", "Virtual 1", 2);
rxCh.Database = db
启动通道,生成一些报文流(随机),然后通过报文解码来接收报文。并查看接收到的报文的前几行。
start(rxCh);
generateMsgsDb();
rxMsg = receive(rxCh, Inf, "OutputFormat", "timetable");
rxMsg(1:15, :)
停止接收通道并将其从工作区中清除。
stop(rxCh);
clear rxCh
检查收到的报文并用DBC解码:
rxMsg(1, :)
rxMsg.Signals{1}
提取报文 的所有实例,并查看此特定报文的前几个实例。
allMsgEngine = rxMsg(strcmpi('EngineMsg', rxMsg.Name), :);
allMsgEngine(1:15, :)
使用 canSignalTimetable
将报文中的信号数据重新打包为一个信号时间表,并查看信号时间表的前几行。
signalTimetable = canSignalTimetable(rxMsg, 'EngineMsg');
signalTimetable(1:15, :)
plot(signalTimetable.Time, signalTimetable.VehicleSpeed)
title('Vehicle Speed from EngineMsg', 'FontWeight', 'bold')
xlabel('Timestamp')
ylabel('Vehicle Speed')
此外,可以在工作区任意修改报文或信号量的值。
从工作区中清除 DBC 文件的变量,关闭对该 DBC 文件的访问。
clear db
以上。