メインコンテンツ

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

CAN メッセージの送受信

インストールされているハードウェアの検出

この例では、canChannelList を使用してシステムの CAN デバイスを検出し、canChannel を使用して 2 つの CAN チャネルを作成します。その後、最初のチャネルのプロパティを編集し、canMessage を使用してメッセージを作成し、transmit を使用して最初のチャネルからメッセージを送信し、receive を使用して他のチャネルで受信します。

  1. システム上の CAN ハードウェア デバイスに関する情報を取得します。

    info = canChannelList
    info =
    
      14×6 table
    
          Vendor              Device           Channel       DeviceModel       ProtocolMode   SerialNumber
       _____________  _______________________  _______  _____________________  _____________  ____________
    
       "MathWorks"    "Virtual 1"                 1     "Virtual"              "CAN, CAN FD"    "0"     
       "MathWorks"    "Virtual 1"                 2     "Virtual"              "CAN, CAN FD"    "0"     
       "Vector"       "VN1610 1"                  1     "VN1610"               "CAN, CAN FD"    "18959"
       "Vector"       "VN1610 1"                  2     "VN1610"               "CAN, CAN FD"    "18959"
       "Vector"       "Virtual 1"                 1     "Virtual"              "CAN, CAN FD"    "0"
       "Vector"       "Virtual 1"                 2     "Virtual"              "CAN, CAN FD"    "0"
       "PEAK-System"  "PCAN-USB Pro"              1     "PCAN-USB Pro"         "CAN, CAN FD"    "0"
       "PEAK-System"  "PCAN-USB Pro"              2     "PCAN-USB Pro"         "CAN, CAN FD"    "0"
       "Kvaser"       "USBcan Professional 1"     1     "USBcan Professional"  "CAN"            "10680"
       "Kvaser"       "USBcan Professional 1"     1     "USBcan Professional"  "CAN"            "10680"
       "Kvaser"       "Virtual 1"                 1     "Virtual"              "CAN, CAN FD"    "0"
       "Kvaser"       "Virtual 1"                 2     "Virtual"              "CAN, CAN FD"    "0"
       "NI"           "9862 CAN/HS (CAN1)"        1     "9862"                 "CAN, CAN FD"    "17F5094"
       "NI"           "9862 CAN/HS (CAN2)"        1     "9862"                 "CAN, CAN FD"    "17F50B2"

メモ

この例をハードウェア CAN デバイス用に変更するには、2 つのチャネル間にループバック接続を作成します。

CANチャネルを作成する

2 つの MathWorks® 仮想 CAN チャネルを作成します。

canch1 = canChannel('MathWorks','Virtual 1',1)
canch2 = canChannel('MathWorks','Virtual 1',2)
canch1 = 

  Channel with properties:

   Device Information
            DeviceVendor: 'MathWorks'
                  Device: 'Virtual 1'
      DeviceChannelIndex: 1
      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: []
                UserData: []


canch2 = 

  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: []
                UserData: []

各チャネルについて、初期の Running 値は 0 (停止) であり、バス速度は 500000 であることに注意してください。

メモ

同じ変数を使用して複数のチャネルを連続して作成することはできません。同じ変数を使用して新しい CAN チャネルを構築する前に、すべてのチャネルをクリアします。

CAN チャネル オブジェクトの配列を作成することはできません。作成する各オブジェクトは、独自のスカラー変数に割り当てる必要があります。

チャネルプロパティを構成する

プロパティ値を構成することで、CAN チャネルの動作を設定できます。この演習では、configBusSpeed 関数を使用してチャネル 1 のバス速度を 250000 に変更します。

ヒント

チャネルを開始する前にプロパティ値を構成します。

  1. 両方のチャネルのバス速度を 250000 に変更し、チャネル BusSpeed プロパティを表示して設定を確認します。

    configBusSpeed(canch1,250000)
    canch1.BusSpeed
    ans =
    
          250000
  2. 更新されたバス速度はチャネル表示でも確認できます。

    canch1
    canch1 = 
    
      Channel with properties:
    
       Device Information
                DeviceVendor: 'MathWorks'
                      Device: 'Virtual 1'
          DeviceChannelIndex: 1
          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: 250000
                         SJW: []
                       TSEG1: []
                       TSEG2: []
                NumOfSamples: []
    
       Other Information
                    Database: []
                    UserData: []
  3. 同様の方法で、2 番目のチャネルのバス速度を変更します。

    configBusSpeed(canch2,250000)

