メインコンテンツ

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

CAN FD メッセージのロギングと再生

この例では、Simulink ® の MathWorks ® 仮想 CAN FD チャネルを使用して CAN FD メッセージをログに記録および再生する方法を示します。このモデルを更新して、システムでサポートされているハードウェアに接続できます。

サンプル フォルダーの SourceFDMsgs.mat ファイルから保存された CAN FD メッセージを読み込みます。ファイルには、テスト トラックを 90 秒間走行するサイクルを表す CAN FD メッセージが含まれています。

load SourceFDMsgs.mat

CAN FD メッセージを含む timetable を検査します。特に、初期タイムスタンプがゼロではないことに注意してください。

startTime = seconds(canFDMsgTimetable.Time(1)) %#ok<NOPTS>
startTime = 88.6176
stopTime = seconds(canFDMsgTimetable.Time(end)) %#ok<NOPTS>
stopTime = 177.2310

これらのメッセージを CAN FD Replay ブロックと互換性のある形式に変換し、別のファイルに保存します。

canFDMsgs = canFDMessageReplayBlockStruct(canFDMsgTimetable);
save DriveReplayFD.mat canFDMsgs
whos
  Name                        Size               Bytes  Class        Attributes

  canFDMsgTimetable      100000x12            45411725  timetable              
  canFDMsgs                   1x1              8401848  struct                 
  startTime                   1x1                    8  double                 
  stopTime                    1x1                    8  double                 

CAN FD 再生モデル

このモデルには以下が含まれます:

  • MathWorks Virtual Channel 1 に送信する CAN FD Replay ブロック。

  • CAN FD ネットワーク上のメッセージを MathWorks Virtual Channel 2 経由で受信する CAN FD Receive ブロック。

CAN FD Receive ブロックは、すべての拡張 ID をブロックし、標準 ID 1200 を持つ WheelSpeed メッセージのみを通過させるように設定されています。

シミュレーションの開始時間と終了時間を、メッセージ時系列の最初のタイムスタンプと最後のタイムスタンプに合わせて設定します。このためには、モデリング タブを選択し、モデル設定 をクリックします。次に、[構成パラメーター] ダイアログ ボックスで、以前に定義した変数 startTimestopTime を使用して、シミュレーションの開始時間と終了時間を設定します。適用 をクリックし、構成パラメータ ウィンドウを閉じます。

実行 ボタンをクリックしてシミュレーションを実行します。

診断ビューアの警告に注意してください。

モデルは、時間ステップが 0.01 秒の固定ステップ ソルバーを使用するように構成されています。ただし、記録された時系列から取得された開始時間と終了時間の値は、シミュレーション時間ステップの整数倍ではありません。Simulink のデフォルトの動作では、これらの値はシミュレーションの時間ステップと互換性を持たせるために丸められます。また、シミュレーションの前に MATLAB ® スクリプトで丸めることもできます。Simulink ソルバーの自動パラメータ選択の詳細については、ドキュメント ページ ソルバーの選択 (Simulink) を参照してください。

ホイールスピードサブシステム

Wheel Speeds サブシステムは、受信した CAN FD メッセージからホイール速度情報をアンパックし、スコープにプロットします。サブシステムはメッセージをファイルに記録します。

ホイール速度情報を可視化

スコープ内のプロットには、テストドライブ中のすべての車輪の車輪速度が表示されます。

コンピュータの構成によっては、シミュレーション後のスコープ内の信号がゼロになる場合があります。この結果は正常です。モデルシミュレーションとメッセージ送信は異なるスレッドで実行され、同期されていません。Simulink は、できるだけ高速にモデルをシミュレートしようとしますが、時系列が非常に短いため、シミュレーションが終了するまでに最初のメッセージの受信が完了していない可能性が非常に高くなります。

Simulink で記録された信号を再生するためのより適切なアプローチは、シミュレーション ペーシングを使用して、ほぼリアルタイムの条件でモデルを実行することです。このようにして、モデルのシミュレーションは、信号が記録されたペースとほぼ同じペースで実行されます。シミュレーションのペースを有効にするには、実行 -> シミュレーション ペース をクリックし、ペースを有効にしてシミュレーションの速度を落とす チェックボックスをオンにします。シミュレーションを再度実行し、スコープを検査すると、適切な信号が表示されます。

シミュレーションのペースの詳細については、次のページをご覧ください: Simulation Pacing Options (Simulink)

ログメッセージファイルを読み込む

CAN FD Log ブロックは、モデルを実行するたびに一意のファイルを作成します。最新のログ ファイルを見つけるには、MATLAB コマンド ウィンドウで dir を使用します。

dir WheelSpeeds*.mat
WheelSpeeds_2023-Jun-20_123918.mat  WheelSpeeds_2023-Jun-20_151835.mat  
load WheelSpeeds_2023-Jun-20_123918.mat
whos
  Name                        Size               Bytes  Class        Attributes

  canFDMsgTimetable      100000x12            45411725  timetable              
  canFDMsgs                   1x1              8401848  struct                 
  outFDMsgs                   1x1              7845516  struct                 
  startTime                   1x1                    8  double                 
  stopTime                    1x1                    8  double                 

