From e62d83b02478897f331f2b58556c9e560babaf6b Mon Sep 17 00:00:00 2001 From: cliu Date: Thu, 1 Oct 2026 15:47:38 +1000 Subject: [PATCH 1/3] Add operator layout CIENG_Operator and navigation display CIENG_Menu to CI-Eng-Sample Co-Authored-By: Claude Opus 5.5 --- examples/CI-Eng-Sample/README.md | 360 +++++++++--------- .../CI-Eng-Sample/displays/CIENG_Menu.xml | 97 +++++ .../CI-Eng-Sample/displays/CIENG_Tank.xml | 53 +-- .../displays/deploy_displays.cmd | 2 + .../displays/remove_displays.cmd | 4 +- .../CI-Eng-Sample/layouts/CIENG_Operator.xml | 184 +++++++++ examples/CI-Eng-Sample/layouts/layout.ps1 | 34 ++ 7 files changed, 536 insertions(+), 198 deletions(-) create mode 100644 examples/CI-Eng-Sample/displays/CIENG_Menu.xml create mode 100644 examples/CI-Eng-Sample/layouts/CIENG_Operator.xml create mode 100644 examples/CI-Eng-Sample/layouts/layout.ps1 diff --git a/examples/CI-Eng-Sample/README.md b/examples/CI-Eng-Sample/README.md index 79861a1..146dc5e 100644 --- a/examples/CI-Eng-Sample/README.md +++ b/examples/CI-Eng-Sample/README.md @@ -1,173 +1,187 @@ -# CI-Eng-Sample - -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 -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. - -## Load and remove - -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 the current folder): - -``` -cmd /c "\examples\CI-Eng-Sample\load.cmd" -cmd /c "\examples\CI-Eng-Sample\remove.cmd" -``` - -- 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 - stores no history until CI Server restarts. -- `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 - has passed, so the script sets a stop time one minute ahead and waits. Removing the group - also deletes its history. - -## Current contents - -| Name | Kind | Details | -|---|---|---| -| `CI-Eng-Sample` | Section | Top level | -| `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.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.MODE` | Item, Integer | 0 manual, 1 auto | -| `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.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.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.DEMO` | Section | Tutorial examples | -| `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_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.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) | -| `CIENG_TANK` | Class (traditional) | Prompt *Tank capacity (m3)*; signal `LEVEL` = `.LEVEL` (trigger on value); creates `.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` | -| `CIENG_JFLOW` | Class (Java) | Attaches `.INFLOW`; creates `.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) | -| `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_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.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.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_PLC` | Modbus station | Open Modbus/TCP to `localhost:5020`, unit 1, output method *On change and connect* | -| `CIENG_SCAN1S` | Modbus scan type | 1000 ms | -| `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.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 | -| `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` | -| 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_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_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 -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. -New items start with status 13 (`NOT INIT`) until a value is written. - -## Files - -| File | Purpose | -|---|---| -| `01_section_df.qli` | Sections (`SECTION_DF`); parents before children | -| `02_item_df.qli` | Items (`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 | -| `04_item_his_df.qli` | Items in the storage group (`ITEM_HIS_DF`, name `:`) | -| `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`) | -| `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`) | -| `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`) | -| `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`) | -| `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 | -| `displays/CIENG_Tank.xml` | Display (HTML mode): title, number field on `TANK1.LEVEL`, alarm overview, trend of `TANK1.LEVEL` | -| `displays/deploy_displays.cmd`, `remove_displays.cmd` | Copy the display into the operator interface and export its HTML version / delete both | -| `monitoring/*.sup.txt` | Setup-file lines for the monitoring processes (not applied by `load.cmd`) | - -## Modbus slave mirror (for station CIENG_PLC) - -`CIENG_PLC` reads and writes CI Server's own Modbus slave: `eqpmdcmem` (slave memory) and -`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 -`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 -``` - -Remove the two files from `tls\com` when the sample is removed. See skill `equipment`, task -`modbus-station.md`. - -## OPC UA loopback (station CIENG_UA) - -`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 -exchange, done by the user (skill `data-access`, task `opcua-client.md` §4): - -1. After loading, the client logs `OPXC-E-CER_NO_TRU`; trust the server certificate in - `%TLS_ALLUSERS_PATH%\pki\opxuac\pkiclient\rejected` (Engineering Module, or move it to - `…\pkiclient\trusted\certs`). -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` - (PowerShell: `Move-Item -LiteralPath`, the name contains brackets). - -Then `UA.COMM_OK` = 1 and `UA.LEVEL_COPY` follows `TANK1.LEVEL`. The trust is kept when the -sample is removed and loaded again. - -## Alarms (TANK1.LEVEL) - -`TANK1.LEVEL` raises HIGH above 80 (Alarm 2, priority 2) and HIGH HIGH above 90 (Alarm 3, -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` -(`NAME`, `ACK` 1), write the level back below 80. See skill `alarm-management`, task -`item-alarming.md`. - -## Display (optional) - -After `load.cmd`, run `displays\deploy_displays.cmd` (no admin rights) and open -`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 -`graphics`. - -## Monitoring processes (optional) - -`monitoring/` holds the lines to add to the setup files in `%TLS_ROOT_PATH%\tls\sup\` so that -`intcpumon`, `intdskmon`, `inttcpmon`, `intmon` and `intspawn` write into the `SYSTEM` items. -These change the system's own setup files: back the files up first and restore them after -testing. See the `system-management` skill, task `monitoring-processes.md`. - -## Planned additions - -| Phase | Adds | -|---|---| -| 10 | A symbol (the display `CIENG_Tank` exists) | -| 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. +# CI-Eng-Sample + +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 +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. + +## Load and remove + +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 the current folder): + +``` +cmd /c "\examples\CI-Eng-Sample\load.cmd" +cmd /c "\examples\CI-Eng-Sample\remove.cmd" +``` + +- 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 + stores no history until CI Server restarts. +- `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 + has passed, so the script sets a stop time one minute ahead and waits. Removing the group + also deletes its history. + +## Current contents + +| Name | Kind | Details | +|---|---|---| +| `CI-Eng-Sample` | Section | Top level | +| `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.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.MODE` | Item, Integer | 0 manual, 1 auto | +| `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.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.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.DEMO` | Section | Tutorial examples | +| `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_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.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) | +| `CIENG_TANK` | Class (traditional) | Prompt *Tank capacity (m3)*; signal `LEVEL` = `.LEVEL` (trigger on value); creates `.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` | +| `CIENG_JFLOW` | Class (Java) | Attaches `.INFLOW`; creates `.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) | +| `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_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.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.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_PLC` | Modbus station | Open Modbus/TCP to `localhost:5020`, unit 1, output method *On change and connect* | +| `CIENG_SCAN1S` | Modbus scan type | 1000 ms | +| `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.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 | +| `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` | +| 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_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_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 +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. +New items start with status 13 (`NOT INIT`) until a value is written. + +## Files + +| File | Purpose | +|---|---| +| `01_section_df.qli` | Sections (`SECTION_DF`); parents before children | +| `02_item_df.qli` | Items (`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 | +| `04_item_his_df.qli` | Items in the storage group (`ITEM_HIS_DF`, name `:`) | +| `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`) | +| `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`) | +| `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`) | +| `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`) | +| `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 | +| `displays/CIENG_Tank.xml` | Display (HTML mode): title, number field on `TANK1.LEVEL`, alarm overview, trend of `TANK1.LEVEL`, button *Operator layout* | +| `displays/CIENG_Menu.xml` | Navigation display (200 x 700): *Tank 1*, *Current Alarm* (main frame), *Tank 1 popup* (layout `popup`) | +| `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 | +| `monitoring/*.sup.txt` | Setup-file lines for the monitoring processes (not applied by `load.cmd`) | + +## Modbus slave mirror (for station CIENG_PLC) + +`CIENG_PLC` reads and writes CI Server's own Modbus slave: `eqpmdcmem` (slave memory) and +`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 +`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 +``` + +Remove the two files from `tls\com` when the sample is removed. See skill `equipment`, task +`modbus-station.md`. + +## OPC UA loopback (station CIENG_UA) + +`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 +exchange, done by the user (skill `data-access`, task `opcua-client.md` §4): + +1. After loading, the client logs `OPXC-E-CER_NO_TRU`; trust the server certificate in + `%TLS_ALLUSERS_PATH%\pki\opxuac\pkiclient\rejected` (Engineering Module, or move it to + `…\pkiclient\trusted\certs`). +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` + (PowerShell: `Move-Item -LiteralPath`, the name contains brackets). + +Then `UA.COMM_OK` = 1 and `UA.LEVEL_COPY` follows `TANK1.LEVEL`. The trust is kept when the +sample is removed and loaded again. + +## Alarms (TANK1.LEVEL) + +`TANK1.LEVEL` raises HIGH above 80 (Alarm 2, priority 2) and HIGH HIGH above 90 (Alarm 3, +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` +(`NAME`, `ACK` 1), write the level back below 80. See skill `alarm-management`, task +`item-alarming.md`. + +## Displays and layout (optional) + +No admin rights needed. After `load.cmd`: + +1. `displays\deploy_displays.cmd` copies `CIENG_Tank` and `CIENG_Menu` into the operator + interface and creates their HTML versions. +2. `powershell -ExecutionPolicy Bypass -File layouts\layout.ps1` adds the layout + `CIENG_Operator` to `Layouts.xml` (first run saves `Layouts-before-CIENG.xml`). + **Restart the Operator Interface** afterwards: it reads the layouts only at start. +3. Operator Interface (desktop): open `CIENG_Tank` from the display box and click + **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 + banner. HTML display (web): `http://localhost:8080/mobileoperator/?d=CIENG_Tank&l=CIENG_Operator` + (CI Server login). + +Remove: `layouts\layout.ps1 -Remove` (restores the file exactly) and +`displays\remove_displays.cmd`. Close the displays in the Edit Module first. See skill +`graphics`. + +## Monitoring processes (optional) + +`monitoring/` holds the lines to add to the setup files in `%TLS_ROOT_PATH%\tls\sup\` so that +`intcpumon`, `intdskmon`, `inttcpmon`, `intmon` and `intspawn` write into the `SYSTEM` items. +These change the system's own setup files: back the files up first and restore them after +testing. See the `system-management` skill, task `monitoring-processes.md`. + +## 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. diff --git a/examples/CI-Eng-Sample/displays/CIENG_Menu.xml b/examples/CI-Eng-Sample/displays/CIENG_Menu.xml new file mode 100644 index 0000000..85dac15 --- /dev/null +++ b/examples/CI-Eng-Sample/displays/CIENG_Menu.xml @@ -0,0 +1,97 @@ + + + + + + true + 200 + 700 + 2 + + + + + + + + + + + 500 + true + false + + 2 + Overview + Always shown + true + 10.0 + + + 3 + Rough + Shown when viewing viewing a large area + true + 25.0 + + + 4 + Standard + Shown when using the default view setting + true + 100.0 + + + 5 + Detail + Shown only when viewing a small area + true + 400.0 + + + 6 + Intricacies + Shown only when viewing a very small area + true + 1000.0 + + + 1 + Layer1 + + 3 + + + + + \ No newline at end of file diff --git a/examples/CI-Eng-Sample/displays/CIENG_Tank.xml b/examples/CI-Eng-Sample/displays/CIENG_Tank.xml index 4582d2e..ab44bb9 100644 --- a/examples/CI-Eng-Sample/displays/CIENG_Tank.xml +++ b/examples/CI-Eng-Sample/displays/CIENG_Tank.xml @@ -1,12 +1,23 @@ - + + + + + + + + + + + + true 1984 760 - 4 + 8 @@ -59,7 +70,7 @@ 1 Layer1 - 4 + 5 7 CI-Eng-Sample Tank 1 @@ -92,9 +103,7 @@ 9 - - - + 10 @@ -107,9 +116,7 @@ 0 0 - - - + @@ -198,9 +205,7 @@ true 0 true - - - + 256 @@ -468,20 +473,20 @@ 344.0 0.0 0.0 + + + \ No newline at end of file diff --git a/examples/CI-Eng-Sample/displays/deploy_displays.cmd b/examples/CI-Eng-Sample/displays/deploy_displays.cmd index 84e5039..0d32b6e 100644 --- a/examples/CI-Eng-Sample/displays/deploy_displays.cmd +++ b/examples/CI-Eng-Sample/displays/deploy_displays.cmd @@ -7,4 +7,6 @@ cd /d "%~dp0" set WAP=%TLS_WAP_PATH% 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_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_Menu diff --git a/examples/CI-Eng-Sample/displays/remove_displays.cmd b/examples/CI-Eng-Sample/displays/remove_displays.cmd index 27c4096..51c164a 100644 --- a/examples/CI-Eng-Sample/displays/remove_displays.cmd +++ b/examples/CI-Eng-Sample/displays/remove_displays.cmd @@ -1,7 +1,9 @@ @echo off 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% 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%\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" diff --git a/examples/CI-Eng-Sample/layouts/CIENG_Operator.xml b/examples/CI-Eng-Sample/layouts/CIENG_Operator.xml new file mode 100644 index 0000000..205b5ca --- /dev/null +++ b/examples/CI-Eng-Sample/layouts/CIENG_Operator.xml @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/CI-Eng-Sample/layouts/layout.ps1 b/examples/CI-Eng-Sample/layouts/layout.ps1 new file mode 100644 index 0000000..18d6129 --- /dev/null +++ b/examples/CI-Eng-Sample/layouts/layout.ps1 @@ -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 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]*\r?\n?' +$text = [regex]::Replace($text, $pattern, '') + +if (-not $Remove) { + $add = [IO.File]::ReadAllText($block) -replace '(?. + $m = [regex]::Match($text, '(?m)^[ \t]*') } + if ($end -lt 0) { throw 'No 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' } -- 2.45.3 From b1fc5527259fc3759a92c701de1538ffe5f20cec Mon Sep 17 00:00:00 2001 From: cliu Date: Thu, 1 Oct 2026 15:47:38 +1000 Subject: [PATCH 2/3] Add layouts task, Operator Interface notes and Edit Module stop lesson Co-Authored-By: Claude Opus 5.5 --- .claude/skills/graphics/SKILL.md | 15 ++- .claude/skills/graphics/tasks/layouts.md | 122 +++++++++++++++++++++++ .claude/skills/system-check/SKILL.md | 8 ++ knowledge/manuals/IM36K10C50-01EN.md | 10 +- knowledge/manuals/IM36K10R30-01EN.md | 8 +- 5 files changed, 156 insertions(+), 7 deletions(-) create mode 100644 .claude/skills/graphics/tasks/layouts.md diff --git a/.claude/skills/graphics/SKILL.md b/.claude/skills/graphics/SKILL.md index 61e3bee..4ff3909 100644 --- a/.claude/skills/graphics/SKILL.md +++ b/.claude/skills/graphics/SKILL.md @@ -1,15 +1,18 @@ --- name: graphics 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, 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 web browser (localhost:8080/mobileoperator), validate, search or unlock displays (jwuiutl, .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 - 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) @@ -27,13 +30,17 @@ Rules: Reloading the browser page logs out — use the display menu *View > Reload*, and the display box to open other displays. - `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 | |---|---|---| | 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 | | 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 | | Symbols, parameters, actions, localisation, record/playback | C50 summary §1, §4, §5 | from docs | | AOG library (styles, symbols, faceplates, templates) | C60 summary | from docs | diff --git a/.claude/skills/graphics/tasks/layouts.md b/.claude/skills/graphics/tasks/layouts.md new file mode 100644 index 0000000..bd84314 --- /dev/null +++ b/.claude/skills/graphics/tasks/layouts.md @@ -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 + + … + … + + + + + + + + … + +``` + +- `title`: `$` = 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 `` + holds several frames as tabs (`tabPosition`, `maximumTabs`, `closeTabAllowed`). Frame options: + `name`, `initialDisplay` (= home display), `stackSize` (back/forward history), `zoom` + (`fitDisplay`, `stretchDisplay`, `%`), `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 [] [

