这个示例向您展示了如何使用存储在dbc文件中的信息创建、接收和处理消息。本示例描述了CAN网络的工作流程,但演示的概念也适用于CAN FD网络。
打开的文件demoVNT_CANdbFiles.dbc
使用canDatabase
。
分贝= canDatabase(“demoVNT_CANdbFiles.dbc”)
DB =数据库与属性:名称: 'demoVNT_CANdbFiles' 路径: '/tmp/Bdoc21b_1757077_208470/tp99e09924/vnt-ex80654288/demoVNT_CANdbFiles.dbc' 节点:{}的nodeinfo:为0x0结构]消息:{5X1细胞} MessageInfo:[5X1结构]属性:{} AttributeInfo:为0x0结构]的UserData:[]
检查消息
属性查看此文件中定义的所有消息的名称。
db。消息
ans =5 x1细胞{'DoorControlMsg'} {' engineemsg '} {' sun屋面控制msg '} {'TransmissionMsg'} {'WindowControlMsg'}
使用messageInfo
以查看消息信息EngineMsg
,包括标识符,数据长度,和信号列表。
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
使用signalInfo
查看信号信息EngineRPM
在消息EngineMsg
,包括类型、字节排序、大小和将原始信号转换为物理值的缩放值。
signalInfo(DB,“EngineMsg”那“EngineRPM”)
ans =结构体字段:名称: 'EngineRPM' 注释: '' 起始位:0 SignalSize:32字节顺序: 'LittleEndian' 签名:0值类型: '整数' 级: 'UINT32' 因子:0.1000偏移:250最小值:250最大值:9500个单位: 'RPM'ValueTable:为0x1结构]多路复用器:0复用:0 MultiplexMode:0 RxNodes:{为0x1细胞}属性:{} AttributeInfo:为0x0结构]
您还可以查询的信息,在消息中的所有信号EngineMsg
立刻。
signalInfo(DB,“EngineMsg”)
ans =2×1带有字段的结构数组:名称注释起始位SignalSize字节顺序签名的ValueType类因子偏移最小最大单位ValueTable复用器复用MultiplexMode RxNodes属性AttributeInfo⋮
通过指定数据库和消息名称创建一个新的消息EngineMsg
有应用的数据库定义。可以在这个消息信号除了原始数据字节被表示以工程单位。
msgEngineInfo = canMessage (db,“EngineMsg”)
msgEngineInfo =消息与属性:消息识别ProtocolMode: 'CAN' ID:100扩展:0名称: 'EngineMsg' 数据细节时间戳:0数据:[0 0 0 0 0 0 0 0]信号:[1x1的结构]长度:8协议标志错误:0远程:0其他信息数据库:[1x1的can.Database]的UserData:[]
使用信号
属性,以查看该消息信号值。您可以直接写入和这些信号读取包装和从消息解压数据。
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 =结构体字段:VehicleSpeed:0 EngineRPM:5.5003e + 03
当一个值直接写入信号时,会使用数据库定义将其转换、缩放并打包到消息数据中。中值的变化数据
新值后财产被写入VehicleSpeed
信号。
msgEngineInfo.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 =分贝
rxCh =通道与属性:设备信息DeviceVendor:'MathWorks的装置: '虚拟1' DeviceChannelIndex:2 DeviceSerialNumber:0 ProtocolMode: 'CAN' 状态信息运行:0 MessagesAvailable:0 MessagesReceived:0 MessagesTransmitted:0 InitializationAccess:1 InitialTimestamp:为0x0日期时间] FilterHistory:“标准ID过滤器:允许所有|扩展ID过滤器:允许所有”频道信息BUS状态软键: 'N / A' SILENTMODE:0 TransceiverName: 'N / A' TransceiverState: 'N / A' ReceiveErrorCount:0 TransmitErrorCount:0 BusSpeed:500000 SJW:[] TSEG1:[]TSEG2:[] NumOfSamples:[]其他信息数据库:[1x1的can.Database]的UserData:[]
启动通道,产生一些消息业务,并且接收与物理消息解码的消息。
开始(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.Signals {10}
ans =结构体字段:VehicleSpeed:50 EngineRPM:3.5696e + 03
提取消息的所有实例EngineMsg
。
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
使用canSignalTimetable
从消息中重新打包信号数据EngineMsg
变成一个信号时间表。
signalTimetable = canSignalTimetable (rxMsg,“EngineMsg”);
查看信号时间表的前几行。
头(signalTimetable)
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
把信号的值画出来VehicleSpeed
随着时间的推移。
情节(signalTimetable。时间,signalTimetable.VehicleSpeed)标题(《engine emsg的车速》那“fontWeight设置”那“大胆”)包含(“时间戳”) ylabel (“车速”)
通过从工作区清除其可变关闭访问DBC文件。
清除D b