MATLAB Vehicle Network Communication
Prerequisites
- MATLAB R2021a or later
- Vehicle Network Toolbox installed (
ver('vnt') to verify)
- For physical hardware: vendor-specific drivers installed (Vector CANlib, Kvaser CANlib, NI-XNET, PEAK PCAN driver)
- For testing without hardware: MathWorks Virtual channels are always available
Overview
Guide Claude through helping users establish vehicle network communication using MATLAB Vehicle Network Toolbox. This skill covers the full workflow from hardware discovery to message exchange across all supported protocols and vendors.
Implemented protocols:
- CAN / CAN FD — fully documented
Planned protocols (architecture ready, not yet documented):
- J1939 — parameter groups, transport protocol, address claiming
- XCP — measurement, calibration, A2L file handling
- Additional protocols as VNT adds support
When to Use
- User wants to send/receive messages on a vehicle network bus in MATLAB
- User is setting up a communication test bench or loopback verification
- User asks about Vehicle Network Toolbox channel configuration
- User encounters channel errors (initialization access, bus speed, no acknowledgment)
- User wants to filter, decode, or analyze vehicle network messages
- User asks which hardware works on their platform
- User wants passive bus monitoring without affecting traffic
- User needs to encode/decode signal data from messages
When NOT to Use
- User wants to log/replay BLF files without live communication — use a BLF logging skill
- User is building Simulink vehicle network blocks — use Simulink-specific skills
- User needs CAN database file (DBC/LDF/A2L) creation or editing — this skill covers using existing files only
- User is working with a protocol not yet documented in this skill (check protocol sections below)
Protocol Router
Use this decision tree to identify which protocol the user needs:
| User's Goal |
Protocol |
Reference Section |
| Send/receive CAN or CAN FD messages |
CAN/CAN FD |
references/can/ |
| Work with SAE J1939 parameter groups |
J1939 |
Not yet documented |
| ECU measurement or calibration via XCP/CCP |
XCP |
Not yet documented |
| General hardware discovery (any protocol) |
Shared |
references/shared/ |
If the user asks about a protocol not yet documented, inform them which protocols are currently covered and offer to help with those.
Shared Concepts (All Protocols)
Hardware Discovery
t = canChannelList; % CAN/CAN FD/J1939 devices
All VNT protocols share the same hardware discovery mechanism. See references/shared/hardware-discovery.md.
Channel Lifecycle
All protocols follow the same lifecycle pattern:
Create Channel → Configure → Start → Operate → Stop/Cleanup
Key rules:
- Configuration (bus speed, filters) must happen BEFORE
start
clear ch releases the channel (equivalent to stop + destroy)
- Use
onCleanup(@() stop(ch)) for error-safe cleanup
- Running channels hold InitializationAccess — blocking new channel creation
See references/shared/channel-lifecycle.md.
Vendor / Platform Matrix
| Vendor |
Windows |
Linux |
Notes |
| Vector |
Yes |
No |
Virtual channels if driver installed |
| NI |
Yes |
No |
No channel index in constructor |
| Kvaser |
Yes |
Yes |
Restart MATLAB after connecting hardware |
| PEAK-System |
Yes |
Yes |
10-arg clock-based configBusSpeed |
| SocketCAN |
No |
Yes |
Configure speed at OS level via ip link |
| MathWorks Virtual |
Yes |
Yes |
Always available, no driver needed |
CAN / CAN FD
Troubleshooting Gate
If the user reports a CAN/CAN FD problem — "not working", "trouble", "error", "can't connect", "no messages", hardware not detected, or any communication failure — you MUST do one of the following:
Domain-knowledge question ("why does X cause Y", "what's the maximum stub length for CAN FD", "explain bit rate switching") — answer from references/can/troubleshooting/l1-domain-knowledge.md without running diagnostics.
Actionable problem requiring diagnosis — Load references/can/troubleshooting/diagnostic-workflow.md BEFORE responding. Follow its Entry-Point Routing to select the correct starting step. Do NOT diagnose from this file. The tables, pitfalls, and patterns below are reference material for healthy operation — they are NOT a diagnostic procedure. Improvising from them produces wall-of-text responses with multiple guesses instead of structured one-question-at-a-time triage.
Core Workflow
digraph can_workflow {
rankdir=TB;
node [shape=box];
discover [label="1. Discover Hardware\ncanChannelList"];
decide [label="CAN Classic or CAN FD?" shape=diamond];
create_classic [label="2a. Create Channel\ncanChannel(vendor, device, ch)"];
create_fd [label="2b. Create FD Channel\ncanChannel(..., ProtocolMode='CAN FD')\nor canFDChannel(...)"];
config [label="3. Configure Bus Speed\nconfigBusSpeed (vendor-specific syntax)"];
start [label="4. Start Channel\nstart(ch)"];
operate [label="5. Transmit / Receive\ntransmit, receive\ntransmitPeriodic, transmitEvent, replay"];
cleanup [label="6. Cleanup\nstop(ch) or clear ch"];
discover -> decide;
decide -> create_classic [label="Classic"];
decide -> create_fd [label="CAN FD"];
create_classic -> config;
create_fd -> config;
config -> start;
start -> operate;
operate -> cleanup;
}
Post-Transmit Verification (MANDATORY)
After ANY transmit, verify the bus accepted the frame before reporting success:
pause(0.5);
fprintf('TEC=%d REC=%d BusStatus=%s\n', ch.TransmitErrorCount, ch.ReceiveErrorCount, ch.BusStatus);
| Result |
Action |
| TEC=0, REC=0, ErrorActive |
Healthy — report success |
| TEC>0 OR REC>0 OR not ErrorActive |
Unhealthy — report counters to user, route to diagnostic workflow Step 0.5. Follow diagnostic Interaction Rules (one question at a time). |
Never claim "sent successfully" from transmit returning without error. It is non-blocking and returns immediately regardless of bus state. When routing to diagnostics, do NOT list multiple possible causes — let Step 0.5 identify the root cause and ask one targeted question.
CAN Classic vs CAN FD Decision
| Aspect |
CAN Classic |
CAN FD |
| Max payload |
8 bytes |
64 bytes |
| Message constructor |
canMessage(id, ext, dlc) |
canFDMessage(id, ext, dlc) or canMessage(..., ProtocolMode="CAN FD") |
| Channel creation |
canChannel(vendor, device, ch) |
Add 'ProtocolMode', 'CAN FD' or use canFDChannel |
| Bus speed config |
Single speed |
Arbitration + Data phase (vendor-specific syntax) |
receive output |
Objects or timetable |
Always timetable |
| Valid DLCs |
0–8 |
0, 8, 12, 16, 20, 24, 32, 48, 64 |
Critical Patterns (Non-Obvious API Behavior)
These patterns are where the API behaves differently than expected. Follow these exactly.
attachDatabase operates on MESSAGES, not channels
% WRONG — will error
attachDatabase(ch, db);
ch.Database = db; % only valid for name-based filterAllowOnly
% CORRECT — attach to received message object
rxMsg = receive(ch, 1);
attachDatabase(rxMsg, db);
speed = rxMsg.Signals.EngineSpeed;
transmitPeriodic + pack for live signal updates
% WRONG — manual loop blocks MATLAB, timing is inaccurate
while running
pack(msg, newValue, 0, 16, 'LittleEndian');
transmit(ch, msg);
pause(0.1);
end
% CORRECT — hardware-timed, non-blocking
transmitPeriodic(ch, msg, 'On', 0.1);
start(ch);
pack(msg, newValue, 0, 16, 'LittleEndian'); % next cycle sends updated data
filterAllowOnly REQUIRES type argument for numeric IDs
% WRONG — errors with "Expected NAME to be one of these types: char, cell"
filterAllowOnly(ch, [0x180 0x181]);
% CORRECT — must specify 'Standard' or 'Extended'
filterAllowOnly(ch, [0x180 0x181], 'Standard');
filterAllowOnly(ch, [0x18FEF100], 'Extended');
CAN FD configBusSpeed is vendor-specific
% MathWorks Virtual / NI — simple 3-arg form works
configBusSpeed(ch, 500000, 2000000);
% Vector / Kvaser — REQUIRES 9-arg advanced timing form
configBusSpeed(ch, 500000, 2, 6, 3, 2000000, 2, 6, 3);
% PEAK-System — REQUIRES 10-arg clock-based form
configBusSpeed(ch, 20, 5, 1, 2, 1, 2, 1, 3, 1);
CAN FD receive ALWAYS returns timetable
% CAN FD channels ignore OutputFormat — always timetable
msgs = receive(fdCh, Inf); % returns timetable
msgs.ID % numeric vector of IDs
msgs.Data{1} % uint8 vector for first message
% WRONG: msgs(1).Data, msgs.Data(1) — these error on timetable
transmitEvent fires on ANY .Data write (including pack)
transmitEvent(ch, msg, 'On');
start(ch);
pack(msg, value, 0, 16, 'LittleEndian'); % this auto-transmits!
% No explicit transmit() call needed — pack triggers it
Common Pitfalls
| Pitfall |
Symptom |
Fix |
| Stale channel object |
"lacks initialization access" |
clear the variable or stop prior channel |
canMessage for FD payload |
"DATALENGTH must be <= 8" |
Use canFDMessage or add ProtocolMode="CAN FD" |
| No acknowledging node |
Transmit retries continuously |
Ensure another node/channel is started on the bus |
| Claiming success without checking counters |
User believes data sent; bus is ErrorPassive |
ALWAYS check TEC/REC/BusStatus after transmit |
| Bus speed mismatch |
Transmit succeeds, receive empty |
All nodes must share same speed |
configBusSpeed after start |
Error |
Must configure while channel is offline |
| Reusing variable |
Error on creation |
clear variable before creating new channel |
configBusSpeed on SocketCAN |
Not supported |
Configure speed at OS level via ip link |
| CAN FD on PEAK-System Linux |
Self-receive not supported |
Use SocketCAN as workaround |
unpack on timetable |
"Incorrect number or types of inputs" |
CAN FD always returns timetable; use typecast(data(1:2), 'int16') on raw bytes |
CAN References
Detailed API documentation (load on demand):
- references/can/channel-creation.md —
canChannel, canFDChannel, vendor-specific syntax
- references/can/bus-speed-config.md —
configBusSpeed, vendor-specific argument counts
- references/can/message-creation.md —
canMessage, canFDMessage, valid FD DLCs
- references/can/transmit.md —
transmit, transmitPeriodic, transmitEvent, replay
- references/can/receive.md —
receive, SilentMode, timetable output, FIFO behavior
- references/can/filters.md —
filterAllowOnly, filterBlockAll, filterAllowAll
- references/can/database.md —
canDatabase, attachDatabase, signal-level decode/encode
- references/can/pack-unpack.md —
pack, unpack, signal extraction, byte-order
- references/can/message-extraction.md —
extractAll, extractRecent, extractTime, discard
CAN Troubleshooting
See Troubleshooting Gate at the top of this section. Also route to diagnostics when the agent observes unhealthy bus state (TEC/REC > 0, BusStatus not ErrorActive) during any operation — including after transmit verification.
- references/can/troubleshooting/diagnostic-workflow.md — Full diagnostic procedure (Phase 0 automation, L1 physical, L2 traffic analysis)
- references/can/troubleshooting/script-interfaces.md — Function signatures, arguments, and outputs for all diagnostic/analysis scripts
Shared References
- references/shared/hardware-discovery.md —
canChannelList, platform constraints
- references/shared/channel-lifecycle.md —
start, stop, onCleanup, channel release
- references/shared/limitations.md — Vendor/platform-specific constraints
Copyright 2026 The MathWorks, Inc.
1---2name: matlab-use-vehicle-network3description: Use when setting up vehicle network communication in MATLAB using Vehicle Network Toolbox. Covers CAN/CAN FD (fully implemented), with architecture for J1939, XCP, and future protocols. Handles hardware discovery, channel creation, bus configuration, message exchange, signal encoding/decoding, and analysis across all supported vendors. (Vector, Kvaser, PEAK-System, NI, SocketCAN, MathWorks Virtual).4license: https://www.mathworks.com/content/dam/mathworks/license/pmrl/lic5---67# MATLAB Vehicle Network Communication89## Prerequisites1011- MATLAB R2021a or later12- Vehicle Network Toolbox installed (`ver('vnt')` to verify)13- For physical hardware: vendor-specific drivers installed (Vector CANlib, Kvaser CANlib, NI-XNET, PEAK PCAN driver)14- For testing without hardware: MathWorks Virtual channels are always available1516## Overview1718Guide Claude through helping users establish vehicle network communication using MATLAB Vehicle Network Toolbox. This skill covers the full workflow from hardware discovery to message exchange across all supported protocols and vendors.1920**Implemented protocols:**21- CAN / CAN FD — fully documented2223**Planned protocols (architecture ready, not yet documented):**24- J1939 — parameter groups, transport protocol, address claiming25- XCP — measurement, calibration, A2L file handling26- Additional protocols as VNT adds support2728## When to Use2930- User wants to send/receive messages on a vehicle network bus in MATLAB31- User is setting up a communication test bench or loopback verification32- User asks about Vehicle Network Toolbox channel configuration33- User encounters channel errors (initialization access, bus speed, no acknowledgment)34- User wants to filter, decode, or analyze vehicle network messages35- User asks which hardware works on their platform36- User wants passive bus monitoring without affecting traffic37- User needs to encode/decode signal data from messages3839## When NOT to Use4041- User wants to log/replay BLF files without live communication — use a BLF logging skill42- User is building Simulink vehicle network blocks — use Simulink-specific skills43- User needs CAN database file (DBC/LDF/A2L) creation or editing — this skill covers using existing files only44- User is working with a protocol not yet documented in this skill (check protocol sections below)4546## Protocol Router4748Use this decision tree to identify which protocol the user needs:4950| User's Goal | Protocol | Reference Section |51|-------------|----------|-------------------|52| Send/receive CAN or CAN FD messages | CAN/CAN FD | `references/can/` |53| Work with SAE J1939 parameter groups | J1939 | *Not yet documented* |54| ECU measurement or calibration via XCP/CCP | XCP | *Not yet documented* |55| General hardware discovery (any protocol) | Shared | `references/shared/` |5657If the user asks about a protocol not yet documented, inform them which protocols are currently covered and offer to help with those.5859## Shared Concepts (All Protocols)6061### Hardware Discovery6263```matlab64t = canChannelList; % CAN/CAN FD/J1939 devices65```6667All VNT protocols share the same hardware discovery mechanism. See [references/shared/hardware-discovery.md](references/shared/hardware-discovery.md).6869### Channel Lifecycle7071All protocols follow the same lifecycle pattern:7273```74Create Channel → Configure → Start → Operate → Stop/Cleanup75```7677Key rules:78- Configuration (bus speed, filters) must happen BEFORE `start`79- `clear ch` releases the channel (equivalent to stop + destroy)80- Use `onCleanup(@() stop(ch))` for error-safe cleanup81- Running channels hold InitializationAccess — blocking new channel creation8283See [references/shared/channel-lifecycle.md](references/shared/channel-lifecycle.md).8485### Vendor / Platform Matrix8687| Vendor | Windows | Linux | Notes |88|--------|:-------:|:-----:|-------|89| Vector | Yes | No | Virtual channels if driver installed |90| NI | Yes | No | No channel index in constructor |91| Kvaser | Yes | Yes | Restart MATLAB after connecting hardware |92| PEAK-System | Yes | Yes | 10-arg clock-based configBusSpeed |93| SocketCAN | No | Yes | Configure speed at OS level via `ip link` |94| MathWorks Virtual | Yes | Yes | Always available, no driver needed |9596---9798## CAN / CAN FD99100### Troubleshooting Gate101102**If the user reports a CAN/CAN FD problem** — "not working", "trouble", "error", "can't connect", "no messages", hardware not detected, or any communication failure — you MUST do one of the following:1031041. **Domain-knowledge question** ("why does X cause Y", "what's the maximum stub length for CAN FD", "explain bit rate switching") — answer from [references/can/troubleshooting/l1-domain-knowledge.md](references/can/troubleshooting/l1-domain-knowledge.md) without running diagnostics.1051062. **Actionable problem requiring diagnosis** — **Load** [references/can/troubleshooting/diagnostic-workflow.md](references/can/troubleshooting/diagnostic-workflow.md) BEFORE responding. **Follow** its Entry-Point Routing to select the correct starting step. **Do NOT diagnose from this file.** The tables, pitfalls, and patterns below are reference material for healthy operation — they are NOT a diagnostic procedure. Improvising from them produces wall-of-text responses with multiple guesses instead of structured one-question-at-a-time triage.107108### Core Workflow109110```dot111digraph can_workflow {112 rankdir=TB;113 node [shape=box];114115 discover [label="1. Discover Hardware\ncanChannelList"];116 decide [label="CAN Classic or CAN FD?" shape=diamond];117 create_classic [label="2a. Create Channel\ncanChannel(vendor, device, ch)"];118 create_fd [label="2b. Create FD Channel\ncanChannel(..., ProtocolMode='CAN FD')\nor canFDChannel(...)"];119 config [label="3. Configure Bus Speed\nconfigBusSpeed (vendor-specific syntax)"];120 start [label="4. Start Channel\nstart(ch)"];121 operate [label="5. Transmit / Receive\ntransmit, receive\ntransmitPeriodic, transmitEvent, replay"];122 cleanup [label="6. Cleanup\nstop(ch) or clear ch"];123124 discover -> decide;125 decide -> create_classic [label="Classic"];126 decide -> create_fd [label="CAN FD"];127 create_classic -> config;128 create_fd -> config;129 config -> start;130 start -> operate;131 operate -> cleanup;132}133```134135### Post-Transmit Verification (MANDATORY)136137After ANY transmit, verify the bus accepted the frame before reporting success:138139```matlab140pause(0.5);141fprintf('TEC=%d REC=%d BusStatus=%s\n', ch.TransmitErrorCount, ch.ReceiveErrorCount, ch.BusStatus);142```143144| Result | Action |145|--------|--------|146| TEC=0, REC=0, ErrorActive | Healthy — report success |147| TEC>0 OR REC>0 OR not ErrorActive | Unhealthy — report counters to user, route to [diagnostic workflow Step 0.5](references/can/troubleshooting/diagnostic-workflow.md). Follow diagnostic Interaction Rules (one question at a time). |148149**Never claim "sent successfully" from `transmit` returning without error.** It is non-blocking and returns immediately regardless of bus state. When routing to diagnostics, do NOT list multiple possible causes — let Step 0.5 identify the root cause and ask one targeted question.150151### CAN Classic vs CAN FD Decision152153| Aspect | CAN Classic | CAN FD |154|--------|-------------|--------|155| Max payload | 8 bytes | 64 bytes |156| Message constructor | `canMessage(id, ext, dlc)` | `canFDMessage(id, ext, dlc)` or `canMessage(..., ProtocolMode="CAN FD")` |157| Channel creation | `canChannel(vendor, device, ch)` | Add `'ProtocolMode', 'CAN FD'` or use `canFDChannel` |158| Bus speed config | Single speed | Arbitration + Data phase (vendor-specific syntax) |159| `receive` output | Objects or timetable | Always timetable |160| Valid DLCs | 0–8 | 0, 8, 12, 16, 20, 24, 32, 48, 64 |161162### Critical Patterns (Non-Obvious API Behavior)163164These patterns are where the API behaves differently than expected. Follow these exactly.165166#### attachDatabase operates on MESSAGES, not channels167168```matlab169% WRONG — will error170attachDatabase(ch, db);171ch.Database = db; % only valid for name-based filterAllowOnly172173% CORRECT — attach to received message object174rxMsg = receive(ch, 1);175attachDatabase(rxMsg, db);176speed = rxMsg.Signals.EngineSpeed;177```178179#### transmitPeriodic + pack for live signal updates180181```matlab182% WRONG — manual loop blocks MATLAB, timing is inaccurate183while running184 pack(msg, newValue, 0, 16, 'LittleEndian');185 transmit(ch, msg);186 pause(0.1);187end188189% CORRECT — hardware-timed, non-blocking190transmitPeriodic(ch, msg, 'On', 0.1);191start(ch);192pack(msg, newValue, 0, 16, 'LittleEndian'); % next cycle sends updated data193```194195#### filterAllowOnly REQUIRES type argument for numeric IDs196197```matlab198% WRONG — errors with "Expected NAME to be one of these types: char, cell"199filterAllowOnly(ch, [0x180 0x181]);200201% CORRECT — must specify 'Standard' or 'Extended'202filterAllowOnly(ch, [0x180 0x181], 'Standard');203filterAllowOnly(ch, [0x18FEF100], 'Extended');204```205206#### CAN FD configBusSpeed is vendor-specific207208```matlab209% MathWorks Virtual / NI — simple 3-arg form works210configBusSpeed(ch, 500000, 2000000);211212% Vector / Kvaser — REQUIRES 9-arg advanced timing form213configBusSpeed(ch, 500000, 2, 6, 3, 2000000, 2, 6, 3);214215% PEAK-System — REQUIRES 10-arg clock-based form216configBusSpeed(ch, 20, 5, 1, 2, 1, 2, 1, 3, 1);217```218219#### CAN FD receive ALWAYS returns timetable220221```matlab222% CAN FD channels ignore OutputFormat — always timetable223msgs = receive(fdCh, Inf); % returns timetable224msgs.ID % numeric vector of IDs225msgs.Data{1} % uint8 vector for first message226% WRONG: msgs(1).Data, msgs.Data(1) — these error on timetable227```228229#### transmitEvent fires on ANY .Data write (including pack)230231```matlab232transmitEvent(ch, msg, 'On');233start(ch);234pack(msg, value, 0, 16, 'LittleEndian'); % this auto-transmits!235% No explicit transmit() call needed — pack triggers it236```237238### Common Pitfalls239240| Pitfall | Symptom | Fix |241|---------|---------|-----|242| Stale channel object | "lacks initialization access" | `clear` the variable or `stop` prior channel |243| `canMessage` for FD payload | "DATALENGTH must be <= 8" | Use `canFDMessage` or add `ProtocolMode="CAN FD"` |244| No acknowledging node | Transmit retries continuously | Ensure another node/channel is started on the bus |245| Claiming success without checking counters | User believes data sent; bus is ErrorPassive | ALWAYS check TEC/REC/BusStatus after transmit |246| Bus speed mismatch | Transmit succeeds, receive empty | All nodes must share same speed |247| `configBusSpeed` after `start` | Error | Must configure while channel is offline |248| Reusing variable | Error on creation | `clear` variable before creating new channel |249| `configBusSpeed` on SocketCAN | Not supported | Configure speed at OS level via `ip link` |250| CAN FD on PEAK-System Linux | Self-receive not supported | Use SocketCAN as workaround |251| `unpack` on timetable | "Incorrect number or types of inputs" | CAN FD always returns timetable; use `typecast(data(1:2), 'int16')` on raw bytes |252253### CAN References254255Detailed API documentation (load on demand):256- [references/can/channel-creation.md](references/can/channel-creation.md) — `canChannel`, `canFDChannel`, vendor-specific syntax257- [references/can/bus-speed-config.md](references/can/bus-speed-config.md) — `configBusSpeed`, vendor-specific argument counts258- [references/can/message-creation.md](references/can/message-creation.md) — `canMessage`, `canFDMessage`, valid FD DLCs259- [references/can/transmit.md](references/can/transmit.md) — `transmit`, `transmitPeriodic`, `transmitEvent`, `replay`260- [references/can/receive.md](references/can/receive.md) — `receive`, `SilentMode`, timetable output, FIFO behavior261- [references/can/filters.md](references/can/filters.md) — `filterAllowOnly`, `filterBlockAll`, `filterAllowAll`262- [references/can/database.md](references/can/database.md) — `canDatabase`, `attachDatabase`, signal-level decode/encode263- [references/can/pack-unpack.md](references/can/pack-unpack.md) — `pack`, `unpack`, signal extraction, byte-order264- [references/can/message-extraction.md](references/can/message-extraction.md) — `extractAll`, `extractRecent`, `extractTime`, `discard`265266### CAN Troubleshooting267268See **Troubleshooting Gate** at the top of this section. Also route to diagnostics when the agent observes unhealthy bus state (TEC/REC > 0, BusStatus not ErrorActive) during any operation — including after transmit verification.269- [references/can/troubleshooting/diagnostic-workflow.md](references/can/troubleshooting/diagnostic-workflow.md) — Full diagnostic procedure (Phase 0 automation, L1 physical, L2 traffic analysis)270- [references/can/troubleshooting/script-interfaces.md](references/can/troubleshooting/script-interfaces.md) — Function signatures, arguments, and outputs for all diagnostic/analysis scripts271272---273274## Shared References275276- [references/shared/hardware-discovery.md](references/shared/hardware-discovery.md) — `canChannelList`, platform constraints277- [references/shared/channel-lifecycle.md](references/shared/channel-lifecycle.md) — `start`, `stop`, `onCleanup`, channel release278- [references/shared/limitations.md](references/shared/limitations.md) — Vendor/platform-specific constraints279280----281282Copyright 2026 The MathWorks, Inc.283284----