ci-server-engineer/.claude/skills/graphics/tasks/create-display.md
cliu 516729ff24 R1.05 findings from a user project (tested only)
Tested on the R1.05 test server 2026-10-09..12 with a user project (own
objects only); not yet on CI-Eng-Sample (ISS-188). Only results that
were tested are included; inferences, code-only and manual-only points
and the untested sample layout change were left out.
- layouts: 'logout' is a secondary logout, always disabled on the R1.05
  web client; 'exit' closes the window and ends the session (ISS-182).
- create-display: R1.05 web client table (String items in text vs
  textField, fixed text alignment, start-hidden limits ISS-183, two
  visibility conditions, On entry display actions, rectangle blinking,
  verified connections, first load).
- java-class 4a: signal arrays at scale, write on change, attribute
  arrays, offline javac/javap check; change-reset-class: new signals need
  the object recreated, attributes lost (ISS-185); opcdbg reset in cmd,
  TRIGGER_1 via dssqld -m.
- string-items (ISS-187), users-groups, modbus-station (400 registers,
  comm loss), export-dataset (NAME range filter), item-alarming.
- new task system-management/package-project.md; tools/ModbusSim.java
  (tested on R1.05: FC03/04/06/16, exceptions, modes); AMSI (ISS-186).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 21:57:08 +11:00

