メインコンテンツ

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

CAN 通信でメッセージフィルタを使用する

この例では、CAN メッセージ フィルターを使用して、指定された識別子を含むメッセージのみがチャネルを通過できるようにする方法を示します。ループバック構成で接続されている MathWorks® バーチャル CAN チャネルを使用します。この例では、CAN ネットワークのワークフローについて説明していますが、ここで説明する概念は CAN FD ネットワークにも適用されます。

送信チャネルと受信チャネルを作成する

メッセージを送信するためのチャネルと受信するためのチャネルをそれぞれ 1 つ作成します。フィルターは受信チャネルで後で設定されます。

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

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

メッセージを作成する

例全体を通して受信チャネルに複数回送信されるメッセージをいくつか作成します。1 つのメッセージに拡張識別子があることに注意してください。

txMsgs(1) = canMessage(250, false, 8);
txMsgs(2) = canMessage(500, false, 8);
txMsgs(3) = canMessage(1000, false, 8);
txMsgs(4) = canMessage(1500, true, 8);
txMsgs(5) = canMessage(2000, false, 8);

フィルターなしでメッセージを受信する

チャネルをオンラインに設定し、一方のチャネルでメッセージを送信し、もう一方のチャネルで受信します。送信されたすべてのメッセージが受信されることに注意してください。デフォルトでは、フィルターが構成されていない新しく作成されたチャネルは、すべての標準識別子と拡張識別子を受け取ります。

start(rxCh);
start(txCh);
transmit(txCh, txMsgs);
pause(0.5);
rxMsgs1 = receive(rxCh, Inf, "OutputFormat", "timetable")
rxMsgs1=5×8 timetable
        Time         ID     Extended       Name              Data            Length      Signals       Error    Remote
    ____________    ____    ________    __________    ___________________    ______    ____________    _____    ______

    0.038957 sec     250     false      {0×0 char}    {[0 0 0 0 0 0 0 0]}      8       {0×0 struct}    false    false 
    0.038959 sec     500     false      {0×0 char}    {[0 0 0 0 0 0 0 0]}      8       {0×0 struct}    false    false 
    0.038961 sec    1000     false      {0×0 char}    {[0 0 0 0 0 0 0 0]}      8       {0×0 struct}    false    false 
    0.038963 sec    1500     true       {0×0 char}    {[0 0 0 0 0 0 0 0]}      8       {0×0 struct}    false    false 
    0.038964 sec    2000     false      {0×0 char}    {[0 0 0 0 0 0 0 0]}      8       {0×0 struct}    false    false 

受信チャネルと送信チャネルの両方を停止します。

stop(rxCh);
stop(txCh);

受信したメッセージの識別子をプロットして、送信されたすべてのメッセージがチャネルによって受信されたことを確認します。

plot(1, rxMsgs1.ID, "x")
h_gca = gca;
h_gca.XTick = 0:1:2;
h_gca.XTickLabel = ["", "Transmit 1", ""];
axis([0 2 0 2047])
xlabel("Message Transmits")
ylabel("CAN Identifiers")

識別子で設定されたフィルターでメッセージを受信する

CAN 識別子および識別子タイプによって指定されたメッセージのみを許可するには、filterAllowOnly コマンドを使用します。標準識別子 500 および 2000 を持つメッセージのみを受信するように受信チャネルを構成します。

filterAllowOnly(rxCh, [500 2000], "Standard");

メッセージ フィルターの構成状態を表示するには、チャネルの FilterHistory プロパティを表示します。

rxCh.FilterHistory
ans = 
'Standard ID Filter: Allow Only | Extended ID Filter: Allow All'

メッセージを受信チャネルに再度送信します。今回は受信するメッセージが少なくなることに注意してください。

start(rxCh);
start(txCh);
transmit(txCh, txMsgs);
pause(0.5);
rxMsgs2 = receive(rxCh, Inf, "OutputFormat", "timetable")
rxMsgs2=3×8 timetable
        Time         ID     Extended       Name              Data            Length      Signals       Error    Remote
    ____________    ____    ________    __________    ___________________    ______    ____________    _____    ______

    0.037472 sec     500     false      {0×0 char}    {[0 0 0 0 0 0 0 0]}      8       {0×0 struct}    false    false 
    0.037473 sec    1500     true       {0×0 char}    {[0 0 0 0 0 0 0 0]}      8       {0×0 struct}    false    false 
    0.037474 sec    2000     false      {0×0 char}    {[0 0 0 0 0 0 0 0]}      8       {0×0 struct}    false    false 