チャネルを開始する

プロパティを構成したら、両方のチャネルを起動します。次に、最初のチャネルの更新されたステータス情報を表示します。

start(canch1)
start(canch2)
canch1
canch1 = 

  Channel with properties:

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

   Status Information
                 Running: 1
       MessagesAvailable: 0
        MessagesReceived: 0
     MessagesTransmitted: 0
    InitializationAccess: 1
        InitialTimestamp: 23-May-2019 15:43:40
           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: 250000
                     SJW: []
                   TSEG1: []
                   TSEG2: []
            NumOfSamples: []

   Other Information
                Database: []
                UserData: []
チャネル Running プロパティ値が 1 (true) になっていることに注意してください。

メッセージを作成する

すべてのプロパティ値を必要に応じて設定し、チャネルが実行されると、CAN バス上でメッセージを送受信する準備が整います。この演習では、canch1 を使用してメッセージを送信し、canch2 を使用して受信します。メッセージを送信するには、メッセージ オブジェクトを作成し、必要なデータとともにメッセージをパックします。

標準タイプ ID が 500、データ長が 8 バイトの CAN メッセージを作成します。

messageout = canMessage(500,false,8)
messageout = 

  Message with properties:

   Message Identification
    ProtocolMode: 'CAN'
              ID: 500
        Extended: 0
            Name: ''

   Data Details
       Timestamp: 0
            Data: [0 0 0 0 0 0 0 0]
         Signals: []
          Length: 8

   Protocol Flags
           Error: 0
          Remote: 0

   Other Information
        Database: []
        UserData: []

メッセージのプロパティの一部は次のことを示します。

  • Error — メッセージはエラーではないため、論理 0 (false) です。

  • Remote — メッセージはリモート フレームではないため、論理 0 (false) です。

  • ID — 指定したID。

  • Extended — 拡張 ID を指定しなかったため、論理 0 (false) になります。

  • Data — データ長によってサイズが指定される、0 の uint8 配列。

入力引数の詳細については、canMessage 関数を参照してください。

メッセージをパックする

メッセージを作成したら、必要なデータをメッセージにパックします。

pack 関数を使用して、次の入力パラメータでメッセージをパックします: Data 値 25、開始ビット 0、信号サイズ 16、およびリトルエンディアン形式のバイト順序。設定を確認するには、メッセージの Data プロパティを表示します。

pack(messageout,25,0,16,'LittleEndian')
messageout.Data
ans =

  1×8 uint8 row vector

   25    0    0    0    0    0    0    0

パックによって変更される唯一のメッセージ プロパティは Data です。入力引数の詳細については、pack 関数を参照してください。

メッセージを送信する

これで、パックされたメッセージを送信できます。transmit 関数を使用し、チャネル canch1 とメッセージを入力引数として指定します。

transmit(canch1,messageout)
canch1
canch1 = 

  Channel with properties:

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

   Status Information
                 Running: 1
       MessagesAvailable: 1
        MessagesReceived: 0
     MessagesTransmitted: 1
    InitializationAccess: 1
        InitialTimestamp: 23-May-2019 15:43:40
           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: 250000
                     SJW: []
                   TSEG1: []
                   TSEG2: []
            NumOfSamples: []

   Other Information
                Database: []
                UserData: []

MATLAB® は更新されたチャネルを表示します。ステータス情報セクションでは、メッセージを送信するたびに MessagesTransmitted 値が 1 ずつ増加します。受信されるメッセージはバス上のすべてのデバイスで利用できるため、送信チャネルの場合でも MessagesAvailable プロパティに表示されます。

入力引数の詳細については、transmit 関数を参照してください。

メッセージを受信する

