メインコンテンツ

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

CAN 通信におけるメッセージ受信コールバック関数の使用

この例では、コールバック関数を使用して CAN チャネルから受信したメッセージを処理する方法を示します。ループバック構成で接続されている MathWorks® バーチャル CAN チャネルを使用します。この例では、CAN ネットワークのワークフローについて説明していますが、ここで説明する概念は CAN FD ネットワークにも適用されます。

受信チャネルを作成する

ベンダー名、デバイス名、デバイス チャネル インデックスを指定して、canChannel を使用して CAN チャネルを作成し、メッセージを受信します。

rxCh = canChannel("MathWorks", "Virtual 1", 2)
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: []
                UserData: []

コールバック関数を設定する

必要な数のメッセージがチャネル上で利用可能になったときに実行されるコールバック関数を設定します。

rxCh.MessageReceivedFcn = @receivingFcn;

メッセージ受信数を設定する

コールバック関数がトリガーされる前にチャネルで必要なメッセージの数を指定します。

rxCh.MessageReceivedFcnCount = 30;

コールバック関数を実装する

サンプルのコールバック関数は、チャネルから利用可能なすべてのメッセージを受信し、実行ごとに CAN 識別子をタイムスタンプに対してプロットします。

type receivingFcn
function receivingFcn(rxCh)
% RECEIVINGFCN A CAN channel message receive callback function.
%
%   This is a callback function used to receive CAN message. It receives 
%   messages from the channel RXCH and plots the result.
%

% Copyright 2009-2016 The MathWorks, Inc.

    % Receive all available messages.
    rxMsg = receive(rxCh, Inf, 'OutputFormat', 'timetable');

    % Plot the signal values against their message timestamps.
    plot(rxMsg.Time, rxMsg.ID, 'x');
    ylim([0 2047])
    xlabel('Timestamp');
    ylabel('CAN Identifier');
    hold all;
end

チャネルの開始

チャネルをオンラインに設定するには、start コマンドを使用します。

start(rxCh);

コールバック関数を実行する

関数 generateMsgs は CAN メッセージを作成し、さまざまな周期で送信して CAN バス上にトラフィックを作成します。メッセージが送信されると、プロパティ MessageReceivedFcnCount で指定されたしきい値が満たされるたびにコールバック関数が実行されます。

generateMsgs();

残りのメッセージを調べる

残りのメッセージの数を確認するには、チャネルの MessagesAvailable プロパティを表示します。利用可能なメッセージ数が指定されたしきい値を下回っているため、もう一度コールバックをトリガーするには、さらにメッセージが必要です。

rxCh.MessagesAvailable
ans = 11

チャネルの停止

チャネルをオフラインに設定するには、stop コマンドを使用します。

stop(rxCh);