Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

MATLAB 中基于事件的 CAN 通信

此示例说明如何配置 CAN 通道和报文,以便在事件发生时传输报文。它使用以环回配置形式连接的 MathWorks 虚拟 CAN 通道。

由于此示例是在虚拟网络上发送和接收 CAN 报文,因此结合运行 CAN Explorer 可以更全面地了解代码所执行的操作。要运行 CAN Explorer,请打开并配置它使用与示例的接收通道相同的接口。确保在开始运行示例之前启动 CAN Explorer,以便查看发生的所有报文。

此示例说明 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: [1x1 struct]
          Length: 8

   Protocol Flags
           Error: 0
          Remote: 0

   Other Information
        Database: [1x1 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.033071 sec    100     false      {'EngineMsg'}    {[250 100 0 0 20 0 0 0]}      8       {1x1 struct}    false    false 
    1.0489 sec      100     false      {'EngineMsg'}    {[250 100 0 0 60 0 0 0]}      8       {1x1 struct}    false    false 

检查信号,注意 VehicleSpeed 的第二个实例具有先前设置为 VehicleSpeed 信号的数据值。

signals = canSignalTimetable(msgRx)
signals=2×2 timetable
        Time        VehicleSpeed    EngineRPM
    ____________    ____________    _________

    0.033071 sec         20           2835   
    1.0489 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