Main Content

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

记录并回放 CAN FD 报文

以下示例说明如何使用 Simulink 中的 MathWorks 虚拟 CAN FD 通道记录和回放 CAN FD 报文。您可以更新此模型以连接到您的系统上支持的硬件。

从示例文件夹中的 SourceFDMsgs.mat 文件加载保存的 CAN FD 报文。该文件包含 CAN FD 报文,这些报文表示绕试车道一周的 90 秒驾驶周期。

load SourceFDMsgs.mat

检查包含 CAN FD 报文的时间表。特别要注意,初始时间戳不为零:

startTime = seconds(canFDMsgTimetable.Time(1)) %#ok<NOPTS>
startTime = 88.6176
stopTime = seconds(canFDMsgTimetable.Time(end)) %#ok<NOPTS>
stopTime = 177.2310

将这些报文转换为与 CAN FD Replay 模块兼容的格式,并将其保存到一个单独的文件中。

canFDMsgs = canFDMessageReplayBlockStruct(canFDMsgTimetable);
save DriveReplayFD.mat canFDMsgs
whos
  Name                        Size               Bytes  Class        Attributes

  canFDMsgTimetable      100000x12            45411725  timetable              
  canFDMsgs                   1x1              8401848  struct                 
  startTime                   1x1                    8  double                 
  stopTime                    1x1                    8  double                 

CAN FD Replay 模型

该模型包含:

  • 一个 CAN FD Replay 模块,用于向 MathWorks Virtual Channel 1 传输报文。

  • 一个 CAN FD Receive 模块,用于通过 MathWorks Virtual Channel 2 接收 CAN FD 网络上的报文。

CAN FD Receive 模块配置为阻止所有扩展 ID,并且仅允许具有标准 ID 1200WheelSpeed 报文通过。

使用报文时间序列的初始和最终时间戳连贯地配置仿真开始和停止时间。为此,请选择建模选项卡,然后点击模型设置。然后,在配置参数对话框中,使用之前定义的变量 startTimestopTime 设置仿真开始和停止时间。点击应用,然后关闭配置参数窗口。

通过点击运行按钮来运行仿真。

请注意诊断查看器中的警告:

该模型配置为使用定步长求解器,时间步为 0.01 秒。然而,从记录的时间序列中获得的开始和停止时间的值不是仿真时间步的整数倍。Simulink 中的默认行为是对这些值进行舍入,使它们与仿真时间步一致;它们也可以在仿真前在 MATLAB 脚本中舍入。有关 Simulink 求解器自动参数选择的详细信息,请参阅文档页选择求解器 (Simulink)

Wheel Speeds 子系统

Wheel Speeds 子系统对收到的 CAN FD 报文中的轮速信息解包,并将它们绘制到示波器中。该子系统还将报文记录到一个文件中。

可视化轮速信息

示波器中的绘图显示试驾期间所有车轮的轮速。

根据计算机的配置,仿真后示波器中的信号可能为零。此结果是正常的:模型仿真和报文传输在不同线程中执行,因此并不同步。Simulink 尝试尽可能快地仿真模型,由于时间序列非常短,因此,到仿真结束时,很可能第一条报文的接收尚未完成。

要在 Simulink 中回放记录信号,更合适的方法是使用仿真调速在近实时的情况下执行模型。这样,模型的仿真大致可以记录信号的速度运行。要启用仿真调速,请点击运行 -> 仿真调速,然后选中复选框启用调速以减慢仿真。再次运行仿真并检查示波器,它现在显示适当的信号。

要了解有关仿真调速的更多信息,请访问此页:Simulation Pacing Options (Simulink)

加载包含所记录报文的文件

每次运行模型时,CAN FD Log 模块都会创建一个具有唯一性的文件。在 MATLAB 命令行窗口中使用 dir 查找最新日志文件。

dir WheelSpeeds*.mat
WheelSpeeds_2023-Jun-20_123918.mat  WheelSpeeds_2023-Jun-20_151835.mat  
load WheelSpeeds_2023-Jun-20_123918.mat
whos
  Name                        Size               Bytes  Class        Attributes

  canFDMsgTimetable      100000x12            45411725  timetable              
  canFDMsgs                   1x1              8401848  struct                 
  outFDMsgs                   1x1              7845516  struct                 
  startTime                   1x1                    8  double                 
  stopTime                    1x1                    8  double                 

转换记录的报文

使用 startTime 变量来偏移 CAN FD Log 模块中记录的时间戳。

outFDMsgs.Timestamp = startTime + outFDMsgs.Timestamp;

使用函数 canFDMessageTimetable 将仿真期间记录的报文转换为可在命令行窗口中使用的时间表。

