Floating Scope — Control Systems/Sinks
Control_Systems/Sinks/Floating_Scope · 0 input / 0 output port(s) at insert · exports to Python, MATLAB, Java, Rust, C, C++, VHDL, Verilog, SystemVerilog, PLC Structured Text
Description#
The block's own DESCRIPTION_HTML, rendered verbatim — the same text the config dialog's info panel and the library navigator show. Fix a wrong sentence in the block's .cpp (R-D9), never here.
Floating Scope
Control Systems / Sinks
Plots signals it is told the names of, against simulation time, on the chart attached to the block – without being wired to any of them. It has no ports at all: drop it anywhere and it watches whatever Signals lists. One trace per scalar channel, so a [3,1] signal draws three lines.
Ports
- None. Not one input, not one output. That is what makes it floating, and it is the whole difference from Scope.
Naming the signals to watch
ICore links carry names, and that name is the selection: rename a link (its
name is editable like a block's) and list that name here. A name containing
/ is matched against the link's full path instead, which is how two
links called err in different subsystems are told apart. Matching runs over
this block's own subsystem and everything below it, never above – that is
exactly the set of signals a generated core contains, so a Floating Scope cannot
plot something in the app that its exported code has no name for.
Parameters
- Signals – comma-separated link names, in plot order:
err, y_meas, Plant/u_cmd. Empty watches nothing and plots nothing. This names links in the diagram, not variables, so it is never looked up in the variables space. A name that matches no link is reported by name when the run starts, and the remaining names still plot. - Sampling Time (s) – how often a point is taken. Zero or less inherits the solver's rate; a positive value samples the traces at that period.
Notes
- The traces are one sample behind. Solver order follows input dependencies, and a block with no inputs has none – so this block runs at the head of every step and reads what its sources published on the previous one. Every trace is shifted by one sampling period. That is inherent to watching a signal instead of receiving it: use Scope where the exact sample matters.
- The traces live inside the chart and are cleared at the start of every run. To keep a run's data, use Signal Recorder or Record.
- On an infinite simulation the chart streams and keeps a rolling window rather than the whole history.
Code export
All ten targets: Python, MATLAB, Java, Rust, C, C++, VHDL, Verilog, SystemVerilog and PLC Structured Text. The watched signals are ordinary signals in the generated core, so each target reads them by name and prints them per step; a deployable target has no display, exactly as with the Scope. PLC Structured Text emits comments only, naming the exact signal array entries to tap, since ST has no console. The one-sample shift above applies to the exported code too, and for the same reason – so the export agrees with the app.
Code-export verification
This block is excluded from the code-export verification matrix, by
name, in ICoreParityRigLibrary::unriggableTypes(). The verifier
records a terminal block's input signals and compares them; a block with
no inputs records nothing, so a rig around it would fail all ten languages at
residual 0 with "Each matrix must have at least two columns" – a red row
that says nothing about the block. The exclusion is reported by
exportVerify with that reason rather than dropping it silently.
Simulink bridge
Import and export, mapped to simulink/Sinks/Floating Scope.
The signal selection does not cross in either direction, and cannot:
Simulink stores a floating scope's selection in the scope's own configuration
object rather than in a block parameter, so there is no parameter for "Signals"
to map to. The block crosses; the list has to be re-picked on the far side, and
an imported Floating Scope arrives watching nothing. "Sampling Time (s)" is
written to SampleTime as on every block, though Simulink's floating
scope normalises it back to inherited (-1).
Code facts#
| Fact | Value |
|---|---|
| registered type | Control_Systems/Sinks/Floating_Scope |
| family | Control_Systems/Sinks |
| solver environment class | ICoreBlock_0_Control_Systems_1_Sinks_2_Floating_Scope |
| source | src/ICoreSDK/ICoreBlockLibrary/Blocks/Control_Systems/Sinks/Floating_Scope/ICoreBlock_0_Control_Systems_1_Sinks_2_Floating_Scope.cpp |
| header | src/ICoreSDK/ICoreBlockLibrary/Blocks/Control_Systems/Sinks/Floating_Scope/ICoreBlock_0_Control_Systems_1_Sinks_2_Floating_Scope.h |
| default size on canvas | 70 × 70 px |
| ports at insert | 0 in, 0 out |
| code generators implemented | Python, MATLAB, Java, Rust, C, C++, VHDL, Verilog, SystemVerilog, PLC Structured Text |
Ports#
The constructor creates no port explicitly — the port list comes from registerInitialPorts (0 in, 0 out) or from the block's configuration.
Configuration variables#
| Config variable | Default | Simulink parameter |
|---|---|---|
Signals | — | — |
Every block also carries Sampling Time (s) from ICoreBlockSolverEnvironment: zero or less inherits the solver's rate, a positive value runs the block at that period.
Simulink bridge#
| support | Support::Both |
| Simulink path | simulink/Sinks/Floating Scope |
| port-count rule | PortsParam::None |
SampleTime parameter | yes |
| deliberately not crossed | CONFIG_SIGNALS.c_str() |
Caveat (shown to the user): the watched-signal list does not cross: Simulink keeps a floating scope's selection in the scope's own configuration object, not in a block parameter, so the signals must be re-picked on the far side
Catalog contract: src/ICoreSDK/ICoreCoder/ICoreCommandSystem/SimulinkBridge/ICoreSimulinkBlockCatalog.h
Description vs code#
The checker has a blind spot here — it could not resolve something (a grouped port bullet, a computed config name), which is reported and never counted as a pass. A reader has to settle it:
B0Ports lists 1 entry for 0 ports (0 in, 0 out) — grouped, or one undocumented? a reader must say
The verdict above is
tools/docs/check_block_descriptions.py(P7.1), which compares LISTS. It cannot read a sentence: "stateless" on a block with a state, an initial-value semantic the recursion does not implement, a "not synthesizable" caveat the HDL banner contradicts. That is the agent audit (P7.3) on BLOCK_DESCRIPTION_AUDIT.md, and this tool's green is not a substitute for one.
Sample results#
Plotted: free — No input: the block run alone
Category source · sample time 0.1 · 60 steps · commit ccf005c8 · produced by docsSample --out <folder> --steps 60 · data docs/generated/samples/Control_Systems__Sinks__Floating_Scope.json · the SVG is generated from those numbers by tools/docs/plot_svg.py, so it is a run and not a drawing (R-D10).