Matlab Modernize Daq
MathWorksOfficialCreated by MathWorks
- Skill
- Tool integration
- Science and research
- BSD-2-Clause
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured procedure for porting legacy session-based MATLAB DAQ code to the modern DataAcquisition interface introduced in R2020a. It addresses common pitfalls such as the removal of wait(d), the replacement of DataAvailable listeners with ScansAvailableFcn, and the transition from queueOutputData to preload and write. The skill includes verified patterns for triggers, callbacks, and continuous acquisition, ensuring that users can modernize their scripts while avoiding silent failures and common runtime errors.
What it does
- Maps legacy session-API tokens to modern DataAcquisition interface equivalents.
- Provides verified code patterns for triggers, clocks, and callback-driven streaming.
- Guides the implementation of state-sharing patterns for callbacks using nested functions or handle classes.
- Replaces deprecated lifecycle methods like wait(d) with modern polling or duration-based start commands.
- Includes a verification script to detect silent gaps and common errors in modernized DAQ code.
- Offers guidance on handling errors within callbacks using ErrorOccurredFcn.
When to use it
- When migrating legacy DAQ scripts that use daq.createSession or addAnalogInputChannel.
- When a script fails with errors related to deprecated functions like wait or DataAvailable.
- When writing new, complex DAQ scripts involving continuous acquisition or analog output.
- When replacing legacy listeners with modern ScansAvailableFcn or ScansRequiredFcn callbacks.
Advantages
- Reduces runtime errors by replacing deprecated and discouraged API calls.
- Prevents silent failures in callbacks by implementing proper error handling.
- Ensures waveform continuity in continuous output tasks through correct preload and write patterns.
- Provides a clear, verified path for modernizing complex multi-feature DAQ workflows.
Usage examples
- “How do I update my legacy DAQ script that uses addAnalogInputChannel and startBackground?”
- The agent will guide you through mapping these to the modern addinput and start commands, while also updating your callback structure to use ScansAvailableFcn.
- “My DAQ script errors with 'Undefined function wait' on R2024a. How do I fix it?”
- The agent will explain that wait(d) is removed and provide the modern alternative using a while loop polling the d.Running property.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/matlab/matlab-modernize-daq/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip matlab-modernize-daq.zip -d .agents/skills
Documentation by MathWorks
Port DAQ Code to the Modern DataAcquisition Interface
Translate legacy session-based Data Acquisition Toolbox code (daq.createSession, addAnalogInputChannel, DataAvailable listeners, startBackground, queueOutputData, wait) to the modern DataAcquisition interface introduced in R2020a (daq("ni"), addinput, ScansAvailableFcn, start, write, preload). Also covers writing new multi-feature DAQ scripts where the modern API patterns are easy to get wrong under cognitive load.
When to Use
Porting an existing script that calls
daq.createSession,addAnalogInputChannel,addAnalogOutputChannel,addCounterInputChannel,addCounterOutputChannel, oraddDigitalChannel.Replacing
DataAvailable/DataRequired/ErrorOccurredlisteners withScansAvailableFcn/ScansRequiredFcn/ErrorOccurredFcn.Replacing
startBackground/startForeground/s.wait()lifecycle calls.Replacing
queueOutputDatawithpreload+write.Writing a new DAQ script that combines two or more of: external triggers, continuous acquisition, callback-driven streaming, analog output with refill, or cross-callback state.
Debugging errors like
Undefined function 'wait' for input arguments of type 'daq.interfaces.DataAcquisition'orUnrecognized method, property, or field 'Data' for class 'matlabshared.asyncio.buffer.ElementsAvailableInfo'.
When NOT to Use
Single-channel foreground acquisition with no trigger and no callbacks (e.g. "acquire 1 s of voltage from ai0 at 10 kHz and plot"). The modern API is straightforward at this scale and this skill would be unnecessary overhead.
Picking a DAQ vendor or evaluating non-NI hardware. This skill's evidence base is NI.
Signal processing or analysis of already-acquired data (filtering, spectral analysis, etc.). This skill only covers acquiring and generating data through the DataAcquisition interface, not post-processing it.
Simulink, App Designer, or real-time-target DAQ workflows.
Modernizing
matlab.unittesttest suites or framework-style test classes (parameterized fixtures,assumeTruegating, arity-contract tests, helper-class hierarchies). The API substitutions in this skill apply, but the test-harness scaffolding (parent-class stripping, fixture redesign, retiring tests that target removed contracts) is out of scope. Use this skill to translate the API calls inside test bodies, then make the harness-level judgment calls separately.
Workflow
When porting a session-based script or composing a new multi-feature DAQ script, follow this order. Verify after every step — most failure modes in this domain are silent.
Inventory the legacy script (porting only). Identify: device(s), channel types, rate, continuous vs finite, trigger/clock connections, callbacks (
DataAvailable/DataRequired/ErrorOccurred), state shared across callbacks, output queueing.Translate vocabulary. Map every session-API token to its modern counterpart. Consult
references/session-to-modern-mapping.md— load it whenever a session-API token appears in the legacy script. Common silent-rename traps:NotifyWhenDataAvailableExceeds→ScansAvailableFcnCount,NumberOfScans/NumScans→ implicit (no equivalent argument),ExternalTriggerTimeout→DigitalTriggerTimeout,IsContinuous=true→start(d, "Continuous")argument.Build the DataAcquisition object.
d = daq("ni"), setd.Rate, add channels withaddinput/addoutput. Apply per-channel properties via the channel handle returned byaddinput/addoutput.Wire triggers and clocks. Use
references/canonical-snippets.md§1 — load it when the script involvesaddtriggeroraddclock. Argument order is(d, type, role, trigSrc, trigDest)— Source is 4th, Destination is 5th. Verify: the returned trigger object'sSourceandDestinationfields show what you intended.Wire callbacks. Use canonical snippets §2 — load it when the script needs
ScansAvailableFcnorScansRequiredFcn. Inside the callback, always pull data viaread(src, src.ScansAvailableFcnCount, "OutputFormat", "Matrix")— theevtargument ismatlabshared.asyncio.buffer.ElementsAvailableInfoand exposes onlyNumElementsAvailable, noData, noTimeStamps. Strongly recommend wiringd.ErrorOccurredFcn = @(~,evt) fprintf("DAQ error: %s\n", evt.Error.message)— without it, exceptions inside other callbacks are silently swallowed and the run "succeeds" while every fire throws. For strict ports where the legacy script had noErrorOccurredlistener, surface this trade-off to the user instead of silently adding the handler — let them opt in.Pick a state-sharing pattern (callbacks only). If a callback needs to maintain state across fires (running counters, phase accumulator, latch flags), see
references/callback-state-patterns.md— load it any time a callback maintains state. Default: handle-class wrapper or nested function. Avoidsrc.UserData.X = src.UserData.X + ...field-mutation; it does not persist.Wire the lifecycle. Use canonical snippets §3 — load it when blocking on completion. There is no
wait(d)method on the modern object. For finite acquisitions, preferstart(d, "Duration", seconds(N))thenreador aRunningpoll. For continuous, set a stop condition inside the callback (if scansRead >= target; stop(src); end) and polld.Runningfrom the caller.Run
verifyDataAcquisitionbefore live execution. Script:scripts/verifyDataAcquisition.m. Catches the four highest-frequency silent gaps (missingErrorOccurredFcn,evt.Datain callback source,wait(d)token,UserData.X = UserData.X + ...field mutation) by inspecting the live object and grepping the source file. Run viamcp__matlab__run_matlab_fileif available, or copy into the user's project.Live verification. Run a short version (e.g. 1–2 s instead of the user's full duration). Check that the script reaches
startcleanly, that the callback fires at least once, and that no errors print fromErrorOccurredFcn. Usemcp__matlab__run_matlab_fileagainst a saved.mfile, notmcp__matlab__evaluate_matlab_code— the eval-string buffer runs in script mode and rejects local/nested function definitions, which Pattern 5 and most callback bodies require.
Key Functions
| Function | Purpose | Toolbox | Available From |
|---|---|---|---|
daq | Create a DataAcquisition object (d = daq("ni")) | Data Acquisition Toolbox | R2020a |
addinput | Add input channel (analog, counter, or digital) | Data Acquisition Toolbox | R2020a |
addoutput | Add output channel | Data Acquisition Toolbox | R2020a |
addtrigger | Add trigger connection: addtrigger(d, type, role, trigSrc, trigDest) | Data Acquisition Toolbox | R2020a |
addclock | Add clock connection (similar signature) | Data Acquisition Toolbox | R2020a |
read | Foreground acquire OR pull data inside ScansAvailableFcn | Data Acquisition Toolbox | R2020a |
write | Write output samples (also from inside ScansRequiredFcn) | Data Acquisition Toolbox | R2020a |
preload | Load initial output buffer before start(d, "Continuous"). Output channels only. | Data Acquisition Toolbox | R2020a |
start | Begin background acquisition: start(d), start(d, "Continuous"), start(d, "Duration", seconds(N)) | Data Acquisition Toolbox | R2020a |
stop | Stop a running acquisition | Data Acquisition Toolbox | R2020a |
flush | Discard buffered scans before reading | Data Acquisition Toolbox | R2020a |
daqlist | Enumerate available devices (replaces daq.getDevices) | Data Acquisition Toolbox | R2020a |
daqreset | Reset DAQ subsystem (replaces daq.reset) | Data Acquisition Toolbox | R2020a |
Properties on DataAcquisition: Rate, Running, NumScansAcquired, NumScansOutputByHardware, ScansAvailableFcn, ScansAvailableFcnCount, ScansRequiredFcn, ScansRequiredFcnCount, ErrorOccurredFcn, DigitalTriggerTimeout, UserData.
Patterns
The five canonical patterns below appear in full, with verified code, in references/canonical-snippets.md. Inline below is the minimal recall snippet for each — enough to anchor the agent's memory under load. Load the reference for the full, runnable forms.
Pattern 1: Add an external start trigger
trg = addtrigger(d, "Digital", "StartTrigger", "External", "Dev1/PFI0");
trg.Condition = "RisingEdge";
d.DigitalTriggerTimeout = 30;The 4th argument is the Source ("External" for an external signal). The 5th is the Destination (the device terminal). Reversing them is the most-frequent error in this domain. The trigger condition ("RisingEdge", "FallingEdge") is set on the trigger object returned by addtrigger (trg.Condition), not on the DataAcquisition object. There is no d.DigitalTriggerCondition property — inventing one passes static lint but errors at runtime.
Pattern 2: ScansAvailableFcn body — pull data via read, never evt.Data
d.ScansAvailableFcnCount = round(d.Rate * 0.5);
d.ScansAvailableFcn = @(src, ~) onBlock(src);
d.ErrorOccurredFcn = @(~, evt) fprintf("DAQ error: %s\n", evt.Error.message);
function onBlock(src)
[data, t] = read(src, src.ScansAvailableFcnCount, "OutputFormat", "Matrix");
plot(t, data); drawnow limitrate;
endThe evt argument carries only NumElementsAvailable; it has no Data or TimeStamps. Wiring ErrorOccurredFcn is strongly recommended — without it, callback exceptions are silently swallowed and the run "succeeds" while every fire throws. For strict ports of legacy scripts that did not have an ErrorOccurred listener, ask the user before adding one rather than inserting it silently.
Pattern 3: Block until acquisition completes — there is no wait(d)
start(d, "Duration", seconds(10));
while d.Running
pause(0.05);
endwait(d) does not exist on daq.interfaces.DataAcquisition. Poll d.Running, or rely on start(d, "Duration", ...) + a stop condition inside the callback.
Pattern 4: Continuous AO playback with auto-refill
d = daq("ni");
d.Rate = 1000;
addoutput(d, "Dev1", "ao0", "Voltage");
d.ScansRequiredFcnCount = d.Rate;
d.ScansRequiredFcn = @(src, ~) write(src, generateNextBlock());
preload(d, generateNextBlock());
preload(d, generateNextBlock());
start(d, "Continuous");preload is output-only — calling it on input-only setups errors. Two preloaded blocks before start give the buffer headroom for the first ScansRequiredFcn to fire.
Pattern 5: Cross-callback state via nested function or handle class
function runStreamingAcquisition()
d = daq("ni");
addinput(d, "Dev1", "ai0", "Voltage");
d.Rate = 1000;
d.ScansAvailableFcnCount = 200;
scansRead = 0;
target = d.Rate * 5;
d.ScansAvailableFcn = @(src, ~) onBlock(src);
d.ErrorOccurredFcn = @(~, evt) fprintf("DAQ error: %s\n", evt.Error.message);
start(d, "Continuous");
while d.Running
pause(0.05);
end
function onBlock(src)
data = read(src, src.ScansAvailableFcnCount, "OutputFormat", "Matrix");
scansRead = scansRead + size(data, 1);
if scansRead >= target
stop(src);
end
end
endNested function captures scansRead by reference, so updates persist across fires. Do not use src.UserData.X = src.UserData.X + ... — that pattern does not persist; counters reset every fire and closed-loop control silently outputs zero forever. Full alternatives (handle class, full UserData rewrite) and their tradeoffs are in references/callback-state-patterns.md.
Conventions
Strongly recommend wiring
d.ErrorOccurredFcnwhenever any other*Fcncallback is set, since the listener swallows callback exceptions otherwise. For strict ports of legacy scripts that lacked anErrorOccurredlistener, surface the trade-off to the user rather than silently adding the handler — adding it is a defensible default but fidelity to the source is also defensible.Always pull data via
read(src, src.ScansAvailableFcnCount, "OutputFormat", "Matrix")insideScansAvailableFcn. Never reach forevt.Dataorevt.TimeStamps.Always verify the returned trigger object after
addtrigger— confirmSourceandDestinationreflect intent.Never use
wait(d). Polld.Runningor usestart(d, "Duration", ...).Never mutate fields of
d.UserDatafrom inside a callback (src.UserData.X = src.UserData.X + ...). State must live in a closure-captured variable, a handle-class wrapper, or a whole-struct rewrite ofUserData.Never call
preloadon an input-onlyDataAcquisition. It is output-only.Prefer
start(d, "Duration", seconds(N))overstart(d, "NumScans", N)for finite acquisition.NumScansis silently coerced or ignored.Prefer the modern function names:
daqlistoverdaq.getDevices,daqresetoverdaq.reset,daq("ni")overdaq.createSession('ni').
Common Mistakes
| Mistake | Why It's Wrong | Correct Approach |
|---|---|---|
addtrigger(d, "Digital", "StartTrigger", "Dev1/PFI0", "External") | Source/Destination reversed. 4th arg is Source, 5th is Destination. | addtrigger(d, "Digital", "StartTrigger", "External", "Dev1/PFI0") |
plot(evt.TimeStamps, evt.Data) inside ScansAvailableFcn | evt is ElementsAvailableInfo; only NumElementsAvailable. Throws silently. | [data, t] = read(src, src.ScansAvailableFcnCount, "OutputFormat", "Matrix") |
wait(d) | No such method on daq.interfaces.DataAcquisition. Throws. | while d.Running, pause(0.05); end |
src.UserData.Counter = src.UserData.Counter + n | Field mutation through src.UserData does not persist across callback fires. | Closure variable in nested function, or handle-class wrapper. See callback-state-patterns.md. |
preload(d, ...) on a DAQ with only input channels | preload is output-only. | For inputs, just call start(d, ...). No prepare/preload step needed. |
start(d, "NumScans", 1000) | NumScans is ignored — emits warning. Buffer size determined by preload or read. | start(d, "Duration", seconds(N)), or rely on preload size. |
s.IsContinuous = true; s.startBackground(); | Both are session-API. Modern API has no IsContinuous property. | start(d, "Continuous") |
addlistener(d, 'DataAvailable', @cb) | Listener events were renamed to *Fcn properties on the object. | d.ScansAvailableFcn = @cb |
s.queueOutputData(block) | Session-API. Modern API uses preload (initial) and write (refill). | preload(d, block) before start; write(d, block) from ScansRequiredFcn. |
References
references/session-to-modern-mapping.md— full rename table for every function and property that is commonly ported verbatim by mistake. Load whenever a session-API token appears in the legacy script.references/canonical-snippets.md— minimal, self-contained, runnable forms of the five patterns above. Load when composing a multi-feature script and you want a verified anchor.references/callback-state-patterns.md— four state-sharing options (UserData / closure / handle-class / nested function), when to pick which, and the silent failure modes of the wrong choice. Load when any callback needs cross-fire state.scripts/verifyDataAcquisition.m— static-checks aDataAcquisitionobject and its source script before live execution. Returns a structured report flagging the four highest-frequency silent gaps.
Copyright 2026 The MathWorks, Inc.
Files
- ATTRIBUTION.mdAdded by AutoGineer1.0 KiB
- LICENSELicence file added by AutoGineer1.4 KiB
- SKILL.md17.8 KiB
- manifest.yaml477 B
- references/callback-state-patterns.md7.5 KiB
- references/canonical-snippets.md5.7 KiB
- references/session-to-modern-mapping.md13.4 KiB
- scripts/verifyDataAcquisition.m7.4 KiB
scripts/verifyDataAcquisition.m
function report = verifyDataAcquisition(d, sourceFile, options)
%verifyDataAcquisition Static checks for a DataAcquisition object before live execution.
% Catches the four highest-frequency silent gaps in session->modern
% DAQ ports: missing ErrorOccurredFcn, evt.Data/evt.TimeStamps in callback
% source, wait(d) tokens, and src.UserData.X = src.UserData.X + ...
% field-mutation. Optionally also flags discouraged session-API tokens.
%
% report = verifyDataAcquisition(d) checks the object only.
% report = verifyDataAcquisition(d, sourceFile) also greps the source.
% report = verifyDataAcquisition(d, sourceFile, "Strict", true) treats
% warnings as failures (returns Pass = false on any warning).
%
% The returned report is a struct with fields:
% Pass (logical) overall pass/fail
% ObjectChecks (struct) results of object-state checks
% SourceChecks (struct) results of source-file string checks
% Warnings (string array) all warning messages
% Errors (string array) all error messages
%
% Example:
% d = daq("ni");
% addinput(d, "Dev1", "ai0", "Voltage");
% d.Rate = 1000;
% d.ScansAvailableFcn = @(src, ~) read(src, 100, "OutputFormat", "Matrix");
% report = verifyDataAcquisition(d, "myAcquireScript.m");
% if ~report.Pass
% disp(report.Errors);
% end
arguments
d (1, 1) daq.interfaces.DataAcquisition
sourceFile (1, 1) string = ""
options.Strict (1, 1) logical = false
end
warnings = string.empty(0, 1);
errors = string.empty(0, 1);
% ------------- Object checks -------------
objChecks = struct();
% Check 1: ErrorOccurredFcn must be wired if any other *Fcn is set.
hasScansAvailable = ~isempty(d.ScansAvailableFcn);
hasScansRequired = ~isempty(d.ScansRequiredFcn);
hasErrorOccurred = ~isempty(d.ErrorOccurredFcn);
objChecks.ErrorOccurredFcnWired = hasErrorOccurred;
if (hasScansAvailable || hasScansRequired) && ~hasErrorOccurred
errors(end+1, 1) = ...
"ErrorOccurredFcn is not wired but ScansAvailableFcn or " + ...
"ScansRequiredFcn is set. Callback exceptions will be silently " + ...
"swallowed. Set d.ErrorOccurredFcn = @(~, evt) " + ...
"fprintf(""DAQ error: %s\n"", evt.Error.message);";
end
% Check 2: ScansAvailableFcnCount must be > 0 if ScansAvailableFcn is set.
if hasScansAvailable && d.ScansAvailableFcnCount <= 0
warnings(end+1, 1) = ...
"ScansAvailableFcn is set but ScansAvailableFcnCount is " + ...
string(d.ScansAvailableFcnCount) + ". Callback may never fire.";
end
objChecks.ScansAvailableFcnCount = d.ScansAvailableFcnCount;
% Check 3: Trigger objects -- if any, confirm Source/Destination are set.
objChecks.Triggers = "(none)";
if isprop(d, "DigitalTriggers") && ~isempty(d.DigitalTriggers)
for k = 1:numel(d.DigitalTriggers)
t = d.DigitalTriggers(k);
if t.Source == "" || t.Destination == ""
errors(end+1, 1) = ...
"DigitalTriggers(" + k + ") has empty Source or Destination."; %#ok<AGROW>
end
end
objChecks.Triggers = "Source=" + string({d.DigitalTriggers.Source}) + ...
" Destination=" + string({d.DigitalTriggers.Destination});
end
% Check 4: Channel inventory.
if isempty(d.Channels)
errors(end+1, 1) = "DataAcquisition has no channels. Call addinput or addoutput first.";
end
objChecks.NumChannels = numel(d.Channels);
% ------------- Source-file string checks -------------
srcChecks = struct();
srcChecks.Performed = false;
if sourceFile ~= "" && isfile(sourceFile)
srcChecks.Performed = true;
srcChecks.File = sourceFile;
src = string(fileread(sourceFile));
% Check S1: wait(d) or wait(<varname>) where the var is a DataAcquisition.
% Conservatively flag any wait(<single-token>) call.
if contains(src, regexpPattern("wait\s*\(\s*\w+\s*\)"))
errors(end+1, 1) = ...
"Source contains wait(<obj>) call. wait() does not exist on " + ...
"daq.interfaces.DataAcquisition. Use 'while d.Running, pause(0.05); end' instead.";
end
% Check S2: evt.Data or evt.TimeStamps inside callbacks.
if contains(src, "evt.Data") || contains(src, "evt.TimeStamps")
errors(end+1, 1) = ...
"Source contains 'evt.Data' or 'evt.TimeStamps'. The modern " + ...
"callback evt is matlabshared.asyncio.buffer.ElementsAvailableInfo " + ...
"and exposes only NumElementsAvailable. Use " + ...
"read(src, src.ScansAvailableFcnCount, 'OutputFormat', 'Matrix') instead.";
end
% Check S3: src.UserData field mutation pattern.
% Match: src.UserData.<word> = src.UserData.<word> (the field re-references)
if ~isempty(regexp(src, "\w+\.UserData\.\w+\s*=\s*\w+\.UserData\.\w+", "once"))
errors(end+1, 1) = ...
"Source contains 'src.UserData.X = src.UserData.X + ...' " + ...
"field-mutation pattern. This does not persist across callback fires. " + ...
"Use a nested function, handle class, or whole-struct rewrite. " + ...
"See callback-state-patterns.md.";
end
% Check S4: discouraged (legacy) session-API tokens.
legacyTokens = ["daq.createSession", "addAnalogInputChannel", ...
"addAnalogOutputChannel", "addCounterInputChannel", ...
"addCounterOutputChannel", "addDigitalChannel", ...
"addTriggerConnection", "addClockConnection", ...
"queueOutputData", "outputSingleScan", "startBackground", ...
"startForeground", "NotifyWhenDataAvailableExceeds", ...
"NotifyWhenScansQueuedBelow", "IsContinuous", ...
"ExternalTriggerTimeout", "DurationInSeconds", ...
"daq.getDevices", "daq.getVendors", "daq.reset"];
found = string.empty;
for tok = legacyTokens
if contains(src, tok)
found(end+1) = tok; %#ok<AGROW>
end
end
srcChecks.LegacySessionTokens = found;
if ~isempty(found)
warnings(end+1, 1) = ...
"Source contains discouraged (legacy) session-API tokens: " + ...
strjoin(found, ", ") + ". See session-to-modern-mapping.md.";
end
elseif sourceFile ~= ""
warnings(end+1, 1) = "Source file '" + sourceFile + "' not found; skipped string checks.";
end
% ------------- Compose report -------------
report = struct();
report.ObjectChecks = objChecks;
report.SourceChecks = srcChecks;
report.Warnings = warnings;
report.Errors = errors;
report.Pass = isempty(errors) && (~options.Strict || isempty(warnings));
if ~report.Pass
fprintf("verifyDataAcquisition: FAIL\n");
for k = 1:numel(errors)
fprintf(" ERROR: %s\n", errors(k));
end
for k = 1:numel(warnings)
fprintf(" WARN: %s\n", warnings(k));
end
else
fprintf("verifyDataAcquisition: PASS\n");
for k = 1:numel(warnings)
fprintf(" WARN: %s\n", warnings(k));
end
end
end
% Copyright 2026 The MathWorks, Inc.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs an MCP server
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- MathWorks
- Publisher
- MathWorks (Official)
- Source
- matlab/matlab-agentic-toolkit · skills-catalog/test-and-measurement/matlab-modernize-daq · commit 2a7f215
- Licence
- BSD 2-Clause License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE.md)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by MathWorks or MathWorks.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download matlab-modernize-daq.zip