Main Content

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

在 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