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.
5.8 KiB
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
- No hand-drawn values or buttons. If it shows a number it is
WRPS_Value; if it is clickable it isWRPS_Button. This is what stops displays drifting. - Faceplates are separate displays opened via
displayToActivate, matching how AOG works — not overlay groups on the parent display. - Setpoint edits go through a numeric entry popup, not an inline field.
- State is never colour alone.
WRPS_Statecarries a square marker and its own text, so it survives a projector or a colour-blind operator. - Simulation controls stay in the band. They never appear beside plant controls.
- An abnormal condition propagates everywhere it is relevant — banner, plant symbol, instrument bubble, value box, faceplate badge. One fault, five places.
- 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). - 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.