Compare commits

...

5 commits

Author SHA1 Message Date
3fe8a8c92b Merge pull request 'Phase 14: Trend settings (desktop and web) and the HTML trend fix' (#16) from docs/phase-14-trends into main
Reviewed-on: cliu/ci-server-config#16
2026-10-02 14:08:55 +10:00
7b731bc04e Close ISS-041 and ISS-056 confirmed by the user
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 14:07:01 +10:00
de55132dbf Colour trend spare pens like the legend background; Micro Trend is intermittent (ISS-055)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 14:06:04 +10:00
e98322d165 Add trend task (all trend settings, desktop vs web), record ISS-041 cause and ISS-055/056
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 13:57:58 +10:00
f612adb56e Add trend lab display, trend feeder and 50-pen web workaround script to the sample
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 13:57:57 +10:00
14 changed files with 2837 additions and 8 deletions

View file

@ -39,6 +39,7 @@ Rules:
|---|---|---|
| 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 |
| Trend: pen sources (history group, aggregates), every pen and chart setting, desktop vs HTML display, 50-pen web workaround (`add_trend_spares.ps1`), Micro Trend | `tasks/trend.md` | verified (desktop); web workaround verified; Micro Trend open (ISS-055) |
| Open and check a display in the browser (HTML display / Mobile Operator) | `tasks/deploy-displays.md` §4 | verified |
| Operator layouts (`Layouts.xml`): windows, menus, toolbars, frames, popups, kiosk screens; open displays in frames and layouts | `tasks/layouts.md` | verified (dual screen, per-user layout from docs) |
| Dataset forms (`*Dia.xml`) and the form description language | R30 summary §3 | from docs |

View file

@ -56,4 +56,5 @@ grep -n "<html>\|<width>\|<height>\|itemName\|itemId\|<source" <DisplayName>.xml
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).
display the trend drew no line: a trend needs 50 visible pens to draw on the web (ISS-041;
workaround and all trend settings in `trend.md`).

View file

