---
name: authoring-simulink-inputs
description: >
Synthesize new waveforms from scratch for Simulink inports using
createInputDataset. Use ONLY when the user asks to generate, create, or
synthesize signals (step, ramp, sine, chirp, pulse, noise) to populate
a Dataset for External Inputs or Signal Editor. Covers timeseries and
timetable formats with correct data type, interpolation, units, and
dimensions. Also covers function-call and trigger inport timing setup.
Do NOT use when the user wants to load, import, or read existing data
from files (MAT, CSV, spreadsheet) — even if that data will be used as
model input. Do NOT use for running simulations or plotting outputs.
license: MathWorks BSD-3-Clause
metadata:
author: MathWorks
version: "1.0"
---
# Author Input Signals
Create populated input signal datasets for Simulink models using `createInputDataset` as the scaffold, then populating with meaningful waveforms while preserving all signal metadata.
## When to Use
- User asks to **generate or create synthetic waveforms** (step, ramp, sine, chirp, pulse, noise, constant) for a model's inports
- User wants to **populate a Dataset** created by `createInputDataset` with meaningful signal data
- User needs signals for **Signal Editor** scenarios
- User describes desired **input signal behavior** in natural language (e.g., "ramp from 0 to 10", "sine at 5 Hz")
- User wants **timetable-based input signals** for inports
- User needs to set up **function-call timing** or configure trigger/enable inport signals
- User wants to replace **zero-filled scaffold** data with realistic waveforms
## When NOT to Use
- User wants to **simulate** the model, **run** it, or **plot outputs** — use `simulating-simulink-models` instead. This skill only creates input data; it never runs `sim()` or produces plots.
- User wants to **load, import, or read** data from existing files (CSV, MAT, spreadsheet, .mat workspace) — even if the destination is a model inport. This skill generates *new synthetic waveforms from scratch*; it does not read or convert existing recorded/measured data.
## Output
This skill produces:
1. **MATLAB code** — a local function that generates and returns the Dataset (reproducible, editable, keeps workspace clean)
2. **Dataset variable (`ds`)** — populated `Simulink.SimulationData.Dataset` in the base workspace, ready for simulation
3. **Summary** — brief description of each element: name, data type, waveform shape, and value range
To simulate with the Dataset, follow the `simulating-simulink-models` skill workflow (`SimulationInput` → `setExternalInput` → `sim`).
## Must-Follow Rules
1. **Start from `createInputDataset` — call it exactly once** — never build a Dataset from scratch. Call `createInputDataset` once per model (it triggers update diagram). For multiple datasets, clone the returned scaffold in a loop rather than calling `createInputDataset` again
2. **Preserve metadata from scaffold** — every new timeseries must copy `origEl.DataInfo.Interpolation` and `origEl.DataInfo.Units`. For timetables, copy `origEl.Properties.VariableContinuity`. Omitting these is a bug
3. **Replace elements in place** — for timeseries: `ds{k} = ts`. For timetable: `ds = ds.setElement(k, tt, origEl.Properties.Description)` — never use `addElement`
4. **Respect data types** — use `cast(data, 'like', origEl.Data)` to match any scaffold type (double, single, integer, fixed-point). For boolean inports use `true(size(t))` directly
5. **Set interpolation correctly** — continuous signals (sine, ramp, chirp) use linear; discrete signals (step, pulse, boolean, integer, noise) use zero-order hold. The scaffold's interpolation reflects the inport's `Interpolate` property — preserve it unless the signal nature demands otherwise
6. **Wrap all generation logic in a function** — the only variables left in the base workspace should be the Dataset (and `simIn`/`simOut` if simulating). All intermediate variables (`t`, `dt`, `origEl`, `ts`, `signalData`, `k`) must stay inside function scope
7. **Never destroy user data** — never call `clear`, `clearvars`, `clear all`, or `bdclose all`. The user may have existing variables, models, or figures open. Only add to the workspace, never remove from it
## Workflow
**Determine your entry point.** Do not always start at step 1. Assess what the user already has:
| User's current state | Start at |
|---------------------|----------|
| No existing Dataset or script — starting fresh | Step 1 |
| Has a Dataset variable but it's empty/scaffold (all zeros or placeholder data) | Step 2 |
| Has a Dataset with some signals populated but needs fixes (wrong shape, dtype, interpolation) | Step 2 — inspect the broken element, fix in place |
| Has a working script but wants additional scenarios or signals added | Step 2 or "Creating Multiple Datasets" |
| Has a complete Dataset but simulation fails | Diagnose the error first — often a metadata mismatch (interpolation, dtype, units) fixable in Step 2 |
A **scaffold** is the Dataset returned by `createInputDataset`. It contains one element per inport, pre-filled with correct metadata (data type, interpolation method, units, signal dimensions) but only placeholder time samples (typically 2 zero-valued rows). The workflow replaces this placeholder data with meaningful waveforms while preserving the metadata.
### 1. Create the scaffold (inside a function)
All generation code lives in a local function. The caller invokes the function and receives the populated Dataset:
```matlab
ds = buildInputs('modelName');
function ds = buildInputs(mdl)
ds = createInputDataset(mdl);
% — or timetable format —
% ds = createInputDataset(mdl, 'DatasetSignalFormat', 'timetable');
stopTime = str2double(get_param(mdl, 'StopTime'));
dt = 0.01;
t = (0:dt:stopTime)';
% ... populate elements (Step 2) ...
end
```
If `createInputDataset` fails (model cannot compile), use `model_read` to inspect the model's inport blocks and ask the user for any type/dimension info that cannot be determined from the model structure.
### 2. Populate each element (inside the same function)
Replace placeholder scaffold data with meaningful signal waveforms while preserving metadata. For each element:
1. Extract the original element (`origEl = ds{k}`)
2. Generate your waveform and cast via `cast(data, 'like', origEl.Data)` — works for all types including fixed-point
3. Create the new timeseries or timetable
4. Copy `DataInfo.Interpolation` and `DataInfo.Units` from `origEl` (timeseries) or `VariableContinuity` from `origEl` (timetable)
5. Replace in place: `ds{k} = ts` (timeseries) or `ds = ds.setElement(k, tt, origEl.Properties.Description)` (timetable)
See [references/signal-patterns.md](references/signal-patterns.md) — "Dataset Assembly" sections — for the complete code patterns.
## Creating Multiple Datasets
Call `createInputDataset` once, then clone the scaffold in a loop inside a function. See [references/dataset-patterns.md](references/dataset-patterns.md) — "Creating Multiple Datasets" section — for the complete pattern.
## Bus Signal Inports
If the model has bus signal inports, see the "Bus Signal Inports" section in [references/dataset-patterns.md](references/dataset-patterns.md).
## Function-Call Inports
If the model has function-call inports, see the "Function-Call Inports" section in [references/dataset-patterns.md](references/dataset-patterns.md).
## Signal Types
See [references/signal-patterns.md](references/signal-patterns.md) for waveform generation code (sine, step, ramp, chirp, pulse, noise, constant, enum).
## Interpolation and Continuity (explicit set — use only when overriding scaffold)
| Signal nature | timeseries | timetable |
|--------------|-----------|-----------|
| Continuous (sine, ramp, chirp) | `tsdata.interpolation('linear')` | `"continuous"` |
| Discrete (step, pulse, boolean) | `tsdata.interpolation('zoh')` | `"step"` |
## Guardrails
| Mistake | Why It's Wrong | Correct Approach |
|---------|---------------|-----------------|
| Using `ones(size(t))` for boolean enable | Creates double; simulation fails with type mismatch | Use `true(size(t))` |
| Ignoring struct fields in bus scaffold | Missing or incorrectly typed bus element causes simulation error | Populate every field in the struct, preserving each field's metadata |
| Treating scaffold data rows as signal width | Scaffold `[2 1]` data means 2 time samples of a scalar, not a 2-element vector | Use `size(origEl.Data, 2)` for signal width — rows are placeholder time samples |
| Enum data fails with "turn off interpolation" | Simulink requires `Interpolate='off'` on inport blocks receiving enum data — even with zoh set on the timeseries | This is a model fix, not a data fix. Use `simIn.setBlockParameter(portPath, 'Interpolate', 'off')` before simulating |
----
Copyright 2026 The MathWorks, Inc.
----