User manual — chapter list

Analysis views

Seven of the desktop app's tabs - SCADA, OPERATOR, MARKET, NESO RP1, MECHANICAL, CYCLE and ASSETS - are read-only views over whatever the app is currently stepping through. None of them changes the grid; they observe it. This chapter covers what each tab shows, where its numbers come from, and what you can click. For launching the app, the transport bar, the source pickers and the remaining tabs (NETWORK, GENERATION & INERTIA, THE MACHINE, SPEED DOMAINS), see the desktop app.

Where each tab's data comes from

Every tab refreshes from each solved frame, in all three modes:

  • Live sim - the app solves the loaded case itself, once per tick.
  • Replay - you loaded a run directory (LOAD RUN...) and the app steps through its pre-solved frames.
  • Bridge - frames stream from the GDA bridge server.

On top of the solved frame, the bridge stream carries lake-only side channels: balancing-mechanism acceptances, market prices, constraints, system warnings, interconnector flows, and the measured inertia split. Panels fed by those channels fill only in bridge mode; in live sim and replay they show - (they are cleared when you leave bridge mode, so stale GB-scale figures cannot linger over a local case). Each tab's section below says which panels are frame-derived and which are bridge-only.

To examine one instant closely, pause the transport bar first - every clickable drill-down described here reads the currently displayed frame.

SCADA

A simulated EMS/supervisory console: a register of tag-named telemetry points and an event/alarm log, both driven off the solved frames.

The register is a representative subset built once per network, not every quantity in the model:

  • every bus voltage at 275 kV and above (SITE.400.V_PU),
  • P and Q on the 30 heaviest-loaded corridors (FROM-TO.400.P_MW / .Q_MVAR), each with a live loading-vs-rating column,
  • every OLTC tap position (SITE-SGT.TAP_POS),
  • system frequency (SYS.F_HZ).

Type in the filter box to narrow the register (plain substring match over tag and description). The header counts visible points and how many read GOOD.

The event log raises entries off real conditions in the frame, once per onset (a sustained excursion logs once, not every tick):

Priority Raised by
P1 (red) any bus voltage outside the 0.94-1.06 pu band
P2 (amber) corridor loading > 90 % of rating; frequency outside 49.9-50.1 Hz
P3 (muted) corridor loading > 70 % (watch); OLTC tap movement; return-to-normal notices

Acknowledge entries with the per-row ACK button or ACK ALL; the header tracks the unacknowledged count.

Clickable: every register row is a link. Clicking a voltage point opens that substation in the ASSETS explorer; clicking a flow or tap point opens the circuit or transformer. The app switches to the ASSETS tab for you.

Honesty notes: the STALE quality flag is simulated - one point per three-tick window is deterministically frozen to mimic an RTU dropout; no real telemetry quality is being reported. Tag names are derived from the model's substation/circuit names, not from a real EMS point database.

OPERATOR

The control-room system view. Frame-derived, in every mode:

  • frequency (colour-graded), RoCoF, system inertia, demand, generation, losses, voltage band,
  • boundary transfers vs their limits (flow, limit, loading %, headroom) - only for cases that carry a boundary model, e.g. the reduced UK case,
  • the dispatch stack by fuel (MW and share), and the synchronous-vs-converter split in GW,
  • largest loss - the largest online synchronous unit this frame. This is deliberate: the app shows the live credible loss, not the lake's 1,800 MW secured-event convention, and it shows the 3,600 MW Dogger Bank design basis alongside as a fixed reference.

Bridge-only (blank otherwise): balancing-mechanism acceptances (unit, kind, MW, price), active constraints (flow/limit/cost, binding flagged red), system warnings (a red banner plus a list), and the response / reserve / derated-margin / net-interconnector headline scalars.

Nothing on this tab is clickable; it is a read-only board. Use NESO RP1 for the drill-down versions of the same quantities.

MARKET

The trading view of the same instant. Frame-derived: demand, renewable share, and an indicative carbon intensity computed from the dispatched fuel mix with fixed per-fuel factors - a synthetic estimate, replaced by the lake's measured figure whenever a bridge tick carries one.

Bridge-only: imbalance price (SBP, colour-graded, with a rolling ~2-day sparkline), system sell price, market index, day-ahead price, BSUoS, constraint cost, net imbalance volume (system short/long), demand forecast, and the interconnector table (signed flow, IMPORT/EXPORT, price).

Nothing on this tab is clickable.

NESO RP1

