メインコンテンツ

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

CAN 通信でDBCファイルを使用する

この例では、DBC ファイルに保存されている情報を使用してメッセージを作成、受信、処理する方法を示します。この例では、CAN ネットワークのワークフローについて説明していますが、ここで説明する概念は CAN FD ネットワークにも適用されます。

DBCファイルを開く

canDatabase を使用してファイル demoVNT_CANdbFiles.dbc を開きます。

db = canDatabase("demoVNT_CANdbFiles.dbc")
db = 
  Database with properties:

             Name: 'demoVNT_CANdbFiles'
             Path: 'C:\Users\michellw\OneDrive - MathWorks\Documents\MATLAB\Examples\vnt-ex80654288\demoVNT_CANdbFiles.dbc'
            Nodes: {}
         NodeInfo: [0×0 struct]
         Messages: {5×1 cell}
      MessageInfo: [5×1 struct]
       Attributes: {}
    AttributeInfo: [0×0 struct]
         UserData: []

このファイルで定義されているすべてのメッセージの名前を確認するには、Messages プロパティを調べてください。

db.Messages
ans = 5×1 cell
    {'DoorControlMsg'   }
    {'EngineMsg'        }
    {'SunroofControlMsg'}
    {'TransmissionMsg'  }
    {'WindowControlMsg' }

メッセージ情報を表示

messageInfo を使用して、識別子、データ長、信号リストなどのメッセージ EngineMsg の情報を表示します。

messageInfo(db, "EngineMsg")
ans = struct with fields:
             Name: 'EngineMsg'
     ProtocolMode: 'CAN'
          Comment: ''
               ID: 100
         Extended: 0
            J1939: []
           Length: 8
              DLC: 8
              BRS: 0
          Signals: {2×1 cell}
       SignalInfo: [2×1 struct]
          TxNodes: {0×1 cell}
       Attributes: {}
    AttributeInfo: [0×0 struct]

すべてのメッセージに関する情報を一度に照会することもできます。

messageInfo(db)
ans=5×1 struct array with fields:
    Name
    ProtocolMode
    Comment
    ID
    Extended
    J1939
    Length
    DLC
    BRS
    Signals
    SignalInfo
    TxNodes
    Attributes
    AttributeInfo

信号情報を見る

signalInfo を使用して、メッセージ EngineMsg 内の信号 EngineRPM の情報を表示します。これには、生の信号を物理値に変換するタイプ、バイト順序、サイズ、スケーリング値などが含まれます。

signalInfo(db, "EngineMsg", "EngineRPM")
ans = struct with fields:
             Name: 'EngineRPM'
          Comment: ''
         StartBit: 0
       SignalSize: 32
        ByteOrder: 'LittleEndian'
           Signed: 0
        ValueType: 'Integer'
            Class: 'uint32'
           Factor: 0.1000
           Offset: 250
          Minimum: 250
          Maximum: 9500
            Units: 'rpm'
       ValueTable: [0×1 struct]
      Multiplexor: 0
      Multiplexed: 0
    MultiplexMode: 0
          RxNodes: {0×1 cell}
       Attributes: {}
    AttributeInfo: [0×0 struct]

メッセージ EngineMsg 内のすべての信号に関する情報を一度に照会することもできます。

signalInfo(db, "EngineMsg")
ans=2×1 struct array with fields:
    Name
    Comment
    StartBit
    SignalSize
    ByteOrder
    Signed
    ValueType
    Class
    Factor
    Offset
    Minimum
    Maximum
    Units
    ValueTable
    Multiplexor
    Multiplexed
    MultiplexMode
    RxNodes
    Attributes
    AttributeInfo
      ⋮

データベース定義を使用してメッセージを作成する

データベースとメッセージ名 EngineMsg を指定して新しいメッセージを作成し、データベース定義を適用します。このメッセージ内の CAN 信号は、生のデータ バイトに加えてエンジニアリング単位で表されます。

msgEngineInfo = canMessage(db, "EngineMsg")
msgEngineInfo = 
  Message with properties:

   Message Identification
    ProtocolMode: 'CAN'
              ID: 100
        Extended: 0
            Name: 'EngineMsg'

   Data Details
       Timestamp: 0
            Data: [0 0 0 0 0 0 0 0]
         Signals: [1×1 struct]
          Length: 8

   Protocol Flags
           Error: 0
          Remote: 0

   Other Information
        Database: [1×1 can.Database]
        UserData: []