要直接访问报文信号,请在转换中使用对应的数据库文件以及 canSignalTimetable

db = canDatabase('VehicleInfoFD.dbc');
wheelSpeedMsgTimetable = canFDMessageTimetable(outFDMsgs, db);
wheelSpeedMsgTimetable(1:15, :)
ans=15×12 timetable
       Time        ID     Extended         Name          ProtocolMode                 Data                 Length    DLC      Signals       Error    Remote     BRS      ESI 
    __________    ____    ________    _______________    ____________    ______________________________    ______    ___    ____________    _____    ______    _____    _____

    88.829 sec    1201     false      {0×0 char     }     {'CAN FD'}     {[           0 0 0 0 0 0 0 0]}      8        8     {0×0 struct}    false    false     true     false
    88.83 sec     1312     false      {0×0 char     }     {'CAN FD'}     {[            250 0 200 50 0]}      5        5     {0×0 struct}    false    false     true     false
    88.831 sec     512     false      {0×0 char     }     {'CAN FD'}     {[   2 1 1 250 1 231 129 255]}      8        8     {0×0 struct}    false    false     true     false
    88.832 sec     513     false      {0×0 char     }     {'CAN FD'}     {[12 103 255 255 39 16 1 255]}      8        8     {0×0 struct}    false    false     true     false
    88.832 sec     533     false      {0×0 char     }     {'CAN FD'}     {[        2 26 2 26 2 24 0 0]}      8        8     {0×0 struct}    false    false     true     false
    88.832 sec     561     false      {0×0 char     }     {'CAN FD'}     {[      15 4 255 255 0 0 0 0]}      8        8     {0×0 struct}    false    false     true     false
    88.832 sec     576     false      {0×0 char     }     {'CAN FD'}     {[             63 141 140 32]}      4        4     {0×0 struct}    false    false     true     false
    88.832 sec    1616     false      {0×0 char     }     {'CAN FD'}     {[                         0]}      1        1     {0×0 struct}    false    false     true     false
    88.836 sec    1200     false      {'WheelSpeeds'}     {'CAN FD'}     {[   39 16 39 16 39 16 39 16]}      8        8     {1×1 struct}    false    false     true     false
    88.836 sec    1201     false      {0×0 char     }     {'CAN FD'}     {[           0 0 0 0 0 0 0 0]}      8        8     {0×0 struct}    false    false     true     false
    88.836 sec    1216     false      {0×0 char     }     {'CAN FD'}     {[                       163]}      1        1     {0×0 struct}    false    false     true     false
    88.841 sec     512     false      {0×0 char     }     {'CAN FD'}     {[   2 1 1 250 1 231 129 255]}      8        8     {0×0 struct}    false    false     true     false
    88.842 sec     513     false      {0×0 char     }     {'CAN FD'}     {[12 103 255 255 39 16 1 255]}      8        8     {0×0 struct}    false    false     true     false
    88.842 sec     533     false      {0×0 char     }     {'CAN FD'}     {[        2 26 2 26 2 24 0 0]}      8        8     {0×0 struct}    false    false     true     false
    88.843 sec    1296     false      {0×0 char     }     {'CAN FD'}     {[                     0 0 1]}      3        3     {0×0 struct}    false    false     true     false

wheelSpeedSignals = canSignalTimetable(wheelSpeedMsgTimetable);
wheelSpeedSignals(end-14:end, :)
ans=15×4 timetable
       Time       RR_WSpeed    RF_WSpeed    LR_WSpeed    LF_WSpeed
    __________    _________    _________    _________    _________

    177.31 sec       57.4        57.37        57.27        57.35  
    177.32 sec      57.39        57.35         57.3        57.32  
    177.33 sec      57.36        57.39         57.4        57.31  
    177.33 sec      57.47        57.46        57.47        57.37  
    177.34 sec      57.56        57.41        57.45        57.39  
    177.35 sec      57.48        57.33        57.43         57.4  
    177.36 sec      57.37        57.35        57.41        57.41  
    177.37 sec      57.33        57.41        57.41        57.39  
    177.37 sec      57.37        57.44        57.44        57.36  
    177.38 sec      57.48        57.47        57.43        57.35  
    177.39 sec       57.5        57.43         57.4        57.33  
    177.4 sec       57.48        57.36        57.35        57.32  
    177.41 sec      57.43        57.35        57.28        57.33  
    177.42 sec      57.28         57.4        57.26        57.36  
    177.43 sec      57.27        57.46        57.23        57.35  

plot(wheelSpeedSignals.Time, wheelSpeedSignals{:,:});

此示例中使用了 MathWorks CAN FD 虚拟通道。但是,您可以将模型连接到其他支持的硬件。

另请参阅

工具

相关主题