Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Translate NI-DAQmx C function signatures into correct calldaqlib MATLAB calls. Use when the user mentions calldaqlib, any DAQmx* C function name (DAQmxCfgSampClkTiming, DAQmxExportSignal, DAQmxSetStartTrigRetriggerable, DAQmxGetSampClkRate, etc.), or needs NI-DAQmx functionality not exposed by the daq object. Covers: projection rules (taskHandle implicit, output pointers become return values, buffer-size args, enum-as-string), multi-task semantics, start() clobber, device-level empty-daq workaro
.claude/skills/matlab-matlab-call-nidaqmx/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 23% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -3% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 9% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 87% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 104% | 0% |
Translate NI-DAQmx C signatures into correct calldaqlib MATLAB calls on Data Acquisition Toolbox R2026a+.
calldaqlib or a specific DAQmx* C functionexport signal, reference triggers, enhanced alias rejection, digital filters)
dq.Rate,addtrigger, addclock, addinput, read, write, start, stop)
DAQmxCreateTask or DAQmxLoadTask (these cannot work throughcalldaqlib — it owns task creation internally)
Did the user explicitly mention calldaqlib or a specific DAQmx C function?
daq object. They have a reason (driver debugging, matching C code, capability gap, learning). Skip to Step 2.
Can the daq object property/method do this? (dq.Rate, addtrigger, addclock, addinput, dq.NumScansAvailable, etc.)
driver-level diagnostics or a capability outside daq object coverage.
Does the C function lack a taskHandle parameter (device-level API)?
DAQmxGetDevIsSimulated, DAQmxGetDevAISupportedMeasTypes:Use an empty daq object (no channels added). Pass the device name as an argument. Returns a plain scalar or array, not a dictionary.
DAQmxCreateTask, DAQmxLoadTask: These do not workthrough calldaqlib at all (calldaqlib owns task creation internally).
DAQmxConnectTerms, DAQmxDisconnectTerms: Use an emptydaq object (same as device-level queries). These work on X-series devices.
Does the daq object have multiple internal task handles (e.g., AI + DIO)?
task warns. Read the dictionary key you care about. Acceptable.
separate daq objects (loses synchronized start/stop).
Is this a getter returning a string or array?
char *data, uInt32 bufferSize in C): Pass "" thenbufferSize. Example: calldaqlib(dq, "DAQmxGetSampClkSrc", "", 256)
int32 data[], uInt32 arraySize in C): Passzeros(1,N,'type') then N. Example: calldaqlib(dq, "DAQmxGetDevAISupportedMeasTypes", "Dev1", zeros(1,32,'int32'), 32)
Does any argument correspond to a C int32 enum slot?
"DAQmx_Val_RisingSlope" not int32(10280).Both work, but strings are self-documenting and prevent silent wrong-enum bugs.
references/enum-constants.md for the 15 most-used enum names.Six distinct patterns cover all calldaqlib usage:
matlabdq = daq("ni"); addinput(dq, "Dev1", "ai0", "Voltage"); calldaqlib(dq, "DAQmxCfgSampClkTiming", "/Dev1/PFI0", 5000, ... "DAQmx_Val_Rising", "DAQmx_Val_FiniteSamps", uint64(1000));
matlabcalldaqlib(dq, "DAQmxSetStartTrigRetriggerable", true);
matlabresult = calldaqlib(dq, "DAQmxGetSampClkRate"); rate = result("Dev1_ai0");
Returns a dictionary keyed by channel name — even on single-channel objects.
matlabresult = calldaqlib(dq, "DAQmxGetSampClkSrc", "", 256); source = result("Dev1_ai0");
The "" is required as a placeholder for the char *data output slot. bufferSize follows immediately. Use 256 for short names, 1024 for long paths.
matlabdEmpty = daq("ni"); result = calldaqlib(dEmpty, "DAQmxGetDevAISupportedMeasTypes", ... "Dev1", zeros(1, 32, "int32"), 32); measTypes = result(result ~= 0);
Pre-allocate a typed buffer (zeros(1,N,'int32')) matching the C signature's array type. Filter unused slots with result(result ~= 0).
matlabdEmpty = daq("ni"); isSim = calldaqlib(dEmpty, "DAQmxGetDevIsSimulated", "Dev1");
Use an empty daq (no channels added). Pass device name as argument. Returns a plain scalar (not a dictionary).
Also works for terminal routing on X-series devices:
matlabdEmpty = daq("ni"); calldaqlib(dEmpty, "DAQmxConnectTerms", "/Dev1/PFI0", "/Dev1/PFI1", "DAQmx_Val_DoNotInvertPolarity"); calldaqlib(dEmpty, "DAQmxDisconnectTerms", "/Dev1/PFI0", "/Dev1/PFI1");
| C argument | calldaqlib equivalent | |---|---| | TaskHandle taskHandle | Omit — daq object owns it | | const char source[] | MATLAB string "/Dev1/PFI0" | | float64 rate | MATLAB double | | int32 activeEdge (enum) | Enum name string "DAQmx_Val_Rising" | | uInt64 sampsPerChan | uint64(1000) | | bool32 data (input) | true / false | | float64 *data (output scalar) | Becomes return value (dictionary) | | int32 *data (output scalar) | Becomes return value (dictionary) | | char *data, uInt32 bufferSize (output pair) | Pass "" + bufferSize | | int32 data[], uInt32 arraySize (output array) | Pass zeros(1,N,'int32') + N | | Any getter return | Always a dictionary keyed by DevN_chanName |
NI tasks; both get the call. For getters with a channel arg, ignore the warning from the irrelevant task and read the dictionary key you want. For setters targeting one measurement type, split into separate daq objects.
getters: pass "" before bufferSize. Array getters: pass zeros(1,N,'type') before arraySize.
start()reapplies dq.Rate to the driver. If you set rate via DAQmxCfgSampClkTiming then call start(), it snaps back to dq.Rate. Fix: set dq.Rate first, use calldaqlib only for parameters the daq object does not track. Alternative: use DAQmxStartTask/DAQmxStopTask via calldaqlib to bypass the daq object's commit pass entirely.
"DAQmx_Val_RisingSlope" notint32(10280). Strings are readable and prevent wrong-enum bugs. The error on a bad string is misleading ("Value must be of type int32") — it means the string wasn't recognized, not that you should pass an int.
no taskHandle (like DAQmxGetDevIsSimulated, DAQmxGetDevAISupportedMeasTypes) work only when the daq object has no channels. Create dEmpty = daq("ni") and pass the device name as an arg.
DAQmxCreateTask and DAQmxLoadTask cannot work through calldaqlib.These functions create a new task — calldaqlib already owns task creation internally. DAQmxConnectTerms/DAQmxDisconnectTerms DO work via an empty daq object on X-series devices (same pattern as device-level queries).
expected errors. To set the same property on multiple channels, loop.
produces no error until start().
types. Error -200077 lists the supported enum values — read it.
dictionary. Keyed byDevN_chanName. Never expect a bare scalar. Use result("Dev1_ai0") or iterate keys(result).
includes "Required Buffer Size in Bytes: N" — parse it and retry with N. Heuristic: 256 for short names, 1024 for long paths/channel lists.
zeros with result(result ~= 0).
dq.Rate before using calldaqlib for timing config"" before bufferSize for string gettersDAQmx_Val_FiniteSamps — it does not work with ContSampsDAQmxGetSampClkRate) not generic attribute getters (DAQmxGetTimingAttribute)references/hot-signatures.md — 20 most-used calldaqlib signatures by categoryreferences/enum-constants.md — 15 DAQmx_Val_ enum name stringsreferences/common-mistakes.md — Mistakes from discovery trials and customer usageCopyright 2026 The MathWorks, Inc.
Other measured skills in the registry, with their headline benchmark lift.