メインコンテンツ

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

CANメッセージの多重化と多重分離

はじめに

この例では、CAN メッセージに多重化と多重分離を適用する方法を示します。

多重化は、CAN バス通信で使用される方法で、各信号の有効サンプル レートを低下させる代わりに、送信される信号の数を増やします。

多重化された信号は同じ CAN フレームに属しますが、ビット レイアウトが重複している場合があります。ビット パターンの解釈は条件付きであり、マルチプレクサと呼ばれる別の信号の値に依存します。

例として、CAN エクスプローラー アプリを使用して取得された、多重化された OBD-II (オンボード診断) フレームの次のシーケンスを考えてみましょう。

最初の 2 つのデータ バイトの解釈は、OBD-II PID に対応する 3 番目のバイトの値によって異なります。

具体的には、次の図に示すように、フレームは重複するビット レイアウトで 3 つの異なる信号を伝送します。

エンジントルク、OBD-II PID = 98(10進数)、62(16進数)

Engine_Torque_bit_layout_diagram.jpg

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

Accelerator_bit_layout_diagram.jpg

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

VehicleSpeed_bit_layout_diagram.jpg

マルチプレクサ信号

Multiplexor_bit_layout_diagram.jpg

マルチプレクサ信号のビットレイアウトは、他の 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 contains an axes object. The axes object with title Accelerator and Engine Torque, xlabel Time (seconds), ylabel Actual Engine Percent Torque (%) contains 2 objects of type line.

figure
plot(Vehicle_Speed);
title("Vehicle Speed");

Figure contains an axes object. The axes object with title Vehicle Speed, xlabel Time (seconds), ylabel Vehicle speed (mph) contains an object of type line.

このデータは、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 contains an axes object. The axes object with title Accelerator and Engine Torque - Demultiplexed, ylabel Actual Engine Percent Torque (%) contains 2 objects of type line.

figure
plot(Vehicle_Speed_Demultiplexed.Time, Vehicle_Speed_Demultiplexed.Vehicle_Speed)
title("Vehicle Speed - Demultiplexed");

Figure contains an axes object. The axes object with title Vehicle Speed - Demultiplexed contains an object of type line.

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