このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
MATLAB での CAN 通信入門
この例では、CAN チャネルを使用して CAN メッセージを送受信する方法を説明します。ループバック構成で接続されている MathWorks® バーチャル CAN チャネルを使用します。
受信チャネルを作成する
ベンダー名、デバイス名、デバイス チャネル インデックスを指定して、canChannel
を使用して CAN チャネルを作成し、メッセージを受信します。
rxCh = canChannel("MathWorks", "Virtual 1", 2);
チャネルを検査する
すべてのチャネル プロパティとその現在の値に関する詳細情報を取得するには、get
コマンドを使用します。
get(rxCh)
ArbitrationBusSpeed: [] DataBusSpeed: [] ReceiveErrorCount: 0 TransmitErrorCount: 0 InitializationAccess: 1 InitialTimestamp: [0×0 datetime] SilentMode: 0 TransceiverState: 'N/A' BusSpeed: 500000 NumOfSamples: [] SJW: [] TSEG1: [] TSEG2: [] BusStatus: 'N/A' TransceiverName: 'N/A' Database: [] MessageReceivedFcn: [] MessageReceivedFcnCount: 1 UserData: [] FilterHistory: 'Standard ID Filter: Allow All | Extended ID Filter: Allow All' MessagesReceived: 0 MessagesTransmitted: 0 Running: 0 Device: 'Virtual 1' DeviceChannelIndex: 2 DeviceSerialNumber: 0 DeviceVendor: 'MathWorks' ProtocolMode: 'CAN' MessagesAvailable: 0
チャネルの開始
チャネルをオンラインに設定するには、start
コマンドを使用します。
start(rxCh);
メッセージを送信する
サンプル関数 generateMsgs
は、canMessage
を使用して CAN メッセージを作成し、transmit
を使用してさまざまな周期で送信します。デモ用に CAN バス上にトラフィックを生成します。
type generateMsgs
function generateMsgs() % generateMsgs Creates and transmits CAN messages for demo purposes. % % generateMsgs periodically transmits multiple CAN messages at various % periodic rates with changing message data. % % Copyright 2008-2016 The MathWorks, Inc. % Create the messages to send using the canMessage function. The % identifier, an indication of standard or extended type, and the data % length is given for each message. msgTx100 = canMessage(100, false, 0); msgTx200 = canMessage(200, false, 2); msgTx400 = canMessage(400, false, 4); msgTx600 = canMessage(600, false, 6); msgTx800 = canMessage(800, false, 8); % Create a CAN channel on which to transmit. txCh = canChannel('MathWorks', 'Virtual 1', 1); % Register each message on the channel at a specified periodic rate. transmitPeriodic(txCh, msgTx100, 'On', 0.500); transmitPeriodic(txCh, msgTx200, 'On', 0.250); transmitPeriodic(txCh, msgTx400, 'On', 0.125); transmitPeriodic(txCh, msgTx600, 'On', 0.050); transmitPeriodic(txCh, msgTx800, 'On', 0.025); % Start the CAN channel. start(txCh); % Run for several seconds incrementing the message data regularly. for ii = 1:50 % Increment the message data bytes. msgTx200.Data = msgTx200.Data + 1; msgTx400.Data = msgTx400.Data + 1; msgTx600.Data = msgTx600.Data + 1; msgTx800.Data = msgTx800.Data + 1; % Wait for a time period. pause(0.100); end % Stop the CAN channel. stop(txCh); end
例のメッセージを送信するには、generateMsgs
関数を実行します。
generateMsgs();
メッセージの受信
generateMsgs
が完了したら、receive
関数を使用してチャネルから利用可能なすべてのメッセージを受信します。
rxMsg = receive(rxCh, Inf, "OutputFormat", "timetable");
head
を使用して、受信したメッセージの最初の数行を抽出し、プレビューします。
head(rxMsg)
Time ID Extended Name Data Length Signals Error Remote ___________ ___ ________ __________ ___________________ ______ ____________ _____ ______ 0.31722 sec 100 false {0×0 char} {1×0 uint8 } 0 {0×0 struct} false false 0.31723 sec 200 false {0×0 char} {[ 0 0]} 2 {0×0 struct} false false 0.31723 sec 400 false {0×0 char} {[ 0 0 0 0]} 4 {0×0 struct} false false 0.31723 sec 600 false {0×0 char} {[ 0 0 0 0 0 0]} 6 {0×0 struct} false false 0.31723 sec 800 false {0×0 char} {[0 0 0 0 0 0 0 0]} 8 {0×0 struct} false false 0.34689 sec 800 false {0×0 char} {[1 1 1 1 1 1 1 1]} 8 {0×0 struct} false false 0.37728 sec 600 false {0×0 char} {[ 1 1 1 1 1 1]} 6 {0×0 struct} false false 0.37729 sec 800 false {0×0 char} {[1 1 1 1 1 1 1 1]} 8 {0×0 struct} false false
チャネルの停止
チャネルをオフラインに設定するには、stop
コマンドを使用します。
stop(rxCh);
受信メッセージを解析する
MATLAB ® は、CAN メッセージの解析を実行するための強力な環境を提供します。plot
コマンドは、メッセージのタイムスタンプと識別子を含む散布図を作成し、ネットワーク上で特定のメッセージがいつ発生したかの概要を提供できます。
plot(rxMsg.Time, rxMsg.ID, "x") ylim([0 2047]) xlabel("Timestamp") ylabel("CAN Identifier")