ログメッセージを変換する

記録されたタイムスタンプを CAN FD Log ブロックからオフセットするには、startTime 変数を使用します。

outFDMsgs.Timestamp = startTime + outFDMsgs.Timestamp;

関数 canFDMessageTimetable を使用して、シミュレーション中に記録されたメッセージをコマンド ウィンドウで使用できる timetable に変換します。

メッセージ信号に直接アクセスするには、canSignalTimetable とともに適切なデータベース ファイルを変換で使用します。

db = canDatabase('VehicleInfoFD.dbc');
wheelSpeedMsgTimetable = canFDMessageTimetable(outFDMsgs, db);
wheelSpeedMsgTimetable(1:15, :)
ans=15×12 timetable
       Time        ID     Extended         Name          ProtocolMode                 Data                 Length    DLC      Signals       Error    Remote     BRS      ESI 
    __________    ____    ________    _______________    ____________    ______________________________    ______    ___    ____________    _____    ______    _____    _____

    88.829 sec    1201     false      {0×0 char     }     {'CAN FD'}     {[           0 0 0 0 0 0 0 0]}      8        8     {0×0 struct}    false    false     true     false
    88.83 sec     1312     false      {0×0 char     }     {'CAN FD'}     {[            250 0 200 50 0]}      5        5     {0×0 struct}    false    false     true     false
    88.831 sec     512     false      {0×0 char     }     {'CAN FD'}     {[   2 1 1 250 1 231 129 255]}      8        8     {0×0 struct}    false    false     true     false
    88.832 sec     513     false      {0×0 char     }     {'CAN FD'}     {[12 103 255 255 39 16 1 255]}      8        8     {0×0 struct}    false    false     true     false
    88.832 sec     533     false      {0×0 char     }     {'CAN FD'}     {[        2 26 2 26 2 24 0 0]}      8        8     {0×0 struct}    false    false     true     false
    88.832 sec     561     false      {0×0 char     }     {'CAN FD'}     {[      15 4 255 255 0 0 0 0]}      8        8     {0×0 struct}    false    false     true     false
    88.832 sec     576     false      {0×0 char     }     {'CAN FD'}     {[             63 141 140 32]}      4        4     {0×0 struct}    false    false     true     false
    88.832 sec    1616     false      {0×0 char     }     {'CAN FD'}     {[                         0]}      1        1     {0×0 struct}    false    false     true     false
    88.836 sec    1200     false      {'WheelSpeeds'}     {'CAN FD'}     {[   39 16 39 16 39 16 39 16]}      8        8     {1×1 struct}    false    false     true     false
    88.836 sec    1201     false      {0×0 char     }     {'CAN FD'}     {[           0 0 0 0 0 0 0 0]}      8        8     {0×0 struct}    false    false     true     false
    88.836 sec    1216     false      {0×0 char     }     {'CAN FD'}     {[                       163]}      1        1     {0×0 struct}    false    false     true     false
    88.841 sec     512     false      {0×0 char     }     {'CAN FD'}     {[   2 1 1 250 1 231 129 255]}      8        8     {0×0 struct}    false    false     true     false
    88.842 sec     513     false      {0×0 char     }     {'CAN FD'}     {[12 103 255 255 39 16 1 255]}      8        8     {0×0 struct}    false    false     true     false
    88.842 sec     533     false      {0×0 char     }     {'CAN FD'}     {[        2 26 2 26 2 24 0 0]}      8        8     {0×0 struct}    false    false     true     false
    88.843 sec    1296     false      {0×0 char     }     {'CAN FD'}     {[                     0 0 1]}      3        3     {0×0 struct}    false    false     true     false

wheelSpeedSignals = canSignalTimetable(wheelSpeedMsgTimetable);
wheelSpeedSignals(end-14:end, :)
ans=15×4 timetable
       Time       RR_WSpeed    RF_WSpeed    LR_WSpeed    LF_WSpeed
    __________    _________    _________    _________    _________

    177.31 sec       57.4        57.37        57.27        57.35  
    177.32 sec      57.39        57.35         57.3        57.32  
    177.33 sec      57.36        57.39         57.4        57.31  
    177.33 sec      57.47        57.46        57.47        57.37  
    177.34 sec      57.56        57.41        57.45        57.39  
    177.35 sec      57.48        57.33        57.43         57.4  
    177.36 sec      57.37        57.35        57.41        57.41  
    177.37 sec      57.33        57.41        57.41        57.39  
    177.37 sec      57.37        57.44        57.44        57.36  
    177.38 sec      57.48        57.47        57.43        57.35  
    177.39 sec       57.5        57.43         57.4        57.33  
    177.4 sec       57.48        57.36        57.35        57.32  
    177.41 sec      57.43        57.35        57.28        57.33  
    177.42 sec      57.28         57.4        57.26        57.36  
    177.43 sec      57.27        57.46        57.23        57.35  

plot(wheelSpeedSignals.Time, wheelSpeedSignals{:,:});

この例では、MathWorks CAN FD 仮想チャネルが使用されました。ただし、モデルを他のサポートされているハードウェアに接続することはできます。

参考

ツール

トピック