From 148508af86277b88f9576fd93b4facf3c7cf84ac Mon Sep 17 00:00:00 2001 From: cliu Date: Thu, 1 Oct 2026 14:50:13 +1000 Subject: [PATCH 1/4] Add display CIENG_Tank with deploy and remove scripts to CI-Eng-Sample Co-Authored-By: Claude Opus 5.5 --- examples/CI-Eng-Sample/README.md | 337 ++++++------ .../CI-Eng-Sample/displays/CIENG_Tank.xml | 487 ++++++++++++++++++ .../displays/deploy_displays.cmd | 10 + .../displays/remove_displays.cmd | 7 + 4 files changed, 677 insertions(+), 164 deletions(-) create mode 100644 examples/CI-Eng-Sample/displays/CIENG_Tank.xml create mode 100644 examples/CI-Eng-Sample/displays/deploy_displays.cmd create mode 100644 examples/CI-Eng-Sample/displays/remove_displays.cmd diff --git a/examples/CI-Eng-Sample/README.md b/examples/CI-Eng-Sample/README.md index b8a370f..79861a1 100644 --- a/examples/CI-Eng-Sample/README.md +++ b/examples/CI-Eng-Sample/README.md @@ -1,164 +1,173 @@ -# 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 | -| `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`. - -## 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 display and symbol | -| 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` | +| `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. diff --git a/examples/CI-Eng-Sample/displays/CIENG_Tank.xml b/examples/CI-Eng-Sample/displays/CIENG_Tank.xml new file mode 100644 index 0000000..4582d2e --- /dev/null +++ b/examples/CI-Eng-Sample/displays/CIENG_Tank.xml @@ -0,0 +1,487 @@ + + + + + + true + 1984 + 760 + 4 + + + + + + + + + + + 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 + + 4 + + 7 + CI-Eng-Sample Tank 1 + + true + 124.734375 + 36.953125 + 5.3125 + 5.3125 + 52.375 + 52.375 + 0.0 + 0.0 + + + 8 + + + + + 0.0 + + + CI-Eng-Sample.TANK1.LEVEL + 1.1.268.0.0.1.1.7 + ItemValue + + + + + + 9 + + + + + + 10 + + + + false + -1 + true + + 0 + 0 + + + + + + + + + + false + + @NULL + false + 0 + 0 + 800 + 400 + false + + + + + + + true + @NULL + + + + + false + false + true + + true + true + false + true + + + + + + 0.2705882352941177 + + + true + false + true + false + false + false + false + false + 5 + 0 + 0 + true + true + false + + + + true + true + 0 + + 0 + 50 + true + + + false + + + + + + + + + + + + + + + true + true + 0 + true + + + + + 256 + + + @NULL + true + true + + false + 0 + true + true + true + @NULL + @NULL + 0 + NaN + NaN + false + + <description>Tank 1 level (%)</description> + <legendText/> + <titlePlacement>0</titlePlacement> + <titleRotation>0</titleRotation> + <labelRotation>0</labelRotation> + <majorGridVisible>false</majorGridVisible> + <minorGridVisible>false</minorGridVisible> + <lowHighLimitGridVisible>false</lowHighLimitGridVisible> + <lowHighLimitGridAreaVisible>false</lowHighLimitGridAreaVisible> + <lowLowHighHighLimitGridVisible>false</lowLowHighHighLimitGridVisible> + <majorGridColor>@NULL</majorGridColor> + <minorGridColor>@NULL</minorGridColor> + <lowHighLimitGridColor>@NULL</lowHighLimitGridColor> + <lowHighLimitGridAreaColor>@NULL</lowHighLimitGridAreaColor> + <lowLowHighHighLimiGridColor>@NULL</lowLowHighHighLimiGridColor> + <majorGridStroke type="stroke" width="0.1"/> + <minorGridStroke type="stroke" width="0.1"/> + <lowHighLimitGridStroke type="stroke" width="0.1"/> + <lowLowHighHighLimiGridStroke type="stroke" width="0.1"/> + <lowLimit>20.0</lowLimit> + <highLimit>80.0</highLimit> + <lowLowLimit>10.0</lowLowLimit> + <highHighLimit>90.0</highHighLimit> + <annotationVisible>false</annotationVisible> + <timeShift>0</timeShift> + </pen> + <pen type="pen"> + <type>256</type> + <color type="colorSet" r="241" g="76" b="20"/> + <stroke type="stroke" width="1.5"/> + <paint>@NULL</paint> + <visible>true</visible> + <visibleLegend>true</visibleLegend> + <source type="sourceID" uri=""/> + <axisVisible>false</axisVisible> + <axisPosition>0</axisPosition> + <labelVisible>true</labelVisible> + <majorTickVisible>true</majorTickVisible> + <minorTickVisible>true</minorTickVisible> + <axisColor>@NULL</axisColor> + <labelColor>@NULL</labelColor> + <scaleRangeType>0</scaleRangeType> + <minimum>NaN</minimum> + <maximum>NaN</maximum> + <procentual>false</procentual> + <title/> + <description/> + <legendText/> + <titlePlacement>0</titlePlacement> + <titleRotation>0</titleRotation> + <labelRotation>0</labelRotation> + <majorGridVisible>false</majorGridVisible> + <minorGridVisible>false</minorGridVisible> + <lowHighLimitGridVisible>false</lowHighLimitGridVisible> + <lowHighLimitGridAreaVisible>false</lowHighLimitGridAreaVisible> + <lowLowHighHighLimitGridVisible>false</lowLowHighHighLimitGridVisible> + <majorGridColor>@NULL</majorGridColor> + <minorGridColor>@NULL</minorGridColor> + <lowHighLimitGridColor>@NULL</lowHighLimitGridColor> + <lowHighLimitGridAreaColor>@NULL</lowHighLimitGridAreaColor> + <lowLowHighHighLimiGridColor>@NULL</lowLowHighHighLimiGridColor> + <majorGridStroke type="stroke" width="0.1"/> + <minorGridStroke type="stroke" width="0.1"/> + <lowHighLimitGridStroke type="stroke" width="0.1"/> + <lowLowHighHighLimiGridStroke type="stroke" width="0.1"/> + <lowLimit>NaN</lowLimit> + <highLimit>NaN</highLimit> + <lowLowLimit>NaN</lowLowLimit> + <highHighLimit>NaN</highHighLimit> + <annotationVisible>false</annotationVisible> + <timeShift>0</timeShift> + </pen> + <pen type="pen"> + <type>256</type> + <color type="colorSet" r="127" g="255" b="0"/> + <stroke type="stroke" width="1.5"/> + <paint>@NULL</paint> + <visible>true</visible> + <visibleLegend>true</visibleLegend> + <source type="sourceID" uri=""/> + <axisVisible>false</axisVisible> + <axisPosition>0</axisPosition> + <labelVisible>true</labelVisible> + <majorTickVisible>true</majorTickVisible> + <minorTickVisible>true</minorTickVisible> + <axisColor>@NULL</axisColor> + <labelColor>@NULL</labelColor> + <scaleRangeType>0</scaleRangeType> + <minimum>NaN</minimum> + <maximum>NaN</maximum> + <procentual>false</procentual> + <title/> + <description/> + <legendText/> + <titlePlacement>0</titlePlacement> + <titleRotation>0</titleRotation> + <labelRotation>0</labelRotation> + <majorGridVisible>false</majorGridVisible> + <minorGridVisible>false</minorGridVisible> + <lowHighLimitGridVisible>false</lowHighLimitGridVisible> + <lowHighLimitGridAreaVisible>false</lowHighLimitGridAreaVisible> + <lowLowHighHighLimitGridVisible>false</lowLowHighHighLimitGridVisible> + <majorGridColor>@NULL</majorGridColor> + <minorGridColor>@NULL</minorGridColor> + <lowHighLimitGridColor>@NULL</lowHighLimitGridColor> + <lowHighLimitGridAreaColor>@NULL</lowHighLimitGridAreaColor> + <lowLowHighHighLimiGridColor>@NULL</lowLowHighHighLimiGridColor> + <majorGridStroke type="stroke" width="0.1"/> + <minorGridStroke type="stroke" width="0.1"/> + <lowHighLimitGridStroke type="stroke" width="0.1"/> + <lowLowHighHighLimiGridStroke type="stroke" width="0.1"/> + <lowLimit>NaN</lowLimit> + <highLimit>NaN</highLimit> + <lowLowLimit>NaN</lowLowLimit> + <highHighLimit>NaN</highHighLimit> + <annotationVisible>false</annotationVisible> + <timeShift>0</timeShift> + </pen> + <pen type="pen"> + <type>256</type> + <color type="colorSet" r="0" g="0" b="139"/> + <stroke type="stroke" width="1.5"/> + <paint>@NULL</paint> + <visible>true</visible> + <visibleLegend>true</visibleLegend> + <source type="sourceID" uri=""/> + <axisVisible>false</axisVisible> + <axisPosition>0</axisPosition> + <labelVisible>true</labelVisible> + <majorTickVisible>true</majorTickVisible> + <minorTickVisible>true</minorTickVisible> + <axisColor>@NULL</axisColor> + <labelColor>@NULL</labelColor> + <scaleRangeType>0</scaleRangeType> + <minimum>NaN</minimum> + <maximum>NaN</maximum> + <procentual>false</procentual> + <title/> + <description/> + <legendText/> + <titlePlacement>0</titlePlacement> + <titleRotation>0</titleRotation> + <labelRotation>0</labelRotation> + <majorGridVisible>false</majorGridVisible> + <minorGridVisible>false</minorGridVisible> + <lowHighLimitGridVisible>false</lowHighLimitGridVisible> + <lowHighLimitGridAreaVisible>false</lowHighLimitGridAreaVisible> + <lowLowHighHighLimitGridVisible>false</lowLowHighHighLimitGridVisible> + <majorGridColor>@NULL</majorGridColor> + <minorGridColor>@NULL</minorGridColor> + <lowHighLimitGridColor>@NULL</lowHighLimitGridColor> + <lowHighLimitGridAreaColor>@NULL</lowHighLimitGridAreaColor> + <lowLowHighHighLimiGridColor>@NULL</lowLowHighHighLimiGridColor> + <majorGridStroke type="stroke" width="0.1"/> + <minorGridStroke type="stroke" width="0.1"/> + <lowHighLimitGridStroke type="stroke" width="0.1"/> + <lowLowHighHighLimiGridStroke type="stroke" width="0.1"/> + <lowLimit>NaN</lowLimit> + <highLimit>NaN</highLimit> + <lowLowLimit>NaN</lowLowLimit> + <highHighLimit>NaN</highHighLimit> + <annotationVisible>false</annotationVisible> + <timeShift>0</timeShift> + </pen> + <pen type="pen"> + <type>256</type> + <color type="colorSet" r="199" g="9" b="16"/> + <stroke type="stroke" width="1.5"/> + <paint>@NULL</paint> + <visible>true</visible> + <visibleLegend>true</visibleLegend> + <source type="sourceID" uri=""/> + <axisVisible>false</axisVisible> + <axisPosition>0</axisPosition> + <labelVisible>true</labelVisible> + <majorTickVisible>true</majorTickVisible> + <minorTickVisible>true</minorTickVisible> + <axisColor>@NULL</axisColor> + <labelColor>@NULL</labelColor> + <scaleRangeType>0</scaleRangeType> + <minimum>NaN</minimum> + <maximum>NaN</maximum> + <procentual>false</procentual> + <title/> + <description/> + <legendText/> + <titlePlacement>0</titlePlacement> + <titleRotation>0</titleRotation> + <labelRotation>0</labelRotation> + <majorGridVisible>false</majorGridVisible> + <minorGridVisible>false</minorGridVisible> + <lowHighLimitGridVisible>false</lowHighLimitGridVisible> + <lowHighLimitGridAreaVisible>false</lowHighLimitGridAreaVisible> + <lowLowHighHighLimitGridVisible>false</lowLowHighHighLimitGridVisible> + <majorGridColor>@NULL</majorGridColor> + <minorGridColor>@NULL</minorGridColor> + <lowHighLimitGridColor>@NULL</lowHighLimitGridColor> + <lowHighLimitGridAreaColor>@NULL</lowHighLimitGridAreaColor> + <lowLowHighHighLimiGridColor>@NULL</lowLowHighHighLimiGridColor> + <majorGridStroke type="stroke" width="0.1"/> + <minorGridStroke type="stroke" width="0.1"/> + <lowHighLimitGridStroke type="stroke" width="0.1"/> + <lowLowHighHighLimiGridStroke type="stroke" width="0.1"/> + <lowLimit>NaN</lowLimit> + <highLimit>NaN</highLimit> + <lowLowLimit>NaN</lowLowLimit> + <highHighLimit>NaN</highHighLimit> + <annotationVisible>false</annotationVisible> + <timeShift>0</timeShift> + </pen> + <penPanelLayout type="xyPenPanelLayout"> + <Height>417</Height> + <AutoSize>true</AutoSize> + <SplitLocation>-1</SplitLocation> + <column index="0" visible="true" width="20"/> + <column index="1" visible="true" width="20"/> + <column index="2" visible="true" width="150"/> + <column index="3" visible="true" width="120"/> + <column index="4" visible="true" width="60"/> + <column index="5" visible="false" width="120"/> + <column index="6" visible="false" width="120"/> + <column index="7" visible="false" width="60"/> + <column index="8" visible="true" width="60"/> + <column index="9" visible="true" width="60"/> + <column index="10" visible="false" width="20"/> + <column index="11" visible="true" width="90"/> + <column index="12" visible="false" width="130"/> + <column index="13" visible="true" width="200"/> + <column index="14" visible="false" width="240"/> + <column index="15" visible="false" width="280"/> + </penPanelLayout> + <timeRange type="timeRangeLast" count="1"> + <type type="timeUnit" value="TimeUnitHour"/> + </timeRange> + <updateInterval>30</updateInterval> + <fillHistory>true</fillHistory> + <updating>false</updating> + </chartPanel> + </config> + <x>472.0</x> + <y>588.0</y> + <top>172.0</top> + <bottom>172.0</bottom> + <left>344.0</left> + <right>344.0</right> + <rotation>0.0</rotation> + <shear>0.0</shear> + <data type="data"> + <action type="actionInternalServiced"/> + <action type="actionConnectTo"> + <property type="property" name="chart.attribute[00]"/> + <filter type="filter"> + <value>0.0</value> + </filter> + <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> + </data> + </chart> + </coreObjectDefinition> +</visualization> \ 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 new file mode 100644 index 0000000..84e5039 --- /dev/null +++ b/examples/CI-Eng-Sample/displays/deploy_displays.cmd @@ -0,0 +1,10 @@ +@echo off +rem Deploy the CI-Eng-Sample displays into the operator interface (deployment DEPLOY). +rem CI Server R1.03.00. Load the sample (load.cmd) first; no admin rights needed. +rem Copies the display XML, then creates the HTML (Mobile Operator) version with jwuiutl; +rem without -o the HTML goes to %TLS_WAP_PATH%\mobileoperator\operatorInterfaces\DEPLOY. +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\" +call jwuiutl.cmd -e HTML -i -f DEPLOY CIENG_Tank diff --git a/examples/CI-Eng-Sample/displays/remove_displays.cmd b/examples/CI-Eng-Sample/displays/remove_displays.cmd new file mode 100644 index 0000000..27c4096 --- /dev/null +++ b/examples/CI-Eng-Sample/displays/remove_displays.cmd @@ -0,0 +1,7 @@ +@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. +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" -- 2.45.3 From 2ae5ace753b00fdc892e732808a2ad48668cb117 Mon Sep 17 00:00:00 2001 From: cliu <cliu@noreply.git.yokogawa.tech> Date: Thu, 1 Oct 2026 14:50:13 +1000 Subject: [PATCH 2/4] Add graphics manual summaries (R30, C50, C60) and graphics skill Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --- .claude/skills/graphics/SKILL.md | 38 +++++++ .../skills/graphics/tasks/create-display.md | 50 ++++++++++ .../skills/graphics/tasks/deploy-displays.md | 56 +++++++++++ knowledge/manuals/IM36K10C50-01EN.md | 98 +++++++++++++++++++ knowledge/manuals/IM36K10C60-01EN.md | 54 ++++++++++ knowledge/manuals/IM36K10R30-01EN.md | 83 ++++++++++++++++ 6 files changed, 379 insertions(+) create mode 100644 .claude/skills/graphics/SKILL.md create mode 100644 .claude/skills/graphics/tasks/create-display.md create mode 100644 .claude/skills/graphics/tasks/deploy-displays.md create mode 100644 knowledge/manuals/IM36K10C50-01EN.md create mode 100644 knowledge/manuals/IM36K10C60-01EN.md create mode 100644 knowledge/manuals/IM36K10R30-01EN.md diff --git a/.claude/skills/graphics/SKILL.md b/.claude/skills/graphics/SKILL.md new file mode 100644 index 0000000..98e173a --- /dev/null +++ b/.claude/skills/graphics/SKILL.md @@ -0,0 +1,38 @@ +--- +name: graphics +description: >- + CI Server R1.03 operator graphics: displays, symbols, layouts and HTML displays. 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 + use the AOG library (Advanced Operating Graphics, AOG_Style, AOG symbols, faceplates). Sources + IM 36K10C50-01EN, IM 36K10R30-01EN, IM 36K10C60-01EN. +--- + +# Graphics: displays, symbols, layouts (R1.03) + +Background: `knowledge/manuals/IM36K10C50-01EN.md` (Edit Module, components, sheets, symbols, +`jwuiutl`, display file contents), `IM36K10R30-01EN.md` (folders, layouts, dataset forms, HTML +display), `IM36K10C60-01EN.md` (AOG library). + +Rules: +- Drawing is done by the user in the **Edit Module** (GUI). Claude prepares the steps, checks the + saved XML, deploys/exports/validates files and checks the HTML display in the browser. +- Displays and layouts are shared by every operator: changing or deleting existing files only + with the user's approval; keep a copy first (`Layouts-original.xml` is the factory layout file). +- The HTML display needs a CI Server login: the user logs in; Claude never enters passwords. + Reloading the browser page logs out — reopen displays via the display box instead. +- `jwuiutl -vf`, `-u`, `-c`, `-a` rewrite or unlock files of **all** displays: only with approval. + +| 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 | +| 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/create-display.md b/.claude/skills/graphics/tasks/create-display.md new file mode 100644 index 0000000..5d23f65 --- /dev/null +++ b/.claude/skills/graphics/tasks/create-display.md @@ -0,0 +1,50 @@ +--- +task: Build a display in the Edit Module and check the saved file +version: R1.03 +source: IM 36K10C50-01EN §1.2, §1.7, §2, §4.8.1; practiced on CI-Eng-Sample (display CIENG_Tank) 2026-10-01 +status: verified +--- + +# Build a display (Edit Module) + +The user draws; Claude gives the steps and checks the result. Example = the sample display +`examples/CI-Eng-Sample/displays/CIENG_Tank.xml`. + +## Steps for the user + +1. Start the Edit Module and log in. +2. *File > New Display*, name `<DisplayName>`; tick **HTML display** if it should also run in a + browser (the editor then hides unsupported components and properties). +3. Add components from the component bar, for example: + - **Text** — title. + - **Number field** — in the Properties sheet click **Value**, open the connection dialog, + *Items* tab, pick `<Section>.<Tag>`. + - **Alarm Overview** — right-click > *Component Properties*; *Filter* tab for an ASA, section + or tag filter; *Types* tab for current/historical. + - **Trend** — component properties, pen 1 = `<Section>.<Tag>` (a new trend has 5 empty pens; + the item must be in a storage group). +4. *File > Save* (or *Save with Revision Information*). Close the tab when done: an open + display is locked (`<DisplayName>.lck`) and `jwuiutl` skips it. + +## Check the saved file + +Folder `%TLS_WAP_PATH%\cfg\operatorInterfaces\DEPLOY\displays\` (and with HTML mode also +`%TLS_WAP_PATH%\mobileoperator\operatorInterfaces\DEPLOY\displays\<DisplayName>.html`). + +``` +grep -n "<html>\|<width>\|<height>\|itemName\|itemId\|<source" <DisplayName>.xml +``` + +- `<html>true</html>` = HTML mode; `<width>`/`<height>` must be set for the HTML display. +- Item connections: `<itemName>` + `<itemId>` (node.group.number…); trend pens: + `<source type="sourceID" uri="ci:/item/<item>"/>` (`uri=""` = empty pen). +- The name is what counts: after the item was deleted and loaded again (new id) the display + still validated and a new session showed live values; already-open sessions kept showing the + old value until reopened. + +## Verified (CIENG_Tank, 2026-10-01) + +Text `CI-Eng-Sample Tank 1`, number field on `TANK1.LEVEL` (live: 72 → 61), alarm overview +(no filter; listed the TANK1.LEVEL alarms), trend pen `TANK1.LEVEL` (legend +`CI-Eng-Sample.TANK1.LEVEL [CIENG_SCAN10S]` = highest-priority storage group). In the HTML +display the trend drew no line (ISS-041). diff --git a/.claude/skills/graphics/tasks/deploy-displays.md b/.claude/skills/graphics/tasks/deploy-displays.md new file mode 100644 index 0000000..76b0a21 --- /dev/null +++ b/.claude/skills/graphics/tasks/deploy-displays.md @@ -0,0 +1,56 @@ +--- +task: Deploy, remove, export, validate and search displays; open them in the browser +version: R1.03 +source: IM 36K10C50-01EN §1.5; IM 36K10R30-01EN §1.1, §4; practiced on CI-Eng-Sample 2026-10-01 +status: verified +--- + +# Deploy and check displays + +No admin rights needed (`C:\Users\Public\Yokogawa\tls\wap`). `jwuiutl.cmd` is in `tls\com` +(on `PATH`); call it through `cmd` (`cmd /c "jwuiutl.cmd …"`). + +## 1. Deploy / remove (sample scripts) + +`examples/CI-Eng-Sample/displays/deploy_displays.cmd`: copies `CIENG_Tank.xml` to +`%TLS_WAP_PATH%\cfg\operatorInterfaces\DEPLOY\displays\` and runs +`jwuiutl.cmd -e HTML -i -f DEPLOY CIENG_Tank` (HTML into +`%TLS_WAP_PATH%\mobileoperator\operatorInterfaces\DEPLOY\displays\`). +`remove_displays.cmd` deletes both files (close the display in the Edit Module first). +Deploy after `load.cmd` so the items exist. + +For another display: copy `<name>.xml` into `DEPLOY\displays` and export it the same way. +Displays with symbols also need the symbol files in `DEPLOY\symbols`. + +## 2. Validate (report only) + +``` +cmd /c "jwuiutl.cmd -d -v -i -l <scratch>\validate.txt" +``` + +Per display: `Validating <name>` then `Info: No problems found`, or `*** Validation failed for +display <name>:` with `Problem: <component>: Connected item is not found (<item>)`. Skipped: +`*** Display locked <name>` (open in the Edit Module or a stale `.lck`; `-u` unlocks — with +approval), displays saved by a newer version. `-vf` re-saves all displays — only with approval. + +## 3. Search + +``` +cmd /c "jwuiutl.cmd -d -m <term> > <scratch>\match.txt 2>&1" +``` + +CSV `Type, File, Component` per match; `-M` adds actions and properties. Use it before deleting +or renaming items to find the displays that use them. + +## 4. Open in the browser (HTML display) + +`http://localhost:8080/mobileoperator/?d=<display>` (`&l=<layout>`). The user logs in with a CI +Server user. The page shows the operator frame (menu, navigation buttons, alarm banner, status +line). To switch displays type the name in the display box and press Enter — **reloading the +page ends the session**. Check live values by writing a test value (`itmval -p`, test items only). + +## Verified (2026-10-01) + +Remove → deploy recreated both files; `-e HTML` output identical to the Edit Module's HTML; +validation of `CIENG_Tank` *No problems found* (also after a sample reload with new item ids); +search worked; browser showed live values. HTML trend without line: ISS-041. diff --git a/knowledge/manuals/IM36K10C50-01EN.md b/knowledge/manuals/IM36K10C50-01EN.md new file mode 100644 index 0000000..d201a5f --- /dev/null +++ b/knowledge/manuals/IM36K10C50-01EN.md @@ -0,0 +1,98 @@ +--- +manual: IM 36K10C50-01EN +title: Edit Module +edition: 3rd Edition, Sep. 2023 +version: R1.03 +status: display CIENG_Tank built by the user in the Edit Module (text, number field, alarm overview, trend) and checked as XML and HTML 2026-10-01; jwuiutl search, validate and HTML export verified; other components, symbols, actions and the tutorial from docs +--- + +# Edit Module (R1.03) + +The Edit Module draws displays and symbols for the operator interface (CI View) and the HTML +display. Displays are XML files (`IM36K10R30-01EN.md` §1). Section numbers refer to the manual. + +## 1. Window and files (§1) + +- Window: sheets, component bar, graphic sheet, symbols sheet, menu, toolbar, edit area. +- *File > New Display* (Ctrl+N), *New Symbol* (Ctrl+Shift+N), *Save* (Ctrl+S), *Save with + Revision Information* (who/when/why, kept in `revisionHistory`), *Save As*, *Save Selection + as* (new symbol or display), print area, print. Open displays are locked (`<name>.lck`); + autosave writes `<name>.xml.autosave`. +- *Edit > Find* searches the open display; `jwuiutl -m` searches all. +- **HTML display** check box (new display dialog / display properties): the editor then offers + only HTML-supported components, properties and actions, and saving also writes the HTML file. + HTML mode can be switched off later. Not for enterprise displays. The tab icon shows normal / + HTML / HTML with unsupported content. +- Localisation: *Tools > Configure Localization* → *Extract Text*, add locale, translate; + global and per-file tables; the operator's locale decides. +- *Playback > Record* records operator/editor sessions; *Open viewer* plays them back. + +## 2. `jwuiutl` — batch operations (§1.5) + +`jwuiutl.cmd` (in `tls\com`, Java; runs from a normal prompt): + +| Option | Use | +|---|---| +| `-d` / `-s` | Only displays / only symbols (`-p <palette>`, `-g <group>`) | +| `-v` | Validate (connected items exist, components defined); report only. `-l <file>` writes the result, `-i` shows progress (`Validating <name>` / `Info: No problems found`) | +| `-vf` | Force validation and **save** every display/symbol | +| `-u` | Unlock locked files (`.lck` left by a crashed editor) | +| `-c` / `-a` | Clean up temporary files / validate + unlock + clean up | +| `-m <terms>` / `-M <terms>` | Print matching components (CSV) / with actions and properties | +| `-e HTML [-o <dir>] [-f <deployment>] [<display>]` | Export HTML displays | +| `-b`, `-z`, `-h true/false` | Also save `.xml.bin` (faster loading) / compressed / set HTML mode | +| `-un`, `-pw` | User for enterprise displays | + +**Verified on the test system:** `-d -m TANK1` and `-d -v -i -l` ran without errors; locked +displays and displays saved by a newer version are skipped (`*** Display locked <name>`, +`… created with a newer version of CI Server (R1.04.0.0)`); `-e HTML -i -f DEPLOY CIENG_Tank` +wrote `mobileoperator\operatorInterfaces\DEPLOY\displays\CIENG_Tank.html`. + +## 3. Components (§2) + +Shapes (rectangle, ellipse, arc, polygon, spline, line, links), text / text field / text area +/ password field, number and number field, icon, rectangular and circular scales, radial, data +bar, spinner, slider, push/toggle button, check box, radio button, combo box, list box, date +and time field, **alarm overview** (current/historical; acknowledge, block, shelve, link display, +export; dialog tabs Types, Columns, Filter, Alarm link display, Appearance, Header and footer, +Fetching, Alarm Shelving, Enterprise, Advanced, Attributes), list of blocked items, alarm +sound, dataset tables (view/edit dataset records), report, **trend** (pens on items with +history; shows limits; time slider and controls; definitions can be saved from the operator +interface), DTS trend, micro trend, playback indicator, calculation/function, JavaScript +function, web browser, PDF viewer, navigation tree, display generator, map viewer. + +## 4. Sheets (§4) + +Visualization (displays/symbols tree), zoom, visibility groups (shown by zoom factor), +**parameters** (default read-only ones such as `name`, `attachedObject`, `client`, `server`, +`mouseX`; user-defined with scope; `$name` in command lines), messages, symbols, **properties** +(connect a property to an item attribute, parameter or dataset field; linear transformations; +writable properties: value, item name parts, id, units, description, status number/text, +control status, option bits), layers, attributes, edit history (undo/redo), **actions** (open / +close display, execute command, read/write parameters; triggered by component events). + +## 5. Symbols (§5) + +*File > New Symbol*; put it on a palette (attributes sheet); external user-defined parameters +become properties of each instance; after changing a symbol run *Tools > Validate all +Symbols* and *Validate all Displays* (with all tabs closed); a symbol can be linked to a +PROCESS Service class so each instance shows one object; data location (display, operator's +CI Portal, display's server, enterprise, node). + +## 6. What the display file stores (verified with CIENG_Tank) + +- `<coreObjectDefinition type="displayDefinition">` with `<html>true</html>`, `<width>`, + `<height>`, grid, revision history, visibility groups, layers. +- Components as elements (`text`, `numberField`, `alarmOverview`, `chart` = trend). +- Item connections in `<globalSection>`: `<itemName>CI-Eng-Sample.TANK1.LEVEL</itemName>` **and** + `<itemId>1.1.248.0.0.1.1.7</itemId>`. Trend pens: `<source uri="ci:/item/<item>"/>`; a new + trend has 5 empty pens. +- **After a sample remove/reload the item got id 268** while the file kept 248: `jwuiutl -v` still + reported *No problems found*, and a newly opened session showed the live value — the name is + what counts. Sessions that were already open kept the old binding (value frozen) until the + display was opened in a new session. + +## 7. Tutorial (§6) + +Builds wheels, faceplates, valve symbols, indicators, PID faceplates with mode and setpoint +dialogs, scales, limit colours, tag info and pinning buttons — a guided exercise in the GUI. diff --git a/knowledge/manuals/IM36K10C60-01EN.md b/knowledge/manuals/IM36K10C60-01EN.md new file mode 100644 index 0000000..e777007 --- /dev/null +++ b/knowledge/manuals/IM36K10C60-01EN.md @@ -0,0 +1,54 @@ +--- +manual: IM 36K10C60-01EN +title: Advanced Operating Graphics +edition: 3rd Edition, Sep. 2023 +version: R1.03 +status: from docs; installed AOG displays checked read-only (DEPLOY\displays, mobileoperator) 2026-10-01 +--- + +# Advanced Operating Graphics — AOG library (R1.03) + +A ready-made library of symbols and displays in a consistent, high-performance HMI style, +used from the Edit Module's Visualization sheet. Section numbers refer to the manual. + +## 1. Symbols (§1.1) + +| Kind | Purpose | Palettes / examples | +|---|---|---| +| Equipment symbols | Static equipment, no live data | `AOG_ContainersAndVessels` (AOG_Tank, AOG_Vessel, AOG_Reactor, …), `AOG_HeatTransfer`, `AOG_Indicator`, `AOG_MaterialHandling`, `AOG_Mixing`, `AOG_Rotating` (pumps, compressors, turbine), `AOG_Separators`, `AOG_ValvesAndActuators`, `AOG_Electrical`, `AOG_Filters`, `AOG_Others` (Yokogawa systems such as AOG_CentumFCS, AOG_ProsafeRS, AOG_StardomFCN, AOG_FAM3, AOG_DTS; field devices; stations) | +| Item symbols | Show and change one or more item attributes | indicators (bar, needle, circular, radial, number, text, on/off, manual, alarm, trend), valves (2-way, 3-way, on/off), selection box, name/info | +| Object symbols (`AOG_O…`) | Same, driven by PROCESS Service object signals | e.g. `AOG_ONumberIndicator`, `AOG_OHorizontalBarIndicator` | +| Navigation symbol, components | Navigation between displays | | + +## 2. Displays (§1.2) + +Standard displays: `AOG_Default`, `AOG_DisplayTemplate` (start for new displays), `AOG_Style` +(global style parameters), `AOG_MenuMain`, alarm displays (`AOG_AlarmBanner`, `AOG_AlarmCurrent`, +`AOG_AlarmHistory`, `AOG_AlarmShelved`), `AOG_AuditTrail`, `AOG_ItemFaceplate`, +`AOG_ItemTuningPanel`, `AOG_ObjectFaceplate`, `AOG_ObjectTuningPanel`, `AOG_SetItemMode`, +`AOG_SetObjectMode`, `AOG_SetNumberPV/SV/SL/SH/SLL/SHH`, `AOG_LockStatus`, `AOG_TrendOpen`, +OPC UA method call displays; plus demo displays. **Installed**: these are in +`DEPLOY\displays`, and the alarm, audit, default, menu, style, trend and UA method displays also +exist as HTML displays. + +## 3. Global style parameters (§1.1, §2.1.1) + +Defined once on the `AOG_Style` display (*Parameters* tab) and used by all AOG symbols: +colours (`AOG_C…`: alarm high/medium/low/diagnostic/off, display background, equipment +running/off/not running, fluid and gas lines, indicator background/limit/normal/outline/signal, +manual control, selector, text 1–4), strokes (`AOG_S…`), fonts (`AOG_FT1–4`), engineering unit +texts (`AOG_EF1` flow, `AOG_EL1` level, `AOG_EP1` pressure, `AOG_ET1/2` temperature), on/off +texts, `AOG_BlinkOnNotAcknowledged`. Changing a value changes every symbol that uses it. + +## 4. Building an HMI (§2) + +Edit Module → (optionally) adjust `AOG_Style` and save → *New display* or start from +`AOG_DisplayTemplate` → place AOG symbols from the Visualization sheet → connect them to items +or objects → save → open in the operator interface. New symbols can be made in the same style. + +## 5. Enterprise (§3) + +Enterprise displays and AOG item/object symbols for enterprise engineering (items/objects on +several servers; locations chosen per symbol). + +Not practiced: the sample display uses plain components; AOG symbols need the Edit Module GUI. diff --git a/knowledge/manuals/IM36K10R30-01EN.md b/knowledge/manuals/IM36K10R30-01EN.md new file mode 100644 index 0000000..f7beba5 --- /dev/null +++ b/knowledge/manuals/IM36K10R30-01EN.md @@ -0,0 +1,83 @@ +--- +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 +--- + +# Graphic Display Setup (R1.03) + +How the operator interface is framed (layouts), how custom dataset forms are added, and how +displays run in a web browser (HTML display, "Mobile Operator"). Section numbers refer to the +manual. Building displays: `IM36K10C50-01EN.md`; AOG library: `IM36K10C60-01EN.md`. + +## 1. Files and folders (installed) + +| What | Where (`%TLS_WAP_PATH%` = `C:\Users\Public\Yokogawa\tls\wap`) | +|---|---| +| Displays (operator interface) | `cfg\operatorInterfaces\DEPLOY\displays\<name>.xml` (plus `.lck` while open in the Edit Module, `.autosave`) | +| Symbols | `cfg\operatorInterfaces\DEPLOY\symbols\` (≈ 3100 files incl. the AOG library) | +| Layouts | `cfg\operatorInterfaces\DEPLOY\layouts\Layouts.xml` (+ `Layouts.readme`, `Layouts-original.xml`) | +| Components, locales, thresholds | `cfg\operatorInterfaces\DEPLOY\components\`, `locales\`, `thresholds\` | +| HTML displays | `mobileoperator\operatorInterfaces\DEPLOY\displays\<name>.html` | +| Dataset forms | `cfg\dialog\dialogs\<name>Dia.xml` (components `<name>Com.xml`, definitions `JToolsGlobalDef.xml`); texts in `cfg\properties\` | + +`DEPLOY` is the deployment name (a user's *Operator Interface Deployment* field selects another; +empty = `deploy`). + +## 2. Layouts (§1) + +- `Layouts.xml` holds several `<layout>` elements under `<layouts>` (common options such as + `debugActivationKey="CONTROL SHIFT F6"` for the graphics debugger, Java only). A layout = + menu, toolbar, **frame set (required)**, status line. +- Layout options: `name`, `icon`, `title` (`$<frame>` = title of the display in that frame), + `drawBorder`, `sizingAllowed`, `minimizingAllowed`, `closingAllowed`, `alwaysOnTop`, `modal`, + `lookAndFeel`, `initialPosition` (… `fitFrames`), `initialPositionX/Y`, `initialSize`, + `initialSizeWidth/Height`, `maximumOpen`, print orientation and margins (Java only). +- Menu items (§1.5, e.g. `menu.file.login`, `menu.view.reload`), toolbar (§1.6), status line + items (§1.7, e.g. graphics queue level), frames and tabs (§1.8), translations (§1.9). +- Which layout opens: *In layout* of an *Open display* action (Edit Module), or the user's + *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 + each banner open its main display in its own layout. +- **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 + size). The test system's `Layouts.xml` also has a custom layout added by the author; keep a copy + of the original before editing. + +## 3. Dataset forms (§2, §3) + +Engineering-Module-style forms for operators: write `<name>Dia.xml` in `cfg\dialog\dialogs` +(never change the existing forms there), optionally a property file per language, then place a +*Dataset form* component on a display. Objects: `label`, `textField`, `checkBox`, `comboBox`, +`panel`, `component` (`JhmiRecordNameCom`, `JhmiTreeComboBoxCom`, `JhmiSelectAvailableCom`, +`JhmiTimeSelectorCom`); `meta` links an object to a dataset field: `field=`, `mixedValue=`, +`choices=<dataset>[,<field>[,<filter>]]`, `none=`, `available=`/`selected=`, `label=`, +`dateVisible=`, `visibility=`. Layout by `column`, `top="+"`, `right="*"`. Localisation via +property files and language codes (§3.5). + +## 4. HTML display / Mobile Operator (§4) + +- Export: Edit Module saves the HTML version automatically when the display has **HTML + display** ticked; or `jwuiutl -e HTML -i [-o <path>] [-f <deployment>] [<display>]` (without + `-o` it writes into `mobileoperator\operatorInterfaces\<deployment>`). **Verified**: both give + identical HTML (except a time stamp). +- Open: `http(s)://<host>:8080|8443/mobileoperator?d=<display>&l=<layout>&u=<user>` or *Open* of + *Mobile Operator* on the Remote Connect page. Login with a CI Server user (manual, or SSO via + `https://<host>: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 + 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); open other displays with the display box instead. +- Differences from the Java operator interface (§4.7): layout windows live inside the browser + window (no resizing of embedded layouts); displays need explicit width/height; names are + case-sensitive; zoom and pan not supported; some mouse/keyboard events and actions missing; + no enterprise displays. Components supported (§4.8): alarm overview, display, group, symbol, + trend, visibility group/layer, parameters, web browser (with listed properties). +- Full screen F11, Chrome shortcuts or `chrome.exe --app=http://<host>:<port>`. +- **Test system**: the HTML trend of `CIENG_Tank` drew no line although history existed; browser + console `Mismatch between number of labels … and number of columns in array (51)` (ISS-041). -- 2.45.3 From 3b1fbf8838852c7d8bc9499c6a2eb936b1b889f1 Mon Sep 17 00:00:00 2001 From: cliu <cliu@noreply.git.yokogawa.tech> Date: Thu, 1 Oct 2026 14:50:13 +1000 Subject: [PATCH 3/4] Record phase 10 progress and ISS-041 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --- knowledge/issues.md | 1 + knowledge/progress.md | 11 +++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/knowledge/issues.md b/knowledge/issues.md index e27a35b..8e9556c 100644 --- a/knowledge/issues.md +++ b/knowledge/issues.md @@ -60,3 +60,4 @@ 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 | diff --git a/knowledge/progress.md b/knowledge/progress.md index c0b9caf..019bc2d 100644 --- a/knowledge/progress.md +++ b/knowledge/progress.md @@ -53,9 +53,9 @@ 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 | not started | -| 10 | IM 36K10C50 | Edit Module | not started | -| 10 | IM 36K10C60 | Advanced Operating Graphics | not started | +| 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 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 | | 11 | IM 36K10P30 | Data Set Service Language | not started | | 11 | IM 36K10P20 | Report Generation Language | not started | @@ -107,7 +107,7 @@ now come before classes and objects (phase 6), and the other interfaces follow a | G10/C10 | Authorization group and user creation ([task](../.claude/skills/authorization/tasks/users-groups.md)) | passed | passed | Group `CIENG_VIEWER` (sample file `08_auth_group_df.qli`) loaded/removed by Claude; test user `CIENG_TEST` (no password) loaded by the user, checked and removed. The sample creates no users. | | C10 | String items: length 1–200, holds length − 1 characters ([task](../.claude/skills/item-engineering/tasks/string-items.md)) | passed | passed | Tested with temporary `CI-Eng-Sample.DEMO.STR*` items (removed): 201 rejected; too-long writes cut, status 12 OVERRANGED ([ISS-019](issues.md)). | | C10 | Integrator time unit: integration granule `itm_int_secs` in `itm.sup` ([task](../.claude/skills/item-engineering/tasks/sub-items.md)) | passed | passed | 60 → `RUN_SECONDS` +1 per minute; restored to 1 (file identical to backup), +1 per second again ([ISS-010](issues.md)). Elevated restarts run by the user. | -| G10 | Displays, symbols, Operator Interface test | not practiced | pending | GUI (Edit Module); phase 10. | +| G10 | Displays, symbols, Operator Interface test | display done (phase 10); symbols not practiced | display added | Display `CIENG_Tank` built in the Edit Module and checked in the HTML display. | | L41/C10 | Modbus TCP line, station, scan type, points, connected items by quick load ([task](../.claude/skills/equipment/tasks/modbus-station.md)) | passed | passed | Loopback to CI Server's own Modbus slave (`eqpmdcmem` + `eqpmdcslvtcp` on 5020, started by hand). Line load created and started `EQPCIENG`; removal stopped it and deleted its files. Write/read-back, off-scan/on-scan checked; full remove/reload from sample files. Protocol must be Open Modbus/TCP ([ISS-024](issues.md)). Mirror start files copied to `tls\com` by the user; after a restart everything came back under the CI Service and the setpoint was re-sent on connect. | | G10 | Alarms, reports, audit, RDBMS, history | alarms done (phase 8); others not practiced | alarms added | Covered in their own phases (7–12). | | R10/R20 | Read a setup file: active settings and keyword help ([task](../.claude/skills/portal-setup/tasks/read-setup-file.md)) | passed | n/a | Read-only. Compared with the Setup File Editor GUI for `wfla_display.sup`, `wflgdi.sup` and all 9 tabs of `jwuiisg.sup`: fields and values identical. Manual differences logged as ISS-012 to ISS-017 (installed software taken as the reference). | @@ -130,3 +130,6 @@ now come before classes and objects (phase 6), and the other interfaces follow a | L20 | `hisdbg` read-only checks and forced rollover ([task](../.claude/skills/history-management/tasks/history-checks.md)) | passed | passed | 45 groups, 30 clients; group/unit info; rollover of `CIENG_EVENT` closed unit 3,1. Extra history types 4 and 36 (ISS-039). | | L20/L35 | `ithloahis` into older units ([task](../.claude/skills/system-management/tasks/load-history.md)) | passed | passed | Samples in the active unit or a unit closed after the restart stored; older ones dropped silently (ISS-006); dropped sample became the next unit's initial value (ISS-038). | | 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). Page reload ends the browser session. | +| 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. | -- 2.45.3 From 9c170d8d6f29c26918af9a7074e2301f760840d8 Mon Sep 17 00:00:00 2001 From: cliu <cliu@noreply.git.yokogawa.tech> Date: Thu, 1 Oct 2026 14:52:13 +1000 Subject: [PATCH 4/4] Document View > Reload for HTML displays Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --- .claude/skills/graphics/SKILL.md | 3 ++- .claude/skills/graphics/tasks/deploy-displays.md | 5 +++-- knowledge/manuals/IM36K10R30-01EN.md | 3 ++- knowledge/progress.md | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.claude/skills/graphics/SKILL.md b/.claude/skills/graphics/SKILL.md index 98e173a..61e3bee 100644 --- a/.claude/skills/graphics/SKILL.md +++ b/.claude/skills/graphics/SKILL.md @@ -24,7 +24,8 @@ Rules: - Displays and layouts are shared by every operator: changing or deleting existing files only with the user's approval; keep a copy first (`Layouts-original.xml` is the factory layout file). - The HTML display needs a CI Server login: the user logs in; Claude never enters passwords. - Reloading the browser page logs out — reopen displays via the display box instead. + 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. | Task | File | Status | diff --git a/.claude/skills/graphics/tasks/deploy-displays.md b/.claude/skills/graphics/tasks/deploy-displays.md index 76b0a21..d1bcfc5 100644 --- a/.claude/skills/graphics/tasks/deploy-displays.md +++ b/.claude/skills/graphics/tasks/deploy-displays.md @@ -46,8 +46,9 @@ or renaming items to find the displays that use them. `http://localhost:8080/mobileoperator/?d=<display>` (`&l=<layout>`). The user logs in with a CI Server user. The page shows the operator frame (menu, navigation buttons, alarm banner, status -line). To switch displays type the name in the display box and press Enter — **reloading the -page ends the session**. Check live values by writing a test value (`itmval -p`, test items only). +line). To switch displays type the name in the display box and press Enter. To refresh, use the +display menu **View > Reload** (keeps the session) — **reloading the browser page ends the +session** and needs a new login. Check live values by writing a test value (`itmval -p`, test items only). ## Verified (2026-10-01) diff --git a/knowledge/manuals/IM36K10R30-01EN.md b/knowledge/manuals/IM36K10R30-01EN.md index f7beba5..5ec5a2e 100644 --- a/knowledge/manuals/IM36K10R30-01EN.md +++ b/knowledge/manuals/IM36K10R30-01EN.md @@ -72,7 +72,8 @@ property files and language codes (§3.5). - **Verified**: `http://localhost:8080/mobileoperator/?d=CIENG_Tank` showed the CI View-like 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); open other displays with the display box instead. + the session** (login again); use the display's own menu *View > Reload* instead (keeps the + session, confirmed by the user), and the display box to open other displays. - Differences from the Java operator interface (§4.7): layout windows live inside the browser window (no resizing of embedded layouts); displays need explicit width/height; names are case-sensitive; zoom and pan not supported; some mouse/keyboard events and actions missing; diff --git a/knowledge/progress.md b/knowledge/progress.md index 019bc2d..56cd7a7 100644 --- a/knowledge/progress.md +++ b/knowledge/progress.md @@ -131,5 +131,5 @@ now come before classes and objects (phase 6), and the other interfaces follow a | L20/L35 | `ithloahis` into older units ([task](../.claude/skills/system-management/tasks/load-history.md)) | passed | passed | Samples in the active unit or a unit closed after the restart stored; older ones dropped silently (ISS-006); dropped sample became the next unit's initial value (ISS-038). | | 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). Page reload ends the browser session. | +| 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. | -- 2.45.3