このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
CANメッセージの多重化と多重分離
はじめに
この例では、CAN メッセージに多重化と多重分離を適用する方法を示します。
多重化は、CAN バス通信で使用される方法で、各信号の有効サンプル レートを低下させる代わりに、送信される信号の数を増やします。
多重化された信号は同じ CAN フレームに属しますが、ビット レイアウトが重複している場合があります。ビット パターンの解釈は条件付きであり、マルチプレクサと呼ばれる別の信号の値に依存します。
例として、CAN エクスプローラー アプリを使用して取得された、多重化された OBD-II (オンボード診断) フレームの次のシーケンスを考えてみましょう。

最初の 2 つのデータ バイトの解釈は、OBD-II PID に対応する 3 番目のバイトの値によって異なります。
具体的には、次の図に示すように、フレームは重複するビット レイアウトで 3 つの異なる信号を伝送します。
エンジントルク、OBD-II PID = 98(10進数)、62(16進数)

アクセルペダルの位置、OBD-II PID = 73 (10進数)、49 (16進数)

車速、OBD-II PID = 13 (10進数)、0D (16進数)

マルチプレクサ信号

マルチプレクサ信号のビットレイアウトは、他の 3 つの信号と重複しないことに注意してください。
次のセクションでは、実際に記録された信号を Simulink ® モデルを使用して多重化して送信します。
その後、CAN フレームは CAN エクスプローラー アプリで受信され、最終的に数行の MATLAB ® コードで多重分離されます。
Simulinkにおける多重化と伝送
実際のエンジン トルクのパーセント、アクセル ペダルの位置、および車両速度の記録された信号は、時系列形式で MAT ファイルで入手できます。0秒から25秒までのデータが記録されています。
load("Logged_OBD2_Data.mat");記録された信号を調べると、特に次に示すように、アクセル位置が 0 になるとエンジン トルクが負になることがわかります。これはエンジンブレーキとして知られる一般的な状況であり、実際にそれに応じて車速が低下します。
figure; yyaxis("left"); plot(Accelerator); yyaxis("right"); plot(Engine_Torque); title("Accelerator and Engine Torque");

figure
plot(Vehicle_Speed);
title("Vehicle Speed");
このデータは、From Workspace ブロックを介して次の Simulink モデルに入力されます。

CAN Pack ブロックは、DBC ファイル CAN_OBD2_Multiplexed.dbc に基づいて次のように構成されます。ファイルには、OBD2Mode という名前の 1 つのマルチプレクサを含む、単一の多重化 CAN フレームの定義が含まれています。

入力信号は、Stateflow ® チャートを使用して実装された Multiplexer ブロックに送られます。これは、時間ベースの多重化に特に便利なアプローチです。

このステート マシンには、相互に排他的な 3 つの状態が含まれます。Transmit_Engine_Torque 状態がアクティブな場合、エンジン トルク信号とそれに対応する OBD-II PID が送信され、他の 2 つの信号はゼロに設定されます。同様のロジックが他の 2 つの状態、つまり Transmit_Accelerator と Transmit_Vehicle_Speed にも適用されます。
状態間の切り替えは時間ベースのロジックに従います。Transmit_Engine_Torque 状態は 2 つのシミュレーション時間ステップでアクティブになり、Transmit_Accelerator 状態は 1 つの時間ステップでアクティブになり、Transmit_Vehicle_Speed 状態は最初の状態に遷移する前に 3 つの時間ステップでアクティブになります。Stateflow の tick キーワードは、Simulink ソルバーによってトリガーされる各タイム ステップでのダイアグラムのアクティブ化を指します。
次のパラメータは、Simulink モデルのシミュレーションを制御するために使用されます。ほぼウォールクロック時間の実行を実現するためのシミュレーション ペーシングが有効になっています。
Ts = 0.1; % [s] StartTime = 0; % [s] StopTime = 25; % [s]
シミュレーションを実行した後、多重化された信号とマルチプレクサを検査することは興味深いことです。

