主要内容

使用数据库定义创建和处理消息

此示例演示如何使用存储在CAN数据库文件中的信息创建、接收和处理消息。此示例使用CAN数据库文件,demoVNT_CANdbFiles.dbc

打开数据库文件

打开数据库文件并检查消息属性查看此数据库中定义的所有消息的名称。

db = canDatabase (“demoVNT_CANdbFiles.dbc”)数据库。消息
db = Database with properties: Name: 'demoVNT_CANdbFiles' Path: '/tmp/Bdoc21a_1606923_186538/tp6e149c41/ex80654288/demoVNT_CANdbFiles. db = Database with properties: Name: 'demoVNT_CANdbFiles' Path: '/tmp/Bdoc21a_1606923_186538/tp6e149c41/ex80654288/demoVNT_CANdbFiles. db = Database with properties:dbc' Nodes: {} NodeInfo: [0x0 struct] Messages: {5x1 cell} MessageInfo: [5x1 struct] Attributes: {} AttributeInfo: [0x0 struct] UserData: [] ans: [] ans = 5x1 cell array {'DoorControlMsg'} {' engineemsg '} {' sunroocontrolmsg '} {'TransmissionMsg'} {'WindowControlMsg'}

查看消息信息

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

messageInfo(数据库,“EngineMsg”
ans=struct带字段:Name:'EngineMsg'ProtocolMode:'CAN'注释:'ID:100扩展:0 J1939:[]长度:8 DLC:8 BRS:0信号:{2x1 cell}信号信息:[2x1 struct]TxNodes:{0x1 cell}属性:{}属性信息:[0x0 struct]

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

消息信息(数据库)
ans = 5x1 struct array with fields: Name ProtocolMode Comment ID Extended J1939 Length DLC BRS Signals SignalInfo TxNodes Attributes AttributeInfo

查看信号信息

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

signalInfo (db,“EngineMsg”“EngineRPM”
ans=struct带字段:Name:'EngineRPM'注释:'StartBit:0 SignalSize:32字节顺序:'LittleEndian'有符号:0 ValueType:'Integer'类:'uint32'因子:0.1000偏移量:250最小值:250最大值:9500单位:'rpm'值表:[0x1结构]多路复用器:0多路复用:0多路模式:0 RxNodes:{0x1 cell}属性:{AttributeInfo:[0x0结构]

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

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

使用数据库定义创建消息

在创建新消息以应用数据库定义时指定消息的名称。该消息中的CAN信号除了原始数据字节外,还用工程单位表示。

msgengininfo=canMessage(db,“EngineMsg”
msgEngineInfo = Message with properties: Message Identification ProtocolMode: 'CAN' ID: 100 Extended: 0 Name: ' engineemsg ' Data Details Timestamp: 0 Data: [0 00 00 0] Signals: [1x1 struct] Length: 8 Protocol Flags Error: 0 Remote: 0 Other Information Database: [1x1 CAN . 0] Data Details: 0 Data: [0 00 00 0] Signals: [1x1 struct] Length: 8 Protocol Flags Error: 0 Remote: 0 Other Information Database: [1x1 CAN . 0]数据库用户数据:[]

查看信号信息

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

msgengininfo.Signals
ans = struct with fields: VehicleSpeed: 0 engineerpm: 250

更改信号信息

直接写入信号以更改值并读取其当前值。

msgEngineInfo.Signals.EngineRPM=5500.25 msgEngineInfo.Signals
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][] ans = struct with fields: VehicleSpeed: 0 engineerpm: 5.5003e+03

直接写入信号时,将使用数据库定义将值转换、缩放并打包到消息数据中。

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 .][] ans = struct with fields: VehicleSpeed: 71 engineerpm: 5.5003e+03

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

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

rxCh = canChannel (“MathWorks”“虚拟1”2);rxCh。= db数据库
DeviceVendor rxCh =通道属性:设备信息:“MathWorks”设备:“虚拟1”DeviceChannelIndex: 2 DeviceSerialNumber: 0 ProtocolMode:“可以运行的状态信息:0 MessagesAvailable: 0 MessagesReceived: 0 MessagesTransmitted: 0 InitializationAccess: 1 InitialTimestamp: [0 x0 datetime] FilterHistory:“标准ID过滤器:Allow All | Extended ID Filter: Allow All' Channel Information BusStatus: 'N/A' SilentMode: 0 TransceiverName: 'N/A' TransceiverState: 'N/A' ReceiveErrorCount: 0 TransmitErrorCount: 0 BusSpeed: 500000 SJW: [] TSEG1: [] TSEG2: [] NumOfSamples: [] Other Information Database: [1x1 can.]数据库用户数据:[]

接收消息

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

开始(rxCh);生成msgsdb();rxMsg=receive(rxCh,Inf,“OutputFormat”“时间表”);rxMsg (1:15,:)
ans = 15×8时间表时间ID扩展名称数据远程信号长度错误  ____________ ___ ________ _____________________ ________________________ ______ ____________ _____ ______ 0.039786秒100假{‘EngineMsg} {[0 0 0 0 0 0 0 0]} {1 x1 struct} 8假假0.039803秒200假{‘TransmissionMsg} {[0 0 0 0 0 0 0 0]} 8 {1 x1 struct}假假0.039828秒400假{‘DoorControlMsg} {[0 0 0 0 0 0 0 0]} {1 x1 struct} 8假假0.039832秒600假{‘WindowControlMsg} {[0 0 0 0]} 4 {1 x1 struct}假假0.039834秒800假{‘SunroofControlMsg} {[0 0]} 2 {1 x1 struct}假假0.064773秒100假{‘EngineMsg} {(172 129 0 0 0 0 0)} 8 {1 x1 struct}假假0.089761秒100假{‘EngineMsg} {(172 129 0 0 0 0 0)} {1 x1 struct} 8假假0.089764秒200假{‘TransmissionMsg} {[4 0 0 0 0 0 0 0]} {1 x1 struct} 8假假0.11485秒100假{‘EngineMsg} {(172 129 0 0 0 0 0)} {1 x1 struct} 8假假0.1398秒100假{‘EngineMsg} {(172 129 0 0 0 0 0)} 8 {1 x1struct} false false 0.1398 sec 200 false {'TransmissionMsg' } {[ 4 0 0 0 0 0 0 0]} 8 {1x1 struct} false false 0.16479 sec 100 false {'EngineMsg' } {[172 129 0 0 50 0 0 0]} 8 {1x1 struct} false false 0.16479 sec 400 false {'DoorControlMsg' } {[ 1 0 0 0 0 0 0 0]} 8 {1x1 struct} false false 0.18982 sec 100 false {'EngineMsg' } {[177 131 0 0 55 0 0 0]} 8 {1x1 struct} false false 0.18983 sec 200 false {'TransmissionMsg' } {[ 4 0 0 0 0 0 0 0]} 8 {1x1 struct} false false

停止频道并将其从工作区中清除。

停止(rxCh);清晰的rxCh

检查收到的消息

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

rxMsg(10,:)rxMsg.信号{10}
2008年8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8时间时间时间时间时间时间时间时间时间8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间ID扩展扩展扩展扩展名称扩展名称扩展名称扩展名称扩展名称扩展_uuuuuuuuuuuuuuuuuuuuuu0.1398第100节假{'EngineMsg'}{[172 129 0 50 0 0]}8{1x1结构}假假ans=结构,带字段:车辆速度:50发动机转速:3.5696e+03

提取指定消息的所有实例

使用MATLAB符号按名称提取指定消息的所有实例。

allMsgEngine=rxMsg(strcmpi(“EngineMsg”,rxMsg.Name),:;allMsgEngine(1:15,:)
ans = 15×8时间表时间ID扩展名称数据远程信号长度错误  ____________ ___ ________ _____________ ________________________ ______ ____________ _____ ______ 0.039786秒100假{‘EngineMsg} {[0 0 0 0 0 0 0 0]} {1 x1 struct} 8假假0.064773秒100假{‘EngineMsg} {(172 129 0 0 0 0 0)} 8 {1 x1 struct}假假0.089761秒100假{‘EngineMsg} {(172 129 0 0 0 0 0)} {1 x1 struct} 8假假0.11485秒100假{‘EngineMsg} {(172 129 0 0 0 0 0)} {1 x1 struct} 8假假0.1398秒100假{‘EngineMsg} {(172 129 0 0 0 0 0)} {1 x1 struct} 8假假0.16479秒100假{‘EngineMsg} {(172 129 0 0 0 0 0)} {1 x1 struct} 8假假0.18982秒100假{‘EngineMsg} {[55 177 131 0 0 0 0 0]} {1 x1 struct} 8假假0.21485秒100假{‘EngineMsg} {[55 177 131 0 0 0 0 0]} {1 x1 struct} 8假假0.23975秒100假{‘EngineMsg} {[55 177 131 0 0 0 0 0]} {1 x1 struct} 8假假0.26478秒100假{‘EngineMsg} {[55 177 131 0 0 0 0 0]} 8 {1 x1 struct}假假0.28982秒100假{‘EngineMsg} {[55 91 133 0 0 0 0 0]} {1 x1 struct} 8假假0.31478秒100假{‘EngineMsg} {[55 91 133 0 0 0 0 0]} {1 x1 struct} 8假假0.33981秒100假{‘EngineMsg} {[55 91 133 0 0 0 0 0]} {1 x1 struct} 8假假0.36479秒100假{‘EngineMsg} {[55 91 133 0 0 0 0 0]} 8 {1 x1struct} false false 0.38981 sec 100 false {'EngineMsg'} {[201 130 00 54 00 0]} 8 {1x1 struct} false false

绘制物理信号值

绘制随时间变化的数据库解码信号值。参考消息时间戳和变量中的信号值。

信号时刻表=CAN信号时刻表(rxMsg,“EngineMsg”);信号时刻表(1:15,:)绘图(信号时刻表。时间,信号时刻表。车速)标题(“engine emsg的车速”“FontWeight”“大胆”)xlabel(“时间戳”)伊拉贝尔(“车速”
ans = 15 x2时间表时间VehicleSpeed EngineRPM  ____________ ____________ _________ 0.039786秒0 250 0.064773秒50 3569.6 - 0.089761秒50 3569.6 - 0.11485秒50 3569.6 - 0.1398秒50 3569.6 - 0.16479秒50 0.23975 3621.3 3569.6 3621.3 - 0.21485 0.18982秒55秒55 55秒55 3621.3 - 0.26478秒3663.9 3621.3 3663.9 - 0.31478 0.28982秒55秒550.33981 SEC 55 3663.9 0.36479 SEC 55 3663.9 0.38981 SEC 54 3598.1