在仿真中回放 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 文件由 Vector CANoe 使用“系统配置 (J1939)”采样配置生成,并使用 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 {0x0 char} {[ 76 52 169 232 0 0 0 0]} 8 {0x0 struct} false false
0.001128 sec 418316035 true {0x0 char} {[ 78 52 169 232 0 3 0 0]} 8 {0x0 struct} false false
0.001688 sec 418316043 true {0x0 char} {[ 75 52 169 232 0 9 0 0]} 8 {0x0 struct} false false
0.002244 sec 418316055 true {0x0 char} {[ 77 52 169 232 0 19 0 0]} 8 {0x0 struct} false false
0.002796 sec 418316083 true {0x0 char} {[ 79 52 169 232 0 38 0 0]} 8 {0x0 struct} false false
0.003364 sec 418316262 true {0x0 char} {[ 105 52 169 232 0 131 0 16]} 8 {0x0 struct} false false
0.003932 sec 418316262 true {0x0 char} {[ 105 52 169 232 0 131 0 16]} 8 {0x0 struct} false false
0.25158 sec 201326595 true {0x0 char} {[252 255 255 255 248 255 255 255]} 8 {0x0 struct} false false
0.25216 sec 201326603 true {0x0 char} {[252 255 255 255 248 255 255 255]} 8 {0x0 struct} false false
0.25272 sec 217055747 true {0x0 char} {[ 192 0 0 250 240 240 7 3]} 8 {0x0 struct} false false
0.2533 sec 217056000 true {0x0 char} {[ 1 0 0 0 0 252 0 255]} 8 {0x0 struct} false false
0.25386 sec 217056256 true {0x0 char} {[ 240 0 125 208 7 0 241 0]} 8 {0x0 struct} false false
0.25444 sec 418382091 true {0x0 char} {[ 0 0 0 0 0 1 11 3]} 8 {0x0 struct} false false
0.25501 sec 418383107 true {0x0 char} {[ 125 0 0 125 0 0 0 0]} 8 {0x0 struct} false false
0.2556 sec 418384139 true {0x0 char} {[ 0 0 0 0 0 0 0 0]} 8 {0x0 struct} false false
0.25618 sec 419283979 true {0x0 char} {[ 3 0 0 255 255 255 255 255]} 8 {0x0 struct} false false
⋮
对于这一名为 EEC1_EMS
的示例,此数据包含一个感兴趣的 PG。该 PG 包含来自 Engine Electronic Controller 模块的数据。出于演示目的,此示例操作 BLF 文件中的数据集以有意触发故障模式。Simulink 模型使用修改后的数据集重现此故障。
打开 Simulink 模型
打开包含您的算法的 Simulink 模型。此示例中包含的模型使用基本的 J1939 网络设置。有关此设置和 J1939 模块的更多详细信息,请参阅示例 Simulink J1939 通信快速入门。
open demoVNTSL_J1939ReplayExample
模型概述
示例模型配置为通过 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");