matlab-call-nidaqmx について
Data Acquisition Toolbox R2026a+ で、NI-DAQmx の C 関数シグネチャを `calldaqlib` 呼び出しに変換する MATLAB スキルです。呼び出し形式、引数の対応付け、タスクハンドルや辞書形式の戻り値などの制約を説明します。
主な機能
- 01C の引数を MATLAB 呼び出しに対応付け
- 02六つの `calldaqlib` 呼び出し形式を網羅
- 03ゲッターのバッファーと戻り値を説明
- 04デバイス単位と複数タスクの制約を記載
活用シーン
- 01NI-DAQmx の C コードを MATLAB に変換
- 02daq オブジェクトで扱えない DAQmx 関数の呼び出し
- 03NI ドライバーレベルの設定の確認や変更
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ matlab/ matlab-agentic-toolkit --skill matlab-call-nidaqmxインストール後、Claude Code で/matlab-call-nidaqmxを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
manifest.yamlreferences/common-mistakes.mdenum-constants.mdhot-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 rate | MATLAB の double |
int32 activeEdge(enum) | Enum 名の文字列 "DAQmx_Val_Rising" |
uInt64 sampsPerChan | uint64(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 |
厳守事項
-
taskHandle は暗黙的です。 daq オブジェクトが所有します。決して渡さないでください。
-
calldaqlib はすべての内部タスクに対してループします。 AI + DIO を含む daq には NI タスクが 2 つあり、両方で呼び出しが行われます。チャンネル引数を取る getter では、関係のないタスクからの警告を無視し、必要な辞書キーを読み取ってください。1 つの測定タイプを対象とする setter は、別々の daq オブジェクトに分けてください。
-
出力ポインター引数にはプレースホルダーと bufferSize が必要です。 文字列 getter では、bufferSize の前に
""を渡します。配列 getter では、arraySize の前にzeros(1,N,'type')を渡します。 -
start() は calldaqlib で設定したレートとクロックソースを上書きします。
start()はdq.Rateをドライバーに再適用します。DAQmxCfgSampClkTimingでレートを設定してからstart()を呼び出すと、dq.Rateの値に戻ります。対処法:最初にdq.Rateを設定し、daq オブジェクトが管理しないパラメーターにだけ calldaqlib を使用します。別の方法として、calldaqlib 経由でDAQmxStartTask/DAQmxStopTaskを使用すると、daq オブジェクトのコミット処理全体を迂回できます。 -
Enum 定数には文字列形式を使用します。
int32(10280)ではなく"DAQmx_Val_RisingSlope"を使用します。文字列は読みやすく、誤った enum による不具合を防ぎます。不正な文字列に対するエラーは誤解を招くメッセージ("Value must be of type int32")ですが、これは文字列が認識されなかったという意味であり、int を渡すべきという意味ではありません。 -
デバイスレベルの API には空の daq が必要です。 C シグネチャに
taskHandleがない関数(DAQmxGetDevIsSimulated、DAQmxGetDevAISupportedMeasTypesなど)は、daq オブジェクトにチャンネルがない場合にのみ動作します。dEmpty = daq("ni")を作成し、引数としてデバイス名を渡してください。 -
DAQmxCreateTaskとDAQmxLoadTaskは calldaqlib 経由では動作しません。 これらの関数は新しいタスクを作成しますが、calldaqlib は内部ですでにタスクの作成を管理しています。X シリーズデバイスでは、空の daq オブジェクトを使えばDAQmxConnectTerms/DAQmxDisconnectTermsは動作します(デバイスレベルのクエリと同じ方法です)。 -
プロパティ値はスカラーです。 スカラーが想定されている場所にベクトルを渡すとエラーになります。同じプロパティを複数のチャンネルに設定するには、ループを使用してください。
-
チャンネル/デバイスのパスはクライアント側で検証されません。 不正なパスを指定しても、
start()を呼び出すまでエラーになりません。 -
トリガーのサポートはデバイスごとに異なります。 すべてのデバイスがすべてのトリガータイプをサポートしているわけではありません。エラー -200077 にサポートされている enum 値が列挙されるので、確認してください。
-
タスクレベルの getter の結果はすべて
dictionaryとして返されます。 キーはDevN_chanNameです。スカラーが直接返されるとは想定しないでください。result("Dev1_ai0")を使用するか、keys(result)を反復処理してください。 -
バッファーサイズが小さすぎると NI エラー -200228 が返されます。 エラーメッセージには "Required Buffer Size in Bytes: N" が含まれるので、N を解析して再試行してください。目安:短い名前には 256、長いパスやチャンネルリストには 1024 を使用します。
-
配列 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.