主要内容

开发 CAN Replay 模型

此示例说明如何选择一种建模方法以将回放的 CAN 报文注入模型中。

概述

CAN Replay 模块允许您将 CAN 数据作为输入注入 Simulink® 模型中。数据在 MAT 文件中提供,形式为具有已定义字段的结构体类型的变量。有关详细信息,请参阅记录和回放 CAN 报文

在此示例中,文件 DriveReplay.mat 包含变量 canMsgs,其中包含随时可用的记录数据。

load("DriveReplay.mat");
canMsgs
canMsgs = struct with fields:
           ID: [1201 1312 512 513 533 561 576 1616 1200 1201 1216 512 513 533 1296 1200 128 133 144 528 529 1201 1312 512 513 533 1200 1201 628 561 576 1296 1200 128 133 144 512 513 528 529 533 1201 1312 1200 1201 512 513 533 1296 … ] (1×100000 uint32)
     Extended: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 … ] (1×100000 uint8)
       Remote: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 … ] (1×100000 uint8)
        Error: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 … ] (1×100000 uint8)
       Length: [8 5 8 8 8 8 4 1 8 8 1 8 8 8 3 8 7 8 8 7 8 8 5 8 8 8 8 8 8 8 4 3 8 7 8 8 8 8 7 8 8 8 5 8 8 8 8 8 3 8 7 8 8 7 8 7 8 5 8 8 8 8 4 7 1 8 8 3 8 8 8 8 7 8 8 7 8 8 5 8 8 8 8 8 3 8 4 8 7 8 8 7 8 8 8 8 8 5 3 8 8 8 8 8 8 7 8 8 7 … ] (1×100000 uint8)
    Timestamp: [88.6176 88.6178 88.6194 88.6196 88.6199 88.6201 88.6203 88.6204 88.6241 88.6243 88.6244 88.6294 88.6296 88.6299 88.6307 88.6323 88.6325 88.6328 88.6330 88.6333 88.6335 88.6337 88.6339 88.6394 88.6397 88.6399 88.6405 … ] (1×100000 double)
         Data: [8×100000 uint8]

设置仿真时间步以及仿真的初始和最终时间很方便,如下所示:

Ts = 0.01;
startTime = round(canMsgs.Timestamp(1)/Ts)*Ts;
stopTime = round(canMsgs.Timestamp(end)/Ts)*Ts; 

其中仿真的开始和停止时间舍入到采样时间的最接近整数倍。

典型用例

CAN Replay 模块在以下情况下很有用:

  • 无通道或调速的仿真。

  • 通过虚拟通道传输报文的仿真。

  • 通过物理通道传输报文的仿真。

无通道或调速的仿真

在这种情况下,CAN Replay 模块用于从 MAT 文件读取数据,并将 CAN 报文路由到其输出端口。打开模型 simulation_without_channels_or_pacing.slx 并验证模块的配置如下所示:

其中将报文回放给设置为 Output port。在这种情况下,无法设置 Device 参数,因为没有设备用于传输。

请注意采样时间 Ts 的使用,以及仅回放一次报文的决定。为了使仿真与这些选择兼容,有必要按如下方式设置模型的配置参数:

报文可以通过 CAN Unpack 模块进行解码,如下图所示。轮速信号可以用作模型中的任何其他 Simulink 信号,并且它们与仿真时间同步。

对模型 simulation_without_channels_or_pacing.slx 进行仿真以及使用仿真数据检查器对数据进行可视化会得到以下结果:

通过虚拟通道传输报文的仿真

或者,可以将 CAN Replay 模块配置为通过虚拟通道进行传输。模块的配置可能如下所示:

参数将报文回放给设置为 CAN Bus,并且所选设备是 MathWorks® 虚拟通道。应用此配置后,CAN Replay 模块的输出端口消失,因为该模块直接通过所选通道进行传输。此外,软件建议插入 CAN Configuration 模块来配置所选设备。CAN Configuration 模块可以保留其默认参数。需要插入一个额外的模块,即 CAN Receive 模块,该模块配置为从 MathWorks Virtual 1 (Channel 1) 接收报文,并且采样时间等于 Ts。所有其他参数值与上一节中的相同。在模型 simulation_with_virtual_channels.slx 中可用的模块图如下所示:

对此模型运行仿真会得到以下结果,这很有启发性:

与之前的情况相比,当使用设备时,无法保证报文的传输与仿真时间同步。特别是,虚拟通道是在不同线程中执行的软件缓冲区,用于模拟硬件通道的行为,但传输数据时不会损坏。在这种情况下,仿真在虚拟通道开始将报文路由到 CAN Unpack 模块之前就已完成。因此,产生的信号为零。

请注意,将模型配置为通过虚拟通道回放 CAN 报文并非在需要在运行时使用数据的情况下运行仿真的正确策略,因为这些虚拟通道会引入延迟。然而,这是准备模型以使用硬件通道的最合适和有利的方式,因为切换到使用硬件设备只需修改模块参数,而不需要对模型进行结构性修改(不添加或删除模块)。

减轻虚拟通道引入的延迟影响的一种方法是使用仿真调速选项 (Simulink)。将每挂钟秒的仿真时间设置为 1 后,LF_WSpeed 信号的仿真结果如下:

绿色信号 LF_WSpeed 表示不使用通道或调速获得的结果;红色信号 LF_WSpeed_VirtualChannel_Pacing 是使用虚拟通道和仿真调速获得的结果。虚拟通道引入了明显的延迟,这无法通过使用仿真调速完全补偿。

通过物理通道传输报文的仿真

当使用物理通道时,桌面计算机通过专用硬件设备连接到 CAN 总线。就仿真时序而言,注意事项与上一节中的相同。除了通道引入的传输延迟外,硬件设备还会引入虚拟通道无法仿真的其他真实效应。

请注意,仿真调速无法替代实时仿真,后者需要专用的实时计算机和特定的传输/接收模块。有关详细信息,请参阅 Simulink Real-Time 快速入门 (Simulink Real-Time)