=;…]` | Open a display in a frame (with parameters) | +| `navigate back/forward/up/home/history ` | Frame history (`$` in the tooltip = target name) | +| `reload ` / `reload all` | Reload displays (keeps the session in the HTML display) | +| `zoom ` | 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 `, `lookfeel `, `help` | | + + The installed status line also uses item types `displayName`, `playbackIndicator` and + `dateTime`, which the readme does not list (ISS-042). +- `` 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 `` with ``, ``, ``, `` | +| Menu / toolbar | `navigate to ` (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=&l=` | +| Script on a component | *Execute command* with `ACTION `, 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). diff --git a/.claude/skills/system-check/SKILL.md b/.claude/skills/system-check/SKILL.md index 98dddef..c2a15c8 100644 --- a/.claude/skills/system-check/SKILL.md +++ b/.claude/skills/system-check/SKILL.md @@ -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); some processes (e.g. `umh`) stay attached, but `dssqld`/`itmval` fail and the log shows `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`, 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 diff --git a/knowledge/manuals/IM36K10C50-01EN.md b/knowledge/manuals/IM36K10C50-01EN.md index d201a5f..6b8ed8a 100644 --- a/knowledge/manuals/IM36K10C50-01EN.md +++ b/knowledge/manuals/IM36K10C50-01EN.md @@ -8,7 +8,7 @@ status: display CIENG_Tank built by the user in the Edit Module (text, number fi # 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. ## 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 / close display, execute command, read/write parameters; triggered by component events). +Open-display action (verified): `` with +`` (factory files also use +`ActivateReplace`), ``, optional `` (empty = current window) and ``, +plus `` entries for display parameters. Layout commands from a component: +*Execute command* `ACTION ` (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) *File > New Symbol*; put it on a palette (attributes sheet); external user-defined parameters diff --git a/knowledge/manuals/IM36K10R30-01EN.md b/knowledge/manuals/IM36K10R30-01EN.md index 5ec5a2e..d52aaec 100644 --- a/knowledge/manuals/IM36K10R30-01EN.md +++ b/knowledge/manuals/IM36K10R30-01EN.md @@ -3,7 +3,7 @@ manual: IM 36K10R30-01EN title: Graphic Display Setup edition: 3rd Edition, Sep. 2023 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) @@ -41,6 +41,10 @@ empty = `deploy`). *Layout* field (Engineering Module, Authorization > Users); empty = `default`. - Dual screen (§1.10): copy the layout and the banner display as `_1` / `_2` and let 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`, `wsxgap1f/r`, `wuxga1f/r`, `ResizablePopup`, `FixedPopup`, `popup`, `Splash`, `tuningpanel`, `faceplate`, `SelectMode`, `Setpoint`, `mapviewer` (`f` fixed / `r` resizable per screen @@ -69,7 +73,7 @@ property files and language codes (§3.5). `https://:8443/auth/mbl`); user profile fields used: password, authorization group, ASA, shelving group, process areas, logoff timeout, deployment, initial display, locale (layout 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 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 -- 2.45.3 From fafa68e988b452a46370485d42b5379b06b31385 Mon Sep 17 00:00:00 2001 From: cliu Date: Thu, 1 Oct 2026 15:47:38 +1000 Subject: [PATCH 3/3] Record phase 10b progress, update ISS-041, add ISS-042 Co-Authored-By: Claude Opus 5.5 --- knowledge/issues.md | 3 ++- knowledge/progress.md | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/knowledge/issues.md b/knowledge/issues.md index 8e9556c..28c85b7 100644 --- a/knowledge/issues.md +++ b/knowledge/issues.md @@ -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-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-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 ` / `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 | diff --git a/knowledge/progress.md b/knowledge/progress.md index 56cd7a7..f8d6241 100644 --- a/knowledge/progress.md +++ b/knowledge/progress.md @@ -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)) | | 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)) | -| 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 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 | @@ -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. | | 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). | -| 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` 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. | -- 2.45.3