Live data: show a value within 1 s of its change
Maintainers usually reply within 1 day
@mrcsin is already working on this.
Since Oct 8, 2026.
Assessment
This issue has not been assessed yet.
Description
Problem
The chart's live edge comes from the archive: RealtimePoll reads trends every second. The archive cannot carry a live edge. Simple-Scada buffers each variable in memory and writes it to trends in batches of about 50 rows or every ~8 minutes, so the newest row of a pen lags the plant by 1-3 min for a pen changing every second, ~8 min for a slow one, hours for a rarely changing one, and up to a day for a constant one (docs/architecture/scada-archive-observed.md#how-late-a-value-arrives). No setting controls the buffering.
Requirement: a change on the plant reaches the chart within 1 s.
What the SCADA's built-in OPC UA server gives (measured 2026-10-08, 2.7.6.0 demo-64)
- Available in Minimal, Standard and Professional (manual, version table); enabled per project in
Проект -> Настройки -> OPC UA-сервер, endpointopc.tcp://<host>:<port>. The scripts manual (2.10.6) names it the usual way to hand current values to other applications. - Node of a variable:
ns=3;s=<project ID><trends.id>, e.g.ns=3;s=FD34514A352forid = 2. The project ID is inПроект -> Настройки -> Общие; changing it changes every address. Namespace URIhttp://simple-scada.com/UA. - Latency from the server's source timestamp to the client, 100 ms publishing interval: median 3-4 ms, max ~190 ms.
SourceTimestamp(UTC) equals the archive'st(local time): 119/119 rows of a by-change pen and 68/68 of a deadband pen matched on(t, v). A by-time pen matched 79/92; the other 13 archive rows sit on the archiver's own tick a few ms after the live change, sometimes with the previous value.- Live is denser than the archive: every change arrives (117 notifications in 2 min for
Time10s, ~12 archive rows). - A new subscription delivers the current value at once, also for a pen that has not changed.
- Anonymous, security mode None works; SemiPlot and the SCADA always run on one machine.
A question to the vendor (is OPC UA the intended route, does an OPC UA client take a licence seat, is the node address format stable, HistoryRead) is out; the expected answer is OPC UA.
Design proposal
- Live source. A new
SemiPlot.DataSource.*sibling subscribes over OPC UA (OPCFoundation.NetStandard.Opc.Ua.Client) to every pen of the catalogue, publishing interval ~100 ms, and emits the sameSamplestream the poll emits today. Endpoint port and project ID are configuration keys underconnection/. - Archive watermark per pen. The archive poll stays and advances, per pen, the newest
tseen intrends. - Live buffer per pen. Holds live samples newer than the pen's watermark, bounded in time (e.g. 24 h); samples at or below the watermark are dropped. Stitching is by watermark, not by matching points, because by-time pens do not match exactly.
- Rendering. History from the archive up to the watermark, the live buffer after it; when the archive catches up its rows replace the live points. At start-up the first notification of each pen draws a step from its last archived value to now; live history exists only while the window runs.
- OPC UA down. Archive only, a message on the panel, reconnection in the background.
Related findings that touch the read path
- Layers 1 and 2 hold at most 2 points per period (min and max), not 4:
AggregationLayer.ToPointSpacingis off by a factor of two. - Layer 3 can be empty (2.7.6.0 wrote none in 48 h): a window that selects the day layer draws nothing; the hour layer has to stand in.
Acceptance
- A value change on the SCADA appears on the chart within 1 s, measured on the bench with the demo SCADA.
- No visible seam or duplicate when the archive catches up with the live buffer.
- With the OPC UA server off, the chart works from the archive alone and says so.
- Dominant language
- C#
- Stars
- 0
- Forks
- 0
- Avg merge
- 3h 2m
- Merged PRs (30d)
- 35
Getting set up
This project ships no dev container, Dockerfile or contributing guide, so setting up is up to you: start from its README, and see our first-contribution guide for the general steps.
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from Semiteq/SemiPlot
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
Maintainers usually reply within 1 day
-
enhancement
Difficulty 2/5 1-3 hours Newbie friendliness 69/100
Maintainers usually reply within 1 day
-
Difficulty 3/5 1-2 days Newbie friendliness 72/100
Maintainers usually reply within 1 day
-
Minimap: draw an envelope, bound the span, step with arrowsMay be free again @mrcsin claimed this 35 days ago, and no pull request is open. Openenhancement
Semiteq/SemiPlot#78 · 1 assignee ·
Maintainers usually reply within 1 day
-
Chart: time markers stored in the archiveMay be free again @mrcsin claimed this 35 days ago, and no pull request is open. Openenhancement
Semiteq/SemiPlot#77 · 1 assignee ·
Maintainers usually reply within 1 day
All issues in Semiteq/SemiPlot
Similar issues
-
AzureBlobSnapshotStore.LoadAsync allocates the snapshot twice (growable MemoryStream + ToArray)Openenhancement
Difficulty 2/5 Half a day Newbie friendliness 72/100
-
bug ui-only
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
ClickHouse/clickhouse-cs#689 ·
Maintainers usually reply within 2 days
-
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
Maintainers usually reply within 7 days
-
Difficulty 1/5 Under an hour Newbie friendliness 65/100
vchelaru/FlatRedBall2#1481 ·
Maintainers usually reply within 1 day