Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

事件触发的 CAN 报文传输

以下示例说明如何使用 Vehicle Network Toolbox™ 的自动 CAN 报文传递功能在发生事件时发送报文。它使用以环回配置形式连接的 MathWorks 虚拟 CAN 通道。由于此示例是在虚拟网络上发送和接收 CAN 报文,因此结合运行 CAN Explorer 可以更全面地了解代码所执行的操作。要运行 CAN Explorer,请打开并配置它使用与示例的接收通道相同的接口。确保在开始运行示例之前启动 CAN Explorer,以便查看发生的所有报文。

创建 CAN 通道

创建要对其使用自动报文传输命令的 CAN 通道。

txCh = canChannel('MathWorks', 'Virtual 1', 1);
rxCh = canChannel('MathWorks', 'Virtual 1', 2);

在此示例中,您将使用 CAN 数据库文件来定义和解码报文。打开数据库并将其连接到 CAN 通道。

db = canDatabase('CANDatabaseEvent.dbc');
txCh.Database = db;
rxCh.Database = db;

创建 CAN 报文

您可以使用数据库信息创建 CAN 报文以注册事件传输。

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');

启动事件报文传输

启动通道并将新值写入 Data 属性或直接写入信号,以触发自动基于事件的传输,从而将报文传输到 CAN 总线上。

start(rxCh);
start(txCh);
msgEngineMsg.Data = [250 100 0 0 20 0 0 0];
pause(1);
msgEngineMsg.Signals.VehicleSpeed = 60;
pause(1);
stop(txCh);
stop(rxCh);

分析事件传输行为

接收通道现在有两条可用报文,对应于导致两次传输的两个更新。

rxCh
rxCh = 
  Channel with properties:

   Device Information
            DeviceVendor: 'MathWorks'
                  Device: 'Virtual 1'
      DeviceChannelIndex: 2
      DeviceSerialNumber: 0
            ProtocolMode: 'CAN'

   Status Information
                 Running: 0
       MessagesAvailable: 2
        MessagesReceived: 0
     MessagesTransmitted: 0
    InitializationAccess: 1
        InitialTimestamp: 13-Feb-2021 03:22:09
           FilterHistory: 'Standard ID Filter: 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.Database]
                UserData: []

接收并检查每条报文,以查看每条报文是否具有先前设置的数据值。

msgRx = receive(rxCh, Inf, 'OutputFormat', 'timetable')
msgRx=2×8 timetable
       Time        ID     Extended        Name                   Data              Length      Signals       Error    Remote
    ___________    ___    ________    _____________    ________________________    ______    ____________    _____    ______

    0.05534 sec    100     false      {'EngineMsg'}    {[250 100 0 0 20 0 0 0]}      8       {1x1 struct}    false    false 
    1.0736 sec     100     false      {'EngineMsg'}    {[250 100 0 0 60 0 0 0]}      8       {1x1 struct}    false    false 

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

    0.05534 sec         20           2835   
    1.0736 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