主要内容

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

这个示例向您展示了如何使用存储在CAN数据库文件中的信息创建、接收和处理消息。本例使用CAN数据库文件,demoVNT_CANdbFiles.dbc

打开数据库文件

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

分贝= canDatabase(“demoVNT_CANdbFiles.dbc”)数据库。消息
db = Database with properties: Name: 'demoVNT_CANdbFiles' Path: '/tmp/Bdoc20b_1465442_260350/tpd1cb374b/ex80654288/demoVNT_CANdbFiles. db = Database with properties: Name: 'demoVNT_CANdbFiles' Path: '/tmp/Bdoc20b_1465442_260350/tpd1cb374b/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(DB,'EngineMsg'
ans = struct with fields: Name: ' engineemsg ' ProtocolMode: '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 = 5X1结构阵列字段:名称ProtocolMode评论ID扩展J1939长度DLC BRS信号SignalInfo TxNodes属性AttributeInfo

查看信号信息

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

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结构]

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

signalInfo (db,'EngineMsg'
名称Comment StartBit SignalSize ByteOrder Signed ValueType Class Factor Offset Minimum Maximum Units ValueTable multior Multiplexed multimode RxNodes Attributes AttributeInfo . value . value . value . value . value . value . value . value . value . value . value

使用数据库定义创建消息

当你创建一个新的消息,应用了数据库定义指定消息的名称。可以在这个消息的信号除了原始数据字节被表示以工程单位。

msgEngineInfo = canMessage(分贝,'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]数据库用户数据:[]

查看信号信息

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

msgEngineInfo.Signals
ANS =结构与字段:VehicleSpeed:0 EngineRPM:250

改变信号信息

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

msgEngineInfo. signals . engineerpm = 5500.25信号
msgEngineInfo =消息与属性:消息识别ProtocolMode: 'CAN' ID:100扩展:0名称: 'EngineMsg' 数据细节时间戳:0数据:[23 205 0 0 0 0 0 0]信号:[1x1的结构]长度:8协议标志错误:0远程:0其他信息数据库:[1x1的can.Database]的UserData:[] ANS =结构与字段:VehicleSpeed:0 EngineRPM:5.5003e + 03

当直接写入信号,该值被转换,缩放,并装入使用该数据库定义中的消息数据。

msgEngineInfo.Signals.VehicleSpeed = 70.81 msgEngineInfo.Signals
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);generateMsgsDb();rxMsg =接收(rxCh,天道酬勤,'输出格式'“时间表”);rxMsg(1:15,:)
ans = 15×8时间表时间ID扩展名称数据远程信号长度错误  _____________ ___ ________ _____________________ ___________ ______ ____________ _____ ______ 0.0044775秒100假{‘EngineMsg}{1×8 uint8} {1 x1 struct} 8假假0.0045086秒200假{‘TransmissionMsg}{1×8 uint8} {1 x1 struct} 8假假0.0045279秒400假{‘DoorControlMsg}{1×8 uint8} 8 {1 x1 struct}假假0.0045373秒600假{‘WindowControlMsg} {1 x4 uint8} 4 {1 x1 struct}假假0.0045425秒800假{‘SunroofControlMsg} {1 x2 uint8} 2 {1 x1 struct}假假0.029506秒100假{‘EngineMsg}{1×8 uint8} 8 {1 x1 struct}假假0.054494秒100假{' EngineMsg '}{1×8 uint8} {1 x1 struct} 8假假0.0545秒200假{‘TransmissionMsg}{1×8 uint8} {1 x1 struct} 8假假0.079461秒100假{‘EngineMsg}{1×8 uint8} {1 x1 struct} 8假假0.1045秒100假{‘EngineMsg}{1×8 uint8} {1 x1 struct} 8假假0.10451秒200假{‘TransmissionMsg}{1×8 uint8} {1 x1 struct} 8假假0.1295秒100假{‘EngineMsg}{1×8 uint8} {1 x1 struct} 8假假0.12951秒400假{‘DoorControlMsg}{1×8 uint8} {1 x1 struct} 8假假0.15446秒100假{‘EngineMsg}{1×8 uint8} {1 x1 struct} 8假假0.15447秒200假{‘TransmissionMsg}{1×8 uint8} 8 {1 x1 struct}假假

停止信道和从工作空间清除它。

停止(rxCh);清晰的rxCh

检查收到的消息

检查接收到的消息以查看所施加的数据库解码。

rxMsg rxMsg(10:)。信号{10}
ans = 1×8时间表时间ID扩展名称数据远程信号长度错误  __________ ___ ________ _____________ ___________ ______ ____________ _____ ______ 0.1045秒100假{‘EngineMsg}{1×8 uint8} {1 x1 struct} 8假假ans =结构体字段:VehicleSpeed: 50 EngineRPM: 3.5696 e + 03

提取指定消息的所有实例

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

allMsgEngine = rxMsg (strcmpi ('EngineMsg'rxMsg.Name):);allMsgEngine (1:15,:)
ANS = 15x8时间表时间ID扩展名称数据长度的信号错误远程_____________ ___ ________ _____________ ___________ ______ ____________ _____ ______ 0.0044775秒100假{ 'EngineMsg'} {1×8 UINT8} 8 {1x1的结构}虚假0.029506秒100假{ 'EngineMsg'} {1×8 UINT8} 8 {1x1的结构}虚假0.054494秒100假{ 'EngineMsg'} {1×8 UINT8} 8 {1x1的结构}虚假0.079461秒100假{ 'EngineMsg'} {1×8 UINT8} 8 {1x1的结构}虚假0.1045秒100假{ 'EngineMsg'} {1×8 UINT8} 8 {1x1的结构}虚假0.1295秒100假{ 'EngineMsg'} {1×8 UINT8} 8 {1x1的结构}虚假0.15446秒100假{ 'EngineMsg'} {1×8 UINT8} 8 {1x1的结构}虚假0.17947秒100假{ 'EngineMsg'} {1×8 UINT8} 8 {1x1的结构}虚假0.20447秒100假{ 'EngineMsg'} {1×8 UINT8} 8 {1x1的结构}虚假0.2295秒100假{ 'EngineMsg'} {1×8 UINT8} 8 {1x1的结构}虚假0.25451秒100假{ 'EngineMsg'} {1×8 UINT8} 8 {1x1的结构}虚假0.27943秒100假{ 'EngineMsg'} {1×8 UINT8} 8 {1x1的结构}虚假0.30447秒100假{ 'EngineMsg'} {1×8 UINT8} 8 {1x1的结构}虚假0.32949秒100假{ 'EngineMsg'} {1×8 UINT8} 8 {1x1的结构}虚假0.35453秒100假{ 'EngineMsg'} {1×8 UINT8} 8 {1x1的结构}虚假

绘制物理信号值

绘制数据库解码信号随时间的值。在变量中引用消息时间戳和信号值。

signalTimetable = canSignalTimetable (rxMsg,'EngineMsg');signalTimetable(1:15,:)图(signalTimetable.Time,signalTimetable.VehicleSpeed)称号(“engine emsg的车速”'fontweight'“大胆”)包含(“时间戳”) ylabel (“车速”
ANS = 15X2时间表时间VehicleSpeed EngineRPM _____________ ____________ _________ 0.0044775秒0 250 0.029506秒50 3569.6 0.054494秒50 3569.6 0.079461秒50 3569.6 0.1045秒50 3569.6 0.1295秒50 3569.6 0.15446秒55 3621.3 0.17947秒55 3621.3 0.20447秒55 3621.3 0.2295秒55 3621.30.25451秒55 3663.9 0.27943秒55 3663.9 0.30447秒55 3663.9 0.32949秒55 3663.9 0.35453秒55 3663.9