@ -55,4 +55,5 @@ session** and needs a new login. Check live values by writing a test value (`itm
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 —
but a stale `<itemId>` then shows 0 at run time, ISS-052);
search worked; browser showed live values. HTML trend without line: ISS-041.
search worked; browser showed live values. HTML trend without line: ISS-041 (cause and
workaround in `trend.md` §6).

View file

@ -0,0 +1,132 @@
---
task: Configure a trend (chart) component; what each setting does on the desktop and in the HTML display
version: R1.03
source: IM 36K10C50-01EN §2.27 (Trend, Tables 2.27-10…28), §2.29 (Micro Trend); IM 36K10R30-01EN §4.8.7; installed web client code (`%TLS_WAP_PATH%\mobileoperator\src\fasttools\ui\components\implementation\charts\`); practiced on CI-Eng-Sample (display CIENG_TrendLab) 2026-10-02
status: verified (desktop Operator Interface: every row marked ✅/❌ below; HTML display: §6)
---
# Trend settings (desktop and web)
Example: `examples/CI-Eng-Sample/displays/CIENG_TrendLab.xml` (deployed by
`deploy_displays.cmd`). Method used: change one XML value in the display, deploy, *View >
Reload* in the client, compare.
## 1. Before you start
- **Data**: the trend draws history. `TANK1.LEVEL` / `TANK1.INFLOW` are internal items: after a
CI Server start they are `NOT INIT` (value 0) until something writes them, and the trend then
shows nothing (or a bold black line at 0 with status drawing). For tests run
`displays/trend_feed.ps1` (writes sine waves with `itmval` every 5 s; `-Seconds` = run time).
- **Reload**: changes in the display file show after *View > Reload*. A reload within a few
seconds of the deploy can still show the old file — reload again.
- The **Trend properties** dialog (right-click the trend) and the trend toolbar change the trend
only for the session; *Save trend as* writes a trend definition to
`%TLS_WAP_PATH%\cfg\charts\<name>.xml` (same `<chartPanel>` format; factory `Template1..4.xml`).
The display file holds the start-up settings under `<chart>` › `<config>` › `<chartPanel>`.
## 2. Pen source (`<pen>` › `<source uri=…>`)
```
ci:/item/<Section>.<Tag>[?historygroup=<GROUP>[&amp;aggregationperiod=<PERIOD>]][#<ATTR>]
```
| Part | Values | Result (desktop and web the same) |
|---|---|---|
| no `historygroup` | — | works; trend picks the highest-priority storage group (here `CIENG_SCAN10S`, seen in table mode); legend without `[group]` |
| `historygroup=CIENG_EVENT` / `CIENG_SCAN10S` | an item storage group | works; legend `… [GROUP]` |
| aggregation group without attribute | e.g. `CIENG_AGG` | ❌ `WFL-E-HIS_ITMN` / `ITH-E-NO_ADM_UPD` *Item not defined in group, or group not specified* |
| aggregation group **with** `aggregationperiod` + `#MAX` | periods `30MIN HOUR SHIFT DAY WEEK MONTH YEAR`; attributes `MAX MIN AVG INT SDV CNT DFSM` | ✅ one flat segment per finished period; legend `… / AGG_MAX 30MIN [CIENG_AGG]` |
| `#H` `#HH` `#L` `#LL` `#DB` | limit / deadband attributes | ❌ *Record not found* unless the limit history is stored |
| `uri=""` | — | empty pen |
`&` must be written `&amp;` in the XML. The *Pen attributes > Attribute[n]* property of the
component is the same attribute (`ITEM_VALUE`, `AGG_MAX`…): connecting it to an item by mistake
gives *Short attribute name (<value>) is invalid* (ISS-041 history).
## 3. Pen settings (`<pen>`)
| XML | Values | Desktop result |
|---|---|---|
| `type` | 0/1 line, 2 bar (no button in the pen panel), 3 stair-step, 4 scatter (squares); **+256** = status drawing: offline / `NOT INIT` parts drawn bold black (256 = Edit Module default = line + status) | ✅ |
| `color`, `stroke width` | | ✅ |
| `paint` (fill) `<paint type="paint"><paint type="colorSet" …/></paint>` | | ✅ filled from 0 up, **opaque** (covers other pens); legend symbol filled |
| `visible` false | | ✅ line hidden **and** removed from legend; tick cleared in the pen panel |
| `visibleLegend` false / `legendText` | | ✅ hidden from / renamed in the legend |
| `scaleRangeType` | **0** item scale range (item definition), **1** manual `minimum`/`maximum`, **2** fit to data (with margin; min/max ignored) | ✅ |
| `procentual` | | ✅ axis 0–100 % of the range, `%` label |
| `timeShift` | seconds | ✅ data drawn later by that time (overlay of older data) |
| `axisVisible` | | ✅ value axis (left); clicking a legend entry also shows that pen's axis and thickens the line (hover thickens) |
| `axisPosition` | 0 left, 1 right | ✅ |
| `axisColor`, `labelColor` (`<axisColor type="colorSet" r=… g=… b=…/>`, `@NULL` = pen colour) | | ✅ axis + ticks / numbers |
| `labelRotation` | degrees | ✅ |
| `majorTickVisible` + `minorTickVisible` false | | removes the numbers too |
| `title`, `titlePlacement` | | ❌ nothing shown |
| `majorGridVisible`, `minorGridVisible`, `majorGridColor` | | ✅ horizontal grid in pen colour / given colour |
| `lowHighLimitGridVisible`, `lowLowHighHighLimitGridVisible` | | ✅ lines at the **item definition** limits |
| `lowLimit`…`highHighLimit` | | ❌ ignored (item definition limits are used) |
| `lowHighLimitGridAreaVisible` | | ✅ band L…H in pen colour, **opaque, drawn over the line** |
| `maximumPens` (chart level) | | ✅ only the first n pens are loaded |
| `description` | | pen panel shows the **item** description, not this value |
## 4. Chart settings (`<chartPanel>`)
| Group | XML | Desktop result |
|---|---|---|
| Time range | `<timeRange type="timeRangeLast" count="10"><type type="timeUnit" value="TimeUnitMinute"/></timeRange>`; `timeRangeCurrent` (no count) = current minute/hour/day…; units `TimeUnitMinute Hour Day Week Month Year` | ✅ (*Current hour*: 12:00–13:00, line up to now) |
| | `updating` true | ✅ runs live when opened (play grey, stop red) |
| | `updateInterval` (s) | ✅ shown in *Update every* (60 → "1 Minutes") |
| | `autoUpdateInterval` true | ✅ the *Update every* field disappears |
| | `fillHistory` false | ✅ empty (all pens red tag) until the first update interval, then filled |
| | custom range `timeRangeSpecific` (`startTime`/`endTime`) | not tested |
| Performance | `optimised` true (default) = sample interval by zoom (`cfg\configurations\ChartThresholdTables.xml`) | — |
| | `optimised` false + `useSampleInterval` true + `sampleInterval` 60 | ✅ one point per 60 s, last value held to now |
| | `useSampleInterval` false | ✅ all stored samples |
| | `updateFromHistory` false (runtime values) | no visible difference |
| Appearance | `plotAreaTransparent` false + `plotAreaPaint` | ✅ plot colour (paint has no effect while transparent) |
| | `backgroundPaint` | ❌ no visible effect |
| | `hairlineVisible`, `hairlineColor` | ✅ toolbar hairline button on; click in the plot → line + box with time and pen values |
| | `timeSliderVisible`, `valueSliderVisible` false | ✅ sliders removed |
| | `xAxisReversed` / `yAxisReversed` | ✅ newest left **and** time axis moves to the top / 0 at top **and** value axis moves right |
| | `renderMode` `Rendering2d`, `RenderingTable`, `Rendering3dObl` (`Rendering3dOrt`, `RenderingCSS` not tested) | ✅ table = sample time, value and status per pen (good to see what the server returns); 3D = hatched ribbons |
| Time axis | `timeAxisMajorGridColor`, `timeAxisLabelRotation`, `timeAxisTitle` | ✅ (the time-axis title shows, unlike the pen title) |
| | `timeAxisLongLabelVisible` false | ✅ date line under the first label removed |
| | `timeAxisMinorTickVisible`, `timeAxisMinorGridVisible` | nothing at a 10-minute range |
| Header/footer | `headerText`, `footerText` | ✅ top-left above the plot / bottom-left below the time control |
| Legend | `legendPositionType` `PositionNorthEast` (default, right panel), `PositionSouthWest` (= full-height panel on the **left**); also `NorthBottom NorthTop NorthWest SouthBottom SouthTop SouthEast East Absolute` | ✅ |
| | `legendTitle`, `legendColor`, `legendBackgroundColor`, `legendTransparancy` | ✅ |
| Controls | `toolbarVisible` false, `timeRangeControlVisible` false | ✅ toolbar / date and range boxes removed |
| Pen panel | `penPanelVisible`; `penPanelLayout` columns: 0 visible, 1 colour, 2 source, 3 description, 4 units, 5 hairline value, 6 statistics (min \| max \| avg of the shown range), 7 legend, 8 min, 9 max, 10 %, 11 scale range, 12 time offset, 13 appearance, 14 axis, 15 grid (default visible 0–4, 8, 9, 11, 13) | ✅ |
Gaps (CI Server stopped): the desktop joined the last and next sample with a straight line, or
held a scan-group pen flat (seen once); the web drops to 0.
## 5. Component property sheet (Edit Module, connectable)
20 pen slots `[00]`–`[19]`. Inputs (⇦, item → trend): colours, tooltip, visible, transparency,
rotation, zoom. Outputs (⇨): *Hairline value[n]*, *Time range begin/end*, *Update interval*,
*Updating possible*. Both (◇): *Item name[n]*, *Attribute[n]*, *Color[n]*, *Min/Max[n]*,
*Scale type[n]*, *History group[n]*, *Updating*, *Use history*, *Item index/name*,
*Configuration file*. Connections were listed, not tested.
## 6. HTML display (web client)
- **A trend with fewer than 50 visible pens with an item draws no line** in R1.03 (ISS-041):
the web code always builds 50 data columns (`PEN_COUNT_LIMIT`) but labels only the visible
pens with an item; console `Mismatch between number of labels (…) and number of columns in
array (51)`. The desktop is not affected.
- **Workaround** (verified 2026-10-02): pad the trend to 50 pens with
`displays/add_trend_spares.ps1 -Path <display>.xml`. Spares copy the first pen's source,
are scaled to 1E30–2E30 (clipped), hidden from the legend and get blank unique legend texts
in the legend background colour
(the web legend ignores *Show in legend*, ISS-056). Run it again after editing the trend; do
not keep hidden real pens (they count against the 50). Cost: 50 history requests per trend.
- Working on the web as on the desktop: value axis, last/current time range, update interval,
updating at start, plot colour, time-axis grid colour and label rotation, header and footer,
hidden range control. Not applied: legend position, pen panel, trend toolbar (no way to add
pens in the browser). Supported-property lists: IM 36K10C50 Table 2.27-28, IM 36K10R30 §4.8.7.
- **Micro Trend** (`<microTrend>`, up to 4 pens, own SVG drawing, no controls; per-pen
`<property type="componentProperty"><name>itemName[0]</name><value>…</value></property>`,
`scaleMin[n]`, `scaleMax[n]`; elements `numberOfPens`, `realTime`, `fillWithHistory`,
`timeRange` (s, default 300), `sampleCount` (default 300)): drew on desktop and web the first
time, then stayed blank on several later opens and later drew again; after an in-page reload
sometimes only part of a pen shows (intermittent, ISS-055, open).

View file

@ -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`.

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,85 @@
# 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) in the legend background colour, because the web legend ignores
# "Show in legend". Empty pens are removed; do not keep hidden real pens (they count against 50).
# 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 <display>.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)<chartPanel>.*?</chartPanel>'
$penRx = New-Object Text.RegularExpressions.Regex '(?s)[ \t]*<pen type="pen">.*?</pen>\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('<minimum>1.0E30</minimum>')
if ($isSpare) { $spareCount++ }
elseif (-not $empty) { $real += $v }
}
if ($real.Count -eq 0) { return $panel }
$visibleReal = 0
foreach ($v in $real) { if ($v.Contains('<visible>true</visible>')) { $visibleReal++ } }
$need = $target - $visibleReal
if ($need -lt 0) { $need = 0 }
$template = $real[0]
# spare colour = legend background, so their (blank) web legend entries do not show
$bg = (New-Object Text.RegularExpressions.Regex '<legendBackgroundColor type="colorSet" r="\d+" g="\d+" b="\d+"/>').Match($panel)
$spareColor = '<color type="colorSet" r="240" g="240" b="240"/>'
if ($bg.Success) { $spareColor = $bg.Value.Replace('<legendBackgroundColor ', '<color ') }
$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 '<color type="colorSet" r="\d+" g="\d+" b="\d+"/>').Replace($s, $spareColor, 1)
$s = (New-Object Text.RegularExpressions.Regex '<stroke type="stroke" width="[^"]*"').Replace($s, '<stroke type="stroke" width="0.0"', 1)
$s = (New-Object Text.RegularExpressions.Regex '<paint type="paint">.*?</paint>(?=\s*<visible>)', 'Singleline').Replace($s, '<paint>@NULL</paint>', 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 '<maximumPens>\d+</maximumPens>').Replace($panel, "<maximumPens>$target</maximumPens>", 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"

View file

@ -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

View file

@ -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"

View file

@ -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
}

View file

@ -60,7 +60,7 @@ 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. | closed | Retested 2026-10-01 after a CI Server restart (first unit 18:05:46). (a) Sample dated one day earlier (95), live value 112, forced rollover: initial value 112 — correct. (b) Sample dated 18:00 (96, a few minutes before the first unit), live value 113, forced rollover: initial value **96** — wrong again; the live item value stayed 113. So a dropped sample dated shortly before the first unit (same day) becomes the next unit's initial value; a much older one did not. Also found: a forced rollover within 2 minutes of the previous one is refused (`DSI-E-ROLLDONE`). Documented as a caution; behaviour confirmed, ready to close. Closed 2026-10-01 (confirmed by user). | `.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`). | closed | Installed software is the reference (standing user decision). Close when the user confirms. Closed 2026-10-01 (confirmed by user). | `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. 2026-10-01 later: the trend also had the property `chart.attribute[00]` connected to `TANK1.LEVEL` (added by mistake with the pen); the Operator Interface (desktop) showed *Short attribute name ( 61.0) is invalid*. After removing it the desktop trend draws the line, but the HTML trend still logs the mismatch error. | open | Tried 2026-10-01 (fresh session after a restart, 283 history samples in the hour): removing the 4 empty pens, and `updating` true / `updateInterval` 10 like the factory `AOG_TrendOpen` — the mismatch error and the empty trend stayed in both cases (changes reverted). Still to try: a Micro Trend, the HTML-supported trend properties (IM 36K10R30 §4.8.7), clearing the browser/`MO_CACHE_DISPLAYS` cache (the console shows `CIENG_Tank.xml` *loaded (from cache)*), and adding the pen to the factory *Open Trend* display in the HTML client. | `.claude/skills/graphics/tasks/create-display.md`; `knowledge/manuals/IM36K10R30-01EN.md` §4 |
| ISS-041 | 2026-10-01 | GRAPHICS (HTML trend) | In the HTML display (`localhost:8080/mobileoperator/?d=CIENG_Tank`) the trend shows the pen legend `CI-Eng-Sample.TANK1.LEVEL [CIENG_SCAN10S]` and time axis but draws no line, although `ITEM_HISTORY` has 420 samples in the shown hour. Browser console: `Mismatch between number of labels (Time,CI-Eng-Sample.TANK1.LEVEL [CIENG_SCAN10S]) and number of columns in array (51)`. The trend has 4 further empty pens. 2026-10-01 later: the trend also had the property `chart.attribute[00]` connected to `TANK1.LEVEL` (added by mistake with the pen); the Operator Interface (desktop) showed *Short attribute name ( 61.0) is invalid*. After removing it the desktop trend draws the line, but the HTML trend still logs the mismatch error. | closed | Tried 2026-10-01 (fresh session after a restart, 283 history samples in the hour): removing the 4 empty pens, and `updating` true / `updateInterval` 10 like the factory `AOG_TrendOpen` — the mismatch error and the empty trend stayed in both cases (changes reverted). Still to try: a Micro Trend, the HTML-supported trend properties (IM 36K10R30 §4.8.7), clearing the browser/`MO_CACHE_DISPLAYS` cache (the console shows `CIENG_Tank.xml` *loaded (from cache)*), and adding the pen to the factory *Open Trend* display in the HTML client. **Cause found 2026-10-02** (trend lab `CIENG_TrendLab`): a web-client defect, not a display setting. `DataSource.refresh()` in the web trend code (`mobileoperator\src\…\charts\trend\datasources\DataSource.js`, same in the served `src\lib\fasttools.min.js`) numbers **all 50** internal pen slots (`PEN_COUNT_LIMIT`; the filter for empty/hidden pens is commented out), so each data row has 51 columns, while the dygraph labels only list visible pens with an item. Proof: a 50-pen test display drew normally in the browser. Ruled out on the way: the `?historygroup` suffix, empty pens, `optimised`. **Workaround** (verified on the web): pad each trend to 50 visible pens with `displays/add_trend_spares.ps1` (spares scaled out of view, blank unique legend texts); sample `CIENG_TrendLab` uses it. Alternatively a Micro Trend (ISS-055). Report to Yokogawa. Close when the user confirms. Closed 2026-10-02 (confirmed by user). | `.claude/skills/graphics/tasks/trend.md` (done); `create-display.md`, `deploy-displays.md` (done); `knowledge/manuals/IM36K10R30-01EN.md` §4 (done) |
| ISS-042 | 2026-10-01 | GRAPHICS (layouts) | Installed vs `Layouts.readme`: the factory layouts use status line item types `displayName`, `playbackIndicator` and `dateTime` and the commands `reload <frame>` / `reload all`, none of which the readme lists (readme: `statusText`, `userName`, `progresBar`, `graphicsQueueLevel`, `connectionState`); the readme also writes `zooom` for the zoom command (factory files use `zoom`). | closed | Installed software is the reference (standing user decision). Close when the user confirms. Closed 2026-10-01 (confirmed by user). | `.claude/skills/graphics/tasks/layouts.md` §2 |
| ISS-043 | 2026-10-01 | REPORT (system reports) | IM 36K10C30 App. 1.3 names two system reports `ALM_ATTS_CUR` and `ALM_ATRS_HIS`; the installed reports are `ALM_ATTRS_CUR` and `ALM_ATTRS_HIS`. The other 26 names match. | closed | Installed software is the reference (standing user decision). Close when the user confirms. Closed 2026-10-01 (confirmed by user). | `knowledge/manuals/IM36K10C30-01EN.md` §8 (done) |
| ISS-044 | 2026-10-01 | REPORT (scheduling) | Behaviour not in the manuals, found by quick load: a generation interval below 10 minutes is refused (`HIS-E-ROLLTOFAST`, the interval is the rollover of the report's storage group); a scheduled report cannot be deleted (`RPT-E-ACTIVE`) until `ACTIVATION_TIME` and `GENERATION_INTERVAL` are cleared; `CORRECT_DAYLIGHT` 0 counts intervals in UTC (06:00 set for January ran at 05:00 in October); a past activation time moves to the next slot - once (modify, past time within the lifetime) a single report labelled with the old time was generated, at insert with an older time none. | closed | Documented as verified behaviour; the one-off generation for a past activation time is not fully understood. Close when the user confirms. Closed 2026-10-01 (confirmed by user). | `.claude/skills/reporting/tasks/define-reports.md` §1, §5, §6; `knowledge/manuals/IM36K10C30-01EN.md` §2; `examples/CI-Eng-Sample/83a_stop_report_df.qli`, `18_report_df.qli` |
@ -74,3 +74,5 @@ development system (see "Test system" in `progress.md`); they do not exist on ot
| ISS-052 | 2026-10-01 | GRAPHICS (stale item id) | The HTML display `CIENG_Tank` showed **0** in its number field on `CI-Eng-Sample.TANK1.LEVEL` (live value 50) and the popup `ITM-E-NO_MAIN, No main item found`, in a fresh session after a CI Server restart. The display XML stores `<itemName>` **and** `<itemId>1.1.268.0.0.1.1.7</itemId>` from when it was built; after today's sample reloads the item has `ID_NUMBER` 357. Phase 10 had seen live values after a reload, so the id is not always used, but here it broke the field. | closed | Fixed in the sample: removed the `<itemId>` line from `displays/CIENG_Tank.xml`, redeployed; the field shows 50 and the popup is gone (binding by name). Documented in `create-display.md`. Close when the user confirms. Closed 2026-10-01 (confirmed by user). | `examples/CI-Eng-Sample/displays/CIENG_Tank.xml`; `.claude/skills/graphics/tasks/create-display.md`; `.claude/skills/graphics/tasks/deploy-displays.md` |
| ISS-053 | 2026-10-01 | HAC (manual vs installed) | IM 36K10J20 vs the installed `hac.sup`/scripts: (1) *Start in manual mode*: §1.3 says HAC starts in manual by default, §1.5 and the `hac.sup` help say automatic; the installed template sets `START_MANUAL = YES`. (2) `MAXOPNDB` default: help 500, manual 50 (§1.5) and 5 (§4.8). (3) `QUESIZE` default: help 100 K, manual 2000 K (file sets 2000). (4) §4.5 says `tls\com` and `tls\exe` cannot be mirrored, but the template mirrors `12 COM` (excluding `ci_command.cmd`). (5) §4.4 says the critical processes are already in the queue/CPU check lists; the installed file has no `MAX_QUEUE`/`MAX_CPU`/`INACTIVE` lines. (6) `hacw_standby` uses `TLS_LST_PATH` when `TLS_BACKUP_PATH` is unset (manual: `TLS_ALLUSERS_PATH`). (7) The template `IP_DEVICE` is `localhost` (priority 0), which §1.3 says to remove after testing. (8) HMI properties have `communicationInterval`/`Timeout`/`RetryCount`, not in the manual. | closed | Installed software is the reference (standing user decision); documented in the J20 summary §5 and the `high-availability` skill. Not testable on one server. Closed 2026-10-01 (confirmed by user). | `knowledge/manuals/IM36K10J20-01EN.md`; `.claude/skills/high-availability/tasks/*.md` |
| ISS-054 | 2026-10-01 | AD (manual vs installed) | IM 36K10J40 vs the installed `dssana.sup`: the *Active Directory* tab has keywords the manual does not describe — `AD_SERVER`, `AD_SERVER_BACKUP` (host[:port], 389/636), `AD_SECURE` (LDAPS; installed `NO`, help says default yes), `AD_ACCESS_USER`/`AD_ACCESS_PASSWORD` (blank = the CI Server service account). The manual's *Profile priority* is `USER_DF.MERGE_PRIORITY`; *Directory group* is `DIRECTORY_GROUP` (68 characters). The SSO keytab path is given as `%TLS_WAP_PATH%\webapps\auth\WEB-INF` (§2.5.1) and `%TLS_ALLUSERS_PATH%\wap\webapps\auth\WEB-INF` (§3.4.3) — the same folder on the test system. | closed | Installed software is the reference; documented in the J40 summary §5 and `authorization/tasks/active-directory.md`. Not testable without a domain. Closed 2026-10-01 (confirmed by user). | `knowledge/manuals/IM36K10J40-01EN.md`; `.claude/skills/authorization/tasks/active-directory.md` |
| ISS-055 | 2026-10-02 | GRAPHICS (Micro Trend) | A Micro Trend written into `CIENG_TrendLab` (`itemName[0..1]` = `TANK1.LEVEL`/`INFLOW`, `numberOfPens` 2, `realTime`, `fillWithHistory`) drew both pens on the desktop and in the browser the first time (about 13:33), then stayed **blank** on every later open on both clients: with and without the 48 spare trend pens, and with explicit `timeRange` 600 / `sampleCount` 60. No console error; CI Server running. Code: `MicroTrend.js` only starts when all properties are set (`startTrendIfAllPropertiesAreSet`; it also compares `scaleMax[i]` with `scaleMin[1]`). | open | Later 2026-10-02 the clean sample file (no explicit `timeRange`/`sampleCount`, 48 spare trend pens) drew both pens on the desktop and in the browser after a fresh login; after a *View > Reload* in the browser only LEVEL showed fully, INFLOW only a short piece: the behaviour is intermittent. Still to try: build the Micro Trend in the Edit Module (compare the XML), connect `itemName[n]` instead of a fixed value (as in factory/test displays), a display with only the Micro Trend, a CI Server restart. | `.claude/skills/graphics/tasks/trend.md` §6; `examples/CI-Eng-Sample/displays/CIENG_TrendLab.xml` |
| ISS-056 | 2026-10-02 | GRAPHICS (trend, manual vs installed) | (1) IM 36K10C50 Table 2.27-28 lists *Appearance - Show in Legend* as supported in the HTML display, but the web legend listed pens with `visibleLegend` false (the desktop hides them). (2) The legend position (`PositionSouthWest`) was not applied in the browser (not supported per the table). (3) The manual says a trend has up to 20 pens; the component property sheet has 20 slots, but the web code reserves 50 and `maximumPens` 50 works on the desktop. (4) Desktop: pen `title`/`titlePlacement`, pen limit values `lowLimit`… and chart `backgroundPaint` had no visible effect; time-axis minor ticks/grid showed nothing at a 10-minute range. | closed | Documented in `trend.md`; installed software is the reference. Close when the user confirms. Closed 2026-10-02 (confirmed by user). | `.claude/skills/graphics/tasks/trend.md` |

View file

@ -3,7 +3,7 @@ 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
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; trend settings (§2.27) tested one by one on CIENG_TrendLab 2026-10-02 (skill graphics, tasks/trend.md); other components, symbols, actions and the tutorial from docs
---
# Edit Module (R1.03)
@ -58,7 +58,7 @@ export; dialog tabs Types, Columns, Filter, Alarm link display, Appearance, Head
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
interface; every setting tested in skill `graphics`, `tasks/trend.md`), DTS trend, micro trend, playback indicator, calculation/function, JavaScript
function, web browser, PDF viewer, navigation tree, display generator, map viewer.
## 4. Sheets (§4)

View file

@ -86,3 +86,6 @@ property files and language codes (§3.5).
- 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).
Cause (2026-10-02): the web trend code always builds 50 data columns, so a trend draws only
with 50 visible pens; workaround `add_trend_spares.ps1`, details and web/desktop differences in
skill `graphics`, `tasks/trend.md` §6.

View file

@ -133,6 +133,8 @@ now come before classes and objects (phase 6), and the other interfaces follow a
| C50 | Build a display in the Edit Module, check the XML ([task](../.claude/skills/graphics/tasks/create-display.md)) | passed | passed | User built `CIENG_Tank` (HTML mode): text, number field, alarm overview, trend. File stores item name + id; after a sample reload (id 248 → 268) validation still passed and a new session showed live values. |
| C50/R30 | Deploy/remove, `jwuiutl` HTML export, validate, search; HTML display in the browser ([task](../.claude/skills/graphics/tasks/deploy-displays.md)) | passed | passed | Scripts `displays/deploy_displays.cmd` / `remove_displays.cmd`; command-line HTML identical to the Edit Module's. Number field live in the browser; HTML trend draws no line (ISS-041). Browser page reload ends the session; the display menu *View > Reload* keeps it (user). |
| R30/C50 | Operator layout `CIENG_Operator` (menu, toolbar, navigation/main/banner frames, status line) added with `layout.ps1`; navigation display `CIENG_Menu`; open displays in frames, layouts and the `popup` layout ([task](../.claude/skills/graphics/tasks/layouts.md)) | passed | passed | Desktop: second 1600 x 900 window, frame navigation and Back, popup on top and minimised with its parent, F11 within taskbar limits; the Operator Interface must be restarted after `Layouts.xml` changes; factory `default` layout unchanged for Admin. Web: `?d=CIENG_Tank&l=CIENG_Operator`. Status line/command names not in the readme (ISS-042). A stray trend property connection caused a desktop error (ISS-041 update). |
| C50/R30 | Trend settings one by one on `CIENG_TrendLab` (pen source, type, scale, axis, grid, limits; time range, performance, appearance, time axis, legend, pen panel; property sheet listed) ([task](../.claude/skills/graphics/tasks/trend.md)) | passed (desktop) | passed | 2026-10-02, user confirmed each round with screenshots. Pen limits, pen title and `backgroundPaint` had no effect (ISS-056). Internal items need `trend_feed.ps1` after a restart. |
| C50/R30 | HTML trend: cause of the empty web trend and 50-pen workaround (`add_trend_spares.ps1`); Micro Trend ([task](../.claude/skills/graphics/tasks/trend.md) §6) | passed (workaround) | passed | Web code always builds 50 columns (ISS-041). Padded `CIENG_TrendLab` draws in the browser with a clean legend; web ignores *Show in legend* (ISS-056). Micro Trend drew once, then blank (ISS-055). |
| J10/C50 | Restart CI Server with the Edit Module open | observed | n/a | Start aborted: `JWUIGED<pid>` still attached to the BUS Service (`ci_start.log`); closing the Edit Module fixed it (skill `system-check`). |
| R30/C50/C60 | Dataset forms, symbols, AOG library, dual screen, per-user layouts | not practiced | n/a | GUI work; user profiles not changed. |
| R40/C30 | REPORT Service checks: processes, set-up files (`rptman.sup`, `rptge1.rpt`, `rptgen.rpt`), system reports, `rptstp` ([task](../.claude/skills/reporting/tasks/report-checks.md)) | passed | n/a | Read-only plus one cancel: `rptstp rptge1` stopped the endless-loop test report `CIENG_LOOP` (removed). 28 system reports; two names differ from the manual (ISS-043). |