mcpField
M
matlab-call-nidaqmx

matlab-call-nidaqmx

github.com/matlab開発1.2k57 回インストール1 日前に更新
リポジトリ

matlab-call-nidaqmx について

Data Acquisition Toolbox R2026a+ で、NI-DAQmx の C 関数シグネチャを `calldaqlib` 呼び出しに変換する MATLAB スキルです。呼び出し形式、引数の対応付け、タスクハンドルや辞書形式の戻り値などの制約を説明します。

主な機能

  1. 01C の引数を MATLAB 呼び出しに対応付け
  2. 02六つの `calldaqlib` 呼び出し形式を網羅
  3. 03ゲッターのバッファーと戻り値を説明
  4. 04デバイス単位と複数タスクの制約を記載

活用シーン

  1. 01NI-DAQmx の C コードを MATLAB に変換
  2. 02daq オブジェクトで扱えない DAQmx 関数の呼び出し
  3. 03NI ドライバーレベルの設定の確認や変更

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/matlab/matlab-agentic-toolkit --skill matlab-call-nidaqmx

インストール後、Claude Code で/matlab-call-nidaqmxを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

manifest.yaml
references/
common-mistakes.md
enum-constants.md
hot-signatures.md

詳細

matlab-call-nidaqmx

NI-DAQmx C シグネチャを、Data Acquisition Toolbox R2026a 以降で正しい calldaqlib MATLAB 呼び出しに変換します。

使用する場合

  • ユーザーが calldaqlib または特定の DAQmx* C 関数に明示的に言及している
  • daq オブジェクトでは公開されていない NI-DAQmx の機能が必要(再トリガ可能、エクスポート信号、リファレンストリガー、エイリアス除去の強化、デジタルフィルター)
  • ドライバーレベルでデバッグしている(NI ドライバーが保持している値の読み取り)
  • 既存の C/LabVIEW コードを MATLAB に変換している

使用しない場合

  • ユーザーが daq オブジェクトだけで実現できる機能について説明している(dq.Rate、 addtrigger、addclock、addinput、read、write、start、stop)
  • ユーザーが Session ベースの(レガシー)DAQ インターフェイスについて質問している
  • DAQmxCreateTask または DAQmxLoadTask が必要(これらは calldaqlib 経由では動作しません。タスクの作成は内部で管理されます)

判断フロー

ステップ 0 — ユーザーの意図を読み取る

ユーザーは calldaqlib または特定の DAQmx C 関数に明示的に言及していますか?

  • はい — 要求された calldaqlib 呼び出しを記述します。daq オブジェクトに誘導してはいけません。ユーザーには理由があります(ドライバーデバッグ、C コードとの照合、機能上の制約、学習)。ステップ 2 に進みます。
  • いいえ — calldaqlib の名前を挙げずに機能について説明しています。ステップ 1 に進みます。
ステップ 1 — 適切なツールを選ぶ

daq オブジェクトのプロパティやメソッドで対応できますか?(dq.Rate、addtrigger、 addclock、addinput、dq.NumScansAvailable など)

  • はい — daq オブジェクトを推奨します。ドライバーレベルの診断や、daq オブジェクトでカバーされない機能が必要な場合に限り、calldaqlib に言及します。
  • いいえ — ステップ 2 に進みます。
ステップ 2 — デバイスレベルの確認

C 関数に taskHandle パラメーターがありませんか(デバイスレベル API)?

  • DAQmxGetDevIsSimulated、DAQmxGetDevAISupportedMeasTypes のような関数: 空の daq オブジェクト(チャンネルを追加していない状態)を使用します。デバイス名を引数として渡します。辞書ではなく、通常のスカラーまたは配列を返します。
  • DAQmxCreateTask、DAQmxLoadTask のような関数:これらは calldaqlib 経由ではまったく動作しません(タスクの作成は内部で管理されます)。
  • DAQmxConnectTerms、DAQmxDisconnectTerms のような関数:空の daq オブジェクト(デバイスレベルのクエリと同じ)を使用します。これらは X シリーズデバイスで動作します。
ステップ 3 — 複数タスクの確認

daq オブジェクトに複数の内部タスクハンドルがありますか(例:AI + DIO)?

  • ゲッターとチャンネル引数:呼び出しは両方のタスクで実行されます。関係のないタスクでは警告が出ます。必要な辞書キーを読み取ります。許容されます。
  • 特定の測定タイプを対象とするセッター:スコープを指定する仕組みはありません。別々の daq オブジェクトに分けます(同期した開始/停止はできなくなります)。