receive 関数を使用して、canch2 で利用可能なメッセージを受信します。

  1. このチャネルで受信可能なメッセージを表示するには、次のように入力します。

    canch2
    canch2 = 
    
      Channel with properties:
    
       Device Information
                DeviceVendor: 'MathWorks'
                      Device: 'Virtual 1'
          DeviceChannelIndex: 2
          DeviceSerialNumber: 0
                ProtocolMode: 'CAN'
    
       Status Information
                     Running: 1
           MessagesAvailable: 1
            MessagesReceived: 0
         MessagesTransmitted: 0
        InitializationAccess: 1
            InitialTimestamp: 23-May-2019 15:43:40
               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: 250000
                         SJW: []
                       TSEG1: []
                       TSEG2: []
                NumOfSamples: []
    
       Other Information
                    Database: []
                    UserData: []

    チャネル ステータス情報は、MessagesAvailable に対して 1 を示します。

  2. canch2 で 1 つのメッセージを受信し、それを messagein に割り当てます。短い一時停止により、メッセージの送信が完了したことが確認されます。

    messagein = receive(canch2,1)
    messagein = 
    
      Message with properties:
    
       Message Identification
        ProtocolMode: 'CAN'
                  ID: 500
            Extended: 0
                Name: ''
    
       Data Details
           Timestamp: 0.0312
                Data: [25 0 0 0 0 0 0 0]
             Signals: []
              Length: 8
    
       Protocol Flags
               Error: 0
              Remote: 0
    
       Other Information
            Database: []
            UserData: []

    受信したメッセージの Data プロパティに注意してください。これはcanch1から送信されたデータと一致します。

    入力引数の詳細については、receive 関数を参照してください。

  3. チャネルがメッセージを受信したかどうかを確認するには、チャネル表示を表示します。

    canch2
    canch2 = 
    
      Channel with properties:
    
       Device Information
                DeviceVendor: 'MathWorks'
                      Device: 'Virtual 1'
          DeviceChannelIndex: 2
          DeviceSerialNumber: 0
                ProtocolMode: 'CAN'
    
       Status Information
                     Running: 1
           MessagesAvailable: 0
            MessagesReceived: 1
         MessagesTransmitted: 0
        InitializationAccess: 1
            InitialTimestamp: 23-May-2019 15:43:40
               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: 250000
                         SJW: []
                       TSEG1: []
                       TSEG2: []
                NumOfSamples: []
    
       Other Information
                    Database: []
                    UserData: []

    チャネル ステータス情報は、MessagesReceived の場合は 1、MessagesAvailable の場合は 0 を示します。

メッセージをアンパックする

チャネルがメッセージを受信した後、メッセージをアンパックしてメッセージ内のデータを解釈する方法を指定します。メッセージをアンパックするためのパラメータを指定するには、unpack を使用します。これらのパラメータは、パックするために使用されるパラメータと対応している必要があります。

value = unpack(messagein,0,16,'LittleEndian','int16')
value =

  int16

   25

入力引数の詳細については、unpack 関数を参照してください。

CAN チャネルの保存と読み込み

CAN 通信セッション中はいつでも、save 関数を使用して CAN チャネル オブジェクトをファイルに保存できます。

canch1 を MATLAB ファイル mycanch.mat に保存するには、次のように入力します。

save mycanch.mat canch1

CAN チャネルを MATLAB ファイルに保存した場合は、load 関数を使用してチャネルを MATLAB に読み込むことができます。たとえば、先ほど作成した mycanch.mat からチャネルをリロードするには、次のように入力します。

load mycanch.mat

ロードされた CAN チャネル オブジェクトは、指定されたハードウェアに再接続し、チャネルが保存されたときの仕様に合わせて再構成されます。

チャネルを切断してクリーンアップする

設定されたチャネルを切断する

CAN バスとの通信が不要になった場合は、stop 関数を使用して、構成した CAN チャネルを切断します。

  1. 最初のチャネルを停止します。

    stop(canch1)
  2. チャネルのステータスを確認します。

    canch1
    .
    .
    .
     Status Information
                     Running: 0
           MessagesAvailable: 1
            MessagesReceived: 0
         MessagesTransmitted: 1
  3. 2番目のチャネルを停止します。

    stop(canch2)
  4. チャネルのステータスを確認します。

    canch2
    .
    .
    .
     Status Information
                     Running: 0
           MessagesAvailable: 0
            MessagesReceived: 1
         MessagesTransmitted: 0

MATLAB ワークスペースをクリーンアップする

これらのオブジェクトと変数が不要になったら、clear コマンドを使用して MATLAB ワークスペースから削除します。

  1. 各チャネルをクリアします。

    clear canch1
    clear canch2
  2. CAN メッセージをクリアします。

    clear messageout
    clear messagein
  3. アンパックされた値をクリアします。

    clear value

参考

トピック