主要内容

在CAN通信中使用dbc文件

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

打开dbc文件

打开的文件demoVNT_CANdbFiles.dbc使用canDatabase

db =数据库“demoVNT_CANdbFiles.dbc”
db =数据库属性:名称:'demoVNT_CANdbFiles'路径:'/tmp/Bdoc21b_1757077_208470/tp99e09924/vnt-ex80654288/demoVNT_CANdbFiles. db =数据库属性:'demoVNT_CANdbFiles'dbc' Nodes: {} NodeInfo: [0x0 struct] Messages: {5x1 cell} MessageInfo: [5x1 struct] Attributes: {} AttributeInfo: [0x0 struct] UserData: []

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

db。消息
ans =5 x1细胞{'DoorControlMsg'} {' engineemsg '} {'SunroofControlMsg'} {'TransmissionMsg'} {'WindowControlMsg'}}

查看消息信息

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

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

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

messageInfo (db)
ans =5×1结构数组与字段:名称协议模式评论ID扩展J1939长度DLC BRS Signals SignalInfo TxNodes Attributes AttributeInfo

查看信号信息

使用signalInfo查看信号信息EngineRPM在消息EngineMsg,包括将原始信号转换为物理值的类型、字节顺序、大小和缩放值。

signalInfo (db,“EngineMsg”“EngineRPM”
ans =带有字段的结构体:名称:'EngineRPM'注释:" StartBit: 0 SignalSize: 32 ByteOrder: 'LittleEndian' Signed: 0 ValueType: 'Integer' Class: 'uint32' Factor: 0.1000 Offset: 250 Minimum: 250 Maximum: 9500 Units: 'rpm' ValueTable: [0x1 struct] Multiplexor: 0 Multiplexed: 0 MultiplexMode: 0 RxNodes: {0x1 cell} Attributes: {} AttributeInfo: [0x0 struct]

您还可以查询消息中所有信号的信息EngineMsg在一次。

signalInfo (db,“EngineMsg”
ans =2×1结构数组与字段:名称注释StartBit SignalSize ByteOrder Signed ValueType Class Factor Offset最小最大单位ValueTable Multiplexor Multiplexed MultiplexMode RxNodes Attributes AttributeInfo

使用数据库定义创建消息

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

msgEngineInfo = canMessage(db,“EngineMsg”
msgEngineInfo =消息属性:消息识别协议模式:'CAN' ID: 100扩展:0名称:' engineemsg '数据详细信息时间戳:0数据:[0 00 00 00 00]信号:[1x1 struct]长度:8协议标志错误:0 Remote: 0其他信息数据库:[1x1 CAN .]UserData: []

查看信号信息

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

msgEngineInfo。信号
ans =带有字段的结构体:车速:0车速:250

改变信号信息

直接写入信号EngineRPM修改其值。

msgEngineInfo.Signals.EngineRPM = 5500.25
msgEngineInfo = Message with properties: Message Identification协议模式:'CAN' ID: 100扩展:0名称:' engineemsg '数据详细信息时间戳:0数据:[23 205 00 00 00 0]信号:[1x1 struct]长度:8协议标志错误:0 Remote: 0其他信息数据库:[1x1 CAN .]UserData: []

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

msgEngineInfo。信号
ans =带有字段的结构体:车辆速度:0工程师pm: 5.5003e+03

当一个值被直接写入信号时,它会被转换、缩放并使用数据库定义打包到消息数据中。中的值更改数据属性写入新值后VehicleSpeed信号。

msgengineinfo . signals . vehiclesspeed = 70.81
msgEngineInfo =消息属性:消息识别协议模式:'CAN' ID: 100扩展:0名称:' engineemsg '数据详细信息时间戳:0数据:[23 205 00 71 00 0]信号:[1x1 struct]长度:8协议标志错误:0 Remote: 0其他信息数据库:[1x1 CAN . 1]UserData: []
msgEngineInfo。信号
ans =带有字段的结构体:车速:71工程师pm: 5.5003e+03

接收带有数据库信息的消息

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

rxCh = canChannel(“MathWorks”“虚拟1”2);rxCh。数据base = db
rxCh = Channel with properties: Device Information DeviceVendor: 'MathWorks' Device: 'Virtual 1' DeviceChannelIndex: 2 DeviceSerialNumber: 0 ProtocolMode: 'CAN'状态信息Running: 0 MessagesAvailable: 0 MessagesReceived: 0 messagestransited: 0 InitialTimestamp: [0x0 datetime] FilterHistory: '标准ID Filter: Allow All |扩展ID Filter: Allow All'通道信息BusStatus: 'N/A' SilentMode: 0 TransceiverName: 'N/A' TransceiverState: 'CAN'状态信息'N/A' ReceiveErrorCount: 0 TransmitErrorCount: 0 BusSpeed: 500000 SJW: [] TSEG1: [] TSEG2: [] NumOfSamples: [] Other Information Database: [1x1 can. A]UserData: []

接收消息

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

开始(rxCh);generateMsgsDb ();rxMsg = receive(rxCh, Inf)“OutputFormat”“时间表”);

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

头(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假假0.10119秒400假{‘DoorControlMsg} {[0 0 0 0 0 0 0 0]} {1 x1 struct} 8假假0.10119秒600假{‘WindowControlMsg} {[0 0 0 0]} 4 {1 x1 struct}假false 0.1012 sec 800 false {'SunroofControlMsg'} {[0 0]} 2 {1x1 struct} false false 0.12398 sec 100 false {'EngineMsg'} {[0 00 00 00 00 00 00 0]} 8 {1x1 struct} false false 0.14798 sec 100 false {'EngineMsg'} {[0 00 00 00 00 0]} 8 {1x1 struct} false false 0.15197 sec 200 false {'TransmissionMsg'} {[4 00 00 00 00 00]} 8 {1x1 struct} false 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工程师pm: 3.5696e+03

提取指定消息的所有实例

提取消息的所有实例EngineMsg

allmsggine = 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假假0.14798秒100假{‘EngineMsg} {[0 0 0 0 0 0 0 0]} {1 x1 struct} 8假假0.17226秒100假{‘EngineMsg} {(172 129 0 0 0 0 0)} {1 x1 struct} 8 0.19998假假sec 100 false {' engineemsg '} {[172 129 00 50 00 00]} 8 {1x1 struct} false false 0.22398 sec 100 false {' engineemsg '} {[172 129 00 50 00 00]} 8 {1x1 struct} false false 0.25119 sec 100 false {' engineemsg '} {[172 129 00 50 00 0]} 8 {1x1 struct} false false 0.27618 sec 100 false {' engineemsg '} {[172 129 00 50 00 0]} 8 {1x1 struct} false false false

物理信号值

使用canSignalTimetable从消息中重新包装信号数据EngineMsg变成一个信号时间表。

signal时间表= cansignal时间表(rxMsg;“EngineMsg”);

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

头(signalTimetable)
ans =8×2时间表时间车辆速度工程师,pm ___________ ____________ _________ 0.10118秒0 250 0.12398秒0 250 0.14798秒0 250 0.17226秒50 3569.6 0.19998秒50 3569.6 0.22398秒50 3569.6 0.25119秒50 3569.6 0.27618秒50 3569.6

绘制信号的值VehicleSpeed随着时间的推移。

情节(signalTimetable。时间、信号、时刻表、车速“来自引擎emsg的车速”“FontWeight”“大胆”)包含(“时间戳”) ylabel (“车速”

图包含一个轴对象。标题为来自engineemsg的Vehicle Speed的坐标轴对象包含一个类型为line的对象。

关闭dbc文件

通过从工作空间中清除其变量来关闭对dbc文件的访问。

清晰的db