信号情報を見る

このメッセージの信号値を確認するには、Signals プロパティを使用します。これらの信号に直接書き込み、直接読み取りを行うことで、メッセージからデータをパックおよびアンパックできます。

msgEngineInfo.Signals
ans = struct with fields:
    VehicleSpeed: 0
       EngineRPM: 250

信号情報の変更

信号 EngineRPM に直接書き込み、その値を変更します。

msgEngineInfo.Signals.EngineRPM = 5500.25
msgEngineInfo = 
  Message with properties:

   Message Identification
    ProtocolMode: 'CAN'
              ID: 100
        Extended: 0
            Name: 'EngineMsg'

   Data Details
       Timestamp: 0
            Data: [23 205 0 0 0 0 0 0]
         Signals: [1×1 struct]
          Length: 8

   Protocol Flags
           Error: 0
          Remote: 0

   Other Information
        Database: [1×1 can.Database]
        UserData: []

現在の信号値を読み取り直すと、EngineRPM が書き込まれた値で更新されていることがわかります。

msgEngineInfo.Signals
ans = struct with fields:
    VehicleSpeed: 0
       EngineRPM: 5.5003e+03

値が信号に直接書き込まれると、データベース定義を使用して値が変換され、スケーリングされ、メッセージ データにパックされます。VehicleSpeed 信号に新しい値が書き込まれた後、Data プロパティの値が変化することに注意してください。

msgEngineInfo.Signals.VehicleSpeed = 70.81
msgEngineInfo = 
  Message with properties:

   Message Identification
    ProtocolMode: 'CAN'
              ID: 100
        Extended: 0
            Name: 'EngineMsg'

   Data Details
       Timestamp: 0
            Data: [23 205 0 0 71 0 0 0]
         Signals: [1×1 struct]
          Length: 8

   Protocol Flags
           Error: 0
          Remote: 0

   Other Information
        Database: [1×1 can.Database]
        UserData: []

msgEngineInfo.Signals
ans = struct with fields:
    VehicleSpeed: 71
       EngineRPM: 5.5003e+03

データベース情報を含むメッセージを受信する

メッセージを受信する CAN チャネルにデータベースを接続して、受信メッセージにデータベース定義を自動的に適用します。データベースは定義されているメッセージのみを復号化します。その他のメッセージはすべて生の形式で受信されます。

rxCh = canChannel("MathWorks", "Virtual 1", 2);
rxCh.Database = db
rxCh = 
  Channel with properties:

   Device Information
            DeviceVendor: 'MathWorks'
                  Device: 'Virtual 1'
      DeviceChannelIndex: 2
      DeviceSerialNumber: 0
            ProtocolMode: 'CAN'

   Status Information
                 Running: 0
       MessagesAvailable: 0
        MessagesReceived: 0
     MessagesTransmitted: 0
    InitializationAccess: 1
        InitialTimestamp: [0×0 datetime]
           FilterHistory: 'Standard ID Filter: Allow All | Extended ID Filter: Allow All'

   Channel Information
               BusStatus: 'N/A'
              SilentMode: 0
         TransceiverName: 'N/A'
        TransceiverState: 'N/A'
       ReceiveErrorCount: 0
      TransmitErrorCount: 0
                BusSpeed: 500000
                     SJW: []
                   TSEG1: []
                   TSEG2: []
            NumOfSamples: []

   Other Information
                Database: [1×1 can.Database]
                UserData: []

メッセージの受信

チャネルを開始し、メッセージ トラフィックを生成し、物理的なメッセージのデコードを使用してメッセージを受信します。

start(rxCh);
generateMsgsDb();
rxMsg = receive(rxCh, Inf, "OutputFormat", "timetable");

受信したメッセージの最初の数行を表示します。

