メインコンテンツ

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

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

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

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

load SourceMsgs.mat

あるいは、blfread 関数を使用して BLF ファイルから CAN メッセージを読み取ります。出力はスカラー セルであるため、timetable をセルから抽出する必要があることに注意してください。

canMsgTimetable = blfread("SourceMsgs.blf");
canMsgTimetable = canMsgTimetable{1};

mdfRead 関数を使用して、同様のアプローチで MDF ファイルから読み取ることができます。

記録されたメッセージの初期タイムスタンプがゼロではないことに注意してください。

startTime = seconds(canMsgTimetable.Time(1))
startTime = 
88.6176
stopTime = seconds(canMsgTimetable.Time(end))
stopTime = 
177.2310

シミュレーション時間ステップを 0.01 秒に定義し、startTimestopTime の値をそれと互換性があるように丸めます。

Ts = 0.01;
startTime = round(startTime, 2);
stopTime = round(stopTime, 2);

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

canMsgs = canMessageReplayBlockStruct(canMsgTimetable);
save DriveReplay.mat canMsgs
whos
  Name                      Size               Bytes  Class        Attributes

  Ts                        1x1                    8  double                 
  canMsgTimetable      100000x8             38311075  timetable              
  canMsgs                   1x1              2400952  struct                 
  startTime                 1x1                    8  double                 
  stopTime                  1x1                    8  double                 

CAN Replay モデル

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

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

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

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

CAN メッセージの時系列との互換性のためにモデル パラメータを構成します。モデリング タブをクリックし、次に 構成パラメーター をクリックします。ソルバー ペインで、図のように適切な編集フィールドで startTimestopTime、および Ts 変数を使用します。

変更を適用してウィンドウを閉じるには、[OK ] をクリックします。

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

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

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

シミュレーションを実行するには、実行 をクリックします。コンピュータの構成によっては、スコープに表示される出力がゼロになる場合があります。

この結果は予想通りです。モデルシミュレーションとメッセージ送信は別々のスレッドで実行され、同期されません。Simulink は、シミュレーションをできるだけ高速に実行しようとしますが、提供された時系列は非常に短いため、シミュレーションが完了する前に最初のメッセージの送信が開始されていなかった可能性があります。

ログに記録された信号を再生するためのより良い方法は、シミュレーション ペーシングを使用することです。これにより、モデルの実行速度が遅くなり、ほぼリアルタイムのシミュレーションが実現します。シミュレーション ペーシングを有効にするには、[実行] -> [シミュレーション ペーシング] をクリックし、チェック ボックスをオンにしてオプションを有効にします。シミュレーションを再度実行し、テストドライブ中のすべての車輪の車輪速度を可視化します。

demoVNTSL_CANReplayAndLog_Scope.png

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

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

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

  Ts                        1x1                    8  double                 
  canMsgTimetable      100000x8             38311075  timetable              
  canMsgs                   1x1              2400952  struct                 
  outMsgs                   1x1               240304  struct                 
  startTime                 1x1                    8  double                 
  stopTime                  1x1                    8  double                 

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

以前に定義した startTime 変数を使用して、ログに記録されたタイムスタンプをオフセットします。

outMsgs.Timestamp = startTime + outMsgs.Timestamp;

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

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

次に、プロット関数を使用して信号を可視化し、シミュレーションの出力と比較します。

db = canDatabase('VehicleInfo.dbc');
wheelSpeedMsgTimetable = canMessageTimetable(outMsgs, db);
wheelSpeedMsgTimetable(1:15, :)
ans=15×8 timetable
       Time        ID     Extended         Name                     Data                Length      Signals       Error    Remote
    __________    ____    ________    _______________    ___________________________    ______    ____________    _____    ______

    88.912 sec    1200     false      {'WheelSpeeds'}    {[39 16 39 16 39 16 39 16]}      8       {1×1 struct}    false    false 
    88.92 sec     1200     false      {'WheelSpeeds'}    {[39 16 39 16 39 16 39 16]}      8       {1×1 struct}    false    false 
    88.929 sec    1200     false      {'WheelSpeeds'}    {[39 16 39 16 39 16 39 16]}      8       {1×1 struct}    false    false 
    88.939 sec    1200     false      {'WheelSpeeds'}    {[39 16 39 16 39 16 39 16]}      8       {1×1 struct}    false    false 
    88.947 sec    1200     false      {'WheelSpeeds'}    {[39 16 39 16 39 16 39 16]}      8       {1×1 struct}    false    false 
    88.957 sec    1200     false      {'WheelSpeeds'}    {[39 16 39 16 39 16 39 16]}      8       {1×1 struct}    false    false 
    88.965 sec    1200     false      {'WheelSpeeds'}    {[39 16 39 16 39 16 39 16]}      8       {1×1 struct}    false    false 
    88.974 sec    1200     false      {'WheelSpeeds'}    {[39 16 39 16 39 16 39 16]}      8       {1×1 struct}    false    false 
    88.982 sec    1200     false      {'WheelSpeeds'}    {[39 16 39 16 39 16 39 16]}      8       {1×1 struct}    false    false 
    88.99 sec     1200     false      {'WheelSpeeds'}    {[39 16 39 16 39 16 39 16]}      8       {1×1 struct}    false    false 
    88.999 sec    1200     false      {'WheelSpeeds'}    {[39 16 39 16 39 16 39 16]}      8       {1×1 struct}    false    false 
    89.007 sec    1200     false      {'WheelSpeeds'}    {[39 16 39 16 39 16 39 16]}      8       {1×1 struct}    false    false 
    89.016 sec    1200     false      {'WheelSpeeds'}    {[39 16 39 16 39 16 39 16]}      8       {1×1 struct}    false    false 
    89.024 sec    1200     false      {'WheelSpeeds'}    {[39 16 39 16 39 16 39 16]}      8       {1×1 struct}    false    false 
    89.033 sec    1200     false      {'WheelSpeeds'}    {[39 16 39 16 39 16 39 16]}      8       {1×1 struct}    false    false 

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

    177.38 sec      56.73        56.73        56.61        56.65  
    177.39 sec      56.76        56.69        56.64        56.66  
    177.4 sec       56.74        56.66        56.62        56.65  
    177.41 sec      56.72        56.73        56.56        56.64  
    177.42 sec      56.76        56.76        56.57        56.66  
    177.43 sec      56.78        56.69        56.66        56.72  
    177.44 sec      56.82        56.74        56.72        56.74  
    177.45 sec      56.85        56.81        56.77        56.72  
    177.45 sec      56.79        56.81        56.79        56.69  
    177.46 sec      56.76        56.83        56.78        56.66  
    177.47 sec      56.74        56.79        56.74        56.66  
    177.48 sec       56.7        56.74        56.68        56.69  
    177.49 sec      56.76        56.77        56.69        56.72  
    177.5 sec       56.76        56.81        56.72        56.77  
    177.51 sec      56.65        56.83        56.68        56.77  

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

Figure contains an axes object. The axes object contains 4 objects of type line.

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

参考

ツール

トピック