受信チャネルと送信チャネルの両方を停止します。

stop(rxCh);
stop(txCh);

新しく受信したデータをプロットに追加して、どのメッセージがフィルターを通過したかを確認します。フィルターは標準識別子に対してのみ構成されているため、拡張識別子 1500 を持つメッセージはフィルターによってブロックされません。

plot(1, rxMsgs1.ID, "x", 2, rxMsgs2.ID, "x");
h_gca = gca;
h_gca.XTick = 0:1:3;
h_gca.XTickLabel = ["", "Transmit 1", "Transmit 2", ""];
axis([0 3 0 2047])
xlabel("Message Transmits")
ylabel("CAN Identifiers")

メッセージフィルターをリセットする

すべての標準識別子が許可されるように、filterAllowAll コマンドを使用してメッセージ フィルターをデフォルトの状態にリセットします。

filterAllowAll(rxCh, "Standard");

メッセージ フィルターの構成状態を表示するには、チャネルの FilterHistory プロパティを表示します。

rxCh.FilterHistory
ans = 
'Standard ID Filter: Allow All | Extended ID Filter: Allow All'

3 回目の送信と受信を実行して、すべてのメッセージが再びフィルターを通過し、受信チャネルによって受信されることを確認します。

start(rxCh);
start(txCh);
transmit(txCh, txMsgs);
pause(0.5);
rxMsgs3 = receive(rxCh, Inf, "OutputFormat", "timetable")
rxMsgs3=5×8 timetable
        Time         ID     Extended       Name              Data            Length      Signals       Error    Remote
    ____________    ____    ________    __________    ___________________    ______    ____________    _____    ______

    0.037884 sec     250     false      {0×0 char}    {[0 0 0 0 0 0 0 0]}      8       {0×0 struct}    false    false 
    0.037885 sec     500     false      {0×0 char}    {[0 0 0 0 0 0 0 0]}      8       {0×0 struct}    false    false 
    0.037885 sec    1000     false      {0×0 char}    {[0 0 0 0 0 0 0 0]}      8       {0×0 struct}    false    false 
    0.037888 sec    1500     true       {0×0 char}    {[0 0 0 0 0 0 0 0]}      8       {0×0 struct}    false    false 
    0.037888 sec    2000     false      {0×0 char}    {[0 0 0 0 0 0 0 0]}      8       {0×0 struct}    false    false 

受信チャネルと送信チャネルの両方を停止します。

stop(rxCh);
stop(txCh);

新しいデータがプロットに追加されたら、メッセージ フィルターが両方のケースで完全に開いているため、最初の送信と 3 番目の送信が同一であることを確認します。

plot(1, rxMsgs1.ID, "x", 2, rxMsgs2.ID, "x", 3, rxMsgs3.ID, "x")
h_gca = gca;
h_gca.XTick = 0:1:4;
h_gca.XTickLabel = ["", "Transmit 1", "Transmit 2", "Transmit 3", ""];
axis([0 4 0 2047])
xlabel("Message Transmits")
ylabel("CAN Identifiers")

名前で設定されたフィルターでメッセージを受信する

filterAllowOnly コマンドは、DBC ファイルを使用するときに、名前でメッセージをフィルタリングすることもできます。名前が EngineMsg のメッセージのみを許可します。

db = canDatabase("demoVNT_CANdbFiles.dbc");
rxCh.Database = db;
filterAllowOnly(rxCh, "EngineMsg");
rxCh.FilterHistory
ans = 
'Standard ID Filter: Allow Only | Extended ID Filter: Allow All'

特定の識別子タイプのすべてのメッセージをブロックする

filterBlockAll コマンドを使用すると、標準または拡張識別子タイプのすべてのメッセージをブロックするようにフィルターを簡単に設定できます。拡張識別子を持つすべてのメッセージをブロックします。

filterBlockAll(rxCh, "Extended");
rxCh.FilterHistory
ans = 
'Standard ID Filter: Allow Only | Extended ID Filter: Block All'

チャネルを停止する

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

stop(rxCh);
stop(txCh);
clear rxCh txCh

DBCファイルを閉じる

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

clear db