mcpField
M
matlab-import-export-vehicle-data

matlab-import-export-vehicle-data

github.com/matlabデータ・データベース1.2k42 回インストール1 日前に更新
リポジトリ

matlab-import-export-vehicle-data について

Vehicle Network ToolboxとMDF関数を使い、MATLABで車両ネットワークログをインポート、デコード、エクスポートするスキルです。MATLABのバージョン制約を踏まえ、形式別のCAN、CAN FD、LIN処理やデータベースによるデコードを案内します。

主な機能

  1. 01MDF、MF4、DAT、BLF、ASC、TXTログの読み込み
  2. 02CAN、CAN FD、LINデータのデコード
  3. 03DBC、ARXML、LDFデータベースの利用
  4. 04多相的な読み込み結果の処理
  5. 05timetableのMDF出力とCANデータのBLF出力

活用シーン

  1. 01DBCで記録済みCAN信号をデコードする
  2. 02BLFまたはMDFファイルからLINデータを読む
  3. 03MATLABのtimetableをMDFに出力する
  4. 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.yaml
references/
asc-import.md
blf-import.md
blf-writing.md
can-decode.md
canfd-decode.md
database-objects.md
dbc-multiplexing-syntax.md
lin-decode.md
mdf-import.md
mdf-writing.md
simple-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 は多重化をネイティブにサポートしていません。デコードされた信号に、以下で説明する信号分離の変更を適用してください。

デコードのパイプライン

ソース形式CANCAN FDLINRaw(デコードなし)
ASCcanSignalImport(f,"Vector",db)同左--canMessageImport(f,"Vector",OutputFormat="timetable")
TXTcanSignalImport(f,"Kvaser",db)同左--canMessageImport(f,"Kvaser",OutputFormat="timetable")
BLFblfread(f,Database=db) -> canSignalTimetableblfread(f,Database=db) -> canFDMessageTimetable -> canSignalTimetableblfread(f,Database=linDb,ProtocolMode="LIN") -> linMessageTimetableblfread(f)
MDF/MF4/DATmdfRead -> canMessageTimetable(tt,db) -> canSignalTimetablemdfRead -> canFDMessageTimetable(tt,db) -> canSignalTimetablemdfRead -> 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.

コメント