wrps-demo-kit/04-scada/hmi/component-kit.md
Clio Liu 947f632d7f feat(scada): CI Server tag database, historian, displays
The old 05-scada/, restructured around the distinction its README never
drew: configuration is deployed with dssqld, displays are deployed by
file copy. Conflating the two is what made the folder confusing.

  modbus_points/          the tag database - named for the protocol,
                          since CI Server configures others differently
  modbus_points/historian/  3 groups, 49 bindings - HAND-MADE, no
                          generator, and drifted from the server
  hmi/                    displays and their generator
  ciserver-backup-2026-08/  outdated exports, evidence only, never import
  QUICKLOAD.md            dssqld export/import, the 5 classes, the import
                          order, and why an item import kills every display
  README.md               the chain end to end, and the not-updating triage

Verified during the move - the whole chain is reproducible:
  scada-points.csv and all three .qli regenerate byte-identically
  all six displays build clean

Removed the K offset machinery from build_display.py, item-ids.meta.json
and DEPLOY.md. K was a consistency check on measured ids, not a source of
them, and diagnosing a dead screen by arithmetic is wasted effort when
validating the display in CI Server's Editor Module fixes it outright.
The guidance now leads with that one action.

Recorded, not fixed: the repo's historian config disagrees with the
2026-08 CI Server export - WRPS_THIRTY_SEC and a FIVE_SECONDS group exist
on the server and not here. cicore1 was unreachable during this audit, so
which is correct is unknown.

Not carried across: __pycache__, out/*.xml, and the top-level
WRPS_Overview.xml that was tracked despite .gitignore declaring the
display XMLs to be build output.
2026-09-02 17:16:18 +10:00

5.8 KiB
Raw Blame History

The WRPS component kit

The house style for this project's displays. AOG is the reference for how a component is parameterised — it is not used directly, and only the components this project needs exist.

Applies to this display and every future display in the project. A new requirement adds a component here; it never adds a second style.

Tokens

Named like AOG's AOG_C* so they map onto CI Server global parameters. A restyle is an edit to this table and nothing else.

Token Value Use
WRPS_CBG #EDF0F4 display ground
WRPS_CSF #FFFFFF panel / surface
WRPS_CSF2 #F5F8FB recessed surface, inside a value box
WRPS_CBD #C3CCD8 border — heavier than a desktop design, for distance
WRPS_CBD2 #DFE5EC hairline, internal dividers
WRPS_CT1 #0E1621 primary ink
WRPS_CT2 #465468 labels, secondary ink
WRPS_CAC #0B7DA8 interaction only — selected, focus, faceplate rule
WRPS_CAC2 #12A5D9 accent bright — focus ring
WRPS_CRUN / bg #0F8A45 / #E4F6EA running / on
WRPS_CWRN / bg #A85B00 / #FFEFD2 attention
WRPS_CALM / border #D32029 / #96131A alarm — always a filled block
WRPS_CPRC #2B3F52 pipe and vessel outline
WRPS_CWTR #9FCFE6 liquid fill

Colour policy. The plant is drawn in ink on white. Cyan means you can act on this; green, amber and red mean the plant is telling you something. Nothing else is coloured, so an abnormal state is the only colour on the screen.

Abnormal is a filled block, never coloured text. At distance, red text on white reads as slightly darker grey; a filled red block with white text does not. One fault propagates to every place it is relevant — banner, symbol, instrument bubble, value box, faceplate badge — so it cannot be missed from any part of the screen.

Type. Labels Segoe UI, values and tag names Consolas. Both ship with Windows, so nothing depends on a font that might not be installed — but Segoe is the modern face and Tahoma is what dates a screen. Consolas is monospaced, so digits keep their column as values update at 100 ms, and using it for tag names gives the display its technical read.

Sized for a TV. Nothing on the display is smaller than ~1.35% of screen height (about 15 px at 1080p); the wet well level is the largest thing at 4.6%, because it is the number a room actually watches. Ink is near-black on white and borders are heavier than a desktop design would use — contrast is what survives a bright room and a projector.

Why it does not look like AOG. What dates AOG is the bevelled 3D artwork and mid-grey ground, not the grey itself. This kit is flat, square-cornered, hairline bordered, white on cool neutral.

Components

Every one takes the AOG-shaped parameter set where it applies: item, setPointItem, tagName, format, showAlarmIndicator, selectable, displayToActivate.

Component Purpose Key parameters States
WRPS_Display The 16:9 shell: ground, title bar, body, simulation band
WRPS_Title Display header — name, drawing ref, station states right title, subtitle
WRPS_Panel Every framed region. Panels never nest header
WRPS_Value Every analog value item, tagName, format, units, size, displayToActivate normal · large · warn · alarm
WRPS_State Every discrete status item, onText, offText, inverse, severity off · on · warn · alarm
WRPS_Button Every command and mode selection label, item, writeValue, pressed, variant normal · pressed · destructive
WRPS_Pump Pump symbol, circle with impeller cross item, tagName, displayToActivate stopped · running · tripped
WRPS_Valve Swing check and manual isolation, from the P&ID legend kind static
WRPS_Instrument ISA bubble, function letters over loop number letters, loop, item static · with value
WRPS_Vessel Wet well: outline, liquid fill, setpoint ladder at true heights levelItem, setpointItems, range
WRPS_Faceplate Popup display frame — cyan rule, kit components inside title, subtitle, item
WRPS_AlarmBanner Present only when something is abnormal; pushes the display down alarmList, count hidden · active · acknowledged

WRPS_SimBand is not another component: it is WRPS_Button and WRPS_Value inside a fenced region with a cyan rule and a standing label, so the simulation controls can never be mistaken for plant control.

Rules

  1. No hand-drawn values or buttons. If it shows a number it is WRPS_Value; if it is clickable it is WRPS_Button. This is what stops displays drifting.
  2. Faceplates are separate displays opened via displayToActivate, matching how AOG works — not overlay groups on the parent display.
  3. Setpoint edits go through a numeric entry popup, not an inline field.
  4. State is never colour alone. WRPS_State carries a square marker and its own text, so it survives a projector or a colour-blind operator.
  5. Simulation controls stay in the band. They never appear beside plant controls.
  6. An abnormal condition propagates everywhere it is relevant — banner, plant symbol, instrument bubble, value box, faceplate badge. One fault, five places.
  7. Blink is reserved for unacknowledged alarms, and only on the tag name, not whole regions. CI Server supports this natively (blinkEnabled, blinkDelay, 700 ms in the reference screens).
  8. Green is only for genuinely-running equipment. If normal operation is colourful, red has competition and stops being an alarm.

Geometry

16:9. Laid out on the editor's 4 px snap grid; 1920 × 1080 unless told otherwise.