ステップ 4 — バッファープレースホルダーの確認

文字列または配列を返すゲッターですか?

  • 文字列ゲッター(C では char *data, uInt32 bufferSize):"" の後に bufferSize を渡します。例:calldaqlib(dq, "DAQmxGetSampClkSrc", "", 256)
  • 配列ゲッター(C では int32 data[], uInt32 arraySize):zeros(1,N,'type') の後に N を渡します。例: calldaqlib(dq, "DAQmxGetDevAISupportedMeasTypes", "Dev1", zeros(1,32,'int32'), 32)
ステップ 5 — 列挙型の確認

引数のいずれかが C の int32 列挙型スロットに対応しますか?

  • 必ず文字列形式を使用します:int32(10280) ではなく "DAQmx_Val_RisingSlope" を使用します。どちらも動作しますが、文字列は内容が明確で、誤った列挙値による気づきにくいバグを防げます。
  • よく使われる列挙型名 15 個については references/enum-constants.md を参照してください。

呼び出し形式

6 つの異なるパターンですべての calldaqlib の使用方法を網羅します。

1. 設定(DAQmxCfg*)
dq = daq("ni");
addinput(dq, "Dev1", "ai0", "Voltage");
calldaqlib(dq, "DAQmxCfgSampClkTiming", "/Dev1/PFI0", 5000, ...
    "DAQmx_Val_Rising", "DAQmx_Val_FiniteSamps", uint64(1000));
2. セッター(DAQmxSet*)
calldaqlib(dq, "DAQmxSetStartTrigRetriggerable", true);
3. ゲッター — スカラー(数値を返す DAQmxGet*)
result = calldaqlib(dq, "DAQmxGetSampClkRate");
rate = result("Dev1_ai0");

単一チャンネルのオブジェクトでも、チャンネル名をキーとする dictionary を返します。

4. ゲッター — 文字列(文字列出力を伴う DAQmxGet*)
result = calldaqlib(dq, "DAQmxGetSampClkSrc", "", 256);
source = result("Dev1_ai0");

"" は、char *data 出力スロットのプレースホルダーとして必須です。 bufferSize はその直後に指定します。短い名前には 256、長いパスには 1024 を使用します。

5. Getter — array(型付き配列出力を使用する DAQmxGet*)
dEmpty = daq("ni");
result = calldaqlib(dEmpty, "DAQmxGetDevAISupportedMeasTypes", ...
    "Dev1", zeros(1, 32, "int32"), 32);
measTypes = result(result ~= 0);

C シグネチャの配列型に合わせて、型付きバッファ(zeros(1,N,'int32'))を事前に割り当てます。未使用の要素は result(result ~= 0) でフィルターします。

6. デバイスレベル(C シグネチャに taskHandle がない)
dEmpty = daq("ni");
isSim = calldaqlib(dEmpty, "DAQmxGetDevIsSimulated", "Dev1");

チャンネルを追加していない空の daq を使用します。引数としてデバイス名を渡します。 通常のスカラーを返します(辞書ではありません)。

X シリーズデバイスの端子ルーティングにも使用できます。

dEmpty = daq("ni");
calldaqlib(dEmpty, "DAQmxConnectTerms", "/Dev1/PFI0", "/Dev1/PFI1", "DAQmx_Val_DoNotInvertPolarity");
calldaqlib(dEmpty, "DAQmxDisconnectTerms", "/Dev1/PFI0", "/Dev1/PFI1");

C から calldaqlib への変換

C の引数calldaqlib での相当するもの
TaskHandle taskHandle省略 — daq オブジェクトが所有します
const char source[]MATLAB 文字列 "/Dev1/PFI0"
float64 rateMATLAB の double
int32 activeEdge(enum)Enum 名の文字列 "DAQmx_Val_Rising"
uInt64 sampsPerChanuint64(1000)
bool32 data(入力)true / false
float64 *data(出力スカラー)戻り値になります(辞書)
int32 *data(出力スカラー)戻り値になります(辞書)
char *data, uInt32 bufferSize(出力ペア)"" + bufferSize を渡します
int32 data[], uInt32 arraySize(出力配列)zeros(1,N,'int32') + N を渡します
getter の戻り値全般常に DevN_chanName をキーとする dictionary

