このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
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.FilterHistoryans = 'Standard ID Filter: Allow Only | Extended ID Filter: Block All'
チャネルを停止する
受信チャネルと送信チャネルの両方を停止し、ワークスペースからクリアします。
stop(rxCh); stop(txCh); clear rxCh txCh
DBCファイルを閉じる
ワークスペースから変数をクリアして、DBC ファイルへのアクセスを閉じます。
clear db