このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
CAN データを復号化して MDF ファイルに書き込む
この例では、解析のために MATLAB ® の MDF ファイルから CAN データをインポートして復号化し、復号化されたデータを同じファイルに書き戻す方法を示します。
この例で使用される MDF ファイルは、「CAN - General System Configuration (CAN)」サンプルを使用して Vector CANoe™ から生成されました。この例では、Vector サンプル コンフィギュレーションに付属する CAN データベース ファイル PowerTrain.dbc も使用します。
MDFファイルの詳細を表示
mdfInfo 関数を使用して MDF ファイルのメタデータを表示します。
mdfInfo("Logging_MDF.mf4")ans =
MDFInfo with properties:
File Details
Name: "Logging_MDF.mf4"
Path: "/tmp/Bdoc25a_2864802_1971459/tpcbc94420/vnt-ex42187575/Logging_MDF.mf4"
Author: ""
Department: ""
Project: ""
Subject: ""
Comment: ""
Version: "4.10"
InitialTimestamp: 2020-06-25 20:41:13.133000000
Creator Details
ProgramIdentifier: "MDF4Lib"
CreatorVendorName: "Vector Informatik GmbH"
CreatorToolName: "CANoe"
CreatorToolVersion: "13.0.118"
CreatorUserName: "michellw"
CreatorComment: "Created using MdfLog version 1.5.4.0 and Mdf4Lib version 1.7.0.5 X64 (2019-10-22)"
File Contents
Attachment: [5×7 table]
ChannelGroupCount: 62
Event: [0×8 eventtable]
CANデータフレームを識別する
バス ロギングの関連規格である ASAM MDF によれば、CAN バス システムに定義されるイベント タイプは、「CAN_DataFrame」、「CAN_RemoteFrame」、「CAN_ErrorFrame」、または「CAN_OverloadFrame」になります。この例では、CAN データ フレームの抽出に重点を置いているため、例として「CAN_DataFrame」イベント タイプを使用してバス ログ記録標準について説明します。さらに、標準の CAN データ フレームのペイロードには最大 8 バイトが含まれ、信号値の転送に使用されることに注意してください。
標準では、イベント構造のチャネル名の前にイベント タイプ名 (例: 「CAN_DataFrame」) を付ける必要があることが規定されています。通常、メンバー チャネルを指定するには、区切り文字としてドットが使用されます (例: "CAN_DataFrame.ID" または "CAN_DataFrame.DataLength")。
mdfChannelInfo 関数を使用して、「CAN_DataFrame.*」に一致するチャネル名を見つけます。一致したチャネルに関する情報を含むテーブルが返されます。
mdfChannelInfo("Logging_MDF.mf4", Channel="CAN_DataFrame.*")
ans=24×13 table
Name GroupNumber GroupNumSamples GroupAcquisitionName GroupComment GroupSourceName GroupSourcePath DisplayName Unit Comment ExtendedNamePrefix SourceName SourcePath
_____________________________ ___________ _______________ ____________________ ____________ _______________ _______________ _______________ ___________ __________________________________________________________ __________________ ___________ __________
"CAN_DataFrame.BitCount" 17 8889 CAN1 <undefined> <undefined> CAN_DataFrame "BitCount" <undefined> Frame length in bits. CAN1 <undefined> CAN1
"CAN_DataFrame.BitCount" 29 7648 CAN2 <undefined> <undefined> CAN_DataFrame "BitCount" <undefined> Frame length in bits. CAN2 <undefined> CAN2
"CAN_DataFrame.BusChannel" 17 8889 CAN1 <undefined> <undefined> CAN_DataFrame "BusChannel" <undefined> Logical bus channel number the frame was sent or received. CAN1 <undefined> CAN1
"CAN_DataFrame.BusChannel" 29 7648 CAN2 <undefined> <undefined> CAN_DataFrame "BusChannel" <undefined> Logical bus channel number the frame was sent or received. CAN2 <undefined> CAN2
"CAN_DataFrame.DLC" 17 8889 CAN1 <undefined> <undefined> CAN_DataFrame "DLC" <undefined> Data length code. CAN1 <undefined> CAN1
"CAN_DataFrame.DLC" 29 7648 CAN2 <undefined> <undefined> CAN_DataFrame "DLC" <undefined> Data length code. CAN2 <undefined> CAN2
"CAN_DataFrame.DataBytes" 17 8889 CAN1 <undefined> <undefined> CAN_DataFrame "DataBytes" <undefined> Payload data bytes containing the signal values. CAN1 <undefined> CAN1
"CAN_DataFrame.DataBytes" 29 7648 CAN2 <undefined> <undefined> CAN_DataFrame "DataBytes" <undefined> Payload data bytes containing the signal values. CAN2 <undefined> CAN2
"CAN_DataFrame.DataLength" 17 8889 CAN1 <undefined> <undefined> CAN_DataFrame "DataLength" <undefined> Length of stored payload in bytes. CAN1 <undefined> CAN1
"CAN_DataFrame.DataLength" 29 7648 CAN2 <undefined> <undefined> CAN_DataFrame "DataLength" <undefined> Length of stored payload in bytes. CAN2 <undefined> CAN2
"CAN_DataFrame.Dir" 17 8889 CAN1 <undefined> <undefined> CAN_DataFrame "Dir" <undefined> Bit signal indicating the direction (Rx, Tx). CAN1 <undefined> CAN1
"CAN_DataFrame.Dir" 29 7648 CAN2 <undefined> <undefined> CAN_DataFrame "Dir" <undefined> Bit signal indicating the direction (Rx, Tx). CAN2 <undefined> CAN2
"CAN_DataFrame.Flags" 17 8889 CAN1 <undefined> <undefined> CAN_DataFrame "Flags" <undefined> Combination of bit flags for the message. CAN1 <undefined> CAN1
"CAN_DataFrame.Flags" 29 7648 CAN2 <undefined> <undefined> CAN_DataFrame "Flags" <undefined> Combination of bit flags for the message. CAN2 <undefined> CAN2
"CAN_DataFrame.FrameDuration" 17 8889 CAN1 <undefined> <undefined> CAN_DataFrame "FrameDuration" ns Duration for transmission of the frame in nanoseconds. CAN1 <undefined> CAN1
"CAN_DataFrame.FrameDuration" 29 7648 CAN2 <undefined> <undefined> CAN_DataFrame "FrameDuration" ns Duration for transmission of the frame in nanoseconds. CAN2 <undefined> CAN2
⋮
対象となるパワートレイン データは CAN 2 ネットワークから記録されました。上記の出力は、CAN 2 ネットワークからのデータが MDF ファイルのチャネル グループ 29 に保存されていることを示しています。GroupNumber オプションを指定して mdfChannelGroupInfo 関数を使用し、チャネル グループ 29 の詳細を表示します。
mdfChannelGroupInfo("Logging_MDF.mf4", GroupNumber=29)ans=1×13 table
GroupNumber AcquisitionName Comment NumSamples DataSize Sorted SourceName SourcePath SourceComment SourceType SourceBusType SourceBusChannelNumber SourceSimulated
___________ _______________ ___________ __________ ________ ______ ___________ _____________ _____________ __________ _____________ ______________________ _______________
29 CAN2 <undefined> 7648 206496 true <undefined> CAN_DataFrame <undefined> Bus CAN 2 false
mdfChannelInfo を使用して、チャネル グループ 29 内のすべてのチャネルの詳細を表示します。
mdfChannelInfo("Logging_MDF.mf4", GroupNumber=29)ans=13×13 table
Name GroupNumber GroupNumSamples GroupAcquisitionName GroupComment GroupSourceName GroupSourcePath DisplayName Unit Comment ExtendedNamePrefix SourceName SourcePath
_____________________________ ___________ _______________ ____________________ ____________ _______________ _______________ _______________ ___________ __________________________________________________________ __________________ ___________ ___________
"CAN_DataFrame.BitCount" 29 7648 CAN2 <undefined> <undefined> CAN_DataFrame "BitCount" <undefined> Frame length in bits. CAN2 <undefined> CAN2
"CAN_DataFrame.BusChannel" 29 7648 CAN2 <undefined> <undefined> CAN_DataFrame "BusChannel" <undefined> Logical bus channel number the frame was sent or received. CAN2 <undefined> CAN2
"CAN_DataFrame.DLC" 29 7648 CAN2 <undefined> <undefined> CAN_DataFrame "DLC" <undefined> Data length code. CAN2 <undefined> CAN2
"CAN_DataFrame.DataBytes" 29 7648 CAN2 <undefined> <undefined> CAN_DataFrame "DataBytes" <undefined> Payload data bytes containing the signal values. CAN2 <undefined> CAN2
"CAN_DataFrame.DataLength" 29 7648 CAN2 <undefined> <undefined> CAN_DataFrame "DataLength" <undefined> Length of stored payload in bytes. CAN2 <undefined> CAN2
"CAN_DataFrame.Dir" 29 7648 CAN2 <undefined> <undefined> CAN_DataFrame "Dir" <undefined> Bit signal indicating the direction (Rx, Tx). CAN2 <undefined> CAN2
"CAN_DataFrame.Flags" 29 7648 CAN2 <undefined> <undefined> CAN_DataFrame "Flags" <undefined> Combination of bit flags for the message. CAN2 <undefined> CAN2
"CAN_DataFrame.FrameDuration" 29 7648 CAN2 <undefined> <undefined> CAN_DataFrame "FrameDuration" ns Duration for transmission of the frame in nanoseconds. CAN2 <undefined> CAN2
"CAN_DataFrame.ID" 29 7648 CAN2 <undefined> <undefined> CAN_DataFrame "ID" <undefined> ID of the CAN message. CAN2 <undefined> CAN2
"CAN_DataFrame.IDE" 29 7648 CAN2 <undefined> <undefined> CAN_DataFrame "IDE" <undefined> Identifier Extension bit. CAN2 <undefined> CAN2
"CAN_DataFrame.SingleWire" 29 7648 CAN2 <undefined> <undefined> CAN_DataFrame "SingleWire" <undefined> Bit flag indicating a single wire operation. CAN2 <undefined> CAN2
"CAN_DataFrame.WakeUp" 29 7648 CAN2 <undefined> <undefined> CAN_DataFrame "WakeUp" <undefined> Bit flag indicating a wake-up message (high voltage). CAN2 <undefined> CAN2
"t" 29 7648 CAN2 <undefined> <undefined> CAN_DataFrame "" s <undefined> CAN2 <undefined> <undefined>
MDF ファイルから CAN データフレームを読み取る
mdfRead 関数を使用して、チャネル グループ 29 内のすべてのデータを timetable に読み取ります。timetable は、ASAM MDF 規格のログ形式に従って構成されています。各行はバスからの 1 つの生の CAN フレームを表し、各列は指定されたチャネル グループ内のチャネルを表します。「CAN_DataFrame.Dir」などのチャネルは、バス ロギング標準に従って名前が付けられます。
data = mdfRead("Logging_MDF.mf4", GroupNumber=29)data = 1×1 cell array
{7648×12 timetable}
canData = data{1}canData=7648×12 timetable
t CAN_DataFrame.BusChannel CAN_DataFrame.Flags CAN_DataFrame.Dir CAN_DataFrame.SingleWire CAN_DataFrame.WakeUp CAN_DataFrame.ID CAN_DataFrame.IDE CAN_DataFrame.FrameDuration CAN_DataFrame.BitCount CAN_DataFrame.DLC CAN_DataFrame.DataLength CAN_DataFrame.DataBytes
__________ ________________________ ___________________ _________________ ________________________ ____________________ ________________ _________________ ___________________________ ______________________ _________________ ________________________ ______________________________
2.2601 sec 2 1 "Tx" 0 0 103 0 128000 67 2 2 {[ 1 0]}
2.2801 sec 2 1 "Tx" 0 0 103 0 128000 67 2 2 {[ 1 0]}
2.3002 sec 2 1 "Tx" 0 0 100 0 232000 119 8 8 {[ 238 2 25 1 0 0 238 2]}
2.3005 sec 2 1 "Tx" 0 0 102 0 240000 123 8 8 {[ 0 128 59 68 0 0 0 0]}
2.3006 sec 2 1 "Tx" 0 0 103 0 128000 67 2 2 {[ 1 0]}
2.3008 sec 2 1 "Tx" 0 0 201 0 196000 101 6 6 {[ 0 0 0 0 172 38]}
2.3009 sec 2 1 "Tx" 0 0 1020 0 110000 58 1 1 {[ 1]}
2.3201 sec 2 1 "Tx" 0 0 103 0 128000 67 2 2 {[ 1 0]}
2.3401 sec 2 1 "Tx" 0 0 103 0 128000 67 2 2 {[ 1 0]}
2.3502 sec 2 1 "Tx" 0 0 100 0 234000 120 8 8 {[ 4 0 25 2 119 1 238 2]}
2.3505 sec 2 1 "Tx" 0 0 102 0 228000 117 8 8 {[53 127 119 64 0 128 187 67]}
2.3507 sec 2 1 "Tx" 0 0 201 0 198000 102 6 6 {[ 0 0 0 0 35 40]}
2.3508 sec 2 1 "Tx" 0 0 1020 0 110000 58 1 1 {[ 1]}
2.3601 sec 2 1 "Tx" 0 0 103 0 128000 67 2 2 {[ 1 0]}
2.3801 sec 2 1 "Tx" 0 0 103 0 128000 67 2 2 {[ 1 0]}
2.4002 sec 2 1 "Tx" 0 0 100 0 234000 120 8 8 {[ 10 0 25 3 119 1 238 2]}
⋮
DBC ファイルを使用して CAN メッセージを復号化する
canDatabase 関数を使用して DBC ファイルを開きます。
canDB = canDatabase("PowerTrain_MDF.dbc")canDB =
Database with properties:
Name: 'PowerTrain_MDF'
Path: '/tmp/Bdoc25a_2864802_1971459/tpcbc94420/vnt-ex42187575/PowerTrain_MDF.dbc'
UTF8_File: '/tmp/Bdoc25a_2864802_1971459/tpcbc94420/vnt-ex42187575/PowerTrain_MDF.dbc'
Nodes: {2×1 cell}
NodeInfo: [2×1 struct]
Messages: {12×1 cell}
MessageInfo: [12×1 struct]
Attributes: {11×1 cell}
AttributeInfo: [11×1 struct]
UserData: []
canMessageTimetable 関数はデータベースを使用してメッセージ名と信号を復号化します。ASAM 標準ログ形式データの timetable は、Vehicle Network Toolbox™ CAN message timetable に変換されます。
msgTimetable = canMessageTimetable(canData, canDB)
msgTimetable=7648×8 timetable
Time ID Extended Name Data Length Signals Error Remote
__________ ____ ________ __________________ ______________________________ ______ ____________ _____ ______
2.2601 sec 103 false {'Ignition_Info' } {[ 1 0]} 2 {1×1 struct} false false
2.2801 sec 103 false {'Ignition_Info' } {[ 1 0]} 2 {1×1 struct} false false
2.3002 sec 100 false {'EngineData' } {[ 238 2 25 1 0 0 238 2]} 8 {1×1 struct} false false
2.3005 sec 102 false {'EngineDataIEEE'} {[ 0 128 59 68 0 0 0 0]} 8 {1×1 struct} false false
2.3006 sec 103 false {'Ignition_Info' } {[ 1 0]} 2 {1×1 struct} false false
2.3008 sec 201 false {'ABSdata' } {[ 0 0 0 0 172 38]} 6 {1×1 struct} false false
2.3009 sec 1020 false {'GearBoxInfo' } {[ 1]} 1 {1×1 struct} false false
2.3201 sec 103 false {'Ignition_Info' } {[ 1 0]} 2 {1×1 struct} false false
2.3401 sec 103 false {'Ignition_Info' } {[ 1 0]} 2 {1×1 struct} false false
2.3502 sec 100 false {'EngineData' } {[ 4 0 25 2 119 1 238 2]} 8 {1×1 struct} false false
2.3505 sec 102 false {'EngineDataIEEE'} {[53 127 119 64 0 128 187 67]} 8 {1×1 struct} false false
2.3507 sec 201 false {'ABSdata' } {[ 0 0 0 0 35 40]} 6 {1×1 struct} false false
2.3508 sec 1020 false {'GearBoxInfo' } {[ 1]} 1 {1×1 struct} false false
2.3601 sec 103 false {'Ignition_Info' } {[ 1 0]} 2 {1×1 struct} false false
2.3801 sec 103 false {'Ignition_Info' } {[ 1 0]} 2 {1×1 struct} false false
2.4002 sec 100 false {'EngineData' } {[ 10 0 25 3 119 1 238 2]} 8 {1×1 struct} false false
⋮
「EngineData」メッセージに保存されている信号を表示します。
msgTimetable.Signals{3}ans = struct with fields:
PetrolLevel: 1
EngPower: 7.5000
EngForce: 0
IdleRunning: 0
EngTemp: 0
EngSpeed: 750
関心のある信号値を再パッケージ化して可視化する
canSignalTimetable 関数を使用して、バス上の各固有メッセージからの信号データを signal timetable に再パッケージ化します。この例では、CAN message timetable から、対象となる 3 つのメッセージ「ABSdata」、「EngineData」、および「GearBoxInfo」に対して 3 つの個別の signal timetable を作成します。
signalTimetable1 = canSignalTimetable(msgTimetable, "ABSdata")signalTimetable1=1147×4 timetable
Time AccelerationForce Diagnostics GearLock CarSpeed
__________ _________________ ___________ ________ ________
2.3008 sec -100 0 0 0
2.3507 sec 275 0 0 0
2.4008 sec 275 0 0 0
2.4507 sec 275 0 0 0
2.5008 sec 275 0 0 0
2.5507 sec 275 0 0 0
2.6008 sec 275 0 0 0
2.6507 sec 275 0 0 0
2.7008 sec 350 0 0 0
2.7507 sec 425 0 0 0.5
2.8008 sec 425 0 0 0.5
2.8507 sec 500 0 0 0.5
2.9008 sec 575 0 0 0.5
2.9507 sec 575 0 0 0.5
3.0008 sec 650 0 0 0.5
3.0507 sec 725 0 0 0.5
⋮
signalTimetable2 = canSignalTimetable(msgTimetable, "EngineData")signalTimetable2=1147×6 timetable
Time PetrolLevel EngPower EngForce IdleRunning EngTemp EngSpeed
__________ ___________ ________ ________ ___________ _______ ________
2.3002 sec 1 7.5 0 0 0 750
2.3502 sec 2 7.5 375 0 0 4
2.4002 sec 3 7.5 375 0 0 10
2.4502 sec 4 7.5 375 0 0 17
2.5002 sec 5 7.5 375 0 0 23
2.5502 sec 6 7.5 375 0 0 30
2.6002 sec 7 7.5 375 0 0 36
2.6502 sec 8 7.5 375 0 0 43
2.7002 sec 9 9 450 0 0 50
2.7502 sec 10 10.5 525 0 0 59
2.8002 sec 10 10.5 525 0 0 69
2.8502 sec 11 12 600 0 0 80
2.9002 sec 11 13.5 675 0 0 92
2.9502 sec 12 13.5 675 0 0 106
3.0002 sec 13 15 750 0 0 121
3.0502 sec 13 16.5 825 0 0 136
⋮
signalTimetable3 = canSignalTimetable(msgTimetable, "GearBoxInfo")signalTimetable3=1147×3 timetable
Time EcoMode ShiftRequest Gear
__________ _______ ____________ ____
2.3009 sec 0 0 1
2.3508 sec 0 0 1
2.4009 sec 0 0 1
2.4508 sec 0 0 1
2.5009 sec 0 0 1
2.5508 sec 0 0 1
2.6009 sec 0 0 1
2.6508 sec 0 0 1
2.7009 sec 0 0 1
2.7508 sec 0 0 1
2.8009 sec 0 0 1
2.8508 sec 0 0 1
2.9009 sec 0 0 1
2.9508 sec 0 0 1
3.0009 sec 0 0 1
3.0508 sec 0 0 1
⋮
関心のある信号を可視化するために、signal timetable の列を時間の経過に沿ってプロットし、さらに解析することができます。
subplot(3, 1, 1) plot(signalTimetable1.Time, signalTimetable1.CarSpeed, "r") title("{\itCarSpeed} Signal from {\itABSdata} Message", "FontWeight", "bold") xlabel("Timestamp") ylabel("Car Speed") subplot(3, 1, 2) plot(signalTimetable2.Time, signalTimetable2.EngSpeed, "b") title("{\itEngSpeed} Signal from {\itEngineData} Message", "FontWeight", "bold") xlabel("Timestamp") ylabel("Engine Speed") subplot(3, 1, 3) plot(signalTimetable3.Time, signalTimetable3.Gear, "y") title("{\itGear} Signal from {\itGearBoxInfo} Message", "FontWeight", "bold") xlabel("Timestamp") ylabel("Gear")