head(rxMsg)
ans=8×8 timetable
       Time        ID     Extended            Name                       Data              Length      Signals       Error    Remote
    ___________    ___    ________    _____________________    ________________________    ______    ____________    _____    ______

    0.13103 sec    100     false      {'EngineMsg'        }    {[     0 0 0 0 0 0 0 0]}      8       {1×1 struct}    false    false 
    0.13103 sec    200     false      {'TransmissionMsg'  }    {[     0 0 0 0 0 0 0 0]}      8       {1×1 struct}    false    false 
    0.13104 sec    400     false      {'DoorControlMsg'   }    {[     0 0 0 0 0 0 0 0]}      8       {1×1 struct}    false    false 
    0.13104 sec    600     false      {'WindowControlMsg' }    {[             0 0 0 0]}      4       {1×1 struct}    false    false 
    0.13105 sec    800     false      {'SunroofControlMsg'}    {[                 0 0]}      2       {1×1 struct}    false    false 
    0.15598 sec    100     false      {'EngineMsg'        }    {[     0 0 0 0 0 0 0 0]}      8       {1×1 struct}    false    false 
    0.18 sec       100     false      {'EngineMsg'        }    {[172 129 0 0 50 0 0 0]}      8       {1×1 struct}    false    false 
    0.18001 sec    200     false      {'TransmissionMsg'  }    {[     4 0 0 0 0 0 0 0]}      8       {1×1 struct}    false    false 

受信チャネルを停止し、ワークスペースからクリアします。

stop(rxCh);
clear rxCh

受信したメッセージを調べる

受信したメッセージを検査して、適用されたデータベース デコードを確認します。

rxMsg(10, :)
ans=1×8 timetable
       Time        ID     Extended        Name                   Data              Length      Signals       Error    Remote
    ___________    ___    ________    _____________    ________________________    ______    ____________    _____    ______

    0.22994 sec    100     false      {'EngineMsg'}    {[172 129 0 0 50 0 0 0]}      8       {1×1 struct}    false    false 

rxMsg.Signals{10}
ans = struct with fields:
    VehicleSpeed: 50
       EngineRPM: 3.5696e+03

指定されたメッセージのすべてのインスタンスを抽出する

メッセージ EngineMsg のすべてのインスタンスを抽出します。

allMsgEngine = rxMsg(strcmpi("EngineMsg", rxMsg.Name), :);

この特定のメッセージの最初のいくつかのインスタンスを表示します。

head(allMsgEngine)
ans=8×8 timetable
       Time        ID     Extended        Name                   Data              Length      Signals       Error    Remote
    ___________    ___    ________    _____________    ________________________    ______    ____________    _____    ______

    0.13103 sec    100     false      {'EngineMsg'}    {[     0 0 0 0 0 0 0 0]}      8       {1×1 struct}    false    false 
    0.15598 sec    100     false      {'EngineMsg'}    {[     0 0 0 0 0 0 0 0]}      8       {1×1 struct}    false    false 
    0.18 sec       100     false      {'EngineMsg'}    {[172 129 0 0 50 0 0 0]}      8       {1×1 struct}    false    false 
    0.20597 sec    100     false      {'EngineMsg'}    {[172 129 0 0 50 0 0 0]}      8       {1×1 struct}    false    false 
    0.22994 sec    100     false      {'EngineMsg'}    {[172 129 0 0 50 0 0 0]}      8       {1×1 struct}    false    false 
    0.25695 sec    100     false      {'EngineMsg'}    {[172 129 0 0 50 0 0 0]}      8       {1×1 struct}    false    false 
    0.27995 sec    100     false      {'EngineMsg'}    {[172 129 0 0 50 0 0 0]}      8       {1×1 struct}    false    false 
    0.30597 sec    100     false      {'EngineMsg'}    {[172 129 0 0 50 0 0 0]}      8       {1×1 struct}    false    false 

物理信号値をプロットする

canSignalTimetable を使用して、メッセージ EngineMsg からの信号データを signal timetable に再パッケージ化します。

signalTimetable = canSignalTimetable(rxMsg, "EngineMsg");

signal timetable の最初の数行を表示します。

head(signalTimetable)
ans=8×2 timetable
       Time        VehicleSpeed    EngineRPM
    ___________    ____________    _________

    0.13103 sec          0             250  
    0.15598 sec          0             250  
    0.18 sec            50          3569.6  
    0.20597 sec         50          3569.6  
    0.22994 sec         50          3569.6  
    0.25695 sec         50          3569.6  
    0.27995 sec         50          3569.6  
    0.30597 sec         50          3569.6  

信号 VehicleSpeed の値を時間の経過に沿ってプロットします。

plot(signalTimetable.Time, signalTimetable.VehicleSpeed)
title("Vehicle Speed from EngineMsg", "FontWeight", "bold")
xlabel("Timestamp")
ylabel("Vehicle Speed")

DBCファイルを閉じる

ワークスペースから変数をクリアして、DBC ファイルへのアクセスを閉じます。

clear db