在 MATLAB 中进行基于事件的 CAN 通信
此示例说明如何配置 CAN 通道和报文,以便在事件发生时传输报文。它使用以环回配置形式连接的 MathWorks® 虚拟 CAN 通道。
由于此示例是在虚拟网络上发送和接收 CAN 报文,因此结合运行 CAN 通信管理器可以更全面地了解代码所执行的操作。要运行 CAN 通信管理器,请打开并配置它使用与示例的接收通道相同的接口。确保在开始运行示例之前启动 CAN 通信管理器,以便查看发生的所有报文。
此示例说明 CAN 网络的工作流,但所展示的概念也适用于 CAN FD 网络。
创建 CAN 通道
创建两个分别用于报文传输和接收的 CAN 通道。
txCh = canChannel("MathWorks", "Virtual 1", 1); rxCh = canChannel("MathWorks", "Virtual 1", 2);
打开包含报文和信号定义的 DBC 文件,并将其连接到这两个 CAN 通道。
db = canDatabase("CANDatabaseEvent.dbc");
txCh.Database = db;
rxCh.Database = db;
创建 CAN 报文
使用数据库信息创建 CAN 报文 EngineMsg
。
msgEngineMsg = canMessage(db, "EngineMsg")
msgEngineMsg = Message with properties: Message Identification ProtocolMode: 'CAN' ID: 100 Extended: 0 Name: 'EngineMsg' Data Details Timestamp: 0 Data: [0 0 0 0 0 0 0 0] Signals: [1×1 struct] Length: 8 Protocol Flags Error: 0 Remote: 0 Other Information Database: [1×1 can.Database] UserData: []
为基于事件的传输配置报文
要启用基于事件的报文传输,请使用 transmitEvent
命令指定传输通道、要在通道上注册的报文和状态值。
transmitEvent(txCh, msgEngineMsg, "On");
开始基于事件的传输
启动接收和发送通道。
start(rxCh); start(txCh);
将新值写入 Data
属性,并直接写入 VehicleSpeed
信号,以触发自动基于事件的传输,从而将报文传输到 CAN 总线上。
msgEngineMsg.Data = [250 100 0 0 20 0 0 0]; pause(1); msgEngineMsg.Signals.VehicleSpeed = 60; pause(1);
停止传输和接收通道。
stop(txCh); stop(rxCh);
分析基于事件的传输行为
接收通道现在有两条可用报文,对应于导致两次传输的两个更新。
rxCh.MessagesAvailable
ans = 2
接收可用的报文。检查报文,注意每个报文都有先前设置为 Data
属性的数据值。
msgRx = receive(rxCh, Inf, "OutputFormat", "timetable")
msgRx=2×8 timetable
Time ID Extended Name Data Length Signals Error Remote
____________ ___ ________ _____________ ________________________ ______ ____________ _____ ______
0.045004 sec 100 false {'EngineMsg'} {[250 100 0 0 20 0 0 0]} 8 {1×1 struct} false false
1.0556 sec 100 false {'EngineMsg'} {[250 100 0 0 60 0 0 0]} 8 {1×1 struct} false false
检查信号,注意 VehicleSpeed
的第二个实例具有先前设置为 VehicleSpeed
信号的数据值。
signals = canSignalTimetable(msgRx)
signals=2×2 timetable
Time VehicleSpeed EngineRPM
____________ ____________ _________
0.045004 sec 20 2835
1.0556 sec 60 2835
查看为基于事件的传输配置的报文
要查看为自动传输而在传输通道上配置的报文,请使用 transmitConfiguration
命令。
transmitConfiguration(txCh)
Periodic Messages None Event Messages ID Extended Name Data --- -------- --------- --------------------- 100 false EngineMsg 250 100 0 0 60 0 0 0
关闭通道和 DBC 文件
通过从工作区中清除 DBC 文件的变量,关闭对通道和 DBC 文件的访问。
clear rxCh txCh clear db