114 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
task: Build a display in the Edit Module and check the saved file
version: R1.05 (first written for R1.03)
source: IM 36K10C50-01EN (R1.03 3rd ed. Sep. 2023; R1.05 5th ed. Feb. 2026) §1.2, §1.7, §2, §2.22, §2.25, §2.31–2.33, §4.8.1, §4.12; practiced on CI-Eng-Sample (display CIENG_Tank) 2026-10-01; display XML written by the sample generator and checked on desktop and web 2026-10-02 to 2026-10-06 (installed web client code, component definitions in DEPLOY\components)
status: verified on R1.03 (Edit Module steps, saved XML, generator rules). R1.05: manual re-checked 2026-10-08 (section R1.05 below, from docs); not re-tested on the R1.05 test server (shared server, no displays may be deployed; component list comparison awaiting user verification)
---
# Build a display (Edit Module)
The user draws; Claude gives the steps and checks the result. The sample displays
`examples/CI-Eng-Sample/displays/CIENG_*.xml` are not drawn but written by a generator
(`displays/generator/`); *Writing display XML directly* lists the rules they follow.
## Steps for the user
1. Start the Edit Module and log in.
2. *File > New Display*, name `<DisplayName>`; tick **HTML display** if it should also run in a
browser (the editor then hides unsupported components and properties).
3. Add components from the component bar, for example:
- **Text** — title.
- **Number field** — in the Properties sheet click **Value**, open the connection dialog,
*Items* tab, pick `<Section>.<Tag>`.
- **Alarm Overview** — right-click > *Component Properties*; *Filter* tab for an ASA, section
or tag filter; *Types* tab for current/historical.
- **Trend** — component properties, pen 1 = `<Section>.<Tag>` (a new trend has 5 empty pens;
the item must be in a storage group).
4. *File > Save* (or *Save with Revision Information*). Close the tab when done: an open
display is locked (`<DisplayName>.lck`) and `jwuiutl` skips it.
## Check the saved file
Folder `%TLS_WAP_PATH%\cfg\operatorInterfaces\DEPLOY\displays\` (and with HTML mode also
`%TLS_WAP_PATH%\mobileoperator\operatorInterfaces\DEPLOY\displays\<DisplayName>.html`).
```
grep -n "<html>\|<width>\|<height>\|itemName\|itemId\|<source" <DisplayName>.xml
```
- `<html>true</html>` = HTML mode; `<width>`/`<height>` must be set for the HTML display.
- Item connections: `<itemName>` + `<itemId>` (node.group.number…); trend pens:
`<source type="sourceID" uri="ci:/item/<item>"/>` (`uri=""` = empty pen).
- Write a fixed value with a button (verified in the HTML display, buttons *Manual* / *Auto* on
the former `CIENG_Tank` and, since 2026-10-06, on `CIENG_Control`): `<button>` › `<data>` › `<action type="actionSetItemAttribute">` with
`<event type="event" event="On action"/>`, `<filter type="filter"><value>1.0</value></filter>`
and a `<connection>` with `<direction>2</direction>`, `<itemName>`, `<itemAttribute>ItemValue`
(the factory popups use `ItemValueOW`, presumably the overwrite variant like `itmval -o`; not tested). The factory popup `AOG_SetNumberPV` uses the
same action behind its *Apply* button.
- After the item is deleted and loaded again it gets a **new id**; the display still validates,
but on 2026-10-01 the HTML display showed **0** and the popup `ITM-E-NO_MAIN, No main item
found` for a number field whose stored `<itemId>` was stale, also in a fresh session. Deleting
the `<itemId>` line (keeping `<itemName>`) and redeploying fixed it: the field binds by name.
Sample displays therefore carry no `<itemId>`; for displays made in the Edit Module, reconnect
or remove the ids after reloading items (ISS-052).
## Writing display XML directly (verified 2026-10-02 to 2026-10-06)
The Edit Module stores one element per component (`<text>`, `<number>`, `<rectangle>`, `<arc>`,
`<button>`, `<slider>` …, names as in `DEPLOY\components\*.xml`), its position as centre plus half
sizes, and the connections in `<data>`. Files written by hand or by a script load in the Edit
Module, the Operator Interface and the HTML display, if these rules are kept (sample generator:
`examples/CI-Eng-Sample/displays/generator/`):
| Topic | Rule (R1.03.00) |
|---|---|
| Text / number size | With `<keepOriginalSize>false` the HTML export **scales the text to its box** (e.g. `scale(0.98, 3.80)` in a 40 px box); with `true` it is drawn at its font size, centred on the box (tested 2026-10-06) |
| Rectangle rounding | `roundingX` / `roundingY` are a **fraction 0..1** of the half width / height; values above 1 draw an ellipse, on the desktop and on the web (tested 2026-10-06) |
| Arc angles | `startAngle` / `extentAngle` in degrees **clockwise** from 3 o'clock (screen y down), negative values allowed; the same on both clients, fixed or connected (tested 2026-10-06: 0/90 = lower-right quarter) |
| Click on a shape | event `Clicked b1` (buttons: `On action`), e.g. an *Open display* action on a rectangle (2026-10-02) |
| Item attributes for the web | `ItemValue`, `ItemDesc`, `ItemStatusMnemonic`, `ItemUpdTime` (epoch seconds), `ItemHHL` / `ItemHL` / `ItemLL` / `ItemLLL` (limits), `ItemName` (micro trend pens), list in the web client code; `ItemDescription` does not exist (sample faceplate and Control tab, 2026-10-06) |
| Showing a time | number field with `<asDateTime>true` connected to `ItemUpdTime`; a `dateTimeField` shows the value on the web only when editable (2026-10-02/06) |
| Server-side command | `<action type="actionExecuteCommand">` with `<command>` and `<onServer>true</onServer>` runs on the CI Server node as the service account `CIX_PROCESS`, also from the web; a user in the factory group `OPERATOR` may use it (tested 2026-10-06, sample live-data *Start*) |
| Alarm overview | `autoFit` true in a tab that is hidden while loading squeezes all columns to ~0 px on the web: set `autoFit` false and give `column<Name>Width`; `column…Visible` for `AlarmAttribute` is an array property (a plain value fails the HTML export with `ClassCastException`); the empty part of the list stays **white** on both clients (no property; web: `jquery.dataTables.css` forces it); web rows are 20 px at a 14 px font (2026-10-02/06) |
## R1.05 web client: findings from a generated display (verified 2026-10-12, user project on the R1.05 test server, 2026-10-09 to 10-12)
A generated display with about 1,900 components (6 MB XML, 1 MB HTML) on the R1.05 web client:
| Topic | Finding |
|---|---|
| Text bound to a String item | `<text>` with `text.value` ← `ItemValue` works. `keepOriginalSize` false stretches it to the box (as on R1.03, unreadable for changing text); `true` draws it centred at natural size, good for centred values. For **left-aligned** changing text use a `<textField>`: `textField.value` ← `ItemValue`, `<editable>false`, `<borderType type="border" value="BorderEmpty"/>`, justification `TextJustificationLeft` (or `Right`). `<opaque>false` is ignored: set `backgroundColor` to the colour behind it, or connect `textField.backgroundColor` through a threshold with output type `ColorSet` when the background changes. |
| Fixed text that must align | A `<text>` is centred on its box at its natural width; on one viewer's client long lines started left of their box. A `<textField>` with a fixed `<value>` (no connection) is left-aligned (checked in the test browser). |
| Hidden at start | `<visible>false</visible>` plus a `*.visible` connection: rectangles, texts and numbers appear when the condition becomes true; **ellipses, textFields and numberFields stay hidden**. Leave those visible at start. Without a start value every conditional component is drawn until the first values arrive. |
| Two conditions | Two connections to the same `*.visible` property do not combine (numbers stayed visible after one of their two conditions became false). Encode the condition in one item (e.g. a state item the calculation writes). |
| Display actions on open | Actions placed directly in `coreObjectDefinition` (before the first layer, as in the factory `AOG_ItemFaceplate`) with `<event type="event" event="On entry"/>` run when the display opens **and** on *Reload*; e.g. `actionSetItemAttribute` to reset a selection item. |
| Blinking | `rectangle.blinking` ← item through a threshold (output Boolean) plus a `blinkingPaint` blinks (the component toggles visibility at the display's `blinkDelay`, 500 ms). |
| Also verified | `numberField` with `asDateTime` on `ItemValue` (epoch seconds); `text.fillPaint`, `rectangle.strokePaint`, `ellipse.strokePaint` through thresholds; `actionSetItemAttribute` with event `Clicked b1` on a rectangle and on a number (a number drawn on a clickable shape needs its own action, it catches the click). |
| Size and first load | Once the first values took about a minute on a display this size; later loads took 3–10 s. |
## R1.05: component changes since R1.03 (from docs, IM 36K10C50-01EN 5th ed.)
| Component / sheet | Change (version) |
|---|---|
| *Calculation/Function* → **Generic Functions** (§2.31) | Renamed (R1.05 manual). Timing now documented: *Date and Time* runs every 200 ms; other operations check their inputs every 100 ms and run on a change, and also when the display is loaded or reloaded. |
| Generic Functions: **Password Check** (R1.04) | Inputs T[I1] user name, T[I2] password; B[O] TRUE and T[O] = user name if the pair is valid, else FALSE and the DSS error text (e.g. `DSS-E-UNK_USER`). Needs the login method *Manual CI Server* or *Manual OS* for the Password Check function in `dssana.sup` (*Login control* tab; skill `authorization`). Not tested. |
| Generic Functions: **RDP Connect** (R1.05) | When triggered, writes an `.rdp` file and starts a Remote Desktop session to T[I1] (host or IP). Optional T[I2] RemoteApp alias/program, T[I3] RemoteApp command line, T[I4] RD Gateway (`host[:port]`, default 443). T[O] receives the generated file name. Installed helper: `%TLS_ROOT_PATH%\tls\com\connectrdp.cmd`. Not tested (needs a remote desktop target). |
| JavaScript Function (§2.32) | Wording: inputs checked every 100 ms, script runs on a change and also when the display is loaded/reloaded (R1.03 text implied no run at load). |
| Alarm overview (§2.22, R1.04/R1.05) | New *[Acknowledgement]* properties: **Use Custom Acknowledgement** (acknowledge from a user-made window instead of the overview) enables *Acknowledge Event*, *Acknowledged Alarm*, *Acknowledged Alarm Text*, *Acknowledged Alarm Time*; *Selected Alarm Key*; *[External Acknowledgement]* (*Alarm Key*, *Approver*, *Reason*, *Trigger*); *[Enterprise Alarm Locations]* for enterprise displays. |
| Actions sheet (§4.12, R1.04) | *Update item/parameter* on an item, object signal or parameter can carry **Reason** (≤ 256 chars) and **Approver** (≤ 128 chars); they land in `AUDIT_TRAIL` fields `APPROVAL_REASON` / `APPROVER` (skill `audit-trail`). Two documented recipes for alarm acknowledgement with reason/approver: via an item parameter (attribute *Acknowledged* = 1, item alarms only) or via the overview's *External Acknowledgement* properties (item and external alarms). Not tested. |
| Dataset tables (§2.25, R1.05) | Column **Icon**, *Icon filter* (`<v>`, `!<v>`, `&<v>` bit test), *Icon tooltip*; *Operator can use column sorters*; *Operator can select row(s)* / *multiple rows*; *[Enterprise Dataset Locations]*; enterprise location supported on the HTML display. |
| Report (§2.26, R1.05) | New *[Enterprise]* category (primary / secondary data location). |
| Web Browser (§2.33, R1.05) — **web client: external pages are blocked** by the R1.05 default Content-Security-Policy (verified 2026-10-09, ISS-111); only pages from the CI Server itself load, unless the host is added as `frame-src` in `jwuiisg.sup` (skill `portal-setup`, `check-web-access.md`; verified). Component type `extendedIExplorer` (class `WebBrowserChromium`), property `url` | New browser engine: protocols WebRTC, HTTPS, WebSocket, HTTP/2, HTTP/3; codecs VP8, VP9, WebM, Opus, Vorbis, PCM. Content that played on R1.04 or earlier may not play after the upgrade. Right-click menu; new properties *Go Home/Stop/Reload*, *[Printing]*, *[Status]*, *[Security]* (*Enable Microphone/Camera*, *Allow Insecure Certificates*, *Allow Local file access*). Local files for CI Mobile View must be placed under `%TLS_ALLUSERS_PATH%\wap` and opened by URL. |
| Display generator (§2.36) | The note "not supported on HTML displays" was removed in the R1.05 manual; R30 §4.8 does not list it. Treat web support as unconfirmed. |
| `jwuiutl -m` / `-M` (§1.5) | Output now described as space-separated (R1.03 manual: CSV). On R1.03 `-m` printed comma-separated lines (verified); R1.05 output not checked (ISS-094). |
## Verified (CIENG_Tank, 2026-10-01)
Text `CI-Eng-Sample Tank 1`, number field on `TANK1.LEVEL` (live: 72 → 61), alarm overview
(no filter; listed the TANK1.LEVEL alarms), trend pen `TANK1.LEVEL` (legend
`CI-Eng-Sample.TANK1.LEVEL [CIENG_SCAN10S]` = highest-priority storage group). In the HTML
display the trend drew no line: a trend needs 50 visible pens to draw on the web (ISS-041;
workaround and all trend settings in `trend.md`). The sample file is now padded with
`add_trend_spares.ps1` (49 spares) and draws in the browser too. `CIENG_Tank` was replaced by the
generated `CIENG_*` displays on 2026-10-06; they carry no `<itemId>` and found the recreated items
after a full `remove.cmd` / `load.cmd` cycle in a fresh session (2026-10-06).