このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
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 秒に定義し、startTime
と stopTime
の値をそれと互換性があるように丸めます。
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 メッセージの時系列との互換性のためにモデル パラメータを構成します。モデリング タブをクリックし、次に 構成パラメーター をクリックします。ソルバー ペインで、図のように適切な編集フィールドで startTime
、stopTime
、および Ts
変数を使用します。
変更を適用してウィンドウを閉じるには、[OK ] をクリックします。
ホイールスピードサブシステム
Wheel Speeds サブシステムは、受信した CAN メッセージからホイール速度情報をアンパックし、スコープにプロットします。サブシステムはメッセージをファイルに記録します。
ホイール速度情報を可視化
シミュレーションを実行するには、実行 をクリックします。コンピュータの構成によっては、スコープに表示される出力がゼロになる場合があります。
この結果は予想通りです。モデルシミュレーションとメッセージ送信は別々のスレッドで実行され、同期されません。Simulink は、シミュレーションをできるだけ高速に実行しようとしますが、提供された時系列は非常に短いため、シミュレーションが完了する前に最初のメッセージの送信が開始されていなかった可能性があります。
ログに記録された信号を再生するためのより良い方法は、シミュレーション ペーシングを使用することです。これにより、モデルの実行速度が遅くなり、ほぼリアルタイムのシミュレーションが実現します。シミュレーション ペーシングを有効にするには、[実行] -> [シミュレーション ペーシング] をクリックし、チェック ボックスをオンにしてオプションを有効にします。シミュレーションを再度実行し、テストドライブ中のすべての車輪の車輪速度を可視化します。
ログメッセージファイルを読み込む
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{:,:});
この例では、MathWorks CAN 仮想チャネルが使用されました。ただし、モデルを他のサポートされているハードウェアに接続することはできます。
参考
ツール
- シミュレーション ペーシング オプション (Simulink)