メインコンテンツ

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

Simulink における CAN メッセージ受信動作

この例では、複数のモデリング シナリオで CAN Receive ブロックと CAN Unpack ブロックのメッセージ処理動作を観察する方法を示します。この例では、CAN Receive ブロックの関数トリガー f() ポートを使用する場合と使用しない場合の 2 つのケースを示します。モデルの出力は、各ケースで下流処理のためにアンパックされた CAN メッセージの数を示します。この例では、MathWorks 仮想 CAN チャネルを使用して、MATLAB から Simulink モデルに CAN メッセージを送信します。これらのモデリングのプラクティスと動作は、Vehicle Network Toolbox CAN FD ブロックを使用する CAN FD プロトコルにも適用されます。

サンプルモデルを調べる

サンプルモデルには、500 ミリ秒ごとにサンプリングする Mathworks 仮想チャネル用に構成された CAN Receive ブロックが含まれています。受信した CAN メッセージは、次の 2 つの方法でアンパックされます。

  • Function-Call Subsystem 内の CAN Unpack ブロック。CAN Receive ブロックの関数トリガー f() ポートによってトリガーされます。

  • CAN Msg 出力ポートに直接接続された CAN Unpack ブロック。

どちらの場合も、受信した信号を確認するためにスコープが配置されます。また、CAN Unpack ブロックの出力ポートからの信号値は MATLAB ワークスペースにエクスポートされ、結果をプロットするために使用されます。

open CanReceiveModel

CANメッセージの送信準備

モデルの動作を示すために、CAN メッセージが MATLAB から送信されます。メッセージは提供された MAT ファイルから読み込まれます。この例では、後でデータを送信するために canChannel が作成されます。送信するメッセージは 100 ミリ秒ごとに定期的に計時され、含まれる信号データは直線的に増加します。

load canMessages.mat
txCh = canChannel("MathWorks","Virtual 1", 1);

モデルを実行してMATLABからのCANメッセージを再生する

有限のシミュレーション時間を割り当ててモデルを実行します。

simTime = 10;
set_param("CanReceiveModel","StopTime",num2str(simTime))
set_param("CanReceiveModel","SimulationCommand","start")

モデルが完全に開始されたと認識されるまでスクリプトの実行を一時停止します。

while strcmp(get_param("CanReceiveModel","SimulationStatus"),"stopped")
end

CAN チャネルを開始し、ロードされた CAN メッセージの replay を実行します。

start(txCh);
replay(txCh, canMessages);

再生が発生すると、モデル内の CAN Receive ブロックがメッセージを受信して処理します。Function-Call Subsystem の内外に配置されたスコープで、リアルタイムに受信した信号値を表示できます。続行するには、モデルのシミュレーションが終了するまで待ちます。

受信データ処理結果の調査

モデルで提供されるスコープには、Function-Call Subsystem の内部と外部で受信されたメッセージからの信号値がアンパックされて表示されます。次のビューは、モデルのシミュレーションが終了した後のスコープを示しています。次の違いに注意してください。

  • Function-Call Subsystem の内部:サンプル時間ごとに、信号値が増加する 4 ~ 6 個のメッセージが受信されます。そのため、再生からのすべての CAN メッセージは個別に受信され、サブシステムにトリガーされ、サンプル時間ごとにサブシステム内の CAN Unpack ブロックによって処理されました。

  • Function-Call Subsystem の外部:サンプル時間ごとに、信号値がジャンプする 1 つのメッセージが受信されます。そのため、サンプル時間ごとの再生からの最新の CAN メッセージのみが CAN Unpack ブロックに提供され、処理されました。その他の中間メッセージは処理されません。

signal_in.png signal_out.png

plot.png

CAN Unpack ブロックの出力ポートからエクスポートされたモデル信号値を使用して、プロットで両方のケースを比較します。結果をプロットするために使用される関数はこの例に含まれており、モデルのシミュレーションが停止したときに実行されるように、モデルの Stop Function コールバックで実行されるように構成されています。

CAN メッセージの送信は 100 ミリ秒ごとに定期的に発生し、CAN Receive ブロックは 500 ミリ秒でサンプリングしました。したがって、各サンプルには 4 ~ 6 個の CAN メッセージがあります。これらの波形から、次のような結論を導き出すことができます。

ケース 1: 関数トリガー (Function-Call Subsystem 内) を使用して CAN メッセージをアンパックすると、各サンプルで受信したすべてのメッセージがアンパックされます。

  • 各サンプル時間で複数の信号値が観測されます。

  • 信号の値が直線的に増加していることは、すべてのサンプル時間内のメッセージがアンパックされていることを示しています。

  • この方法では、受信したメッセージごとに Function-Call Subsystem がトリガーされ、その中でアンパックが実行されるため、データは抑制されません。

ケース 2: 関数トリガー (Function-Call Subsystem の外部) を使用せずに CAN メッセージをアンパックすると、各サンプルの最新のメッセージのみがアンパックされます。

  • 各サンプル時間では 1 つの信号値のみが観測されます。

  • したがって、各サンプル時間には 1 つの CAN メッセージのみがアンパックされます。

  • 各サンプル時間には、サンプル内の最新のメッセージのみがアンパックされます。

  • 各サンプルでは、最新のメッセージを除く他のすべてのメッセージが抑制されます。

要約すると、CAN Receive ブロックの関数トリガー ポートは、サンプル時間ごとに受信したすべてのメッセージをアンパックするために使用されます。使用しない場合は、各サンプル時間で最新のメッセージのみがアンパックされます。システムの要件とデータ処理のニーズに基づいてモデルの動作を選択します。