matlab-import-export-vehicle-data について
Vehicle Network ToolboxとMDF関数を使い、MATLABで車両ネットワークログをインポート、デコード、エクスポートするスキルです。MATLABのバージョン制約を踏まえ、形式別のCAN、CAN FD、LIN処理やデータベースによるデコードを案内します。
主な機能
- 01MDF、MF4、DAT、BLF、ASC、TXTログの読み込み
- 02CAN、CAN FD、LINデータのデコード
- 03DBC、ARXML、LDFデータベースの利用
- 04多相的な読み込み結果の処理
- 05timetableのMDF出力とCANデータのBLF出力
活用シーン
- 01DBCで記録済みCAN信号をデコードする
- 02BLFまたはMDFファイルからLINデータを読む
- 03MATLABのtimetableをMDFに出力する
- 04CANまたはCAN FDメッセージをBLFに書き込む
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ matlab/ matlab-agentic-toolkit --skill matlab-import-export-vehicle-dataインストール後、Claude Code で/matlab-import-export-vehicle-dataを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
manifest.yamlreferences/asc-import.mdblf-import.mdblf-writing.mdcan-decode.mdcanfd-decode.mddatabase-objects.mddbc-multiplexing-syntax.mdlin-decode.mdmdf-import.mdmdf-writing.mdsimple-demultiplexing.md詳細
車両データのインポート、エクスポート、デコード
Vehicle Network Toolbox(VNT)を使用して、MATLAB で車両ネットワークのログファイルをインポート、デコード、エクスポートします。
使用する場面
.mf4/.mdf/.dat、.blf、.asc、または.txtの車両バスログファイルを読み込む場合- DBC または ARXML データベースを使用して、未加工の CAN/CAN FD フレームを信号にデコードする場合
- 単純な多重化の場合に、DBC データベースを使用して、未加工の CAN/CAN FD フレームから信号を分離する場合(R2026a 以前)
- LDF データベースを使用して LIN フレームをデコードする場合(R2025a 以降)
- VNT の読み込み関数から返される多態的な戻り値の型を処理する場合
mdfWriteを使用して MATLAB の timetable データを MDF/MF4 ファイルに書き込む場合blfwriteを使用して CAN/CAN FD メッセージデータを BLF ファイルに書き込む場合- MDF エクスポート用に、サポートされていない timetable の型(logical、categorical、cell、datetime 列)を変換する場合
使用しない場面
- Simulink の CAN 構成
- CAN チャネルへのライブアクセス
- XCP/A2L ワークフロー
- 階層型または拡張多重化の場合の信号の分離
- ARXML または LIN データベースを使用した信号の分離
- LIN データの BLF への書き込み(VNT の
blfwriteではサポートされていません。代わりに MDF を使用してください) - ASC または TXT ファイルへの書き込み(
canMessageExportはありません。代わりに BLF または MDF を使用してください)
前提条件
操作を実行する前に、MATLAB のバージョンを確認します。
r = matlabRelease;
tok = regexp(r.Release, 'R(\d{4})([ab])', 'tokens');
matlabYear = str2double(tok{1}{1});
matlabLetter = tok{1}{2};
BLF/ASC/TXT のインポート関数、または CAN/CAN FD/LIN のデコード関数を呼び出す前に、detect_matlab_toolboxes を呼び出して Vehicle Network Toolbox がインストールされていることを確認します。利用できない場合は、ユーザーに伝えてください。セッション内で一度確認したら、再確認しないでください。
MDF 関数(mdfRead、mdfChannelGroupInfo、mdfInfo、mdfChannelInfo)は MATLAB の基本機能(R2023a 以降)であり、VNT は必要ありません。非推奨の mdf() オブジェクトコンストラクターは使用せず、必ず関数型 API を使用してください。すべてのグループを無条件に読み込む場合は、mdfRead だけで問題ありません。選択して読み込む場合や、最初に構造を調べる場合は、mdfChannelGroupInfo または mdfInfo を使用してください。
R2026a 以前では、Vehicle Network Toolbox は多重化をネイティブにサポートしていません。デコードされた信号に、以下で説明する信号分離の変更を適用してください。
デコードのパイプライン
| ソース形式 | CAN | CAN FD | LIN | Raw(デコードなし) |
|---|---|---|---|---|
| ASC | canSignalImport(f,"Vector",db) | 同左 | -- | canMessageImport(f,"Vector",OutputFormat="timetable") |
| TXT | canSignalImport(f,"Kvaser",db) | 同左 | -- | canMessageImport(f,"Kvaser",OutputFormat="timetable") |
| BLF | blfread(f,Database=db) -> canSignalTimetable | blfread(f,Database=db) -> canFDMessageTimetable -> canSignalTimetable | blfread(f,Database=linDb,ProtocolMode="LIN") -> linMessageTimetable | blfread(f) |
| MDF/MF4/DAT | mdfRead -> canMessageTimetable(tt,db) -> canSignalTimetable | mdfRead -> canFDMessageTimetable(tt,db) -> canSignalTimetable | mdfRead -> linMessageTimetable(tt,linDb) | mdfRead -> timetable を直接取得 |
データベースの読み込み
db = canDatabase("path/to/file.dbc"); % CAN and CAN FD
db = arxmlDatabase("path/to/file.arxml"); % CAN only (not CAN FD)
linDb = linDatabase("path/to/file.ldf"); % LIN (R2025a+)
一度読み込んだら、すべてのデコード呼び出しに渡します。複数のデータベースを使用する場合:canMessageTimetable(tt, [db1, db2])。
DBC ファイルのデータベース検査と多重化方式の分類
DBC ファイルの場合のみ、ファイルに拡張または階層型の多重化を使用する多重化信号の定義が含まれているかどうかを判定します。
MATLAB R2026a 以前では、canDatabase オブジェクトから多重化方式を直接判定できません。そのため、fileread() を使用して DBC ファイルをテキストとして読み込み、未加工の DBC テキストを検査して多重化方式を分類します。
dbcText = fileread("path/to/file.dbc");
拡張多重化の指標を確認します。構文の全容については references/dbc-multiplexing-syntax.md を参照してください。見慣れない DBC 信号マーカーや SG_MUL_VAL_ エントリを解析する場合は、こちらを確認してください。
hasSgMulValEntries = ~isempty(regexp(dbcText, '^SG_MUL_VAL_\s+\d+', 'once', 'lineanchors'));
hasNestedMuxor = ~isempty(regexp(dbcText, 'SG_\s+\w+\s+m\d+M\s', 'once'));
hasExtendedMux = hasSgMulValEntries || hasNestedMuxor;
注:SG_MUL_VAL_ は、キーワード宣言として NS_(名前空間)セクションに現れる場合がありますが、これは拡張多重化を示すものではありません。行頭から始まり、その後に数値のメッセージ ID が続く実際のデータエントリのみを照合してください。
hasExtendedMux が true の場合は、SG_MUL_VAL_ エントリからメッセージ ID を解析して、影響を受ける具体的なメッセージを特定します。
sgMulValMsgIds = regexp(dbcText, '^SG_MUL_VAL_\s+(\d+)', 'tokens', 'lineanchors');
extendedMuxMsgIds = unique(cellfun(@(x) str2double(x{1}), sgMulValMsgIds));
R2026a 以前では、拡張多重化を使用するメッセージ(extendedMuxMsgIds で特定)を除外し、その旨をユーザーに伝えてください。
主な制約事項
- 多相戻り値: すべての VNT 読み込み関数(
canSignalImport、blfread、mdfRead、canMessageImport)は、チャネル数とパラメーターに応じて異なる型を返します。必ずiscell()/istimetable()/isstruct()でガードしてください。複数チャネルの結果を確認するときは、まずiscell()をガードとして使用し、セル配列(複数チャネル)と直接の timetable(単一チャネル)を分岐してから、{n}または{i}で反復処理または抽出します。 - ARXML と CAN FD: MATLAB では
arxmlDatabaseは CAN FD をサポートしていません。canFDMessageTimetableと併用することはできません。ユーザーが CAN FD データ用の ARXML ファイルを提供した場合は、ARXML は CAN FD をサポートしていないため、代わりに DBC ファイルとcanDatabaseを使用する必要があることを必ず説明してください。理由を説明せずに DBC に切り替えてはいけません。 - CAN(非 FD)用の ARXML: ユーザーが標準 CAN のデコード用に ARXML ファイルを提供した場合は、
arxmlDatabaseのみを使用してください。フォールバックとしてcanDatabaseも読み込んではいけません。ARXML データベースオブジェクトはcanMessageTimetableとcanSignalTimetableで同じように機能します。canDatabaseを使用するのは、ユーザーが DBC ファイルを提供した場合のみです。 canFDSignalTimetableは存在しません: この関数は存在しません。CAN と CAN FD の両方の信号にcanSignalTimetableを使用してください。- BLF の LIN には
ProtocolMode="LIN"が必要です: これを指定しないと、blfreadは CAN データのみを返します。 - 信号レベルの LIN デコードはありません: 存在するのは
linMessageTimetableのみです。信号値には timetable の列から直接アクセスしてください。 - MDF の未加工 CAN 検出: チャネル名のプレフィックス
CAN_DataFrame/LIN_Frame(ASAM 標準)を使用してください。SourceBusTypeまたはAcquisitionSourceTypeのメタデータは、フォールバックとしても絶対に使用しないでください。これらのフィールドはベンダー固有で信頼性がありません。 canMessageImportの既定の形式: レガシーのcan.Message配列を返します。必ずOutputFormat="timetable"を渡してください。- セルの抽出:
blfread、mdfRead、canMessageImportを複数チャネルで呼び出すと、セル配列が返されます。処理の前に{n}で抽出してください。 - ASC/TXT 信号には
canSignalImportを使用: 1 回の呼び出しでデコードできます。未加工のメッセージ timetable が必要な場合にのみcanMessageImportを使用してください。
ファイル別リファレンス
- ASC のインポート -- Vector および Kvaser ベンダーでの
canSignalImport/canMessageImportの使用方法、複数チャネルファイルにおける多相戻り値型の処理 - BLF のインポート -- ファイル検査に使用する
blfinfo、ChannelID の指定の有無によるblfread、CAN と LIN のプロトコル選択 - MDF のインポート --
mdfRead/mdfChannelGroupInfo/mdfChannelInfo、チャネル名による未加工 CAN/LIN グループの検出、特定のグループの読み込み
プロトコルのリファレンス
- CAN のデコード --
canMessageTimetableおよびcanSignalTimetableのパイプライン、DBC と ARXML データベースの使用方法 - CAN FD のデコード --
canFDMessageTimetableのパイプライン、ARXML が CAN FD で機能しない理由 - LIN のデコード --
linMessageTimetableの使用方法、タイムテーブル列から信号値にアクセスする方法(信号レベルの関数はありません) - データベースオブジェクト --
canDatabase、arxmlDatabase、linDatabaseの違い、および各デコード関数が受け付けるデータベースの種類
多重化解除のリファレンス
- シンプルな多重化解除 --
canDatabase、canMessageTimetable、canFDMessageTimetable、canSignalTimetableのパイプラインと信号の多重化解除
エクスポートのワークフロー
MDF への書き込み
mdfWrite を使用して、MATLAB のタイムテーブルデータを MDF/MF4 ファイルに書き込みます。
| タスク | 関数 | 備考 |
|---|---|---|
| 新しいファイルにタイムテーブルを書き込む | mdfWrite(file, tt) | チャネルグループを追加します。ファイルが存在しない場合は警告付きで作成されます |
| 既存のグループを上書きする | mdfWrite(file, tt, GroupNumber=N) | 事前に IncludeMetadata=true を指定して読み込む必要があります |
| ファイルのメタデータを設定する | mdfCreate(file, FileInfo=minfo) then mdfWrite() | サポート対象:Author、Department、Project、Subject、Comment |
| サポート対象外の型を変換する | references/mdf-writing.md を参照 | logical -> uint8()、categorical -> double()(カテゴリのインデックスを保存)、cell -> string()、datetime 列 -> posixtime() |
| 生の CAN フレームを書き込む | CAN_DataFrame.ID/DLC/DataLength/DataBytes の列名を使用(ASAM 標準) | 4 列すべてが必須です(ID、DLC、DataLength、DataBytes)。いずれかを省略すると、canMessageTimetable で再インポートできません。 |
| 生の LIN フレームを書き込む | LIN_Frame.ID/ReceivedDataByteCount/DataLength/DataBytes の列名を使用 | ASAM 標準の LIN フレーム名 |
datetime の RowTimes を処理する | 必須の手順: 書き込む前に .TimeZone = 'UTC' を設定します:tt.Properties.RowTimes.TimeZone = 'UTC'; | または duration に変換する方法もあります。どちらも機能します。これを省略すると、mdfWrite でエラーが発生するか、読み取り不能なタイムスタンプが生成されます。 |
BLF への書き込み
blfwrite を使用して、CAN および CAN FD のメッセージデータを BLF ファイルに書き込みます。
| タスク | 関数 | 備考 |
|---|---|---|
| CAN メッセージを書き込む | blfwrite(file, tt, chanID, 'CAN') | canMessageTimetable を使用して tt を整形してください。列を手動で作成しないでください |
| CAN FD メッセージを書き込む | blfwrite(file, tt, chanID, 'CAN FD') | canFDMessageTimetable を使用して tt を整形してください。最大 64 バイトのペイロードに対応します。ゼロから作成する際に必要な 13 列については、references/blf-writing.md を参照してください。 |
| CAN/CAN FD の混在 | 1 つの BLF ファイルで両方に対応しています | 呼び出しごとにプロトコル文字列を明示的に指定してください |
VNT の blfwrite は LIN に対応していません。LIN のロギングには MDF を使用してください。ユーザーから LIN データを BLF に書き込むよう求められた場合は、制約をただちに説明してください。制約を説明する前に、回避策や部分的な解決策を試みないでください。
ASC/TXT への書き込みには対応していません。 canMessageImport に対応する canMessageExport はありません。エクスポートには BLF または MDF を使用してください。
エクスポートのリファレンス
- MDF への書き込み --
mdfWrite/mdfCreate、型変換、ASAM CAN/LIN の命名規則、グループの上書き、メタデータの保持 - BLF への書き込み -- CAN/CAN FD での
blfwrite、canMessageTimetable/canFDMessageTimetableによる整形、チャネルコールバック
Copyright 2026 The MathWorks, Inc.