diff --git a/examples/CI-Eng-Sample/README.md b/examples/CI-Eng-Sample/README.md
index 713c3ae..f27c879 100644
--- a/examples/CI-Eng-Sample/README.md
+++ b/examples/CI-Eng-Sample/README.md
@@ -114,6 +114,9 @@ New items start with status 13 (`NOT INIT`) until a value is written.
| `19b_audit_item_df.qli` | *Audit trailing wanted* for `PUMP1.MODE` (loaded with `dssqld -m`) |
| `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/CIENG_TrendLab.xml` | Trend lab (1000 x 860, HTML mode): trend of `TANK1.LEVEL` (no history group, value axis) and `TANK1.INFLOW` (`CIENG_EVENT`), live, last hour, padded with 48 spare pens so it draws in the browser; Micro Trend of both items (ISS-055) |
+| `displays/add_trend_spares.ps1` | Pads every trend in a display file to 50 visible pens (web workaround, ISS-041); safe to run again |
+| `displays/trend_feed.ps1` | Writes sine-wave test values to `TANK1.LEVEL` / `TANK1.INFLOW` every 5 s (`-Seconds`, default 3600) |
| `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`) |
@@ -161,8 +164,8 @@ priority 1). To try it on a test system: `itmval -p -n CI-Eng-Sample.TANK1.LEVEL
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.
+1. `displays\deploy_displays.cmd` copies `CIENG_Tank`, `CIENG_Menu` and `CIENG_TrendLab` 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.
@@ -172,6 +175,12 @@ No admin rights needed. After `load.cmd`:
banner. HTML display (web): `http://localhost:8080/mobileoperator/?d=CIENG_Tank&l=CIENG_Operator`
(CI Server login).
+Trends: `TANK1.LEVEL` and `TANK1.INFLOW` are internal items and stay `NOT INIT` after a CI
+Server start, so trends stay empty. `powershell -ExecutionPolicy Bypass -File
+displays\trend_feed.ps1 -Seconds 3600` writes test values every 5 s. `CIENG_TrendLab` (also
+in the browser: `?d=CIENG_TrendLab`) shows the trend padded to 50 pens, which the HTML display
+needs to draw (ISS-041); `CIENG_Tank`'s trend has 1 pen and draws only on the desktop.
+
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`.
diff --git a/examples/CI-Eng-Sample/displays/CIENG_TrendLab.xml b/examples/CI-Eng-Sample/displays/CIENG_TrendLab.xml
new file mode 100644
index 0000000..3fcea54
--- /dev/null
+++ b/examples/CI-Eng-Sample/displays/CIENG_TrendLab.xml
@@ -0,0 +1,2573 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ 1000
+ 860
+ 8
+
+
+
+
+
+
+
+
+
+
+ 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 trend lab
+
+ true
+ 100.0
+ 24.0
+ 5.3125
+ 5.3125
+ 70.0
+ 70.0
+ 0.0
+ 0.0
+
+
+ 8
+
+
+
+ false
+ -1
+ true
+
+ 0
+ 0
+
+
+
+
+
+
+
+ false
+ 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
+ 50
+ 0
+ 0
+ true
+ true
+ false
+
+
+
+ true
+ true
+ 0
+
+ 0
+ 50
+ true
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ true
+ 0
+ true
+
+
+ 256
+
+
+ @NULL
+ true
+ true
+
+ true
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 0
+ NaN
+ NaN
+ false
+
+ Tank 1 level (%)
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 256
+
+
+ @NULL
+ true
+ true
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 0
+ NaN
+ NaN
+ false
+
+ Tank 1 inflow
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ NaN
+ NaN
+ NaN
+ NaN
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 1
+
+
+ @NULL
+ true
+ false
+
+ false
+ 0
+ true
+ true
+ true
+ @NULL
+ @NULL
+ 1
+ 1.0E30
+ 2.0E30
+ false
+
+
+
+ 0
+ 0
+ 0
+ false
+ false
+ false
+ false
+ false
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+ @NULL
+
+
+
+
+ 20.0
+ 80.0
+ 10.0
+ 90.0
+ false
+ 0
+
+
+ 417
+ true
+ -1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 10
+ true
+ true
+
+
+ 500.0
+ 350.0
+ 290.0
+ 290.0
+ 480.0
+ 480.0
+ 0.0
+ 0.0
+
+
+
+ 20
+ Micro trend (LEVEL, INFLOW)
+
+ true
+ 110.0
+ 670.0
+ 5.3125
+ 5.3125
+ 90.0
+ 90.0
+ 0.0
+ 0.0
+
+
+ 21
+ 2
+ true
+ true
+
+ itemName[0]
+ CI-Eng-Sample.TANK1.LEVEL
+
+
+ scaleMin[0]
+ 0.0
+
+
+ scaleMax[0]
+ 100.0
+
+
+ itemName[1]
+ CI-Eng-Sample.TANK1.INFLOW
+
+
+ scaleMin[1]
+ 0.0
+
+
+ scaleMax[1]
+ 500.0
+
+
+
+
diff --git a/examples/CI-Eng-Sample/displays/add_trend_spares.ps1 b/examples/CI-Eng-Sample/displays/add_trend_spares.ps1
new file mode 100644
index 0000000..c92631b
--- /dev/null
+++ b/examples/CI-Eng-Sample/displays/add_trend_spares.ps1
@@ -0,0 +1,79 @@
+# Pad every trend (chart) in a display file to 50 visible pens so it also draws in the HTML
+# display (web client). CI Server R1.03.00: the web trend always builds 50 data columns but only
+# labels the visible pens with an item; with fewer than 50 such pens it draws nothing (ISS-041).
+#
+# Spare pens copy the first real pen's source, are scaled far outside the data (manual scale
+# 1E30..2E30, so the line is clipped), hidden from the legend and get blank, unique legend texts
+# (1, 2, 3 ... spaces) because the web legend ignores "Show in legend". Empty pens are removed.
+# Run it again after editing the trend in the Edit Module (it only adds what is missing).
+#
+# Usage: powershell -ExecutionPolicy Bypass -File add_trend_spares.ps1 -Path .xml
+param([Parameter(Mandatory = $true)][string]$Path)
+
+$target = 50
+$text = [IO.File]::ReadAllText($Path)
+$nl = "`r`n"
+if (-not $text.Contains($nl)) { $nl = "`n" }
+
+function Set-Tag([string]$pen, [string]$tag, [string]$value) {
+ $rx = New-Object Text.RegularExpressions.Regex ("<$tag>[^<]*$tag>|<$tag/>")
+ return $rx.Replace($pen, "<$tag>$value$tag>", 1)
+}
+
+$panelRx = New-Object Text.RegularExpressions.Regex '(?s).*?'
+$penRx = New-Object Text.RegularExpressions.Regex '(?s)[ \t]*.*?\r?\n?'
+$changed = 0
+$text = $panelRx.Replace($text, {
+ param($m)
+ $panel = $m.Value
+ $pens = $penRx.Matches($panel)
+ if ($pens.Count -eq 0) { return $panel }
+ $real = @(); $spareCount = 0
+ foreach ($p in $pens) {
+ $v = $p.Value
+ $empty = $v.Contains('uri=""')
+ $isSpare = $v.Contains('1.0E30')
+ if ($isSpare) { $spareCount++ }
+ elseif (-not $empty) { $real += $v }
+ }
+ if ($real.Count -eq 0) { return $panel }
+ $visibleReal = 0
+ foreach ($v in $real) { if ($v.Contains('true')) { $visibleReal++ } }
+ $need = $target - $visibleReal
+ if ($need -lt 0) { $need = 0 }
+ $template = $real[0]
+ $spares = @()
+ for ($i = 1; $i -le $need; $i++) {
+ $s = $template
+ $s = Set-Tag $s 'legendText' (' ' * $i)
+ $s = Set-Tag $s 'description' ''
+ $s = Set-Tag $s 'type' '1'
+ $s = Set-Tag $s 'visible' 'true'
+ $s = Set-Tag $s 'visibleLegend' 'false'
+ $s = Set-Tag $s 'axisVisible' 'false'
+ $s = Set-Tag $s 'scaleRangeType' '1'
+ $s = Set-Tag $s 'minimum' '1.0E30'
+ $s = Set-Tag $s 'maximum' '2.0E30'
+ $s = Set-Tag $s 'procentual' 'false'
+ $s = Set-Tag $s 'annotationVisible' 'false'
+ foreach ($g in @('majorGridVisible', 'minorGridVisible', 'lowHighLimitGridVisible', 'lowHighLimitGridAreaVisible', 'lowLowHighHighLimitGridVisible')) { $s = Set-Tag $s $g 'false' }
+ $s = (New-Object Text.RegularExpressions.Regex '.*?(?=\s*)', 'Singleline').Replace($s, '@NULL', 1)
+ $spares += $s
+ }
+ # rebuild: real pens first, then spares, at the place of the first pen
+ $first = $pens[0].Index
+ $last = $pens[$pens.Count - 1]
+ $before = $panel.Substring(0, $first)
+ $after = $panel.Substring($last.Index + $last.Length)
+ $body = ''
+ foreach ($v in $real) { $body += $v }
+ foreach ($v in $spares) { $body += $v }
+ $panel = $before + $body + $after
+ $panel = (New-Object Text.RegularExpressions.Regex '\d+').Replace($panel, "$target", 1)
+ $script:changed++
+ Write-Host ("Trend {0}: {1} real pen(s), {2} old spare(s) replaced, {3} spare(s) written" -f $script:changed, $real.Count, $spareCount, $need)
+ return $panel
+})
+[IO.File]::WriteAllText($Path, $text)
+Write-Host "Done: $changed trend(s) in $Path"
diff --git a/examples/CI-Eng-Sample/displays/deploy_displays.cmd b/examples/CI-Eng-Sample/displays/deploy_displays.cmd
index 0d32b6e..f4d289a 100644
--- a/examples/CI-Eng-Sample/displays/deploy_displays.cmd
+++ b/examples/CI-Eng-Sample/displays/deploy_displays.cmd
@@ -8,5 +8,7 @@ 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\"
+copy /y CIENG_TrendLab.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
+call jwuiutl.cmd -e HTML -i -f DEPLOY CIENG_TrendLab
diff --git a/examples/CI-Eng-Sample/displays/remove_displays.cmd b/examples/CI-Eng-Sample/displays/remove_displays.cmd
index 51c164a..785aacc 100644
--- a/examples/CI-Eng-Sample/displays/remove_displays.cmd
+++ b/examples/CI-Eng-Sample/displays/remove_displays.cmd
@@ -1,9 +1,11 @@
@echo off
rem Remove the CI-Eng-Sample displays (operator interface and HTML version). CI Server R1.03.00.
-rem Close CIENG_Tank and CIENG_Menu in the Edit Module first.
+rem Close CIENG_Tank, CIENG_Menu and CIENG_TrendLab 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"
+del /q "%WAP%\cfg\operatorInterfaces\DEPLOY\displays\CIENG_TrendLab.xml"
+del /q "%WAP%\mobileoperator\operatorInterfaces\DEPLOY\displays\CIENG_TrendLab.html"
diff --git a/examples/CI-Eng-Sample/displays/trend_feed.ps1 b/examples/CI-Eng-Sample/displays/trend_feed.ps1
new file mode 100644
index 0000000..37049e4
--- /dev/null
+++ b/examples/CI-Eng-Sample/displays/trend_feed.ps1
@@ -0,0 +1,16 @@
+# Feed test values into the CI-Eng-Sample tank items so trends have a moving line.
+# CI Server R1.03.00. TANK1.LEVEL and TANK1.INFLOW are internal items: after a restart they
+# stay NOT INIT until something writes them. Writes every 5 s with itmval; stop with Ctrl+C.
+# LEVEL = 50 +/- 25 % (period 10 min, stays inside the L 20 / H 80 alarm limits)
+# INFLOW = 250 +/- 150 m3/h (period 4 min)
+param([int]$Seconds = 3600)
+
+$end = (Get-Date).AddSeconds($Seconds)
+while ((Get-Date) -lt $end) {
+ $t = [double]((Get-Date) - (Get-Date).Date).TotalSeconds
+ $level = [math]::Round(50 + 25 * [math]::Sin(2 * [math]::PI * $t / 600), 1)
+ $inflow = [math]::Round(250 + 150 * [math]::Sin(2 * [math]::PI * $t / 240), 1)
+ itmval -p -n CI-Eng-Sample.TANK1.LEVEL -v $level > $null
+ itmval -p -n CI-Eng-Sample.TANK1.INFLOW -v $inflow > $null
+ Start-Sleep -Seconds 5
+}