主要内容

在仿真中回放 J1939 记录的现场数据

此示例说明如何回放从实际应用(例如实地行驶的车辆)中的 J1939 系统获取的 BLF 文件中的 J1939 数据。

Simulink® 模型会运行一个简单的马力估计器算法来触发现场可能发生的故障。该示例演示基于模型的工作流的一部分,该工作流在将 Simulink 算法部署到 ECU 之前使用现场数据重现该算法中存在的故障,并且可以扩展到测试任何算法模型以调试故障。

J1939 是一个较高层的协议,它使用控制器局域网 (CAN) 总线技术作为物理层。由于 CAN 是 J1939 系统中数据传输的基础,现场使用的工具默认将 J1939 数据记录为 CAN 帧。此示例通过 CAN 总线从 MATLAB® 执行原始记录的 CAN 帧的数据回放,并在 Simulink 模型中使用 J1939 Network Configuration、J1939 Node Configuration、J1939 CAN Transport Layer 和 J1939 Receive 模块接收数据。

此示例中使用的 BLF 文件使用“System Confirguration (J1939)”示例配置在 Vector CANoe 中生成的,并使用 MATLAB 和 Vehicle Network Toolbox™ 进行修改。此示例还使用 Vector 示例配置附带的 J1939 DBC 文件 PowerTrain_J1939.dbc。Vehicle Network Toolbox 提供 J1939 Simulink 模块,用于通过 Simulink 模型在 CAN 上接收和传输参数组 (PG)。该示例使用以环回配置形式连接的 MathWorks® 虚拟 CAN 通道。

读取 BLF 文件数据

使用 blfread 函数,从现场采集的 BLF 文件的通道 1 读取数据。

canData = blfread("LoggingBLF_J1939Replay.blf",1)
canData=15000×8 timetable
        Time           ID        Extended       Name                      Data                    Length      Signals       Error    Remote
    ____________    _________    ________    __________    ___________________________________    ______    ____________    _____    ______

    0.000568 sec    418316032     true       {0×0 char}    {[          76 52 169 232 0 0 0 0]}      8       {0×0 struct}    false    false 
    0.001128 sec    418316035     true       {0×0 char}    {[          78 52 169 232 0 3 0 0]}      8       {0×0 struct}    false    false 
    0.001688 sec    418316043     true       {0×0 char}    {[          75 52 169 232 0 9 0 0]}      8       {0×0 struct}    false    false 
    0.002244 sec    418316055     true       {0×0 char}    {[         77 52 169 232 0 19 0 0]}      8       {0×0 struct}    false    false 
    0.002796 sec    418316083     true       {0×0 char}    {[         79 52 169 232 0 38 0 0]}      8       {0×0 struct}    false    false 
    0.003364 sec    418316262     true       {0×0 char}    {[      105 52 169 232 0 131 0 16]}      8       {0×0 struct}    false    false 
    0.003932 sec    418316262     true       {0×0 char}    {[      105 52 169 232 0 131 0 16]}      8       {0×0 struct}    false    false 
    0.25158 sec     201326595     true       {0×0 char}    {[252 255 255 255 248 255 255 255]}      8       {0×0 struct}    false    false 
    0.25216 sec     201326603     true       {0×0 char}    {[252 255 255 255 248 255 255 255]}      8       {0×0 struct}    false    false 
    0.25272 sec     217055747     true       {0×0 char}    {[        192 0 0 250 240 240 7 3]}      8       {0×0 struct}    false    false 
    0.2533 sec      217056000     true       {0×0 char}    {[            1 0 0 0 0 252 0 255]}      8       {0×0 struct}    false    false 
    0.25386 sec     217056256     true       {0×0 char}    {[        240 0 125 208 7 0 241 0]}      8       {0×0 struct}    false    false 
    0.25444 sec     418382091     true       {0×0 char}    {[               0 0 0 0 0 1 11 3]}      8       {0×0 struct}    false    false 
    0.25501 sec     418383107     true       {0×0 char}    {[            125 0 0 125 0 0 0 0]}      8       {0×0 struct}    false    false 
    0.2556 sec      418384139     true       {0×0 char}    {[                0 0 0 0 0 0 0 0]}      8       {0×0 struct}    false    false 
    0.25618 sec     419283979     true       {0×0 char}    {[      3 0 0 255 255 255 255 255]}      8       {0×0 struct}    false    false 
      ⋮

对于这一名为 EEC1_EMS 的示例,此数据包含一个感兴趣的 PG。该 PG 包含来自 Engine Electronic Controller 模块的数据。出于演示目的,此示例操作 BLF 文件中的数据集以有意触发故障模式。Simulink 模型使用修改后的数据集重现此故障。

