Этот пример показывает вам, как импортировать и декодировать данные J1939 из BLF-файлов в MATLAB для анализа. BLF-файл, используемый в этом примере, был сгенерирован от Векторного КАНОЭ с помощью "Конфигурации системы (J1939)" выборка. Этот пример также использует файл базы данных CAN, Powertrain_J1939_BLF.dbc
, предоставленный Векторную демонстрационную настройку.
Получите и просмотрите информацию о BLF-файле. blfinfo
функционируйте анализирует общую информацию о формате и содержимом Векторного Двоичного файла, Регистрирующего BLF-файл Формата, и возвращает информацию как структуру.
binf = blfinfo("LoggingBLF_J1939.blf")
binf = struct with fields:
Name: "LoggingBLF_J1939.blf"
Path: "C:\Users\michellw\OneDrive - MathWorks\Documents\MATLAB\Examples\vnt-ex52809946\LoggingBLF_J1939.blf"
Application: "CANoe"
ApplicationVersion: "12.0.167"
Objects: 131119
StartTime: 21-Apr-2021 10:05:13.232
EndTime: 21-Apr-2021 10:09:14.344
ChannelList: [2×3 table]
Заметьте, что свойство ChannelList указывает, что существует 2 канала, на которые ссылаются в BLF-файле со значениями ChannelID 1 и 2. Данные о трансмиссии J1939 интереса регистрировались от сети CAN2, таким образом, этот пример особое внимание на ChannelID 2.
binf.ChannelList
ans=2×3 table
ChannelID Protocol Objects
_________ ________ _______
1 "CAN" 92720
2 "CAN" 26054
J1939 является протоколом, созданным сверху протокола CAN. Группа параметра (PG) является набором параметров, принадлежащих той же теме и совместно использующих ту же скорость передачи e.g. EngCoolantTemp, EngFuelTemp, EngTurboOilTemp, и т.д. ET1_EMS PG (см. ET1_EMS PG в signalTimetables ниже). Каждая группа параметра обращена через уникальный номер, названный номером группы параметра (PGN). PG J1939 передаются как системы координат CAN.
Считывайте все данные от канала 2 в расписание с помощью blfread
функция. Каждая строка расписания представляет одну необработанную систему координат CAN от шины.
canData = blfread("LoggingBLF_J1939.blf", 2)
canData=26054×8 timetable
Time ID Extended Name Data Length Signals Error Remote
____________ _________ ________ __________ ___________________________________ ______ ____________ _____ ______
0.000568 sec 418316262 true {0×0 char} {[ 105 52 169 232 0 131 0 16]} 8 {0×0 struct} false false
0.27057 sec 418383078 true {0×0 char} {[ 255 255 255 208 7 255 255 255]} 8 {0×0 struct} false false
0.29057 sec 418383078 true {0×0 char} {[ 255 255 255 208 7 255 255 255]} 8 {0×0 struct} false false
0.30058 sec 418382822 true {0×0 char} {[ 255 0 255 255 255 255 255 255]} 8 {0×0 struct} false false
0.30116 sec 419327206 true {0×0 char} {[255 255 255 255 255 255 255 255]} 8 {0×0 struct} false false
0.31057 sec 418383078 true {0×0 char} {[ 255 255 255 208 7 255 255 255]} 8 {0×0 struct} false false
0.33057 sec 418383078 true {0×0 char} {[ 255 255 255 208 7 255 255 255]} 8 {0×0 struct} false false
0.35058 sec 418382822 true {0×0 char} {[ 255 0 255 255 255 255 255 255]} 8 {0×0 struct} false false
0.35115 sec 418383078 true {0×0 char} {[ 255 255 255 208 7 255 255 255]} 8 {0×0 struct} false false
0.35173 sec 419327206 true {0×0 char} {[255 255 255 255 255 255 255 255]} 8 {0×0 struct} false false
0.3523 sec 419361254 true {0×0 char} {[ 255 0 0 12 255 255 224 255]} 8 {0×0 struct} false false
0.37057 sec 418383078 true {0×0 char} {[ 255 255 255 208 7 255 255 255]} 8 {0×0 struct} false false
0.39057 sec 418383078 true {0×0 char} {[ 255 255 255 208 7 255 255 255]} 8 {0×0 struct} false false
0.40058 sec 418382822 true {0×0 char} {[ 255 0 255 255 255 255 255 255]} 8 {0×0 struct} false false
0.40116 sec 419327206 true {0×0 char} {[255 255 255 255 255 255 255 255]} 8 {0×0 struct} false false
0.41057 sec 418383078 true {0×0 char} {[ 255 255 255 208 7 255 255 255]} 8 {0×0 struct} false false
⋮
Откройте файл базы данных с помощью canDatabase
функция.
canDB = canDatabase("Powertrain_J1939_BLF.dbc")
canDB = Database with properties: Name: 'Powertrain_J1939_BLF' Path: 'C:\Users\michellw\OneDrive - MathWorks\Documents\MATLAB\Examples\vnt-ex52809946\Powertrain_J1939_BLF.dbc' Nodes: {12×1 cell} NodeInfo: [12×1 struct] Messages: {93×1 cell} MessageInfo: [93×1 struct] Attributes: {3×1 cell} AttributeInfo: [3×1 struct] UserData: []
j1939ParameterGroupTimetable
функционируйте использует базу данных, чтобы декодировать необработанные Данные о CAN в PG, PGNs и сигналы. Расписание двоичного файла, регистрирующего данные о формате, преобразовано в расписание группы параметра Vehicle Network Toolbox™ J1939.
j1939PGTimetable = j1939ParameterGroupTimetable(canData, canDB)
j1939PGTimetable=26030×8 timetable
Time Name PGN Priority PDUFormatType SourceAddress DestinationAddress Data Signals
____________ ________ _____ ________ _____________________ _____________ __________________ ___________________________________ ____________
0.000568 sec ACL 60928 6 Peer-to-Peer (Type 1) 230 255 {[ 105 52 169 232 0 131 0 16]} {1×1 struct}
0.27057 sec EEC1_EMS 61444 6 Broadcast (Type 2) 230 255 {[ 255 255 255 208 7 255 255 255]} {1×1 struct}
0.29057 sec EEC1_EMS 61444 6 Broadcast (Type 2) 230 255 {[ 255 255 255 208 7 255 255 255]} {1×1 struct}
0.30058 sec EEC2_EMS 61443 6 Broadcast (Type 2) 230 255 {[ 255 0 255 255 255 255 255 255]} {1×1 struct}
0.30116 sec TCO1_TCO 65132 6 Broadcast (Type 2) 230 255 {[255 255 255 255 255 255 255 255]} {1×1 struct}
0.31057 sec EEC1_EMS 61444 6 Broadcast (Type 2) 230 255 {[ 255 255 255 208 7 255 255 255]} {1×1 struct}
0.33057 sec EEC1_EMS 61444 6 Broadcast (Type 2) 230 255 {[ 255 255 255 208 7 255 255 255]} {1×1 struct}
0.35058 sec EEC2_EMS 61443 6 Broadcast (Type 2) 230 255 {[ 255 0 255 255 255 255 255 255]} {1×1 struct}
0.35115 sec EEC1_EMS 61444 6 Broadcast (Type 2) 230 255 {[ 255 255 255 208 7 255 255 255]} {1×1 struct}
0.35173 sec TCO1_TCO 65132 6 Broadcast (Type 2) 230 255 {[255 255 255 255 255 255 255 255]} {1×1 struct}
0.3523 sec CCVS_EMS 65265 6 Broadcast (Type 2) 230 255 {[ 255 0 0 12 255 255 224 255]} {1×1 struct}
0.37057 sec EEC1_EMS 61444 6 Broadcast (Type 2) 230 255 {[ 255 255 255 208 7 255 255 255]} {1×1 struct}
0.39057 sec EEC1_EMS 61444 6 Broadcast (Type 2) 230 255 {[ 255 255 255 208 7 255 255 255]} {1×1 struct}
0.40058 sec EEC2_EMS 61443 6 Broadcast (Type 2) 230 255 {[ 255 0 255 255 255 255 255 255]} {1×1 struct}
0.40116 sec TCO1_TCO 65132 6 Broadcast (Type 2) 230 255 {[255 255 255 255 255 255 255 255]} {1×1 struct}
0.41057 sec EEC1_EMS 61444 6 Broadcast (Type 2) 230 255 {[ 255 255 255 208 7 255 255 255]} {1×1 struct}
⋮
Просмотрите данные сигнала, сохраненные в третьем Пг расписания, которое является одним экземпляром Стр. "EEC1_EMS".
signalData = j1939PGTimetable.Signals{3}
signalData = struct with fields:
EngDemandPercentTorque: 130
EngStarterMode: 15
SrcAddrssOfCtrllngDvcForEngCtrl: 255
EngSpeed: 250
ActualEngPercentTorque: 130
DriversDemandEngPercentTorque: 130
EngTorqueMode: 15
Используйте j1939SignalTimetable
функционируйте, чтобы повторно группировать данные сигнала от каждого уникального PGN на шине в расписание сигнала. Этот пример создает два отдельных расписания сигнала для двух PG интереса, "EEC1_EMS" и "TCO1_TCO", из расписания J1939 PG.
signalTimetable1 = j1939SignalTimetable(j1939PGTimetable, "ParameterGroups", "EEC1_EMS")
signalTimetable1=12043×7 timetable
Time EngDemandPercentTorque EngStarterMode SrcAddrssOfCtrllngDvcForEngCtrl EngSpeed ActualEngPercentTorque DriversDemandEngPercentTorque EngTorqueMode
___________ ______________________ ______________ _______________________________ ________ ______________________ _____________________________ _____________
0.27057 sec 130 15 255 250 130 130 15
0.29057 sec 130 15 255 250 130 130 15
0.31057 sec 130 15 255 250 130 130 15
0.33057 sec 130 15 255 250 130 130 15
0.35115 sec 130 15 255 250 130 130 15
0.37057 sec 130 15 255 250 130 130 15
0.39057 sec 130 15 255 250 130 130 15
0.41057 sec 130 15 255 250 130 130 15
0.43057 sec 130 15 255 250 130 130 15
0.45115 sec 130 15 255 250 130 130 15
0.47057 sec 130 15 255 250 130 130 15
0.49057 sec 130 15 255 250 130 130 15
0.51057 sec 130 15 255 250 130 130 15
0.53057 sec 130 15 255 250 130 130 15
0.55115 sec 130 15 255 250 130 130 15
0.57057 sec 130 15 255 250 130 130 15
⋮
signalTimetable2 = j1939SignalTimetable(j1939PGTimetable, "ParameterGroups", "TCO1_TCO")
signalTimetable2=4817×14 timetable
Time TachographVehicleSpeed TachographOutputShaftSpeed DirectionIndicator TachographPerformance HandlingInformation SystemEvent DriverCardDriver2 Driver2TimeRelatedStates Overspeed DriverCardDriver1 Driver1TimeRelatedStates DriveRecognize Driver2WorkingState Driver1WorkingState
___________ ______________________ __________________________ __________________ _____________________ ___________________ ___________ _________________ ________________________ _________ _________________ ________________________ ______________ ___________________ ___________________
0.30116 sec 256 8191.9 3 3 3 3 3 15 3 3 15 3 7 7
0.35173 sec 256 8191.9 3 3 3 3 3 15 3 3 15 3 7 7
0.40116 sec 256 8191.9 3 3 3 3 3 15 3 3 15 3 7 7
0.45173 sec 256 8191.9 3 3 3 3 3 15 3 3 15 3 7 7
0.50116 sec 256 8191.9 3 3 3 3 3 15 3 3 15 3 7 7
0.55173 sec 256 8191.9 3 3 3 3 3 15 3 3 15 3 7 7
0.60116 sec 256 8191.9 3 3 3 3 3 15 3 3 15 3 7 7
0.65173 sec 256 8191.9 3 3 3 3 3 15 3 3 15 3 7 7
0.70116 sec 256 8191.9 3 3 3 3 3 15 3 3 15 3 7 7
0.75173 sec 256 8191.9 3 3 3 3 3 15 3 3 15 3 7 7
0.80116 sec 256 8191.9 3 3 3 3 3 15 3 3 15 3 7 7
0.85173 sec 256 8191.9 3 3 3 3 3 15 3 3 15 3 7 7
0.90116 sec 256 8191.9 3 3 3 3 3 15 3 3 15 3 7 7
0.95173 sec 256 8191.9 3 3 3 3 3 15 3 3 15 3 7 7
1.0012 sec 256 8191.9 3 3 3 3 3 15 3 3 15 3 7 7
1.0517 sec 256 8191.9 3 3 3 3 3 15 3 3 15 3 7 7
⋮
Можно альтернативно принять решение преобразовать целое расписание J1939 PG в struct, содержащий несколько расписаний сигнала J1939 для каждого отдельного PG и индекса в него, чтобы получить данные для конкретной Стр.
signalTimetables = j1939SignalTimetable(j1939PGTimetable)
signalTimetables = struct with fields:
ACL: [1×14 timetable]
CCVS_EMS: [2408×19 timetable]
DD: [240×5 timetable]
EEC1_EMS: [12043×7 timetable]
EEC2_EMS: [4817×10 timetable]
ET1_EMS: [240×6 timetable]
HOURS_EMS: [240×2 timetable]
LFC_EMS: [480×2 timetable]
SERV: [240×6 timetable]
TCO1_TCO: [4817×14 timetable]
VDHR_EMS: [240×2 timetable]
VI_EMS: [24×1 timetable]
VW_SSC: [240×4 timetable]
signalTimetables.EEC1_EMS
ans=12043×7 timetable
Time EngDemandPercentTorque EngStarterMode SrcAddrssOfCtrllngDvcForEngCtrl EngSpeed ActualEngPercentTorque DriversDemandEngPercentTorque EngTorqueMode
___________ ______________________ ______________ _______________________________ ________ ______________________ _____________________________ _____________
0.27057 sec 130 15 255 250 130 130 15
0.29057 sec 130 15 255 250 130 130 15
0.31057 sec 130 15 255 250 130 130 15
0.33057 sec 130 15 255 250 130 130 15
0.35115 sec 130 15 255 250 130 130 15
0.37057 sec 130 15 255 250 130 130 15
0.39057 sec 130 15 255 250 130 130 15
0.41057 sec 130 15 255 250 130 130 15
0.43057 sec 130 15 255 250 130 130 15
0.45115 sec 130 15 255 250 130 130 15
0.47057 sec 130 15 255 250 130 130 15
0.49057 sec 130 15 255 250 130 130 15
0.51057 sec 130 15 255 250 130 130 15
0.53057 sec 130 15 255 250 130 130 15
0.55115 sec 130 15 255 250 130 130 15
0.57057 sec 130 15 255 250 130 130 15
⋮
Чтобы визуализировать сигнал интереса, переменные из расписаний сигнала могут строиться в зависимости от времени для последующего анализа. В данном примере посмотрите на сигнал "EngineSpeed" из Стр. "EEC1_EMS".
plot(signalTimetable1.Time, signalTimetable1.EngSpeed, "r") title("{\itEngineSpeed} signal from {\itEEC1\_EMS} PG", "FontWeight", "bold") xlabel("Timestamp") ylabel("Engine Speed")
Закройте доступ к файлу DBC путем очищения его переменной из рабочей области.
clear canDB