主要内容

在CAN通信中使用DBC文件

这个示例向您展示了如何使用存储在dbc文件中的信息创建、接收和处理消息。本示例描述了CAN网络的工作流程,但演示的概念也适用于CAN FD网络。

打开DBC-File

打开的文件demoVNT_CANdbFiles.dbc使用canDatabase.

db=canDatabase(“demoVNT_CANdbFiles.dbc”)
db=具有属性的数据库:名称:'demoVNT_CANdbFiles'路径:'/tmp/Bdoc21b_1757077_208470/tp99e0924/vnt-ex80654288/demoVNT_CANdbFiles.dbc'节点:{}NodeInfo:[0x0 struct]消息:{5x1 cell}MessageInfo:[5x1 struct]属性:{}AttributeInfo:[0x0 struct]用户数据:[]

检查消息属性查看此文件中定义的所有消息的名称。

db.Messages
ans =5 x1细胞{'DoorControlMsg'} {' engineemsg '} {' sun屋面控制msg '} {'TransmissionMsg'} {'WindowControlMsg'}

查看消息信息

使用信息查看消息的信息引擎,包括标识符、数据长度和信号列表。

messageInfo (db,“EngineMsg”)
ans =结构体字段:名称:' engineemsg '协议模式:'CAN' Comment: " ID: 100 Extended: 0 J1939: [] Length: 8 DLC: 8 BRS: 0 Signals: {2x1 cell} SignalInfo: [2x1 struct] TxNodes: {0x1 cell} Attributes: {} AttributeInfo: [0x0 struct]

您还可以一次查询所有邮件的信息。

messageInfo (db)
ans =5×1带有字段的结构数组:名称ProtocolMode Comment ID扩展名J1939长度DLC BRS Signals SignalInfo TxNodes Attributes AttributeInfo

查看信号信息

使用信号信息查看信号信息EngineRPM信息中引擎,包括类型、字节排序、大小和将原始信号转换为物理值的缩放值。

信号信息(db,“EngineMsg”,“引擎PM”)
ans =结构体字段:名称:'EngineRPM'注释:'StartBit:0信号大小:32字节顺序:'LittleEndian'签名:0 ValueType:'Integer'类:'uint32'因子:0.1000偏移量:250最小值:250最大值:9500个单位:'rpm'值表:[0x1结构]多路复用器:0多路复用模式:0 RxNodes:{0x1 cell}属性:{AttributeInfo:[0x0结构]

您还可以查询消息中所有信号的信息引擎马上。

信号信息(db,“EngineMsg”)
ans =2×1带有字段的结构数组:名称注释开始比特信号大小字节顺序有符号值类型类因子偏移最小最大单位值表多路复用器多路复用器模式RxNodes属性AttributeInfo⋮

使用数据库定义创建消息

通过指定数据库和消息名称创建新消息引擎应用数据库定义。除原始数据字节外,此消息中的CAN信号以工程单位表示。

msgEngineInfo = canMessage (db,“EngineMsg”)
msgEngineInfo=具有属性的消息:消息标识协议模式:“CAN”ID:100扩展:0名称:“EngineMsg”数据详细信息时间戳:0数据:[0 0 0]信号:[1x1结构]长度:8协议标志错误:0远程:0其他信息数据库:[1x1 CAN.Database]用户数据:[]

查看信号信息

使用信号属性查看此消息的信号值。您可以直接写入和读取这些信号,以打包和解包消息中的数据。

msgEngineInfo。信号
ans =结构体字段:车辆速度:0引擎pm: 250

改变信号信息

直接写入信号EngineRPM来改变它的值。

msgEngineInfo.Signals.EngineRPM = 5500.25
msgEngineInfo = Message with properties: Message Identification ProtocolMode: 'CAN' ID: 100 Extended: 0 Name: ' engineemsg ' Data Details Timestamp: 0 Data: [23 205 00 00 00] Signals: [1x1 struct] Length: 8 Protocol Flags Error: 0 Remote: 0 Other Information Database: [1x1 CAN . 0]数据库用户数据:[]

读回当前信号值并注意EngineRPM已用书面值更新。

msgEngineInfo。信号
ans =结构体字段:车速:0发动机转速:5.5003e+03

当一个值直接写入信号时,会使用数据库定义将其转换、缩放并打包到消息数据中。中值的变化数据属性,然后将新值写入车速信号。

msgengininfo.Signals.VehicleSpeed=70.81
msgEngineInfo = Message with properties: Message Identification ProtocolMode: 'CAN' ID: 100 Extended: 0 Name: ' engineemsg ' Data Details Timestamp: 0 Data: [23 205 00 71 00 0] Signals: [1x1 struct] Length: 8 Protocol Flags Error: 0 Remote: 0 Other Information Database: [1x1 CAN .]数据库用户数据:[]
msgEngineInfo。信号
ans =结构体字段:车辆速度:71引擎pm: 5.5003e+03

接收包含数据库信息的消息

将数据库连接到接收消息的CAN通道,以便将数据库定义自动应用于传入消息。数据库仅对已定义的消息进行解码。所有其他消息均以原始形式接收。