マルチプレクサは、3 つの信号の OBD-II PID に対応する 98、73、13 の値を定期的に切り替えます。
このグラフは、元の速度信号と多重化された速度信号の比較からわかるように、多重化によって元の時系列のダウンサンプリングが効果的に導入されるという概念を伝えています。信号の値が OBD-II PID に応じて人工的にゼロに設定されている場合でも、新しい情報は導入されないことに注意してください。多重化された信号は「そのまま」解釈することはできず、下流で使用される前に多重化解除する必要があります。
MATLABにおける受信と多重分離
CAN エクスプローラー アプリを開いて、MathWorks 仮想チャネル 1 でメッセージを受信できるように設定します。次に、Simulink モデルを実行してメッセージを受信し、それを MATLAB ワークスペース変数にエクスポートします。この例では、変数はcanExplorerMsgsと呼ばれ、 canExplorerMsgs.mat ファイル.で使用できます。
ファイル CAN_OBD2_Multiplexed.dbc の CAN データベース オブジェクトを作成します。データベース オブジェクトと canMessageTimetable および canSignalTimetable 関数を使用してメッセージを復号化します。
load("canExplorerMsgs.mat"); db = canDatabase("CAN_OBD2_Multiplexed.dbc"); msgsTT = canMessageTimetable(canExplorerMsgs, db); sigsTT = canSignalTimetable(msgsTT)
sigsTT=251×4 timetable
Time Vehicle_Speed Accelerator OBD2Mode Engine_Torque
__________ _____________ ___________ ________ _____________
12.557 sec 1 12.157 98 0
12.657 sec 1 12.157 98 0
12.882 sec 0 0 73 -125
12.976 sec 0 0 13 -125
13.07 sec 0 0 13 -125
13.281 sec 0 0 13 -125
13.797 sec 1 12.157 98 0
13.967 sec 1 12.157 98 0
14.057 sec 0 0 73 -125
14.147 sec 0 0 13 -125
14.237 sec 0 0 13 -125
14.327 sec 0 0 13 -125
14.417 sec 2 12.941 98 7
14.507 sec 2 14.51 98 23
14.597 sec 6 39.608 73 23
14.687 sec 0 0 13 -125
⋮
これらの関数は各信号を個別に処理するため、多重分離は適用されません。sigsTT timetable 内の信号は、マルチプレクサの値、つまり OBD2Mode 信号に従って抽出する必要があります。そのために、論理インデックスを次のように適用できます。
Accelerator_Demultiplexed = sigsTT(sigsTT.OBD2Mode == 73, "Accelerator")Accelerator_Demultiplexed=42×1 timetable
Time Accelerator
__________ ___________
12.882 sec 0
14.057 sec 0
14.597 sec 39.608
15.137 sec 95.294
15.677 sec 83.137
16.217 sec 67.843
16.757 sec 57.647
17.297 sec 58.039
17.837 sec 59.608
18.377 sec 71.373
18.917 sec 86.275
19.457 sec 96.078
20.004 sec 98.824
20.578 sec 98.824
21.158 sec 44.706
21.757 sec 14.902
⋮
Engine_Torque_Demultiplexed = sigsTT(sigsTT.OBD2Mode == 98, "Engine_Torque")Engine_Torque_Demultiplexed=84×1 timetable
Time Engine_Torque
__________ _____________
12.557 sec 0
12.657 sec 0
13.797 sec 0
13.967 sec 0
14.417 sec 7
14.507 sec 23
14.957 sec 95
15.047 sec 98
15.497 sec 75
15.587 sec 76
16.037 sec 79
16.127 sec 79
16.577 sec 71
16.667 sec 68
17.117 sec 63
17.207 sec 63
⋮
Vehicle_Speed_Demultiplexed = sigsTT(sigsTT.OBD2Mode == 13, "Vehicle_Speed")Vehicle_Speed_Demultiplexed=125×1 timetable
Time Vehicle_Speed
__________ _____________
12.976 sec 0
13.07 sec 0
13.281 sec 0
14.147 sec 0
14.237 sec 0
14.327 sec 0
14.687 sec 0
14.777 sec 0
14.867 sec 0
15.227 sec 2
15.317 sec 3
15.407 sec 4
15.767 sec 6
15.857 sec 7
15.947 sec 7
16.307 sec 10
⋮
figure; yyaxis("left"); plot(Accelerator_Demultiplexed.Time, Accelerator_Demultiplexed.Accelerator); ylabel("Accelerator Percent Pedal Position (%)") yyaxis("right"); plot(Engine_Torque_Demultiplexed.Time, Engine_Torque_Demultiplexed.Engine_Torque); ylabel("Actual Engine Percent Torque (%)") title("Accelerator and Engine Torque - Demultiplexed");

figure
plot(Vehicle_Speed_Demultiplexed.Time, Vehicle_Speed_Demultiplexed.Vehicle_Speed)
title("Vehicle Speed - Demultiplexed");
信号は実質的にダウンサンプリングされ、CAN エクスプローラー アプリの起動と Simulink シミュレーションの開始の間にユーザーによって導入された遅延により、初期時間がシミュレーションのものと異なることに注意してください。ただし、シミュレーションのペースにより、約 25 秒の時間範囲はシミュレーションの時間範囲と一致します。