Merge pull request 'Phase 10b: Operator Interface layouts' (#11) from docs/phase-10b-operator-interface into main

Reviewed-on: cliu/ci-server-config#11
This commit is contained in:
Clio Liu 2026-10-01 15:51:16 +10:00
commit c761b20257
14 changed files with 698 additions and 208 deletions

View file

@ -1,15 +1,18 @@
--- ---
name: graphics name: graphics
description: >- description: >-
CI Server R1.03 operator graphics: displays, symbols, layouts and HTML displays. Use when the CI Server R1.03 operator graphics for the Operator Interface (desktop) and the HTML display
(web): displays, symbols, layouts. Use when the
user wants to create or change a display or symbol in the Edit Module (number field, text, user wants to create or change a display or symbol in the Edit Module (number field, text,
alarm overview, trend, buttons, actions, parameters, connecting a component to an item), alarm overview, trend, buttons, actions, parameters, connecting a component to an item),
deploy or remove display files, export displays to HTML / Mobile Operator, open a display in a deploy or remove display files, export displays to HTML / Mobile Operator, open a display in a
web browser (localhost:8080/mobileoperator), validate, search or unlock displays (jwuiutl, web browser (localhost:8080/mobileoperator), validate, search or unlock displays (jwuiutl,
.lck files), find where displays, symbols and layouts are stored (DEPLOY folder, .lck files), find where displays, symbols and layouts are stored (DEPLOY folder,
Layouts.xml), change layouts, menus, toolbars or frames, build dataset forms (*Dia.xml), or Layouts.xml), create or change layouts (operator window, navigation frame, main frame, alarm
banner, popup / faceplate window, kiosk or full-screen screen, menus, toolbars, status line,
frames, tabs, open a display in a frame or another layout), build dataset forms (*Dia.xml), or
use the AOG library (Advanced Operating Graphics, AOG_Style, AOG symbols, faceplates). Sources use the AOG library (Advanced Operating Graphics, AOG_Style, AOG symbols, faceplates). Sources
IM 36K10C50-01EN, IM 36K10R30-01EN, IM 36K10C60-01EN. IM 36K10C50-01EN, IM 36K10R30-01EN, IM 36K10C60-01EN and the installed Layouts.readme.
--- ---
# Graphics: displays, symbols, layouts (R1.03) # Graphics: displays, symbols, layouts (R1.03)
@ -27,13 +30,17 @@ Rules:
Reloading the browser page logs out — use the display menu *View > Reload*, and the display Reloading the browser page logs out — use the display menu *View > Reload*, and the display
box to open other displays. box to open other displays.
- `jwuiutl -vf`, `-u`, `-c`, `-a` rewrite or unlock files of **all** displays: only with approval. - `jwuiutl -vf`, `-u`, `-c`, `-a` rewrite or unlock files of **all** displays: only with approval.
- Ask the user to close the Edit Module before CI Server is stopped or restarted: otherwise the
next start fails (skill `system-check`, §3).
- The Operator Interface (desktop) reads `Layouts.xml` only at start: after layout changes,
restart it (a running client falls back to the current window and just reloads the display).
| Task | File | Status | | Task | File | Status |
|---|---|---| |---|---|---|
| Build a display in the Edit Module (text, number field, alarm overview, trend) and check the saved XML | `tasks/create-display.md` | verified | | Build a display in the Edit Module (text, number field, alarm overview, trend) and check the saved XML | `tasks/create-display.md` | verified |
| Deploy / remove display files, export HTML, validate and search with `jwuiutl` | `tasks/deploy-displays.md` | verified | | Deploy / remove display files, export HTML, validate and search with `jwuiutl` | `tasks/deploy-displays.md` | verified |
| Open and check a display in the browser (HTML display / Mobile Operator) | `tasks/deploy-displays.md` §4 | verified | | Open and check a display in the browser (HTML display / Mobile Operator) | `tasks/deploy-displays.md` §4 | verified |
| Layouts (`Layouts.xml`), menus, toolbars, frames, dual screen | R30 summary §2 | from docs | | Operator layouts (`Layouts.xml`): windows, menus, toolbars, frames, popups, kiosk screens; open displays in frames and layouts | `tasks/layouts.md` | verified (dual screen, per-user layout from docs) |
| Dataset forms (`*Dia.xml`) and the form description language | R30 summary §3 | from docs | | Dataset forms (`*Dia.xml`) and the form description language | R30 summary §3 | from docs |
| Symbols, parameters, actions, localisation, record/playback | C50 summary §1, §4, §5 | from docs | | Symbols, parameters, actions, localisation, record/playback | C50 summary §1, §4, §5 | from docs |
| AOG library (styles, symbols, faceplates, templates) | C60 summary | from docs | | AOG library (styles, symbols, faceplates, templates) | C60 summary | from docs |

View file

@ -0,0 +1,122 @@
---
task: Configure operator layouts (Layouts.xml): windows, menus, toolbars, frames, popups; open displays in frames and layouts
version: R1.03
source: Layouts.readme (installed, %TLS_WAP_PATH%\cfg\operatorInterfaces\DEPLOY\layouts); IM 36K10R30-01EN §1, §4.7; IM 36K10C50-01EN §4.12; practiced with CI-Eng-Sample (layout CIENG_Operator) in the Operator Interface (desktop) and the HTML display 2026-10-01
status: verified
---
# Operator layouts
A **layout** is a window of the Operator Interface: optional menu and toolbars, a **frame set**
(required) holding displays, and a status line. All layouts of a deployment are in one file,
`%TLS_WAP_PATH%\cfg\operatorInterfaces\DEPLOY\layouts\Layouts.xml`, used by **both** the
Operator Interface (desktop) and the HTML display (web). The complete option and command
reference is `Layouts.readme` in the same folder; `Layouts-original.xml` is the factory copy.
## 1. Rules
- `Layouts.xml` is shared by every operator: back it up and change it only with the user's
approval. Keep project layouts in a marked block so they can be removed cleanly (sample:
`examples/CI-Eng-Sample/layouts/layout.ps1` + `CIENG_Operator.xml`; the script checks the XML
is well-formed, keeps UTF-8 without BOM and CRLF, and `-Remove` restores the file byte for byte).
- **The Operator Interface reads `Layouts.xml` only when it starts.** After a change, close and
restart it. A running client does not know a new layout: opening a display in it only reloads
the current window ("blink"). The Edit Module also needs a restart to offer the new name in
the *Open display* action.
- Name the main frame **`default`**: the factory and AOG displays (alarm lists, faceplates,
toolbar commands) open their targets in a frame called `default`.
## 2. Structure
```xml
<layout name="<Name>" title="<text> $default" icon="poi.png" drawBorder="true"
sizingAllowed="true" minimizingAllowed="true" closingAllowed="true" alwaysOnTop="false"
initialPosition="centreScreen" initialSize="pixels" initialSizeWidth="1600"
initialSizeHeight="900" maximumOpen="1">
<menu> <menu-item name="m.file" label="File"> <menu-item … command="exit"/> </menu-item> … </menu>
<toolbar name="t1" floatable="false" position="top"> <toolbar-item icon="ciNavLeft32.png"
tooltip="Back to $" command="navigate back default"/> … </toolbar>
<frame-set rows="1*,fitDisplay"> <!-- main area, alarm banner below -->
<frame-set cols="fitDisplay,1*"> <!-- navigation left, main right -->
<frame name="nav" initialDisplay="<NavDisplay>" zoomingAllowed="false"/>
<frame name="default" initialDisplay="<Overview>" stackSize="10" zoom="fitDisplay"/>
</frame-set>
<frame name="alarmBannerFrame" initialDisplay="AOG_AlarmBanner" zoom="stretchDisplay"/>
</frame-set>
<status-line> <status-line-item type="statusText"/> <status-line-separator/> … </status-line>
</layout>
```
- `title`: `$<frame>` = title of the display in that frame (verified: *CI-Eng-Sample - Current
Alarm Overview*).
- Window: `initialPosition` (`centreScreen`, `atCursor`, `pixelsScreen2`, `centreLayout`, …),
`initialSize` (`pixels`, `screenSize`, `desktopSize`, `fitFrames`), `maximumOpen`, `modal`,
`alwaysOnTop`, print options.
- Frame sets: `rows` / `cols` with pixels, `n*` fractions or `fitDisplay`; nest freely; a `<tab>`
holds several frames as tabs (`tabPosition`, `maximumTabs`, `closeTabAllowed`). Frame options:
`name`, `initialDisplay` (= home display), `stackSize` (back/forward history), `zoom`
(`fitDisplay`, `stretchDisplay`, `<n>%`), `zoomingAllowed`, `scrollingAllowed`, `borderStyle`.
- Menu (max. two levels; `type` normal/check/radio/sub; `mnemonic`, `accelerator` like `F5`,
`CONTROL P`) and toolbar items (`icon` from the factory set such as `ciNavLeft32.png`,
`ciProAlar32.png`, `ciZoomFull32.png`; `type` combo/editableCombo/dropdownList) run commands:
| Command | Effect |
|---|---|
| `navigate to <frame> <display> [<zoom>] [<p>=<v>;…]` | Open a display in a frame (with parameters) |
| `navigate back/forward/up/home/history <frame>` | Frame history (`$` in the tooltip = target name) |
| `reload <frame>` / `reload all` | Reload displays (keeps the session in the HTML display) |
| `zoom <level> <frame>` | 0 = fit, 1 = 100 %, 10–1000 = relative % |
| `toggleSize fullScreen [n]` / `toggleSize x,y,WxH` | Full screen / given size and back |
| `print frame|frameWithSetup|preview|setup|selectFrame` | Printing (desktop only) |
| `login`, `logout`, `exit`, `toolbar`, `statusline`, `playback record|view`, `shell client|server <cmd>`, `lookfeel <class>`, `help` | |
The installed status line also uses item types `displayName`, `playbackIndicator` and
`dateTime`, which the readme does not list (ISS-042).
- `<translations name="nl">` blocks translate labels per locale (key = item name + `.label`).
## 3. Opening displays in frames and layouts
| From | How |
|---|---|
| Button / component (Edit Module, *Actions* sheet → *Open display*) | Display, **Layout** (empty = current window), **Frame**, parameters; stored as `<action type="actionActivateDisplay">` with `<type … value="ActivateSpecific"/>`, `<display>`, `<layout>`, `<layoutFrame>` |
| Menu / toolbar | `navigate to <frame> <display>` (current window only) |
| Login | User profile *Layout* and *Initial display* (Engineering Module, Authorization > Users); empty layout = `default` (from docs; not changed on the test system) |
| HTML display | URL `?d=<display>&l=<layout>` |
| Script on a component | *Execute command* with `ACTION <layout command>`, e.g. `ACTION toggleSize 50,50,710x520` |
Verified behaviour (desktop): a button with layout `CIENG_Operator` opened a **second window**
(1600 × 900, own menu/toolbar/frames); buttons without layout opened their display in the main
frame of the current window; **Back** returned. A button with layout `popup` opened a separate
window: always on top, only a close button, sized to the display (`fitFrames`), and minimised
together with the window that opened it — use popups only for small displays (faceplates,
setpoint dialogs).
## 4. Typical project layouts
- **Operator main window**: navigation frame + main frame `default` (+ tabs) + alarm banner,
project menu/toolbar, assigned to operators via the user profile *Layout*.
- **Kiosk / control-room screen**: `drawBorder="false"`, `alwaysOnTop="true"`,
`initialSize="screenSize"`, `closingAllowed="false"`, `minimizingAllowed="false"`.
`toggleSize fullScreen` covers the taskbar only when `alwaysOnTop="true"` (verified: with
`false` the title bar and taskbar stay).
- **Popups / faceplates**: small layout with one frame `default`, `initialSize="fitFrames"`,
`initialPosition="atCursor"`, `alwaysOnTop="true"`, `maximumOpen` > 1 for several faceplates
(factory: `popup`, `FixedPopup`, `ResizablePopup`, `faceplate`, `tuningpanel`, `Setpoint`,
`SelectMode`).
- **Several screens**: one layout per screen with `initialPosition="pixelsScreen2"` /
`centreScreen2`, or the dual-screen pattern of IM 36K10R30 §1.10.
## 5. HTML display differences
The browser window is the main layout (its size and window options are ignored); other layouts
open as windows inside the page; print, look-and-feel and the debug key are not supported; pick
the layout with `&l=`. Verified: `?d=CIENG_Tank&l=CIENG_Operator` showed the sample menu,
toolbar, navigation frame and banner.
## Verified (CI-Eng-Sample, 2026-10-01)
`layout.ps1` add / remove / add (removal identical to the original, backup kept); Operator
Interface restart required before the layout was found; desktop and web windows as described
above; F11 (`toggleSize fullScreen`) worked within the taskbar limits; after restarting the
Operator Interface the main window still used the factory `default` layout (Admin profile
unchanged).

View file

@ -83,6 +83,14 @@ prompt. Setup files (`*.sup`) are plain text (CRLF); edit them with the Setup Fi
(observed 2026-10-01: a run started 17:25 ran out at 09:52 the next morning after a sleep); (observed 2026-10-01: a run started 17:25 ran out at 09:52 the next morning after a sleep);
some processes (e.g. `umh`) stay attached, but `dssqld`/`itmval` fail and the log shows some processes (e.g. `umh`) stay attached, but `dssqld`/`itmval` fail and the log shows
`ISF-F-LIC_PROB, DATABASE Service is not licensed`. `ISF-F-LIC_PROB, DATABASE Service is not licensed`.
- **Close the Edit Module (and Engineering Module) before stopping CI Server.** A local Edit
Module is attached to the BUS Service (`JWUIGED<pid>`, a `java.exe` in the user's session) and
does not stop with the service. The next start then aborts at once; `%TLS_LOG_PATH%\ci_start.log`
shows `CI Server is already running` / `umh_panic: durwfp, CI Server has not been properly
stopped, kill the following processes …` with the list (seen 2026-10-01: `JWUIGED12760` kept
UMH, DURTIM, UMHLOG … listed). Fix: close the Edit Module (or end that `java.exe`), then start
again. Avoid `durstp -k -p *` unless the user approves. The Operator Interface (desktop) and the
HTML display connect through the web server and were not in the list.
## 4. Time synchronization ## 4. Time synchronization

View file

@ -1,173 +1,187 @@
# CI-Eng-Sample # CI-Eng-Sample
A small, invented sample project that anyone with this repo can load into a CI Server A small, invented sample project that anyone with this repo can load into a CI Server
**R1.03** test system. Skills use its names in their examples, and every skill task is **R1.03** test system. Skills use its names in their examples, and every skill task is
re-tested against it so that no other project is needed. re-tested against it so that no other project is needed.
Built and tested on CI Server R1.03.00 (unlicensed test system), 2026-09-30. Built and tested on CI Server R1.03.00 (unlicensed test system), 2026-09-30.
## Load and remove ## Load and remove
Test systems only: loading writes to the CI Server database. CI Server must be running. Test systems only: loading writes to the CI Server database. CI Server must be running.
From an elevated prompt, call the scripts by full path (a bare `load.cmd` may not be found From an elevated prompt, call the scripts by full path (a bare `load.cmd` may not be found
from the current folder): from the current folder):
``` ```
cmd /c "<repo>\examples\CI-Eng-Sample\load.cmd" cmd /c "<repo>\examples\CI-Eng-Sample\load.cmd"
cmd /c "<repo>\examples\CI-Eng-Sample\remove.cmd" cmd /c "<repo>\examples\CI-Eng-Sample\remove.cmd"
``` ```
- Each step prints a summary and writes a `.qlo` listing; check that `Errors` is 0. - Each step prints a summary and writes a `.qlo` listing; check that `Errors` is 0.
- **Restart CI Server after loading** (stop, then start the CI Service): a new storage group - **Restart CI Server after loading** (stop, then start the CI Service): a new storage group
stores no history until CI Server restarts. stores no history until CI Server restarts.
- `load.cmd` on a system that already has the project reports `Exists` and changes nothing. - `load.cmd` on a system that already has the project reports `Exists` and changes nothing.
- `remove.cmd` takes about 1½ minutes: a storage group can only be deleted after its stop time - `remove.cmd` takes about 1½ minutes: a storage group can only be deleted after its stop time
has passed, so the script sets a stop time one minute ahead and waits. Removing the group has passed, so the script sets a stop time one minute ahead and waits. Removing the group
also deletes its history. also deletes its history.
## Current contents ## Current contents
| Name | Kind | Details | | Name | Kind | Details |
|---|---|---| |---|---|---|
| `CI-Eng-Sample` | Section | Top level | | `CI-Eng-Sample` | Section | Top level |
| `CI-Eng-Sample.TANK1`, `.PUMP1`, `.SYSTEM` | Sections | Tank, pump, system monitoring | | `CI-Eng-Sample.TANK1`, `.PUMP1`, `.SYSTEM` | Sections | Tank, pump, system monitoring |
| `CI-Eng-Sample.TANK1.LEVEL` | Item, Real | %, format `999.9`, limits LL 10 / L 20 / H 80 / HH 90, scale 0–100, stored in `CIENG_EVENT`; alarming on (ack type `CIENG_ACK`, area `CIENG_TANKS`; `16_item_alarm_df.qli`) | | `CI-Eng-Sample.TANK1.LEVEL` | Item, Real | %, format `999.9`, limits LL 10 / L 20 / H 80 / HH 90, scale 0–100, stored in `CIENG_EVENT`; alarming on (ack type `CIENG_ACK`, area `CIENG_TANKS`; `16_item_alarm_df.qli`) |
| `CI-Eng-Sample.TANK1.INFLOW` | Item, Real | m3/h, format `9999.9`, scale 0–500, stored in `CIENG_EVENT` | | `CI-Eng-Sample.TANK1.INFLOW` | Item, Real | m3/h, format `9999.9`, scale 0–500, stored in `CIENG_EVENT` |
| `CI-Eng-Sample.PUMP1.RUNNING` | Item, Boolean | | | `CI-Eng-Sample.PUMP1.RUNNING` | Item, Boolean | |
| `CI-Eng-Sample.PUMP1.MODE` | Item, Integer | 0 manual, 1 auto | | `CI-Eng-Sample.PUMP1.MODE` | Item, Integer | 0 manual, 1 auto |
| `CI-Eng-Sample.SYSTEM.CPU_LOAD` | Item, Real | Target for `intcpumon` | | `CI-Eng-Sample.SYSTEM.CPU_LOAD` | Item, Real | Target for `intcpumon` |
| `CI-Eng-Sample.SYSTEM.DISK_C` | Item, Real | Target for `intdskmon` (reports **used** %) | | `CI-Eng-Sample.SYSTEM.DISK_C` | Item, Real | Target for `intdskmon` (reports **used** %) |
| `CI-Eng-Sample.SYSTEM.PING_LOCALHOST` | Item, Integer | Target for `inttcpmon` (1 = reachable) | | `CI-Eng-Sample.SYSTEM.PING_LOCALHOST` | Item, Integer | Target for `inttcpmon` (1 = reachable) |
| `CI-Eng-Sample.SYSTEM.PROC_ALM` | Item, Integer | Target for `intmon` (1 = `alm` process running) | | `CI-Eng-Sample.SYSTEM.PROC_ALM` | Item, Integer | Target for `intmon` (1 = `alm` process running) |
| `CI-Eng-Sample.PUMP1.RUNNING.RUN_SECONDS` | Sub-item, Integrator | Running time in seconds (adds value × integration granule, `itm_int_secs` in `itm.sup`, default 1 s) | | `CI-Eng-Sample.PUMP1.RUNNING.RUN_SECONDS` | Sub-item, Integrator | Running time in seconds (adds value × integration granule, `itm_int_secs` in `itm.sup`, default 1 s) |
| `CI-Eng-Sample.TANK1.LEVEL.MAX` | Sub-item, Min-Max | Highest level seen | | `CI-Eng-Sample.TANK1.LEVEL.MAX` | Sub-item, Min-Max | Highest level seen |
| `CI-Eng-Sample.DEMO` | Section | Tutorial examples | | `CI-Eng-Sample.DEMO` | Section | Tutorial examples |
| `CI-Eng-Sample.DEMO.COUNTER` | Item, Integer | Counts 1…100, one step per second, written by `DEMO.INCR1` | | `CI-Eng-Sample.DEMO.COUNTER` | Item, Integer | Counts 1…100, one step per second, written by `DEMO.INCR1` |
| `CIENG_1S` | Trigger group | Every second | | `CIENG_1S` | Trigger group | Every second |
| `CIENG_INCR` | Class (traditional) | Increments `DEMO.COUNTER`, wraps at 100; compiled on load | | `CIENG_INCR` | Class (traditional) | Increments `DEMO.COUNTER`, wraps at 100; compiled on load |
| `CI-Eng-Sample.DEMO.INCR1` | Object | Instance of `CIENG_INCR` | | `CI-Eng-Sample.DEMO.INCR1` | Object | Instance of `CIENG_INCR` |
| `CI-Eng-Sample.TEMPLATES` | Section | Template items for classes | | `CI-Eng-Sample.TEMPLATES` | Section | Template items for classes |
| `CI-Eng-Sample.TEMPLATES.TPL_REAL` | Item, Real | Template for items that objects create (format `9999.9`, scale 0–1000) | | `CI-Eng-Sample.TEMPLATES.TPL_REAL` | Item, Real | Template for items that objects create (format `9999.9`, scale 0–1000) |
| `CIENG_TANK` | Class (traditional) | Prompt *Tank capacity (m3)*; signal `LEVEL` = `<object section>.LEVEL` (trigger on value); creates `<object>.VOLUME` from `TPL_REAL`; volume = level × capacity / 100; logs when the level crosses 80; refuses capacity ≤ 0 | | `CIENG_TANK` | Class (traditional) | Prompt *Tank capacity (m3)*; signal `LEVEL` = `<object section>.LEVEL` (trigger on value); creates `<object>.VOLUME` from `TPL_REAL`; volume = level × capacity / 100; logs when the level crosses 80; refuses capacity ≤ 0 |
| `CI-Eng-Sample.TANK1.CALC` | Object | `CIENG_TANK`, capacity 200; creates section `TANK1.CALC` and item `TANK1.CALC.VOLUME` | | `CI-Eng-Sample.TANK1.CALC` | Object | `CIENG_TANK`, capacity 200; creates section `TANK1.CALC` and item `TANK1.CALC.VOLUME` |
| `CIENG_JFLOW` | Class (Java) | Attaches `<object section>.INFLOW`; creates `<object>.sPerMin` = inflow / 60; logs each change | | `CIENG_JFLOW` | Class (Java) | Attaches `<object section>.INFLOW`; creates `<object>.sPerMin` = inflow / 60; logs each change |
| `CI-Eng-Sample.TANK1.JFLOW` | Object | `CIENG_JFLOW`; creates item `TANK1.JFLOW.sPerMin` (mixed case, as the Java identifier) | | `CI-Eng-Sample.TANK1.JFLOW` | Object | `CIENG_JFLOW`; creates item `TANK1.JFLOW.sPerMin` (mixed case, as the Java identifier) |
| `CIENG_EVENT` | Item storage group | Event/Item, lifetime 1 week, rollover 1 day | | `CIENG_EVENT` | Item storage group | Event/Item, lifetime 1 week, rollover 1 day |
| `CIENG_SCAN10S` | Item storage group | Scan/Time every 10 s with quality, priority 10 (source for aggregation), lifetime 1 day, rollover 1 hour; `TANK1.LEVEL`, `TANK1.INFLOW` | | `CIENG_SCAN10S` | Item storage group | Scan/Time every 10 s with quality, priority 10 (source for aggregation), lifetime 1 day, rollover 1 hour; `TANK1.LEVEL`, `TANK1.INFLOW` |
| `CIENG_AGG` | Item storage group | Aggregation 30 min + hourly, lifetime 4 weeks, rollover 1 week; `TANK1.LEVEL` max/min/average (read with `INTERPOLATION = "30Minutes"` / `"Hour"`, `ATTRIBUTE = "Maximum"` …) | | `CIENG_AGG` | Item storage group | Aggregation 30 min + hourly, lifetime 4 weeks, rollover 1 week; `TANK1.LEVEL` max/min/average (read with `INTERPOLATION = "30Minutes"` / `"Hour"`, `ATTRIBUTE = "Maximum"` …) |
| `CI-Eng-Sample.PLC1` | Section | Modbus loopback station | | `CI-Eng-Sample.PLC1` | Section | Modbus loopback station |
| `CI-Eng-Sample.PLC1.COMM_OK` | Item, Boolean | Status item of station `CIENG_PLC` (1 = communicating, status 22 when off-scan) | | `CI-Eng-Sample.PLC1.COMM_OK` | Item, Boolean | Status item of station `CIENG_PLC` (1 = communicating, status 22 when off-scan) |
| `CI-Eng-Sample.PLC1.SETPOINT` / `.READBACK` | Items, Integer | Written to holding register 1 (`RO:1`) / read from input register 1 (`RI:1`), same memory | | `CI-Eng-Sample.PLC1.SETPOINT` / `.READBACK` | Items, Integer | Written to holding register 1 (`RO:1`) / read from input register 1 (`RI:1`), same memory |
| `CI-Eng-Sample.PLC1.CMD` / `.FEEDBACK` | Items, Boolean | Written to coil 1 (`DO:1`) / read from input bit 1 (`DI:1`), same memory | | `CI-Eng-Sample.PLC1.CMD` / `.FEEDBACK` | Items, Boolean | Written to coil 1 (`DO:1`) / read from input bit 1 (`DI:1`), same memory |
| `CIENG_MB_LINE` | Modbus line (TCP/IP) | Equipment manager `EQPCIENG` (created and started by loading the line) | | `CIENG_MB_LINE` | Modbus line (TCP/IP) | Equipment manager `EQPCIENG` (created and started by loading the line) |
| `CIENG_PLC` | Modbus station | Open Modbus/TCP to `localhost:5020`, unit 1, output method *On change and connect* | | `CIENG_PLC` | Modbus station | Open Modbus/TCP to `localhost:5020`, unit 1, output method *On change and connect* |
| `CIENG_SCAN1S` | Modbus scan type | 1000 ms | | `CIENG_SCAN1S` | Modbus scan type | 1000 ms |
| `CI-Eng-Sample.UA` | Section | OPC UA loopback station | | `CI-Eng-Sample.UA` | Section | OPC UA loopback station |
| `CI-Eng-Sample.UA.COMM_OK` | Item, Boolean | Status item of station `CIENG_UA` (1 = connected) | | `CI-Eng-Sample.UA.COMM_OK` | Item, Boolean | Status item of station `CIENG_UA` (1 = connected) |
| `CI-Eng-Sample.UA.LEVEL_COPY` | Item, Real | `TANK1.LEVEL` read back through CI Server's own OPC UA server | | `CI-Eng-Sample.UA.LEVEL_COPY` | Item, Real | `TANK1.LEVEL` read back through CI Server's own OPC UA server |
| `CI-Eng-Sample.UA.SRV_STATE` | Item, Integer | OPC UA server state node (ns 0, i=2259), 0 = Running | | `CI-Eng-Sample.UA.SRV_STATE` | Item, Integer | OPC UA server state node (ns 0, i=2259), 0 = Running |
| `CIENG_UA_LINE` | OPC UA client line | Client process `OPXCIENG` (created and started by loading the line) | | `CIENG_UA_LINE` | OPC UA client line | Client process `OPXCIENG` (created and started by loading the line) |
| `CIENG_UA` | OPC UA station | `opc.tcp://localhost:34493`, Basic256Sha256 / SignAndEncrypt, anonymous; subscription `CIENG_SUB` (1 s); points `LEVEL`, `SRV_STATE` | | `CIENG_UA` | OPC UA station | `opc.tcp://localhost:34493`, Basic256Sha256 / SignAndEncrypt, anonymous; subscription `CIENG_SUB` (1 s); points `LEVEL`, `SRV_STATE` |
| OPC visible | Flags | Sections `CI-Eng-Sample`, `TANK1` and item `TANK1.LEVEL` are OPC visible, item read-only (`12_opc_visible_df.qli`) | | OPC visible | Flags | Sections `CI-Eng-Sample`, `TANK1` and item `TANK1.LEVEL` are OPC visible, item read-only (`12_opc_visible_df.qli`) |
| `CIENG_ACK` | Acknowledgement type | Every alarm needs an acknowledgement; return to normal automatic only if the alarm was acknowledged (same matrix as `MANUAL`) | | `CIENG_ACK` | Acknowledgement type | Every alarm needs an acknowledgement; return to normal automatic only if the alarm was acknowledged (same matrix as `MANUAL`) |
| `CIENG_TANKS` | Area of interest | Label for tank items (`TANK1.LEVEL` `AOI_1`) | | `CIENG_TANKS` | Area of interest | Label for tank items (`TANK1.LEVEL` `AOI_1`) |
| `CIENG_TANK1` | Alarm selection area | `SECTION = "CI-Eng-Sample.TANK1"`, compiled on load | | `CIENG_TANK1` | Alarm selection area | `SECTION = "CI-Eng-Sample.TANK1"`, compiled on load |
| `CIENG_VIEWER` | Authorization group | Read-only: `ITEM_READ`, `SECTION_READ`, `ALARM_CURRENT_READ`, `ALARM_CHRONO_READ`. No users are created by the sample. | | `CIENG_VIEWER` | Authorization group | Read-only: `ITEM_READ`, `SECTION_READ`, `ALARM_CURRENT_READ`, `ALARM_CHRONO_READ`. No users are created by the sample. |
Items created by objects (`TANK1.CALC.VOLUME`, `TANK1.JFLOW.sPerMin`) and their sections are Items created by objects (`TANK1.CALC.VOLUME`, `TANK1.JFLOW.sPerMin`) and their sections are
deleted with the objects; they are not in `02_item_df.qli`. deleted with the objects; they are not in `02_item_df.qli`.
All items except `PLC1.*` are internal (no station). The `PLC1` station talks to CI Server's own Modbus slave mirror (see below), so no PLC is needed either. All items except `PLC1.*` are internal (no station). The `PLC1` station talks to CI Server's own Modbus slave mirror (see below), so no PLC is needed either.
New items start with status 13 (`NOT INIT`) until a value is written. New items start with status 13 (`NOT INIT`) until a value is written.
## Files ## Files
| File | Purpose | | File | Purpose |
|---|---| |---|---|
| `01_section_df.qli` | Sections (`SECTION_DF`); parents before children | | `01_section_df.qli` | Sections (`SECTION_DF`); parents before children |
| `02_item_df.qli` | Items (`ITEM_DF`) | | `02_item_df.qli` | Items (`ITEM_DF`) |
| `02b_sub_item_df.qli` | Sub-items (`SUB_ITEM_DF`) | | `02b_sub_item_df.qli` | Sub-items (`SUB_ITEM_DF`) |
| `03_his_group_df.qli` | Item storage groups (`HIS_GROUP_DF`): event, scan, aggregation | | `03_his_group_df.qli` | Item storage groups (`HIS_GROUP_DF`): event, scan, aggregation |
| `04_item_his_df.qli` | Items in the storage group (`ITEM_HIS_DF`, name `<group>:<item>`) | | `04_item_his_df.qli` | Items in the storage group (`ITEM_HIS_DF`, name `<group>:<item>`) |
| `05_trigger_df.qli`, `06_class_df.qli`, `07_object_df.qli` | Trigger group; classes (source in the `METHOD` memo, `@"` … `"@`, `COMPILE` 1; Traditional and Java); objects (`ATTR_VALUE_1` = prompt answer) | | `05_trigger_df.qli`, `06_class_df.qli`, `07_object_df.qli` | Trigger group; classes (source in the `METHOD` memo, `@"` … `"@`, `COMPILE` 1; Traditional and Java); objects (`ATTR_VALUE_1` = prompt answer) |
| `08_auth_group_df.qli` | Authorization group (`AUTH_GROUP_DF`) | | `08_auth_group_df.qli` | Authorization group (`AUTH_GROUP_DF`) |
| `09_modbus_line_df.qli`, `10_modbus_station_df.qli`, `11_item_eqp_df.qli` | Modbus line; station, scan type, points; items connected to points | | `09_modbus_line_df.qli`, `10_modbus_station_df.qli`, `11_item_eqp_df.qli` | Modbus line; station, scan type, points; items connected to points |
| `12_opc_visible_df.qli` | OPC visible / read flags (loaded with `dssqld -m`) | | `12_opc_visible_df.qli` | OPC visible / read flags (loaded with `dssqld -m`) |
| `13_opcua_line_df.qli`, `14_opcua_station_df.qli`, `15_item_opcua_df.qli` | OPC UA client line; station, subscription, points; connected items | | `13_opcua_line_df.qli`, `14_opcua_station_df.qli`, `15_item_opcua_df.qli` | OPC UA client line; station, subscription, points; connected items |
| `01b_alarm_df.qli` | Alarm definitions: acknowledgement type, area of interest, alarm selection area (`ALARM_ACK_DF`, `ALARM_AOI_DF`, `ALARM_ASA_DF`) | | `01b_alarm_df.qli` | Alarm definitions: acknowledgement type, area of interest, alarm selection area (`ALARM_ACK_DF`, `ALARM_AOI_DF`, `ALARM_ASA_DF`) |
| `16_item_alarm_df.qli` | Switch on alarming for `TANK1.LEVEL` (loaded with `dssqld -m`) | | `16_item_alarm_df.qli` | Switch on alarming for `TANK1.LEVEL` (loaded with `dssqld -m`) |
| `equipment/eqpciengslv_start.cmd`, `_stop.cmd` | Start/stop the Modbus slave mirror (copy to `tls\com`) | | `equipment/eqpciengslv_start.cmd`, `_stop.cmd` | Start/stop the Modbus slave mirror (copy to `tls\com`) |
| `76_`…`93_remove_*.qli` | Names to delete, in reverse order (alarm definitions last, `93`) | | `76_`…`93_remove_*.qli` | Names to delete, in reverse order (alarm definitions last, `93`) |
| `load.cmd`, `remove.cmd` | Run the steps in the right order | | `load.cmd`, `remove.cmd` | Run the steps in the right order |
| `displays/CIENG_Tank.xml` | Display (HTML mode): title, number field on `TANK1.LEVEL`, alarm overview, trend of `TANK1.LEVEL` | | `displays/CIENG_Tank.xml` | Display (HTML mode): title, number field on `TANK1.LEVEL`, alarm overview, trend of `TANK1.LEVEL`, button *Operator layout* |
| `displays/deploy_displays.cmd`, `remove_displays.cmd` | Copy the display into the operator interface and export its HTML version / delete both | | `displays/CIENG_Menu.xml` | Navigation display (200 x 700): *Tank 1*, *Current Alarm* (main frame), *Tank 1 popup* (layout `popup`) |
| `monitoring/*.sup.txt` | Setup-file lines for the monitoring processes (not applied by `load.cmd`) | | `layouts/CIENG_Operator.xml`, `layouts/layout.ps1` | Operator layout block and the script that adds/removes it in `Layouts.xml` |
| `displays/deploy_displays.cmd`, `remove_displays.cmd` | Copy the displays into the operator interface and export their HTML versions / delete them |
## Modbus slave mirror (for station CIENG_PLC) | `monitoring/*.sup.txt` | Setup-file lines for the monitoring processes (not applied by `load.cmd`) |
`CIENG_PLC` reads and writes CI Server's own Modbus slave: `eqpmdcmem` (slave memory) and ## Modbus slave mirror (for station CIENG_PLC)
`eqpmdcslvtcp` (Modbus TCP on port 5020). Without them the station reports bad communication
(`COMM_OK` = 0) but everything loads. To start them with CI Server, an administrator copies `CIENG_PLC` reads and writes CI Server's own Modbus slave: `eqpmdcmem` (slave memory) and
`equipment/eqpciengslv_start.cmd` and `eqpciengslv_stop.cmd` to `%TLS_ROOT_PATH%\tls\com`; `eqpmdcslvtcp` (Modbus TCP on port 5020). Without them the station reports bad communication
for a quick test they can also be started by hand from a normal prompt: (`COMM_OK` = 0) but everything loads. To start them with CI Server, an administrator copies
`equipment/eqpciengslv_start.cmd` and `eqpciengslv_stop.cmd` to `%TLS_ROOT_PATH%\tls\com`;
``` for a quick test they can also be started by hand from a normal prompt:
start eqpmdcmem -n EQPMDCMEM
start eqpmdcslvtcp -n EQPMDCSLVTCP -p 5020 ```
``` start eqpmdcmem -n EQPMDCMEM
start eqpmdcslvtcp -n EQPMDCSLVTCP -p 5020
Remove the two files from `tls\com` when the sample is removed. See skill `equipment`, task ```
`modbus-station.md`.
Remove the two files from `tls\com` when the sample is removed. See skill `equipment`, task
## OPC UA loopback (station CIENG_UA) `modbus-station.md`.
`CIENG_UA` is CI Server's OPC UA client connected to CI Server's own OPC UA server, so no ## OPC UA loopback (station CIENG_UA)
external server is needed. The **first** connection on a system needs a one-time certificate
exchange, done by the user (skill `data-access`, task `opcua-client.md` §4): `CIENG_UA` is CI Server's OPC UA client connected to CI Server's own OPC UA server, so no
external server is needed. The **first** connection on a system needs a one-time certificate
1. After loading, the client logs `OPXC-E-CER_NO_TRU`; trust the server certificate in exchange, done by the user (skill `data-access`, task `opcua-client.md` §4):
`%TLS_ALLUSERS_PATH%\pki\opxuac\pkiclient\rejected` (Engineering Module, or move it to
`…\pkiclient\trusted\certs`). 1. After loading, the client logs `OPXC-E-CER_NO_TRU`; trust the server certificate in
2. The server then rejects the client; move `CI_SERVER_OPCUA_CLIENT_OPXCIENG […].der` from `%TLS_ALLUSERS_PATH%\pki\opxuac\pkiclient\rejected` (Engineering Module, or move it to
`%TLS_ALLUSERS_PATH%\pki\opxuas\pkiserver\rejected` to `…\pkiserver\trusted\certs` `…\pkiclient\trusted\certs`).
(PowerShell: `Move-Item -LiteralPath`, the name contains brackets). 2. The server then rejects the client; move `CI_SERVER_OPCUA_CLIENT_OPXCIENG […].der` from
`%TLS_ALLUSERS_PATH%\pki\opxuas\pkiserver\rejected` to `…\pkiserver\trusted\certs`
Then `UA.COMM_OK` = 1 and `UA.LEVEL_COPY` follows `TANK1.LEVEL`. The trust is kept when the (PowerShell: `Move-Item -LiteralPath`, the name contains brackets).
sample is removed and loaded again.
Then `UA.COMM_OK` = 1 and `UA.LEVEL_COPY` follows `TANK1.LEVEL`. The trust is kept when the
## Alarms (TANK1.LEVEL) sample is removed and loaded again.
`TANK1.LEVEL` raises HIGH above 80 (Alarm 2, priority 2) and HIGH HIGH above 90 (Alarm 3, ## Alarms (TANK1.LEVEL)
priority 1). To try it on a test system: `itmval -p -n CI-Eng-Sample.TANK1.LEVEL -v 85`, export
`ALARM_CURRENT` (filter on `ITEM_NAME`), acknowledge with `dssqld -m` on `ALARM_CURRENT` `TANK1.LEVEL` raises HIGH above 80 (Alarm 2, priority 2) and HIGH HIGH above 90 (Alarm 3,
(`NAME`, `ACK` 1), write the level back below 80. See skill `alarm-management`, task priority 1). To try it on a test system: `itmval -p -n CI-Eng-Sample.TANK1.LEVEL -v 85`, export
`item-alarming.md`. `ALARM_CURRENT` (filter on `ITEM_NAME`), acknowledge with `dssqld -m` on `ALARM_CURRENT`
(`NAME`, `ACK` 1), write the level back below 80. See skill `alarm-management`, task
## Display (optional) `item-alarming.md`.
After `load.cmd`, run `displays\deploy_displays.cmd` (no admin rights) and open ## Displays and layout (optional)
`http://localhost:8080/mobileoperator/?d=CIENG_Tank` (CI Server login), or open `CIENG_Tank` in
CI View / the Edit Module. `displays emove_displays.cmd` deletes it again. See skill No admin rights needed. After `load.cmd`:
`graphics`.
1. `displays\deploy_displays.cmd` copies `CIENG_Tank` and `CIENG_Menu` into the operator
## Monitoring processes (optional) interface and creates their HTML versions.
2. `powershell -ExecutionPolicy Bypass -File layouts\layout.ps1` adds the layout
`monitoring/` holds the lines to add to the setup files in `%TLS_ROOT_PATH%\tls\sup\` so that `CIENG_Operator` to `Layouts.xml` (first run saves `Layouts-before-CIENG.xml`).
`intcpumon`, `intdskmon`, `inttcpmon`, `intmon` and `intspawn` write into the `SYSTEM` items. **Restart the Operator Interface** afterwards: it reads the layouts only at start.
These change the system's own setup files: back the files up first and restore them after 3. Operator Interface (desktop): open `CIENG_Tank` from the display box and click
testing. See the `system-management` skill, task `monitoring-processes.md`. **Operator layout** - a second window opens with the sample menu (File / View / Displays),
toolbar, `CIENG_Menu` on the left, `CIENG_Tank` in the main frame `default` and the alarm
## Planned additions banner. HTML display (web): `http://localhost:8080/mobileoperator/?d=CIENG_Tank&l=CIENG_Operator`
(CI Server login).
| Phase | Adds |
|---|---| Remove: `layouts\layout.ps1 -Remove` (restores the file exactly) and
| 10 | A symbol (the display `CIENG_Tank` exists) | `displays\remove_displays.cmd`. Close the displays in the Edit Module first. See skill
| 11 | A report | `graphics`.
## Rules ## Monitoring processes (optional)
- Test systems only; invented names only, no real plant or customer data. `monitoring/` holds the lines to add to the setup files in `%TLS_ROOT_PATH%\tls\sup\` so that
- Keep the load order: sections → template items → classes (compiled) → objects → other `intcpumon`, `intdskmon`, `inttcpmon`, `intmon` and `intspawn` write into the `SYSTEM` items.
items → storage groups → items in storage groups (IM 36K10J10 §5.6). Keep `remove.cmd` in These change the system's own setup files: back the files up first and restore them after
reverse order. testing. See the `system-management` skill, task `monitoring-processes.md`.
- Every file notes the CI Server version it was built and tested on.
## Planned additions
| Phase | Adds |
|---|---|
| 10 | A symbol and a faceplate popup (displays and the operator layout exist) |
| 11 | A report |
## Rules
- Test systems only; invented names only, no real plant or customer data.
- Keep the load order: sections → template items → classes (compiled) → objects → other
items → storage groups → items in storage groups (IM 36K10J10 §5.6). Keep `remove.cmd` in
reverse order.
- Every file notes the CI Server version it was built and tested on.

View file

@ -0,0 +1,97 @@
<?xml version="1.0" encoding="utf-8" ?>
<visualization protocolVersion="1.3.0.0">
<globalSection/>
<coreObjectDefinition type="displayDefinition">
<version type="version" value="1.3.0.0"/>
<html>true</html>
<width>200</width>
<height>700</height>
<referenceCheck>2</referenceCheck>
<defaultBgColor type="colorSet" r="255" g="255" b="255"/>
<defaultFgColor type="colorSet" r="0" g="0" b="0"/>
<defaultFont type="font" name="Tahoma" size="11" underline="false" strikethrough="false"/>
<defaultStroke type="stroke" width="1.0"/>
<grid type="grid" gridVisible="true" snappingActive="true" verticalSnapInterval="8" horizontalSnapInterval="8" onTop="false">
<color type="colorSet" r="0" g="0" b="0"/>
</grid>
<revisionHistory type="revisionHistory">
<revision type="revision" who="ADMIN" when="2026.10.01 15:05:12.398 AEST" what="Created" where="PXiSEDev"/>
</revisionHistory>
<blinkDelay>500</blinkDelay>
<blinkEnabled>true</blinkEnabled>
<mousePassThrough>false</mousePassThrough>
<visibilityGroup type="componentData">
<htmlId>2</htmlId>
<name>Overview</name>
<description>Always shown</description>
<minimumZoomEnabled>true</minimumZoomEnabled>
<minimumZoomFactor>10.0</minimumZoomFactor>
</visibilityGroup>
<visibilityGroup type="componentData">
<htmlId>3</htmlId>
<name>Rough</name>
<description>Shown when viewing viewing a large area</description>
<minimumZoomEnabled>true</minimumZoomEnabled>
<minimumZoomFactor>25.0</minimumZoomFactor>
</visibilityGroup>
<visibilityGroup type="componentData">
<htmlId>4</htmlId>
<name>Standard</name>
<description>Shown when using the default view setting</description>
<minimumZoomEnabled>true</minimumZoomEnabled>
<minimumZoomFactor>100.0</minimumZoomFactor>
</visibilityGroup>
<visibilityGroup type="componentData">
<htmlId>5</htmlId>
<name>Detail</name>
<description>Shown only when viewing a small area</description>
<minimumZoomEnabled>true</minimumZoomEnabled>
<minimumZoomFactor>400.0</minimumZoomFactor>
</visibilityGroup>
<visibilityGroup type="componentData">
<htmlId>6</htmlId>
<name>Intricacies</name>
<description>Shown only when viewing a very small area</description>
<minimumZoomEnabled>true</minimumZoomEnabled>
<minimumZoomFactor>1000.0</minimumZoomFactor>
</visibilityGroup>
<visualizationLayer type="componentData">
<htmlId>1</htmlId>
<name>Layer1</name>
</visualizationLayer>
<componentCountHint>3</componentCountHint>
<button type="componentData" x="100.0" y="44.0" top="20.0" bottom="20.0" left="84.0" right="84.0" rotation="0.0" shear="0.0">
<htmlId>7</htmlId>
<label>Tank 1</label>
<data type="data">
<action type="actionActivateDisplay">
<event type="event" event="On action"/>
<display>CIENG_Tank</display>
</action>
</data>
</button>
<button type="componentData" x="100.0" y="108.0" top="20.0" bottom="20.0" left="84.0" right="84.0" rotation="0.0" shear="0.0">
<htmlId>8</htmlId>
<label>Current Alarm</label>
<data type="data">
<action type="actionActivateDisplay">
<event type="event" event="On action"/>
<display>AOG_AlarmCurrent</display>
</action>
</data>
</button>
<button type="componentData" x="100.0" y="180.0" top="20.0" bottom="20.0" left="84.0" right="84.0" rotation="0.0" shear="0.0">
<htmlId>9</htmlId>
<label>Tank 1 popup</label>
<data type="data">
<action type="actionActivateDisplay">
<event type="event" event="On action"/>
<type type="displayActivationType" value="ActivateSpecific"/>
<display>CIENG_Tank</display>
<layout>popup</layout>
<layoutFrame>default</layoutFrame>
</action>
</data>
</button>
</coreObjectDefinition>
</visualization>

View file

@ -1,12 +1,23 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<visualization protocolVersion="1.3.0.0"> <visualization protocolVersion="1.3.0.0">
<globalSection/> <globalSection>
<intRef id="17">
<sharedObject type="data">
<action type="actionInternalServiced"/>
</sharedObject>
</intRef>
<intRef id="20">
<sharedObject type="protection" active="false" password="">
<userProtection type="userProtection" user=""/>
</sharedObject>
</intRef>
</globalSection>
<coreObjectDefinition type="displayDefinition"> <coreObjectDefinition type="displayDefinition">
<version type="version" value="1.3.0.0"/> <version type="version" value="1.3.0.0"/>
<html>true</html> <html>true</html>
<width>1984</width> <width>1984</width>
<height>760</height> <height>760</height>
<referenceCheck>4</referenceCheck> <referenceCheck>8</referenceCheck>
<defaultBgColor type="colorSet" r="255" g="255" b="255"/> <defaultBgColor type="colorSet" r="255" g="255" b="255"/>
<defaultFgColor type="colorSet" r="0" g="0" b="0"/> <defaultFgColor type="colorSet" r="0" g="0" b="0"/>
<defaultFont type="font" name="Tahoma" size="11" underline="false" strikethrough="false"/> <defaultFont type="font" name="Tahoma" size="11" underline="false" strikethrough="false"/>
@ -59,7 +70,7 @@
<htmlId>1</htmlId> <htmlId>1</htmlId>
<name>Layer1</name> <name>Layer1</name>
</visualizationLayer> </visualizationLayer>
<componentCountHint>4</componentCountHint> <componentCountHint>5</componentCountHint>
<text type="componentData"> <text type="componentData">
<htmlId>7</htmlId> <htmlId>7</htmlId>
<value>CI-Eng-Sample Tank 1</value> <value>CI-Eng-Sample Tank 1</value>
@ -92,9 +103,7 @@
</numberField> </numberField>
<alarmOverview type="componentData" x="1020.0" y="296.0" top="72.0" bottom="72.0" left="964.0" right="964.0" rotation="0.0" shear="0.0"> <alarmOverview type="componentData" x="1020.0" y="296.0" top="72.0" bottom="72.0" left="964.0" right="964.0" rotation="0.0" shear="0.0">
<htmlId>9</htmlId> <htmlId>9</htmlId>
<data type="data"> <data ref="17"/>
<action type="actionInternalServiced"/>
</data>
</alarmOverview> </alarmOverview>
<chart type="componentData"> <chart type="componentData">
<htmlId>10</htmlId> <htmlId>10</htmlId>
@ -107,9 +116,7 @@
<toolbarPosition type="borderLayoutPosition" value="PositionNorth"/> <toolbarPosition type="borderLayoutPosition" value="PositionNorth"/>
<shiftOffset>0</shiftOffset> <shiftOffset>0</shiftOffset>
<shiftLength>0</shiftLength> <shiftLength>0</shiftLength>
<protection type="protection" active="false" password=""> <protection ref="20"/>
<userProtection type="userProtection" user=""/>
</protection>
<enterpriseGroupLocation type="nodeName" node="$display$"/> <enterpriseGroupLocation type="nodeName" node="$display$"/>
<chartPanel> <chartPanel>
<name/> <name/>
@ -198,9 +205,7 @@
<useSampleInterval>true</useSampleInterval> <useSampleInterval>true</useSampleInterval>
<sampleInterval>0</sampleInterval> <sampleInterval>0</sampleInterval>
<optimised>true</optimised> <optimised>true</optimised>
<chartProtection type="protection" active="false" password=""> <chartProtection ref="20"/>
<userProtection type="userProtection" user=""/>
</chartProtection>
<pen type="pen"> <pen type="pen">
<type>256</type> <type>256</type>
<color type="colorSet" r="65" g="105" b="225"/> <color type="colorSet" r="65" g="105" b="225"/>
@ -468,20 +473,20 @@
<right>344.0</right> <right>344.0</right>
<rotation>0.0</rotation> <rotation>0.0</rotation>
<shear>0.0</shear> <shear>0.0</shear>
<data ref="17"/>
</chart>
<button type="componentData" x="404.0" y="68.0" top="20.0" bottom="20.0" left="84.0" right="84.0" rotation="0.0" shear="0.0">
<htmlId>11</htmlId>
<label>Operator layout</label>
<data type="data"> <data type="data">
<action type="actionInternalServiced"/> <action type="actionActivateDisplay">
<action type="actionConnectTo"> <event type="event" event="On action"/>
<property type="property" name="chart.attribute[00]"/> <type type="displayActivationType" value="ActivateSpecific"/>
<filter type="filter"> <display>CIENG_Tank</display>
<value>0.0</value> <layout>CIENG_Operator</layout>
</filter> <layoutFrame>default</layoutFrame>
<connection type="connection">
<itemName>CI-Eng-Sample.TANK1.LEVEL</itemName>
<itemId>1.1.268.0.0.1.1.7</itemId>
<itemAttribute>ItemValue</itemAttribute>
</connection>
</action> </action>
</data> </data>
</chart> </button>
</coreObjectDefinition> </coreObjectDefinition>
</visualization> </visualization>

View file

@ -7,4 +7,6 @@ cd /d "%~dp0"
set WAP=%TLS_WAP_PATH% set WAP=%TLS_WAP_PATH%
if not defined TLS_WAP_PATH set WAP=C:\Users\Public\Yokogawa\tls\wap if not defined TLS_WAP_PATH set WAP=C:\Users\Public\Yokogawa\tls\wap
copy /y CIENG_Tank.xml "%WAP%\cfg\operatorInterfaces\DEPLOY\displays\" copy /y CIENG_Tank.xml "%WAP%\cfg\operatorInterfaces\DEPLOY\displays\"
copy /y CIENG_Menu.xml "%WAP%\cfg\operatorInterfaces\DEPLOY\displays\"
call jwuiutl.cmd -e HTML -i -f DEPLOY CIENG_Tank call jwuiutl.cmd -e HTML -i -f DEPLOY CIENG_Tank
call jwuiutl.cmd -e HTML -i -f DEPLOY CIENG_Menu

View file

@ -1,7 +1,9 @@
@echo off @echo off
rem Remove the CI-Eng-Sample displays (operator interface and HTML version). CI Server R1.03.00. rem Remove the CI-Eng-Sample displays (operator interface and HTML version). CI Server R1.03.00.
rem Close CIENG_Tank in the Edit Module first. rem Close CIENG_Tank and CIENG_Menu in the Edit Module first.
set WAP=%TLS_WAP_PATH% set WAP=%TLS_WAP_PATH%
if not defined TLS_WAP_PATH set WAP=C:\Users\Public\Yokogawa\tls\wap if not defined TLS_WAP_PATH set WAP=C:\Users\Public\Yokogawa\tls\wap
del /q "%WAP%\cfg\operatorInterfaces\DEPLOY\displays\CIENG_Tank.xml" del /q "%WAP%\cfg\operatorInterfaces\DEPLOY\displays\CIENG_Tank.xml"
del /q "%WAP%\mobileoperator\operatorInterfaces\DEPLOY\displays\CIENG_Tank.html" del /q "%WAP%\mobileoperator\operatorInterfaces\DEPLOY\displays\CIENG_Tank.html"
del /q "%WAP%\cfg\operatorInterfaces\DEPLOY\displays\CIENG_Menu.xml"
del /q "%WAP%\mobileoperator\operatorInterfaces\DEPLOY\displays\CIENG_Menu.html"

View file

@ -0,0 +1,184 @@
<!-- CIENG-SAMPLE-BEGIN: CI-Eng-Sample operator layout (CI Server R1.03.00).
Added and removed by examples\CI-Eng-Sample\layouts\layout.ps1; do not edit inside Layouts.xml.
Window: menu, toolbar, navigation frame "nav" (left), main frame "default" (right),
alarm banner frame (bottom), status line. The main frame is called "default" because the
AOG displays (alarm lists, faceplates) open their targets in a frame named "default". -->
<layout
name="CIENG_Operator"
title="CI-Eng-Sample - $default"
icon="poi.png"
drawBorder="true"
sizingAllowed="true"
minimizingAllowed="true"
closingAllowed="true"
alwaysOnTop="false"
initialPosition="centreScreen"
initialPositionX="0"
initialPositionY="0"
initialSize="pixels"
initialSizeWidth="1600"
initialSizeHeight="900"
maximumOpen="1">
<menu>
<menu-item
name="cieng.menu.file"
label="File"
mnemonic="f">
<menu-item
name="cieng.menu.file.print"
label="Print..."
mnemonic="p"
tooltip="Print $"
command="print frameWithSetup"/>
<menu-separator/>
<menu-item
name="cieng.menu.file.exit"
label="Exit"
mnemonic="x"
tooltip="Close this window"
command="exit"/>
</menu-item>
<menu-item
name="cieng.menu.view"
label="View"
mnemonic="v">
<menu-item
name="cieng.menu.view.reload"
label="Reload"
mnemonic="r"
accelerator="F5"
tooltip="Reload $"
command="reload default"/>
<menu-item
name="cieng.menu.view.reload.all"
label="Reload All"
mnemonic="a"
tooltip="Reload all displays"
command="reload all"/>
<menu-separator/>
<menu-item
name="cieng.menu.view.fullscreen"
label="Full screen"
mnemonic="u"
accelerator="F11"
tooltip="Toggle full screen"
command="toggleSize fullScreen"/>
</menu-item>
<menu-item
name="cieng.menu.displays"
label="Displays"
mnemonic="d">
<menu-item
name="cieng.menu.displays.tank"
label="Tank 1"
mnemonic="t"
tooltip="Tank 1 overview"
command="navigate to default CIENG_Tank fitDisplay"/>
<menu-separator/>
<menu-item
name="cieng.menu.displays.alarmCurrent"
label="Current alarms"
mnemonic="c"
tooltip="Current alarm list"
command="navigate to default AOG_AlarmCurrent"/>
<menu-item
name="cieng.menu.displays.alarmHistory"
label="Alarm history"
mnemonic="h"
tooltip="Historical alarm list"
command="navigate to default AOG_AlarmHistory"/>
<menu-item
name="cieng.menu.displays.trend"
label="Trend"
mnemonic="r"
tooltip="Trend display"
command="navigate to default AOG_TrendOpen"/>
</menu-item>
</menu>
<toolbar
name="cieng.toolbar"
label="CI-Eng-Sample"
floatable="false"
position="top">
<toolbar-item
name="cieng.toolbar.back"
icon="ciNavLeft32.png"
label=""
tooltip="Back to $"
command="navigate back default"/>
<toolbar-item
name="cieng.toolbar.forward"
icon="ciNavRight32.png"
label=""
tooltip="Forward to $"
command="navigate forward default"/>
<toolbar-item
name="cieng.toolbar.home"
icon="ciOverview32.png"
label=""
tooltip="Home to $"
command="navigate home default"/>
<toolbar-item
name="cieng.toolbar.history"
tooltip="History"
label="History"
type="editableCombo"
command="navigate history default"/>
<toolbar-separator/>
<toolbar-item
name="cieng.toolbar.alarmCurrent"
icon="ciProAlar32.png"
label=""
tooltip="Current alarm list"
command="navigate to default AOG_AlarmCurrent"/>
<toolbar-item
name="cieng.toolbar.zoomFit"
icon="ciZoomFull32.png"
label=""
tooltip="Fit display"
command="zoom 0 default"/>
</toolbar>
<frame-set
rows="1*,fitDisplay"
borderStyle="none">
<frame-set
cols="fitDisplay,1*"
borderStyle="none">
<frame
name="nav"
stackSize="1"
zoomingAllowed="false"
scrollingAllowed="false"
initialDisplay="CIENG_Menu"
borderStyle="none"/>
<frame
name="default"
stackSize="10"
zoomingAllowed="true"
scrollingAllowed="true"
initialDisplay="CIENG_Tank"
borderStyle="line"
zoom="fitDisplay"/>
</frame-set>
<frame
name="alarmBannerFrame"
zoomingAllowed="false"
initialDisplay="AOG_AlarmBanner"
borderStyle="none"
zoom="stretchDisplay"/>
</frame-set>
<status-line>
<status-line-item
type="statusText"/>
<status-line-separator/>
<status-line-item
type="displayName"/>
<status-line-separator/>
<status-line-item
type="userName"/>
<status-line-separator/>
<status-line-item
type="dateTime"/>
</status-line>
</layout>
<!-- CIENG-SAMPLE-END -->

View file

@ -0,0 +1,34 @@
# Add or remove the CI-Eng-Sample layout block in Layouts.xml (CI Server R1.03.00).
# Usage: powershell -ExecutionPolicy Bypass -File layout.ps1 [-Remove]
# The block between <!-- CIENG-SAMPLE-BEGIN and <!-- CIENG-SAMPLE-END --> is inserted after
# the last layout (before the translations; an existing block is replaced). The first run
# saves Layouts-before-CIENG.xml next to Layouts.xml.
# No admin rights needed. Reopen the Operator Interface (or View > Reload All) afterwards.
param([switch]$Remove)
$wap = $env:TLS_WAP_PATH
if (-not $wap) { $wap = 'C:\Users\Public\Yokogawa\tls\wap' }
$file = Join-Path $wap 'cfg\operatorInterfaces\DEPLOY\layouts\Layouts.xml'
$backup = Join-Path $wap 'cfg\operatorInterfaces\DEPLOY\layouts\Layouts-before-CIENG.xml'
$block = Join-Path $PSScriptRoot 'CIENG_Operator.xml'
if (-not (Test-Path $file)) { throw "Not found: $file" }
if (-not (Test-Path $backup)) { Copy-Item -LiteralPath $file -Destination $backup }
$text = [IO.File]::ReadAllText($file)
$pattern = '(?s)[ \t]*<!-- CIENG-SAMPLE-BEGIN.*?<!-- CIENG-SAMPLE-END -->\r?\n?'
$text = [regex]::Replace($text, $pattern, '')
if (-not $Remove) {
$add = [IO.File]::ReadAllText($block) -replace '(?<!\r)\n', "`r`n"
# Insert after the last layout: before the first <translations, else before </layouts>.
$m = [regex]::Match($text, '(?m)^[ \t]*<translations\b')
if ($m.Success) { $end = $m.Index } else { $end = $text.LastIndexOf('</layouts>') }
if ($end -lt 0) { throw 'No </layouts> in Layouts.xml' }
$text = $text.Substring(0, $end) + $add + $text.Substring($end)
}
# Check that the result is still well-formed XML before writing it.
[xml]$null = $text
[IO.File]::WriteAllText($file, $text, (New-Object Text.UTF8Encoding($false)))
if ($Remove) { 'CIENG_Operator layout removed' } else { 'CIENG_Operator layout added' }

View file

@ -60,4 +60,5 @@ development system (see "Test system" in `progress.md`); they do not exist on ot
| ISS-038 | 2026-10-01 | HISTORY (`ithloahis` + rollover) | An `ithloahis` sample that was dropped (dated 11:50, before the active unit) still became the **initial value** of the next unit: after a forced rollover at 12:05:26 `ITEM_HISTORY` shows `CI-Eng-Sample.TANK1.INFLOW` = 95 (`INITIAL_VALUE` 1) although the item's value was 112. History after loading old samples can therefore show a wrong value at the next rollover. | open | Accept as a caution (documented in `load-history.md`), or retest after a CI Server restart to see whether the wrong initial value persists. | `.claude/skills/system-management/tasks/load-history.md`; `knowledge/manuals/IM36K10C40-01EN.md` §3 | | ISS-038 | 2026-10-01 | HISTORY (`ithloahis` + rollover) | An `ithloahis` sample that was dropped (dated 11:50, before the active unit) still became the **initial value** of the next unit: after a forced rollover at 12:05:26 `ITEM_HISTORY` shows `CI-Eng-Sample.TANK1.INFLOW` = 95 (`INITIAL_VALUE` 1) although the item's value was 112. History after loading old samples can therefore show a wrong value at the next rollover. | open | Accept as a caution (documented in `load-history.md`), or retest after a CI Server restart to see whether the wrong initial value persists. | `.claude/skills/system-management/tasks/load-history.md`; `knowledge/manuals/IM36K10C40-01EN.md` §3 |
| ISS-039 | 2026-10-01 | HISTORY (setup) | Installed vs manuals: `hisdbg` menu runs to option 22 (manual text: `-1 - 10`, list to 22) and lists history types 4 (`STATION_STAT`) and 36 (`SYS_LOG`) not in IM 36K10L20 §3.1; `ithsag.sup` keyword `run_interval` (manual: *Heartbeat*) and `queue_size` 500 KB (manual default 200); the option-type table in IM 36K10L20 §3.1 is garbled in the PDF (observed: Scan/Time `1 1`, Event/Item `2 2`, Aggregation `4 4`). | open | Installed software is the reference (standing user decision). Close when the user confirms. | `knowledge/manuals/IM36K10L20-01EN.md` §3; `knowledge/manuals/IM36K10C40-01EN.md` §2 | | ISS-039 | 2026-10-01 | HISTORY (setup) | Installed vs manuals: `hisdbg` menu runs to option 22 (manual text: `-1 - 10`, list to 22) and lists history types 4 (`STATION_STAT`) and 36 (`SYS_LOG`) not in IM 36K10L20 §3.1; `ithsag.sup` keyword `run_interval` (manual: *Heartbeat*) and `queue_size` 500 KB (manual default 200); the option-type table in IM 36K10L20 §3.1 is garbled in the PDF (observed: Scan/Time `1 1`, Event/Item `2 2`, Aggregation `4 4`). | open | Installed software is the reference (standing user decision). Close when the user confirms. | `knowledge/manuals/IM36K10L20-01EN.md` §3; `knowledge/manuals/IM36K10C40-01EN.md` §2 |
| ISS-040 | 2026-10-01 | HISTORY (aggregation) | Aggregation group `CIENG_AGG` (30 min + hour, `TANK1.LEVEL` max/min/avg) ran (`ithsag.log`: *Aggregation Completed*) but stored no values: retrieval gave `0x09 = ITM error` per period. `TANK1.LEVEL` was in `CIENG_EVENT` and `CIENG_SCAN10S`, both priority 0. Also `INTERPOLATION = "30 minutes"` is refused by `dssqld`; the installed name is `30Minutes`. | closed | Closed 2026-10-01 (confirmed by user). 2026-10-01 14:02: after `CIENG_SCAN10S` got `PRIORITY` 10, the 13:30–14:00 period stored max 77, min 33, avg 52.7, quality 1000 (`ithdbg` 20 and `dssqld` with `INTERPOLATION = "30Minutes"`). Cause: equal source priorities (C40 §2.1 says the highest-priority group is the source, but not that a tie gives nothing). Sample fixed (priority 10). The hourly value for 13:00–14:00 was not stored (first half had no source); not rechecked. Proposed close. | `.claude/skills/history-management/tasks/storage-groups.md` §4 (done); `knowledge/manuals/IM36K10C40-01EN.md` §3 (done); `examples/CI-Eng-Sample/03_his_group_df.qli`, `README.md` (done) | | ISS-040 | 2026-10-01 | HISTORY (aggregation) | Aggregation group `CIENG_AGG` (30 min + hour, `TANK1.LEVEL` max/min/avg) ran (`ithsag.log`: *Aggregation Completed*) but stored no values: retrieval gave `0x09 = ITM error` per period. `TANK1.LEVEL` was in `CIENG_EVENT` and `CIENG_SCAN10S`, both priority 0. Also `INTERPOLATION = "30 minutes"` is refused by `dssqld`; the installed name is `30Minutes`. | closed | Closed 2026-10-01 (confirmed by user). 2026-10-01 14:02: after `CIENG_SCAN10S` got `PRIORITY` 10, the 13:30–14:00 period stored max 77, min 33, avg 52.7, quality 1000 (`ithdbg` 20 and `dssqld` with `INTERPOLATION = "30Minutes"`). Cause: equal source priorities (C40 §2.1 says the highest-priority group is the source, but not that a tie gives nothing). Sample fixed (priority 10). The hourly value for 13:00–14:00 was not stored (first half had no source); not rechecked. Proposed close. | `.claude/skills/history-management/tasks/storage-groups.md` §4 (done); `knowledge/manuals/IM36K10C40-01EN.md` §3 (done); `examples/CI-Eng-Sample/03_his_group_df.qli`, `README.md` (done) |
| ISS-041 | 2026-10-01 | GRAPHICS (HTML trend) | In the HTML display (`localhost:8080/mobileoperator/?d=CIENG_Tank`) the trend shows the pen legend `CI-Eng-Sample.TANK1.LEVEL [CIENG_SCAN10S]` and time axis but draws no line, although `ITEM_HISTORY` has 420 samples in the shown hour. Browser console: `Mismatch between number of labels (Time,CI-Eng-Sample.TANK1.LEVEL [CIENG_SCAN10S]) and number of columns in array (51)`. The trend has 4 further empty pens. | open | Check the same display in CI View (Java operator interface); try a trend with only one pen (remove the empty ones) or a Micro Trend; check the HTML-supported trend properties (IM 36K10R30 §4.8.7). | `.claude/skills/graphics/tasks/create-display.md`; `knowledge/manuals/IM36K10R30-01EN.md` §4 | | ISS-041 | 2026-10-01 | GRAPHICS (HTML trend) | In the HTML display (`localhost:8080/mobileoperator/?d=CIENG_Tank`) the trend shows the pen legend `CI-Eng-Sample.TANK1.LEVEL [CIENG_SCAN10S]` and time axis but draws no line, although `ITEM_HISTORY` has 420 samples in the shown hour. Browser console: `Mismatch between number of labels (Time,CI-Eng-Sample.TANK1.LEVEL [CIENG_SCAN10S]) and number of columns in array (51)`. The trend has 4 further empty pens. 2026-10-01 later: the trend also had the property `chart.attribute[00]` connected to `TANK1.LEVEL` (added by mistake with the pen); the Operator Interface (desktop) showed *Short attribute name ( 61.0) is invalid*. After removing it the desktop trend draws the line, but the HTML trend still logs the mismatch error. | open | HTML only: try a trend with one pen (remove the empty ones) or a Micro Trend; check the HTML-supported trend properties (IM 36K10R30 §4.8.7); check whether the browser still uses a cached copy (`MO_CACHE_DISPLAYS` in `jwuiisg.sup`). | `.claude/skills/graphics/tasks/create-display.md`; `knowledge/manuals/IM36K10R30-01EN.md` §4 |
| ISS-042 | 2026-10-01 | GRAPHICS (layouts) | Installed vs `Layouts.readme`: the factory layouts use status line item types `displayName`, `playbackIndicator` and `dateTime` and the commands `reload <frame>` / `reload all`, none of which the readme lists (readme: `statusText`, `userName`, `progresBar`, `graphicsQueueLevel`, `connectionState`); the readme also writes `zooom` for the zoom command (factory files use `zoom`). | open | Installed software is the reference (standing user decision). Close when the user confirms. | `.claude/skills/graphics/tasks/layouts.md` §2 |

View file

@ -8,7 +8,7 @@ status: display CIENG_Tank built by the user in the Edit Module (text, number fi
# Edit Module (R1.03) # Edit Module (R1.03)
The Edit Module draws displays and symbols for the operator interface (CI View) and the HTML The Edit Module draws displays and symbols for the Operator Interface (desktop) and the HTML
display. Displays are XML files (`IM36K10R30-01EN.md` §1). Section numbers refer to the manual. display. Displays are XML files (`IM36K10R30-01EN.md` §1). Section numbers refer to the manual.
## 1. Window and files (§1) ## 1. Window and files (§1)
@ -71,6 +71,14 @@ writable properties: value, item name parts, id, units, description, status numb
control status, option bits), layers, attributes, edit history (undo/redo), **actions** (open / control status, option bits), layers, attributes, edit history (undo/redo), **actions** (open /
close display, execute command, read/write parameters; triggered by component events). close display, execute command, read/write parameters; triggered by component events).
Open-display action (verified): `<action type="actionActivateDisplay">` with
`<type type="displayActivationType" value="ActivateSpecific"/>` (factory files also use
`ActivateReplace`), `<display>`, optional `<layout>` (empty = current window) and `<layoutFrame>`,
plus `<parameter>` entries for display parameters. Layout commands from a component:
*Execute command* `ACTION <command>` (e.g. `ACTION navigate back default`). A trend property
connected by mistake (`chart.attribute[00]` -> item) makes the Operator Interface show
*Short attribute name ... is invalid* when the display opens; remove the connection.
## 5. Symbols (§5) ## 5. Symbols (§5)
*File > New Symbol*; put it on a palette (attributes sheet); external user-defined parameters *File > New Symbol*; put it on a palette (attributes sheet); external user-defined parameters

View file

@ -3,7 +3,7 @@ manual: IM 36K10R30-01EN
title: Graphic Display Setup title: Graphic Display Setup
edition: 3rd Edition, Sep. 2023 edition: 3rd Edition, Sep. 2023
version: R1.03 version: R1.03
status: HTML display (Mobile Operator) verified with CI-Eng-Sample display CIENG_Tank 2026-10-01; layout file and form folders checked read-only; layout editing, dataset forms, form language and dual screen from docs status: HTML display (Mobile Operator) and a project layout (CIENG_Operator) verified in the Operator Interface (desktop) and the HTML display 2026-10-01; dataset forms, form language and dual screen from docs
--- ---
# Graphic Display Setup (R1.03) # Graphic Display Setup (R1.03)
@ -41,6 +41,10 @@ empty = `deploy`).
*Layout* field (Engineering Module, Authorization > Users); empty = `default`. *Layout* field (Engineering Module, Authorization > Users); empty = `default`.
- Dual screen (§1.10): copy the layout and the banner display as `<name>_1` / `<name>_2` and let - Dual screen (§1.10): copy the layout and the banner display as `<name>_1` / `<name>_2` and let
each banner open its main display in its own layout. each banner open its main display in its own layout.
- **Verified (2026-10-01)**: sample layout `CIENG_Operator` (skill `graphics`, task `layouts.md`):
second window from an *Open display* action, own menu/toolbar/frames, `$default` title, popup
layout, F11; the Operator Interface reads `Layouts.xml` only at start. The installed
`Layouts.readme` is the full reference for options and commands.
- **Installed layouts**: `mobile`, `default`, `sxga1f/r`, `uxga1f/r`, `wxga1f/r`, `wsxga1f/r`, - **Installed layouts**: `mobile`, `default`, `sxga1f/r`, `uxga1f/r`, `wxga1f/r`, `wsxga1f/r`,
`wsxgap1f/r`, `wuxga1f/r`, `ResizablePopup`, `FixedPopup`, `popup`, `Splash`, `tuningpanel`, `wsxgap1f/r`, `wuxga1f/r`, `ResizablePopup`, `FixedPopup`, `popup`, `Splash`, `tuningpanel`,
`faceplate`, `SelectMode`, `Setpoint`, `mapviewer` (`f` fixed / `r` resizable per screen `faceplate`, `SelectMode`, `Setpoint`, `mapviewer` (`f` fixed / `r` resizable per screen
@ -69,7 +73,7 @@ property files and language codes (§3.5).
`https://<host>:8443/auth/mbl`); user profile fields used: password, authorization group, ASA, `https://<host>:8443/auth/mbl`); user profile fields used: password, authorization group, ASA,
shelving group, process areas, logoff timeout, deployment, initial display, locale (layout shelving group, process areas, logoff timeout, deployment, initial display, locale (layout
not). Login control: `dssana.sup` interface *mobile operator*. not). Login control: `dssana.sup` interface *mobile operator*.
- **Verified**: `http://localhost:8080/mobileoperator/?d=CIENG_Tank` showed the CI View-like - **Verified**: `http://localhost:8080/mobileoperator/?d=CIENG_Tank` showed the operator
frame (menu, navigation buttons, alarm banner, status line) and the display; the number field frame (menu, navigation buttons, alarm banner, status line) and the display; the number field
updated live; the alarm overview listed the sample's alarms. **Reloading the browser page ends updated live; the alarm overview listed the sample's alarms. **Reloading the browser page ends
the session** (login again); use the display's own menu *View > Reload* instead (keeps the the session** (login again); use the display's own menu *View > Reload* instead (keeps the

View file

@ -53,7 +53,7 @@ AID is not needed.
| 8 | IM 36K10E30 | Alarm System Performance Analysis | summarized, from docs (ASPA GUI not practiced; launcher and fetch limits checked) ([notes](manuals/IM36K10E30-01EN.md)) | | 8 | IM 36K10E30 | Alarm System Performance Analysis | summarized, from docs (ASPA GUI not practiced; launcher and fetch limits checked) ([notes](manuals/IM36K10E30-01EN.md)) |
| 9 | IM 36K10L20 | History Management Engineering | done for `hisdbg` checks, files and rollover; archive and repair utilities from docs ([notes](manuals/IM36K10L20-01EN.md)); skill `history-management` | | 9 | IM 36K10L20 | History Management Engineering | done for `hisdbg` checks, files and rollover; archive and repair utilities from docs ([notes](manuals/IM36K10L20-01EN.md)); skill `history-management` |
| 9 | IM 36K10C40 | Engineering Module - Historical | done by quick load for Event/Item, Scan/Time and Aggregation groups (aggregation needs a higher-priority source group, ISS-040); archive from docs ([notes](manuals/IM36K10C40-01EN.md)) | | 9 | IM 36K10C40 | Engineering Module - Historical | done by quick load for Event/Item, Scan/Time and Aggregation groups (aggregation needs a higher-priority source group, ISS-040); archive from docs ([notes](manuals/IM36K10C40-01EN.md)) |
| 10 | IM 36K10R30 | Graphic Display Setup | done for HTML display and folders; layouts, dataset forms, form language from docs ([notes](manuals/IM36K10R30-01EN.md)); skill `graphics` | | 10 | IM 36K10R30 | Graphic Display Setup | done for HTML display, folders and layouts (phase 10b: desktop and web); dataset forms, form language, dual screen from docs ([notes](manuals/IM36K10R30-01EN.md)); skill `graphics` |
| 10 | IM 36K10C50 | Edit Module | done for one display (built by the user) and `jwuiutl` validate/search/export; other components, symbols, actions from docs ([notes](manuals/IM36K10C50-01EN.md)) | | 10 | IM 36K10C50 | Edit Module | done for one display (built by the user) and `jwuiutl` validate/search/export; other components, symbols, actions from docs ([notes](manuals/IM36K10C50-01EN.md)) |
| 10 | IM 36K10C60 | Advanced Operating Graphics | summarized, from docs (AOG displays checked read-only) ([notes](manuals/IM36K10C60-01EN.md)) | | 10 | IM 36K10C60 | Advanced Operating Graphics | summarized, from docs (AOG displays checked read-only) ([notes](manuals/IM36K10C60-01EN.md)) |
| 11 | IM 36K10L50 | Data Set Service Engineering | not started | | 11 | IM 36K10L50 | Data Set Service Engineering | not started |
@ -132,4 +132,6 @@ now come before classes and objects (phase 6), and the other interfaces follow a
| L20/C40 | Archive and retrieve, `hasdbg`, `hisrecover`, `hiswrn`, `hisrep` by hand | not practiced | n/a | No archive device configured (`has.sup`); would change history administration. | | L20/C40 | Archive and retrieve, `hasdbg`, `hisrecover`, `hiswrn`, `hisrep` by hand | not practiced | n/a | No archive device configured (`has.sup`); would change history administration. |
| C50 | Build a display in the Edit Module, check the XML ([task](../.claude/skills/graphics/tasks/create-display.md)) | passed | passed | User built `CIENG_Tank` (HTML mode): text, number field, alarm overview, trend. File stores item name + id; after a sample reload (id 248 → 268) validation still passed and a new session showed live values. | | C50 | Build a display in the Edit Module, check the XML ([task](../.claude/skills/graphics/tasks/create-display.md)) | passed | passed | User built `CIENG_Tank` (HTML mode): text, number field, alarm overview, trend. File stores item name + id; after a sample reload (id 248 → 268) validation still passed and a new session showed live values. |
| C50/R30 | Deploy/remove, `jwuiutl` HTML export, validate, search; HTML display in the browser ([task](../.claude/skills/graphics/tasks/deploy-displays.md)) | passed | passed | Scripts `displays/deploy_displays.cmd` / `remove_displays.cmd`; command-line HTML identical to the Edit Module's. Number field live in the browser; HTML trend draws no line (ISS-041). Browser page reload ends the session; the display menu *View > Reload* keeps it (user). | | C50/R30 | Deploy/remove, `jwuiutl` HTML export, validate, search; HTML display in the browser ([task](../.claude/skills/graphics/tasks/deploy-displays.md)) | passed | passed | Scripts `displays/deploy_displays.cmd` / `remove_displays.cmd`; command-line HTML identical to the Edit Module's. Number field live in the browser; HTML trend draws no line (ISS-041). Browser page reload ends the session; the display menu *View > Reload* keeps it (user). |
| R30/C50/C60 | Layouts, dataset forms, symbols, actions, AOG library | not practiced | n/a | GUI work in the Edit Module; layouts are shared system files. | | R30/C50 | Operator layout `CIENG_Operator` (menu, toolbar, navigation/main/banner frames, status line) added with `layout.ps1`; navigation display `CIENG_Menu`; open displays in frames, layouts and the `popup` layout ([task](../.claude/skills/graphics/tasks/layouts.md)) | passed | passed | Desktop: second 1600 x 900 window, frame navigation and Back, popup on top and minimised with its parent, F11 within taskbar limits; the Operator Interface must be restarted after `Layouts.xml` changes; factory `default` layout unchanged for Admin. Web: `?d=CIENG_Tank&l=CIENG_Operator`. Status line/command names not in the readme (ISS-042). A stray trend property connection caused a desktop error (ISS-041 update). |
| J10/C50 | Restart CI Server with the Edit Module open | observed | n/a | Start aborted: `JWUIGED<pid>` still attached to the BUS Service (`ci_start.log`); closing the Edit Module fixed it (skill `system-check`). |
| R30/C50/C60 | Dataset forms, symbols, AOG library, dual screen, per-user layouts | not practiced | n/a | GUI work; user profiles not changed. |