解码并重新打包参数组以检查信号数据

将 CAN 报文解码为 J1939 PG 时间表。

db = canDatabase("Powertrain_J1939Replay.dbc");
j1939PGTT = j1939ParameterGroupTimetable(canData, db)
j1939PGTT=15000×8 timetable
        Time            Name          PGN     Priority        PDUFormatType        SourceAddress    DestinationAddress                   Data                      Signals   
    ____________    _____________    _____    ________    _____________________    _____________    __________________    ___________________________________    ____________

    0.000568 sec    ACL              60928       6        Peer-to-Peer (Type 1)           0                255            {[          76 52 169 232 0 0 0 0]}    {1×1 struct}
    0.001128 sec    ACL              60928       6        Peer-to-Peer (Type 1)           3                255            {[          78 52 169 232 0 3 0 0]}    {1×1 struct}
    0.001688 sec    ACL              60928       6        Peer-to-Peer (Type 1)          11                255            {[          75 52 169 232 0 9 0 0]}    {1×1 struct}
    0.002244 sec    ACL              60928       6        Peer-to-Peer (Type 1)          23                255            {[         77 52 169 232 0 19 0 0]}    {1×1 struct}
    0.002796 sec    ACL              60928       6        Peer-to-Peer (Type 1)          51                255            {[         79 52 169 232 0 38 0 0]}    {1×1 struct}
    0.003364 sec    ACL              60928       6        Peer-to-Peer (Type 1)         230                255            {[      105 52 169 232 0 131 0 16]}    {1×1 struct}
    0.003932 sec    ACL              60928       6        Peer-to-Peer (Type 1)         230                255            {[      105 52 169 232 0 131 0 16]}    {1×1 struct}
    0.25158 sec     TSC1_TECU_EMS        0       3        Peer-to-Peer (Type 1)           3                  0            {[252 255 255 255 248 255 255 255]}    {1×1 struct}
    0.25216 sec     TSC1_EBS_EMS         0       3        Peer-to-Peer (Type 1)          11                  0            {[252 255 255 255 248 255 255 255]}    {1×1 struct}
    0.25272 sec     ETC1_TECU        61442       3        Broadcast (Type 2)              3                255            {[        192 0 0 250 240 240 7 3]}    {1×1 struct}
    0.2533 sec      EEC2_EMS         61443       3        Broadcast (Type 2)              0                255            {[            1 0 0 0 0 252 0 255]}    {1×1 struct}
    0.25386 sec     EEC1_EMS         61444       3        Broadcast (Type 2)              0                255            {[        240 0 125 208 7 0 241 0]}    {1×1 struct}
    0.25444 sec     EBC1_EBS         61441       6        Broadcast (Type 2)             11                255            {[               0 0 0 0 0 1 11 3]}    {1×1 struct}
    0.25501 sec     ETC2_TECU        61445       6        Broadcast (Type 2)              3                255            {[            125 0 0 125 0 0 0 0]}    {1×1 struct}
    0.2556 sec      VDC2_EBS         61449       6        Broadcast (Type 2)             11                255            {[                0 0 0 0 0 0 0 0]}    {1×1 struct}
    0.25618 sec     EBC5_EBS         64964       6        Broadcast (Type 2)             11                255            {[      3 0 0 255 255 255 255 255]}    {1×1 struct}
      ⋮

将来自感兴趣的 PG EEC1_EMS 的信号打包为一个信号时间表。

sigTable = j1939SignalTimetable(j1939PGTT,ParameterGroups="EEC1_EMS")
sigTable=402×7 timetable
       Time        EngDemandPercentTorque    EngStarterMode    SrcAddrssOfCtrllngDvcForEngCtrl    EngSpeed    ActualEngPercentTorque    DriversDemandEngPercentTorque    EngTorqueMode
    ___________    ______________________    ______________    _______________________________    ________    ______________________    _____________________________    _____________

    0.25386 sec             -125                   1                          0                     250                 0                           -125                       0      
    0.3527 sec              -125                   1                          0                     250                 0                           -125                       0      
    0.4527 sec              -125                   1                          0                     250                 0                           -125                       0      
    0.5527 sec              -125                   1                          0                     250                 0                           -125                       0      
    0.6527 sec              -125                   1                          0                     250                 0                           -125                       0      
    0.7527 sec              -125                   1                          0                     250                 0                           -125                       0      
    0.8527 sec              -125                   1                          0                     250                 0                           -125                       0      
    0.9527 sec              -125                   1                          0                     250                 0                           -125                       0      
    1.0527 sec              -125                   1                          0                     250                 0                           -125                       0      
    1.1527 sec              -125                   1                          0                     250                 0                           -125                       0      
    1.2539 sec              -125                   1                          0                     250                 0                           -125                       0      
    1.3527 sec              -125                   1                          0                     250                 0                           -125                       0      
    1.4527 sec              -125                   1                          0                     250                 0                           -125                       0      
    1.5527 sec              -125                   1                          0                     250                 0                           -125                       0      
    1.6527 sec              -125                   1                          0                     250                 0                           -125                       0      
    1.7527 sec              -125                   3                          0                     250                 0                           -125                       0      
      ⋮