厳守事項

  1. taskHandle は暗黙的です。 daq オブジェクトが所有します。決して渡さないでください。

  2. calldaqlib はすべての内部タスクに対してループします。 AI + DIO を含む daq には NI タスクが 2 つあり、両方で呼び出しが行われます。チャンネル引数を取る getter では、関係のないタスクからの警告を無視し、必要な辞書キーを読み取ってください。1 つの測定タイプを対象とする setter は、別々の daq オブジェクトに分けてください。

  3. 出力ポインター引数にはプレースホルダーと bufferSize が必要です。 文字列 getter では、bufferSize の前に "" を渡します。配列 getter では、arraySize の前に zeros(1,N,'type') を渡します。

  4. start() は calldaqlib で設定したレートとクロックソースを上書きします。 start() は dq.Rate をドライバーに再適用します。DAQmxCfgSampClkTiming でレートを設定してから start() を呼び出すと、dq.Rate の値に戻ります。対処法:最初に dq.Rate を設定し、daq オブジェクトが管理しないパラメーターにだけ calldaqlib を使用します。別の方法として、calldaqlib 経由で DAQmxStartTask/DAQmxStopTask を使用すると、daq オブジェクトのコミット処理全体を迂回できます。

  5. Enum 定数には文字列形式を使用します。 int32(10280) ではなく "DAQmx_Val_RisingSlope" を使用します。文字列は読みやすく、誤った enum による不具合を防ぎます。不正な文字列に対するエラーは誤解を招くメッセージ("Value must be of type int32")ですが、これは文字列が認識されなかったという意味であり、int を渡すべきという意味ではありません。

  6. デバイスレベルの API には空の daq が必要です。 C シグネチャに taskHandle がない関数(DAQmxGetDevIsSimulated、DAQmxGetDevAISupportedMeasTypes など)は、daq オブジェクトにチャンネルがない場合にのみ動作します。dEmpty = daq("ni") を作成し、引数としてデバイス名を渡してください。

  7. DAQmxCreateTask と DAQmxLoadTask は calldaqlib 経由では動作しません。 これらの関数は新しいタスクを作成しますが、calldaqlib は内部ですでにタスクの作成を管理しています。X シリーズデバイスでは、空の daq オブジェクトを使えば DAQmxConnectTerms/DAQmxDisconnectTerms は動作します(デバイスレベルのクエリと同じ方法です)。

  8. プロパティ値はスカラーです。 スカラーが想定されている場所にベクトルを渡すとエラーになります。同じプロパティを複数のチャンネルに設定するには、ループを使用してください。

  9. チャンネル/デバイスのパスはクライアント側で検証されません。 不正なパスを指定しても、start() を呼び出すまでエラーになりません。

  10. トリガーのサポートはデバイスごとに異なります。 すべてのデバイスがすべてのトリガータイプをサポートしているわけではありません。エラー -200077 にサポートされている enum 値が列挙されるので、確認してください。

  11. タスクレベルの getter の結果はすべて dictionary として返されます。 キーは DevN_chanName です。スカラーが直接返されるとは想定しないでください。result("Dev1_ai0") を使用するか、keys(result) を反復処理してください。

  12. バッファーサイズが小さすぎると NI エラー -200228 が返されます。 エラーメッセージには "Required Buffer Size in Bytes: N" が含まれるので、N を解析して再試行してください。目安:短い名前には 256、長いパスやチャンネルリストには 1024 を使用します。

  13. 配列 getter は固定サイズのバッファーを返します。 末尾の未使用のゼロは result(result ~= 0) でフィルターしてください。

規約

  • calldaqlib を使用してタイミングを設定する前に、必ず dq.Rate を設定します
  • 生の整数値ではなく、必ず列挙型の名前文字列を使用します
  • タスクレベルのゲッターは、必ず辞書を返すものとして扱います
  • 文字列ゲッターでは、bufferSize の前に必ず "" を渡します
  • 配列ゲッターでは、型付きバッファーを必ず事前に割り当てます
  • デバイスレベルのクエリには、空の daq(チャネルなし)を使用します
  • コードブロックの前の文章で、複数タスクのセマンティクスについて注意を促します
  • 再トリガー可能モードを有効にする前に、トリガータイプを設定します
  • 再トリガー可能モードには DAQmx_Val_FiniteSamps が必要です。ContSamps では動作しません
  • 汎用属性ゲッター(DAQmxGetTimingAttribute)ではなく、具体的なゲッター関数名(DAQmxGetSampClkRate)を使用します

参考資料

  • references/hot-signatures.md — カテゴリー別にまとめた、最もよく使用される calldaqlib のシグネチャ 20 件
  • references/enum-constants.md — 15 個の DAQmx_Val_* 列挙型の名前文字列
  • references/common-mistakes.md — 検証時の試行と顧客による使用から判明した間違い

Copyright 2026 The MathWorks, Inc.


コメント