A situational-awareness page built around one question: how long do I have? See docs/neso-rp1-and-mechanical.md for the design background.

  • Purchased time (hero gauge) - seconds of frequency ride-through on real intrinsic mass, computed each frame as the time to fall from the current frequency to 49.2 Hz at the RoCoF implied by the live credible loss. Green at >= 5 s, amber at >= 2 s, red below; the gauge caps at "> 10 s". The figure for the 3,600 MW design-basis loss is shown alongside.
  • Inertia split (fuel gauge) - three gauges: total GVA.s = (i) + (p), where (i) is intrinsic synchronous mass (the lake's measured figure in bridge mode, else sum H*MBase over the model's synchronous units) and (p) is the market/contracted component (bridge-only; 0 otherwise).
  • Credible loss - both live candidates: the largest online synchronous unit (named) and the largest correlated HVDC group (Sellindge IFA+ElecLink, North Sea NSL+Viking - group flows are bridge-fed). Whichever binds is highlighted. The 3,600 MW Dogger Bank design basis is fixed alongside, with the superseded 1,800 MW convention labelled as such.
  • Inertia by source - each fuel's share of intrinsic inertia, expressed in seconds of purchased time.
  • Stability trend - a rolling trace of purchased time (~30 min at half-hourly periods).
  • LFDD light - graded from purchased time: NORMAL >= 5 s, WATCH >= 3 s, ADVISORY >= 2 s, WARNING below; a falling trend escalates the colour to red and appends "down".
  • Narrative - an auto-generated handover sentence (inertia carried, purchased time, binding loss, top boundary loading).
  • Dispatch stack (left column) - per-fuel output, headroom, inertia, SYNC/CONV tag.
  • Boundary bars (right column) - transfer vs limit with trend arrows. For streamed gb-full there is no boundary model, so the bars are absent and a note says so; the constraint-cost list (bridge-only, shown as £k/h - the lake's daily figure divided by 24) still fills.
  • BM stability delta (bridge-only) - each acceptance graded by its inertia effect: a synchronous OFFER is "▲ inertia" (green), a synchronous BID "▼ inertia" (red), non-synchronous actions neutral. Needs the lake's BMU->fuel tags; rows without them show "watch".
  • Interconnectors (bridge-only) - flow, import/export, and a red dot on members of a correlated-trip corridor.

Clickable: dispatch-stack and inertia-by-source fuel rows, BM rows and interconnector rows all open the Inspector (below). Fuel -> constituent units -> an individual unit; interconnector -> its corridor with the co-members themselves drillable.

MECHANICAL

The plant-engineer view: what the machines are doing, per synchronous unit. Five sections: per-machine state (sorted most-stressed first), shaft/thermal, protection envelope, inertia roll-up, fleet trajectory.

The view filters to synchronous units at >= 10 MW output - converter-based plant carries no rotating mass and sub-MW embedded plant is noise at this level.

What is real and what is not. Provenance is explicit; this table is the tab's contract:

Field Status
MW output, loading vs Pmax, risk grade real (solved frame)
Stored kinetic energy (H*MBase), H real
MW ramp (MW/min), fleet trend, projected inertia +15 min real (frame-to-frame)
RoCoF relay margin real (frame RoCoF vs both thresholds)
P-Q capability envelope (Qmin/Qmax/Pmax) real limits
MVAr, power factor, excitation "-" - no per-generator reactive telemetry
AVR / governor mode synthetic labels
Stator/rotor temperature synthetic (a function of loading)
Torsional pulse count real-derived proxy (large MW steps), flagged
Certified J / type-test date, committed starts "-" - no asset register / commitment feed

Why no MVAr: the presolved and bridge feeds carry no per-generator reactive dispatch (Generator.Qg is zero), and reconstructing MVAr from the per-bus net reactive injection would misattribute line charging and shunt compensation to whatever machine happens to sit on the bus - an 11 MW CHP would read hundreds of MVAr. The view shows "-" rather than a fabricated number; the reactive columns fill only if a real plant feed is wired.

The dual RoCoF-relay margin shows the current frame RoCoF as a percentage of both protection settings - the original 0.125 Hz/s and the relaxed 1.0 Hz/s - side by side. The P-Q diagram plots the most-stressed machine's operating point inside its capability envelope; with no reactive telemetry the point sits on the P axis. The inertia roll-up compares the sum of asset kinetic energies with the reported system intrinsic figure (bridge-fed) and labels the difference the synthetic gap.

Clickable: any machine row opens the Inspector with the full per-machine card (each field labelled real / proxy / synthetic, as above).

CYCLE

What the parallel analysis engine did with the last cycle. The base Newton-Raphson power flow is single-core, but everything a control room runs after it converges - N-1 contingency sweeps, harmonics, RoCoF screening, physics conformance, the watch list - reads the same solved frame and is embarrassingly parallel. Each cycle does one single-core base solve, shares the immutable frame to every downstream analysis, and fans them out across a worker pool under a compute budget. This tab is that budget's read-out.

The tab is present in both faces - the WPF desktop app and the Blazor web dashboard - and both consume the same shared ResidentCycleService, so the telemetry cannot drift between them. In the desktop app the tab refreshes live as each cycle completes (the service's Updated event marshalled to the dispatcher), not just once per frame.

Hero - HIGH TIER MET or MISSED, alongside the utilization %. High-tier work (the base solve, the hot N-1 set, harmonics, the watch list) must complete every cycle and is never cancelled; MISSED means the budget could not cover it and is the one hard failure this tab watches for. Utilization is compute spent as a share of the budget.

Budget accounting (one card) - the core-millisecond ledger for the cycle:

  • base-solve ms - the single-core Newton-Raphson step this cycle fanned out from. (The WPF face does not time the base solve, so it shows "-" here.)
  • fan-out wall ms - wall-clock time the parallel drain took.
  • compute spent - core-seconds actually burned, against the budget of workers x window core-ms (28 cores x 1000 ms = 28,000 core-ms). The window is the wall-clock deadline; the budget scales with core count.
  • High done / total and Low done / admitted / deferred - the two tiers' completion. Low is admitted only while budget remains and runs under the deadline; any Low not served keeps its place at the front of the rotating pool so a later cycle covers it (round-robin coverage, no starvation).
  • Low cancelled at deadline - deferrable solves aborted mid-flight when the window closed (preemptive cancellation reaches into the NR inner loop).
  • backlog depth - Low jobs waiting for a future cycle.
  • N-1 coverage - how much of the full contingency set the rotating Low shards have covered over the recent cycles (e.g. 8/8 once a full rotation completes), plus the worst contingency seen.

Job table - every job this cycle, High first and then heaviest first, colour-coded by outcome: green completed, amber cancelled at the deadline, muted deferred (never started this cycle), red faulted (a job that threw is isolated - it does not take the cycle down). A full N-1 sweep appears as many small stable-id shard rows (n-1:lp:0, n-1:lp:1, ...); the hot set runs as High, the branch-index shards rotate as Low, so successive cycles walk the sweep to full coverage.

Frame-derived in every mode; nothing on this tab is clickable. On gb-full (3,539 buses) the base solve is tens of ms and leaves the 1000 ms window almost entirely to the fan-out, which is what the budget governs.

ASSETS

An explorer over every asset class in the running model, as a navigable page stack. The landing page shows one live card per class - GENERATORS, INTERCONNECTORS, TRANSFORMERS, CABLES & LINES, SUBSTATIONS, TAP CHANGERS - with counts and a headline metric. Click a card to open the class list, click an item to open its detail page.

Navigation is a stack: ‹ back pops one page, home returns to the landing page, and the breadcrumb shows the trail. Detail pages cross-link - a circuit links to its two substations, a substation to its connected plant and circuits, a generator back to its bus - so you can walk the network as a graph without returning home.

Pages re-read the live model every frame, so an open detail page tracks the running sim (or replay). Only the visible page refreshes; the tab does no work while it is off-screen. The header strip shows the sim time and tick of the frame you are looking at.

The SCADA register (above) deep-links into this tab; expect to arrive here already on a substation or circuit page.

The Inspector drill-down

NESO RP1 and MECHANICAL share a drill-down overlay: click an aggregate and the Inspector shows how it is made up for the currently displayed frame.

Anatomy: a title and subtitle, a row of headline stat tiles (totals and averages), and the constituent rows. A row that can drill further shows a chevron - click anywhere on it. Every hop pushes the previous page onto a back-stack; ‹ back retraces it and closes the overlay (clearing the stack).

Typical trails:

  • RP1 fuel row -> the fuel's units (count, total, mean, average loading, combined inertia) -> one unit's card -> its Fuel row drills back up.
  • RP1 interconnector row -> flow, infeed-loss risk, correlated corridor - with the corridor's other members drillable, so you can hop IFA -> ElecLink.
  • RP1 BM row -> the acceptance detail, including why it moves inertia.
  • MECHANICAL machine row -> the full per-machine card.

The Inspector reads the displayed frame only. Pause the transport bar to explore one instant; if you leave it playing, the numbers you drilled into belong to the frame you clicked on, not the one now showing.

See also