rxCh = canChannel (“MathWorks”,“虚拟1”, 2); rxCh.Database=db
rxCh=具有属性的通道:设备信息设备供应商:“MathWorks”设备:“虚拟1”设备通道索引:2设备序列号:0协议模式:“CAN”状态信息运行:0消息可用:0消息接收:0消息发送:0初始化访问:1初始化时间戳:[0x0日期时间]FilterHistory:'标准ID筛选器:允许全部|扩展ID筛选器:允许全部'通道信息总线状态:'N/A'SilentMode:0收发器名称:'N/A'收发器状态:'N/A'接收错误计数:0 TransmitterRoCount:0总线速度:500000 SJW:[]TSEG1:[]TSEG2:[]NumOfSamples:[]其他信息数据库:[1x1 can.Database]用户数据:[]

接收消息

启动通道,生成一些消息流量,并通过物理消息解码接收消息。

开始(rxCh);generateMsgsDb ();rxMsg = receive(rxCh, Inf,“输出格式”,“时间表”);

查看收到的消息的前几行。

头(rxMsg)
ans =8×8的时间表时间ID扩展名称数据远程信号长度错误  ___________ ___ ________ _____________________ ___________________ ______ ____________ _____ ______ 0.10118秒100假{‘EngineMsg} {[0 0 0 0 0 0 0 0]} {1 x1 struct} 8假假0.10119秒200假{‘TransmissionMsg} {[0 0 0 0 0 0 0 0]} {1 x1 struct} 8 400假假假0.10119秒{'DoorControlMsg' } {[0 0 0 0 0 0 0 0]} 8 {1x1 struct} false false 0.10119 sec 600 false {'WindowControlMsg' } {[ 0 0 0 0]} 4 {1x1 struct} false false 0.1012 sec 800 false {'SunroofControlMsg'} {[ 0 0]} 2 {1x1 struct} false false 0.12398 sec 100 false {'EngineMsg' } {[0 0 0 0 0 0 0 0]} 8 {1x1 struct} false false 0.14798 sec 100 false {'EngineMsg' } {[0 0 0 0 0 0 0 0]} 8 {1x1 struct} false false 0.15197 sec 200 false {'TransmissionMsg' } {[4 0 0 0 0 0 0 0]} 8 {1x1 struct} false false

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

停止(rxCh);清楚的rxCh

检查收到的消息

检查接收到的消息以查看应用的数据库解码。

: rxMsg (10)
ans =1×8的时间表时间ID扩展名称数据远程信号长度错误  ___________ ___ ________ _____________ ________________________ ______ ____________ _____ ______ 0.19998秒100假{‘EngineMsg} {(172 129 0 0 0 0 0)} 8 {1 x1 struct}假假
rxMsg.信号{10}
ans =结构体字段:车速:50发动机转速:3.5696e+03

提取指定消息的所有实例

提取消息的所有实例引擎.

allMsgEngine = rxMsg (strcmpi (“EngineMsg”,rxMsg.Name),:);

查看此特定消息的前几个实例。

头部(allMsgEngine)
ans =8×8的时间表时间ID扩展名称数据远程信号长度错误  ___________ ___ ________ _____________ ________________________ ______ ____________ _____ ______ 0.10118秒100假{‘EngineMsg} {[0 0 0 0 0 0 0 0]} {1 x1 struct} 8假假0.12398秒100假{‘EngineMsg} {[0 0 0 0 0 0 0 0]} {1 x1 struct} 8 100假假假0.14798秒{' EngineMsg} {[0 0 0 0 0 0 0 0]} 8 {1 x1 struct}假假0.17226秒100假{‘EngineMsg} {(172 129 0 0 0 0 0)} 8 {1 x1 struct}假假0.19998秒100假{‘EngineMsg} {(172 129 0 0 0 0 0)} 8 {1 x1 struct}假假0.22398秒100假{‘EngineMsg} {(172 129 0 0 0 0 0)} 8 {1 x1 struct} 100假假假0.25119秒{'EngineMsg'} {[172 129 00 50 00 0]} 8 {1x1 struct} false false 0.27618 sec 100 false {'EngineMsg'} {[172 129 00 50 00 0]} 8 {1x1 struct} false false

绘制物理信号值

使用信号时刻表从消息中重新打包信号数据引擎变成一个信号时间表。

signalTimetable = canSignalTimetable (rxMsg,“EngineMsg”);

查看信号时间表的前几行。

主管(信号时刻表)
ans =8×2时间表Time VehicleSpeed engineerpm ___________ ____________ _________ 0.10118 sec 0 250 0.12398 sec 0 250 0.14798 sec 0 250 0.17226 sec 50 3569.6 0.19998 sec 50

把信号的值画出来车速随着时间的推移。

图(信号时刻表、时间、信号时刻表、车速)标题(《engine emsg的车速》,“FontWeight”,“粗体”)包含(“时间戳”) ylabel (“车速”)

图中包含一个轴对象。EngineMsg中标题为Vehicle Speed的轴对象包含类型为line的对象。

关闭DBC-File

通过从工作区中清除DBC文件的变量来关闭对DBC文件的访问。

清晰的分贝