チャネルグループとチャネルメタデータを構成する
この例の最終的な目標は、対象となる 3 つのメッセージ「ABSdata」、「EngineData」、および「GearBoxInfo」の復号化された信号データを、同じ MDF ファイルの 3 つの新しいチャネル グループに書き込むことです。この方法では、生データと復号化されたデータを 1 つのファイルに保存できます。
各 timetable のデータに加えて、メタデータも測定環境に関する説明情報を提供できる重要な要素です。このセクションでは、ファイルに書き込む前のオプションの準備手順として、データに付随するメタデータを構成する方法を説明します。
関数 mdfAddChannelGroupMetadata を使用して、各 signal timetable に、特定のチャネル グループとそのチャネルのデフォルトまたは推測されたメタデータを追加します。
signalTimetable1 = mdfAddChannelGroupMetadata(signalTimetable1); signalTimetable2 = mdfAddChannelGroupMetadata(signalTimetable2); signalTimetable3 = mdfAddChannelGroupMetadata(signalTimetable3);
各チャネル グループとそのチャネルのデフォルトのメタデータを表示します。
signalTimetable1.Properties.CustomProperties
ans =
CustomProperties with properties:
ChannelGroupAcquisitionName: ""
ChannelGroupComment: ""
ChannelGroupSourceName: ""
ChannelGroupSourcePath: ""
ChannelGroupSourceComment: ""
ChannelGroupSourceType: Unspecified
ChannelGroupSourceBusType: Unspecified
ChannelGroupSourceBusChannelNumber: 0
ChannelDisplayName: ["" "" "" ""]
ChannelComment: ["" "" "" ""]
ChannelUnit: ["" "" "" ""]
ChannelType: [FixedLength FixedLength FixedLength FixedLength]
ChannelDataType: [RealLittleEndian RealLittleEndian RealLittleEndian RealLittleEndian]
ChannelNumBits: [64 64 64 64]
ChannelComponentType: [None None None None]
ChannelCompositionType: [None None None None]
ChannelSourceName: ["" "" "" ""]
ChannelSourcePath: ["" "" "" ""]
ChannelSourceComment: ["" "" "" ""]
ChannelSourceType: [Unspecified Unspecified Unspecified Unspecified]
ChannelSourceBusType: [Unspecified Unspecified Unspecified Unspecified]
ChannelSourceBusChannelNumber: [0 0 0 0]
ChannelReadOption: [Missing Missing Missing Missing]
signalTimetable2.Properties.CustomProperties
ans =
CustomProperties with properties:
ChannelGroupAcquisitionName: ""
ChannelGroupComment: ""
ChannelGroupSourceName: ""
ChannelGroupSourcePath: ""
ChannelGroupSourceComment: ""
ChannelGroupSourceType: Unspecified
ChannelGroupSourceBusType: Unspecified
ChannelGroupSourceBusChannelNumber: 0
ChannelDisplayName: ["" "" "" "" "" ""]
ChannelComment: ["" "" "" "" "" ""]
ChannelUnit: ["" "" "" "" "" ""]
ChannelType: [FixedLength FixedLength FixedLength FixedLength FixedLength FixedLength]
ChannelDataType: [RealLittleEndian RealLittleEndian RealLittleEndian RealLittleEndian RealLittleEndian RealLittleEndian]
ChannelNumBits: [64 64 64 64 64 64]
ChannelComponentType: [None None None None None None]
ChannelCompositionType: [None None None None None None]
ChannelSourceName: ["" "" "" "" "" ""]
ChannelSourcePath: ["" "" "" "" "" ""]
ChannelSourceComment: ["" "" "" "" "" ""]
ChannelSourceType: [Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified]
ChannelSourceBusType: [Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified]
ChannelSourceBusChannelNumber: [0 0 0 0 0 0]
ChannelReadOption: [Missing Missing Missing Missing Missing Missing]
signalTimetable3.Properties.CustomProperties
ans =
CustomProperties with properties:
ChannelGroupAcquisitionName: ""
ChannelGroupComment: ""
ChannelGroupSourceName: ""
ChannelGroupSourcePath: ""
ChannelGroupSourceComment: ""
ChannelGroupSourceType: Unspecified
ChannelGroupSourceBusType: Unspecified
ChannelGroupSourceBusChannelNumber: 0
ChannelDisplayName: ["" "" ""]
ChannelComment: ["" "" ""]
ChannelUnit: ["" "" ""]
ChannelType: [FixedLength FixedLength FixedLength]
ChannelDataType: [RealLittleEndian RealLittleEndian RealLittleEndian]
ChannelNumBits: [64 64 64]
ChannelComponentType: [None None None]
ChannelCompositionType: [None None None]
ChannelSourceName: ["" "" ""]
ChannelSourcePath: ["" "" ""]
ChannelSourceComment: ["" "" ""]
ChannelSourceType: [Unspecified Unspecified Unspecified]
ChannelSourceBusType: [Unspecified Unspecified Unspecified]
ChannelSourceBusChannelNumber: [0 0 0]
ChannelReadOption: [Missing Missing Missing]
3 つのメッセージ名を保持する配列と、3 つの signal timetable を保持する cell 配列を作成します。
msgNames = ["ABSdata", "EngineData", "GearBoxInfo"]; TTs = {signalTimetable1, signalTimetable2, signalTimetable3};
信号データが復号化された CAN メッセージの名前を示すには、TTs 内の各 timetable にプロパティ ChannelGroupComment を設定します。
for ii = 1:numel(TTs) TTs{ii}.Properties.CustomProperties.ChannelGroupComment = sprintf("Signal data from CAN message ""%s"".", msgNames(ii)); end
各 CAN メッセージについて、このスクリプトの最後にあるヘルパー関数 getSignalUnit を使用して、canDB からすべての信号の単位を取得します。各 timetable 変数のプロパティ ChannelUnit を取得した単位に設定します。
for ii = 1:numel(msgNames) sigNames = TTs{ii}.Properties.VariableNames; for jj = 1:numel(sigNames) sigUnit = getSignalUnit(canDB, msgNames(ii), sigNames(jj)); TTs{ii}.Properties.CustomProperties.ChannelUnit(jj) = sigUnit; end end
各チャネル グループとそのチャネルの更新されたメタデータを表示します。プロパティ ChannelGroupComment および ChannelUnit の更新された値に注意してください。
for ii = 1:numel(TTs) TTs{ii}.Properties.CustomProperties end
ans =
CustomProperties with properties:
ChannelGroupAcquisitionName: ""
ChannelGroupComment: "Signal data from CAN message "ABSdata"."
ChannelGroupSourceName: ""
ChannelGroupSourcePath: ""
ChannelGroupSourceComment: ""
ChannelGroupSourceType: Unspecified
ChannelGroupSourceBusType: Unspecified
ChannelGroupSourceBusChannelNumber: 0
ChannelDisplayName: ["" "" "" ""]
ChannelComment: ["" "" "" ""]
ChannelUnit: ["N" "" "" "mph"]
ChannelType: [FixedLength FixedLength FixedLength FixedLength]
ChannelDataType: [RealLittleEndian RealLittleEndian RealLittleEndian RealLittleEndian]
ChannelNumBits: [64 64 64 64]
ChannelComponentType: [None None None None]
ChannelCompositionType: [None None None None]
ChannelSourceName: ["" "" "" ""]
ChannelSourcePath: ["" "" "" ""]
ChannelSourceComment: ["" "" "" ""]
ChannelSourceType: [Unspecified Unspecified Unspecified Unspecified]
ChannelSourceBusType: [Unspecified Unspecified Unspecified Unspecified]
ChannelSourceBusChannelNumber: [0 0 0 0]
ChannelReadOption: [Missing Missing Missing Missing]
ans =
CustomProperties with properties:
ChannelGroupAcquisitionName: ""
ChannelGroupComment: "Signal data from CAN message "EngineData"."
ChannelGroupSourceName: ""
ChannelGroupSourcePath: ""
ChannelGroupSourceComment: ""
ChannelGroupSourceType: Unspecified
ChannelGroupSourceBusType: Unspecified
ChannelGroupSourceBusChannelNumber: 0
ChannelDisplayName: ["" "" "" "" "" ""]
ChannelComment: ["" "" "" "" "" ""]
ChannelUnit: ["l" "kW" "N" "" "degC" "rpm"]
ChannelType: [FixedLength FixedLength FixedLength FixedLength FixedLength FixedLength]
ChannelDataType: [RealLittleEndian RealLittleEndian RealLittleEndian RealLittleEndian RealLittleEndian RealLittleEndian]
ChannelNumBits: [64 64 64 64 64 64]
ChannelComponentType: [None None None None None None]
ChannelCompositionType: [None None None None None None]
ChannelSourceName: ["" "" "" "" "" ""]
ChannelSourcePath: ["" "" "" "" "" ""]
ChannelSourceComment: ["" "" "" "" "" ""]
ChannelSourceType: [Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified]
ChannelSourceBusType: [Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified]
ChannelSourceBusChannelNumber: [0 0 0 0 0 0]
ChannelReadOption: [Missing Missing Missing Missing Missing Missing]
ans =
CustomProperties with properties:
ChannelGroupAcquisitionName: ""
ChannelGroupComment: "Signal data from CAN message "GearBoxInfo"."
ChannelGroupSourceName: ""
ChannelGroupSourcePath: ""
ChannelGroupSourceComment: ""
ChannelGroupSourceType: Unspecified
ChannelGroupSourceBusType: Unspecified
ChannelGroupSourceBusChannelNumber: 0
ChannelDisplayName: ["" "" ""]
ChannelComment: ["" "" ""]
ChannelUnit: ["" "" ""]
ChannelType: [FixedLength FixedLength FixedLength]
ChannelDataType: [RealLittleEndian RealLittleEndian RealLittleEndian]
ChannelNumBits: [64 64 64]
ChannelComponentType: [None None None]
ChannelCompositionType: [None None None]
ChannelSourceName: ["" "" ""]
ChannelSourcePath: ["" "" ""]
ChannelSourceComment: ["" "" ""]
ChannelSourceType: [Unspecified Unspecified Unspecified]
ChannelSourceBusType: [Unspecified Unspecified Unspecified]
ChannelSourceBusChannelNumber: [0 0 0]
ChannelReadOption: [Missing Missing Missing]
カスタマイズしたチャネルグループとチャネルメタデータを使用して MDF ファイルにデータを書き込む
mdfWrite 関数を使用して、TTs の 3 つの timetable を 1 つずつ Logging_MDF.mf4 に書き込みます。MDF ファイルには現在 62 個のチャネル グループがあるため、TTs{1}、TTs{2}、および TTs{3} はチャネル グループ 63、64、および 65 としてファイルの末尾に書き込まれます。
for ii = 1:numel(TTs) mdfWrite("Logging_MDF.mf4", TTs{ii}) end
DBC ファイルを MDF ファイルに添付ファイルとして追加する
将来追加のデータ デコードを実行する必要がある場合に PowerTrain_MDF.dbc に簡単にアクセスできるように、mdfAddAttachment を使用して DBC ファイルを MDF ファイルの埋め込み添付ファイルとして追加できます。
mdfAddAttachment("Logging_MDF.mf4", "PowerTrain_MDF.dbc", Embedded=true)
DBC ファイルを閉じる
ワークスペースから変数をクリアして、DBC ファイルへのアクセスを閉じます。
clear canDB補助関数
function sigUnit = getSignalUnit(canDB, msgName, sigName) % Look up the unit of a signal in a message from a CAN database. Return the unit as a string. msgIdx = find(strcmp({canDB.MessageInfo.Name}, msgName)); sigIdx = find(strcmp({canDB.MessageInfo(msgIdx).SignalInfo.Name}, sigName)); sigUnit = string(canDB.MessageInfo(msgIdx).SignalInfo(sigIdx).Units); end