メインコンテンツ

このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。

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")

Figure contains 3 axes objects. Axes object 1 with title CarSpeed blank Signal blank from blank ABSdata Message, xlabel Timestamp, ylabel Car Speed contains an object of type line. Axes object 2 with title EngSpeed blank Signal blank from blank EngineData Message, xlabel Timestamp, ylabel Engine Speed contains an object of type line. Axes object 3 with title Gear blank Signal blank from blank GearBoxInfo Message, xlabel Timestamp, ylabel Gear contains an object of type line.

チャネルグループとチャネルメタデータを構成する

この例の最終的な目標は、対象となる 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