打开 Simulink 模型

打开包含您的算法的 Simulink 模型。此示例中包含的模型使用基本的 J1939 网络设置。有关此设置和 J1939 模块的更多详细信息,请参阅示例 Simulink J1939 通信快速入门

open demoVNTSL_J1939ReplayExample
ans = logical
   1

模型概述

示例模型配置为通过 MathWorks 虚拟设备 1 通道 1 对 EEC1_EMS PG 执行接收操作。

  • J1939 Network Configuration 模块是使用数据库 Powertrain_J1939.dbc 进行配置的。

  • J1939 CAN Transport Layer 模块将设备设置为 MathWorks 虚拟通道 1。传输层配置为在 CAN 上通过指定的虚拟通道传输 J1939 报文。

  • J1939 Receive 模块接收通过网络传输的报文。J1939 Receive 模块配置为接收 EEC1_EMS PG,并将所需的输入(实际发动机扭矩百分比 (%) 和发动机转速 (RPM))传递给马力估计器算法。它还配置为将发动机要求扭矩百分比 (%) 传递给一个关系运算符模块。为简单起见,其余输出已终止。

马力估计器算法

马力估计器算法是一种简单的计算方法,它基于实际发动机扭矩百分比和速度值来计算发动机马力值。

关系运算符

模型中有三个关系运算符模块:

  • Relational Operator 1 将计算出的马力值与零进行比较,并输出布尔值。

  • Relational Operator 2 将发动机要求扭矩百分比的值与零进行比较,并输出布尔值。

  • Relational Operator 3 比较 Relational Operator 1 和 2 的输出值,并输出一个布尔值来触发故障指示灯的状态。

车辆仪表板

车辆仪表板包含显示发动机 RPM 的转速表、显示计算出的马力值和发动机要求扭矩百分比的两个仪表以及故障指示灯。

创建通道以进行回放

使用 canChannel 函数创建 CAN 通道以回放报文。

replayChannel = canChannel("MathWorks","Virtual 1",2);

设置模型参数并开始仿真

指定仿真时间并开始仿真。

set_param("demoVNTSL_J1939ReplayExample","StopTime","inf");
set_param("demoVNTSL_J1939ReplayExample","SimulationCommand","start");

暂停,直到仿真完全启动。

while strcmp(get_param("demoVNTSL_J1939ReplayExample","SimulationStatus"),"stopped")
end

启动 CAN 通道并回放数据

启动 MATLAB CAN 通道。

start(replayChannel);
pause(2);

回放从 BLF 文件中获取的数据。replay 操作大约会运行 45 秒。

replay(replayChannel,canData);

仿真概述

在此示例正在运行时,观察 Simulink 模型。车辆仪表板部分的仪表值和故障指示灯的红绿灯转换会发生变化。

J1939 Receive 模块从 MATLAB 接收 EEC1_EMS PG,对感兴趣的信号进行解码,并将其传递给马力估计器算法。计算出马力值后,Relational Operator 1 将其值与零进行比较以确定方向。J1939 Receive 模块还将发动机要求扭矩百分比传递给 Relational Operator 2。Relational Operator 2 将其值与零进行比较以确定方向。

如果该值大于或等于零,则输出为布尔值 1;如果该值小于零(负值),则输出为 0。

Relational Operator 3 接受前面两个关系运算符的输出,并比较它们是否相等。如果两个模块的值均为 0 或 1,即正马力和正扭矩 (1),或负马力和负扭矩 (0),则它提供输出 1,这会触发故障指示灯显示绿灯。但如果前面的两个关系运算符模块的值相反,即正马力 (1) 和负扭矩 (0),或负马力 (0) 和正扭矩 (1),则它提供输出 0,这会触发故障指示灯显示红灯。这些观察有助于根据现场数据确定算法是否有问题,您可以进一步分析该算法。

停止 CAN 通道

stop(replayChannel);

停止仿真

set_param("demoVNTSL_J1939ReplayExample","SimulationCommand","stop");