From d299bdf312cbb703f945d46b0a0d6d246f034102 Mon Sep 17 00:00:00 2001 From: cliu Date: Tue, 6 Oct 2026 10:15:14 +1100 Subject: [PATCH 1/7] Sample: merged live-data feed (cieng_feed.ps1) replaces trend_feed.ps1 - feed/cieng_feed.ps1: -Seconds (default, LEVEL +/-25 %), -UntilFlag (DEMO.FEED_ON for the display Start/Stop), -Alarms (+/-33 %, crosses L/H), -System (SYSTEM.* items, skipped while the monitoring processes run); single-copy lock; log in %TLS_LST_PATH%\cieng_feed.log - feed/cieng_feed_start.cmd, feed/install_feed.ps1: installed to C:\Users\Public\CI-Eng-Sample\feed (outside the CI Server package) for the server-side display command - Item CI-Eng-Sample.DEMO.FEED_ON in 02_item_df.qli / 91_remove_item_df.qli - Tested on CI Server R1.03.00 2026-10-06: default run, single copy, start wrapper with flag stop, system items written and skipped with a monitor process present Co-Authored-By: Claude Opus 5.5 --- examples/CI-Eng-Sample/02_item_df.qli | 1 + examples/CI-Eng-Sample/91_remove_item_df.qli | 1 + .../CI-Eng-Sample/displays/trend_feed.ps1 | 16 ---- examples/CI-Eng-Sample/feed/cieng_feed.ps1 | 79 +++++++++++++++++++ .../CI-Eng-Sample/feed/cieng_feed_start.cmd | 6 ++ examples/CI-Eng-Sample/feed/install_feed.ps1 | 18 +++++ 6 files changed, 105 insertions(+), 16 deletions(-) delete mode 100644 examples/CI-Eng-Sample/displays/trend_feed.ps1 create mode 100644 examples/CI-Eng-Sample/feed/cieng_feed.ps1 create mode 100644 examples/CI-Eng-Sample/feed/cieng_feed_start.cmd create mode 100644 examples/CI-Eng-Sample/feed/install_feed.ps1 diff --git a/examples/CI-Eng-Sample/02_item_df.qli b/examples/CI-Eng-Sample/02_item_df.qli index d689ea3..96b754c 100644 --- a/examples/CI-Eng-Sample/02_item_df.qli +++ b/examples/CI-Eng-Sample/02_item_df.qli @@ -20,5 +20,6 @@ LOW_LOW_LIMIT,LOW_LIMIT,HIGH_LIMIT,HIGH_HIGH_LIMIT,SCALE_LOW_LIMIT,SCALE_HIGH_LI "CI-Eng-Sample.SYSTEM.PING_LOCALHOST","localhost reachable, from inttcpmon","Integer","9",0,0,0,0,0,1 "CI-Eng-Sample.SYSTEM.PROC_ALM","ALARM process (alm) running, from intmon","Integer","9",0,0,0,0,0,1 "CI-Eng-Sample.DEMO.COUNTER","Counter 1..100 driven by object DEMO.INCR1","Integer","999",0,0,0,0,0,100 +"CI-Eng-Sample.DEMO.FEED_ON","Live-data feed running (1 = on), written by feed\cieng_feed.ps1","Boolean","",0,0,0,0,0,0 "CI-Eng-Sample.PLC1.COMM_OK","Station CIENG_PLC communication (1 = good), status item","Boolean","",0,0,0,0,0,0 "CI-Eng-Sample.UA.COMM_OK","Station CIENG_UA communication (1 = good), status item","Boolean","",0,0,0,0,0,0 diff --git a/examples/CI-Eng-Sample/91_remove_item_df.qli b/examples/CI-Eng-Sample/91_remove_item_df.qli index bf4d425..ddd4a6c 100644 --- a/examples/CI-Eng-Sample/91_remove_item_df.qli +++ b/examples/CI-Eng-Sample/91_remove_item_df.qli @@ -18,6 +18,7 @@ NAME "CI-Eng-Sample.SYSTEM.PING_LOCALHOST" "CI-Eng-Sample.SYSTEM.PROC_ALM" "CI-Eng-Sample.DEMO.COUNTER" +"CI-Eng-Sample.DEMO.FEED_ON" "CI-Eng-Sample.PLC1.COMM_OK" "CI-Eng-Sample.UA.COMM_OK" "CI-Eng-Sample.TEMPLATES.TPL_REAL" diff --git a/examples/CI-Eng-Sample/displays/trend_feed.ps1 b/examples/CI-Eng-Sample/displays/trend_feed.ps1 deleted file mode 100644 index 37049e4..0000000 --- a/examples/CI-Eng-Sample/displays/trend_feed.ps1 +++ /dev/null @@ -1,16 +0,0 @@ -# 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 -} diff --git a/examples/CI-Eng-Sample/feed/cieng_feed.ps1 b/examples/CI-Eng-Sample/feed/cieng_feed.ps1 new file mode 100644 index 0000000..b1128ca --- /dev/null +++ b/examples/CI-Eng-Sample/feed/cieng_feed.ps1 @@ -0,0 +1,79 @@ +# CI-Eng-Sample live data: writes test values into the sample items so displays, trends and alarms +# move (internal items stay NOT INIT after a CI Server start). CI Server R1.03.00. Replaces +# displays\trend_feed.ps1. Not part of the CI Server package: installed with install_feed.ps1 into +# C:\Users\Public\CI-Eng-Sample\feed, from where the display button "Start" runs it. +# +# Usage: powershell -ExecutionPolicy Bypass -File cieng_feed.ps1 [-Seconds 3600] [-UntilFlag] [-Alarms] [-System] [-Cycle 5] +# (default) run for -Seconds (3600) +# -UntilFlag run while CI-Eng-Sample.DEMO.FEED_ON = 1 (display buttons Start / Stop); sets it to 1 +# at start and 0 at the end +# -Alarms LEVEL 50 +/- 33 % (crosses L 20 and H 80: alarms that need an acknowledgement); +# without it 50 +/- 25 % (stays inside the limits) +# -System also write SYSTEM.CPU_LOAD / DISK_C / PING_LOCALHOST / PROC_ALM with this PC's real +# values - skipped automatically while the monitoring processes (intcpumon, intdskmon, +# inttcpmon, intmon; see ..\monitoring) are running, so they do not overwrite each other +# Every cycle (default 5 s): TANK1.LEVEL (sine, 10 min), TANK1.INFLOW (250 +/- 150 m3/h, 4 min); +# PUMP1.RUNNING = 1 while INFLOW > 250, only in auto mode (PUMP1.MODE = 1). +# Only one copy runs at a time; log: %TLS_LST_PATH%\cieng_feed.log (start / stop lines). +param([int]$Seconds = 3600, [switch]$UntilFlag, [switch]$Alarms, [switch]$System, [int]$Cycle = 5) + +$itmval = 'itmval' +if ($env:TLS_ROOT_PATH) { + $exe = Join-Path $env:TLS_ROOT_PATH 'tls\exe\itmval.exe' + if (Test-Path $exe) { $itmval = $exe } +} +$S = 'CI-Eng-Sample.' +$logDir = $env:TLS_LST_PATH +if (-not $logDir) { $logDir = $PSScriptRoot } +$log = Join-Path $logDir 'cieng_feed.log' + +function Get-Val([string]$name) { + $out = & $itmval -g -n ($S + $name) 2>$null + foreach ($l in $out) { if ($l -match '^Value\s*=\s*(.+)$') { return $Matches[1].Trim() } } + return $null +} +function Put([string]$name, $value) { & $itmval -p -n ($S + $name) -v $value > $null 2>&1 } +function Write-Log([string]$text) { + try { Add-Content -Path $log -Value ('{0} {1}' -f (Get-Date -Format s), $text) } catch { } +} + +$created = $false +$mutex = New-Object Threading.Mutex($true, 'Global\CIENG_FEED', [ref]$created) +if (-not $created) { Write-Log 'already running - this copy exits'; exit 0 } + +$amp = 25 +if ($Alarms) { $amp = 33 } +$monitors = @('intcpumon', 'intdskmon', 'inttcpmon', 'intmon') +$mode = 'seconds=' + $Seconds +if ($UntilFlag) { $mode = 'until FEED_ON = 0' } +$end = (Get-Date).AddSeconds($Seconds) +try { + Write-Log ('start ({0}, alarms={1}, system={2}, user {3})' -f $mode, [bool]$Alarms, [bool]$System, [Environment]::UserName) + if ($UntilFlag) { Put 'DEMO.FEED_ON' 1 } + while ($true) { + if ($UntilFlag) { if ((Get-Val 'DEMO.FEED_ON') -ne '1') { break } } + elseif ((Get-Date) -ge $end) { break } + $t = [double]((Get-Date) - (Get-Date).Date).TotalSeconds + $level = [math]::Round(50 + $amp * [math]::Sin(2 * [math]::PI * $t / 600), 1) + $inflow = [math]::Round(250 + 150 * [math]::Sin(2 * [math]::PI * $t / 240), 1) + Put 'TANK1.LEVEL' $level + Put 'TANK1.INFLOW' $inflow + if ((Get-Val 'PUMP1.MODE') -eq '1') { Put 'PUMP1.RUNNING' ([int]($inflow -gt 250)) } + if ($System -and -not (Get-Process -Name $monitors -ErrorAction SilentlyContinue)) { + try { + $cpus = @(Get-CimInstance Win32_Processor) + $cpu = 0; foreach ($c in $cpus) { $cpu += $c.LoadPercentage }; $cpu = $cpu / [math]::Max(1, $cpus.Count) + Put 'SYSTEM.CPU_LOAD' ([math]::Round($cpu, 1)) + $d = Get-CimInstance Win32_LogicalDisk -Filter "DeviceID='C:'" + Put 'SYSTEM.DISK_C' ([math]::Round(100 * ($d.Size - $d.FreeSpace) / $d.Size, 1)) + Put 'SYSTEM.PING_LOCALHOST' ([int](Test-Connection -ComputerName localhost -Count 1 -Quiet)) + Put 'SYSTEM.PROC_ALM' ([int]([bool](Get-Process alm -ErrorAction SilentlyContinue))) + } catch { } + } + Start-Sleep -Seconds $Cycle + } +} finally { + if ($UntilFlag) { Put 'DEMO.FEED_ON' 0 } + Write-Log 'stop' + $mutex.ReleaseMutex() +} diff --git a/examples/CI-Eng-Sample/feed/cieng_feed_start.cmd b/examples/CI-Eng-Sample/feed/cieng_feed_start.cmd new file mode 100644 index 0000000..022d6c9 --- /dev/null +++ b/examples/CI-Eng-Sample/feed/cieng_feed_start.cmd @@ -0,0 +1,6 @@ +@echo off +rem Starts cieng_feed.ps1 in the background (CI Server R1.03.00). Called by the display button +rem "Start" (server-side command, runs as the CI Server service account CIX_PROCESS) from the +rem fixed install folder C:\Users\Public\CI-Eng-Sample\feed (install_feed.ps1). Returns at once; +rem the feed runs until the button "Stop" writes CI-Eng-Sample.DEMO.FEED_ON = 0. +start "" /b powershell.exe -NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File "%~dp0cieng_feed.ps1" -UntilFlag -Alarms -System diff --git a/examples/CI-Eng-Sample/feed/install_feed.ps1 b/examples/CI-Eng-Sample/feed/install_feed.ps1 new file mode 100644 index 0000000..adcd746 --- /dev/null +++ b/examples/CI-Eng-Sample/feed/install_feed.ps1 @@ -0,0 +1,18 @@ +# Install or remove the CI-Eng-Sample live-data feed (CI Server R1.03.00). +# Copies cieng_feed.ps1 and cieng_feed_start.cmd to C:\Users\Public\CI-Eng-Sample\feed: a fixed folder +# outside the CI Server installation (the feed is not part of the CI Server package) that the CI +# Server service account can read. The display button "Start" calls the .cmd there. +# No admin rights needed. Usage: powershell -ExecutionPolicy Bypass -File install_feed.ps1 [-Remove] +param([switch]$Remove) +$dest = 'C:\Users\Public\CI-Eng-Sample\feed' +if ($Remove) { + if (Test-Path $dest) { Remove-Item -LiteralPath $dest -Recurse -Force } + $parent = Split-Path $dest + if ((Test-Path $parent) -and -not (Get-ChildItem -LiteralPath $parent -Force)) { Remove-Item -LiteralPath $parent -Force } + 'Feed removed from ' + $dest + return +} +New-Item -ItemType Directory -Force -Path $dest > $null +Copy-Item -LiteralPath (Join-Path $PSScriptRoot 'cieng_feed.ps1') -Destination $dest -Force +Copy-Item -LiteralPath (Join-Path $PSScriptRoot 'cieng_feed_start.cmd') -Destination $dest -Force +'Feed installed in ' + $dest From c9d2ead5d92f991b2b9fe7ecdadfe4799776ae7f Mon Sep 17 00:00:00 2001 From: cliu Date: Tue, 6 Oct 2026 10:23:54 +1100 Subject: [PATCH 2/7] Sample: CIENG_* operator HMI displays, generator and CIENG_Operator / CIENG_Popup layouts - displays/CIENG_{Header,Overview,Control,Trends,Alarms,System,AlarmBanner,TankFaceplate}.xml: dark dashboard in HTML mode (desktop + web), generated by displays/generator/build.py (cixml.py component library; README.md describes the tool and the R1.03 rules it follows) - layouts/CIENG_Operator.xml now holds CIENG_Operator (menu, navigation toolbar, header frame, 5-tab set, alarm banner, status line; navigate commands with stretchDisplay) and CIENG_Popup (faceplate); layout.ps1 message updated - deploy_displays.cmd / remove_displays.cmd for the 8 new displays - Live-data Start runs C:\Users\Public\CI-Eng-Sample\feed\cieng_feed_start.cmd on the server - Tested on CI Server R1.03.00 2026-10-06 (ADMIN with ?l=CIENG_Operator / jwuipoi -layout): web layout, tabs, popup, faceplate navigation, combo write, server-side Start as CIX_PROCESS; desktop layout, stretched tabs, Start/Stop - Old CIENG_Tank / CIENG_Menu / CIENG_TrendLab still present (removed in the next stage) Co-Authored-By: Claude Opus 5.5 --- .../displays/CIENG_AlarmBanner.xml | 38 ++ .../CI-Eng-Sample/displays/CIENG_Alarms.xml | 39 ++ .../CI-Eng-Sample/displays/CIENG_Control.xml | 96 +++ .../CI-Eng-Sample/displays/CIENG_Header.xml | 67 ++ .../CI-Eng-Sample/displays/CIENG_Overview.xml | 100 +++ .../CI-Eng-Sample/displays/CIENG_System.xml | 84 +++ .../displays/CIENG_TankFaceplate.xml | 66 ++ .../CI-Eng-Sample/displays/CIENG_Trends.xml | 48 ++ .../displays/deploy_displays.cmd | 11 +- .../displays/generator/.gitignore | 1 + .../displays/generator/README.md | 44 ++ .../CI-Eng-Sample/displays/generator/build.py | 351 +++++++++++ .../CI-Eng-Sample/displays/generator/cixml.py | 583 ++++++++++++++++++ .../displays/remove_displays.cmd | 12 +- .../CI-Eng-Sample/layouts/CIENG_Operator.xml | 230 +++---- examples/CI-Eng-Sample/layouts/layout.ps1 | 2 +- 16 files changed, 1604 insertions(+), 168 deletions(-) create mode 100644 examples/CI-Eng-Sample/displays/CIENG_AlarmBanner.xml create mode 100644 examples/CI-Eng-Sample/displays/CIENG_Alarms.xml create mode 100644 examples/CI-Eng-Sample/displays/CIENG_Control.xml create mode 100644 examples/CI-Eng-Sample/displays/CIENG_Header.xml create mode 100644 examples/CI-Eng-Sample/displays/CIENG_Overview.xml create mode 100644 examples/CI-Eng-Sample/displays/CIENG_System.xml create mode 100644 examples/CI-Eng-Sample/displays/CIENG_TankFaceplate.xml create mode 100644 examples/CI-Eng-Sample/displays/CIENG_Trends.xml create mode 100644 examples/CI-Eng-Sample/displays/generator/.gitignore create mode 100644 examples/CI-Eng-Sample/displays/generator/README.md create mode 100644 examples/CI-Eng-Sample/displays/generator/build.py create mode 100644 examples/CI-Eng-Sample/displays/generator/cixml.py diff --git a/examples/CI-Eng-Sample/displays/CIENG_AlarmBanner.xml b/examples/CI-Eng-Sample/displays/CIENG_AlarmBanner.xml new file mode 100644 index 0000000..9aaff3c --- /dev/null +++ b/examples/CI-Eng-Sample/displays/CIENG_AlarmBanner.xml @@ -0,0 +1,38 @@ + + + + + +Alarm banner +true +1920 +96 +14 + +true + + + + + + +500 +true +false +2OverviewAlways showntrue10.0 +3RoughShown when viewing viewing a large areatrue25.0 +4StandardShown when using the default view settingtrue100.0 +5DetailShown only when viewing a small areatrue400.0 +6IntricaciesShown only when viewing a very small areatrue1000.0 +1Layer1 +8 +7960.048.048.048.0960.0960.00.00.0falsetrueCIENG_OverviewCIENG_OperatorovwACTION navigate to ovw CIENG_Overview stretchDisplayfalse +8960.00.00.50.5960.0960.00.00.0falsetrue +90.09410.195195.048.041.041.085.085.00.00.0truetrue +10ALARMStrue47.422.09.09.023.423.40.00.0 +11104.022.08.08.08.08.00.00.0falsetrue0.0java.lang.Doublefasttools.jwui.common.property.paint.PaintSet0.010.020.080.090.01CI-Eng-Sample.TANK1.LEVELItemValue +12Tank 1true134.622.09.09.016.616.60.00.0 + +14falsetruepriorityNackColor[00]priorityAckColor[00]priorityNackColor[01]priorityAckColor[01]priorityNackColor[02]priorityAckColor[02]priorityNackColor[03]priorityAckColor[03]priorityNackColor[04]priorityAckColor[04]priorityNackColor[05]priorityAckColor[05]priorityNackColor[06]priorityAckColor[06]priorityNackColor[07]priorityAckColor[07]priorityNackColor[08]priorityAckColor[08]priorityNackColor[09]priorityAckColor[09]priorityNackColor[10]priorityAckColor[10]priorityNackColor[11]priorityAckColor[11]priorityNackColor[12]priorityAckColor[12]priorityNackColor[13]priorityAckColor[13]priorityNackColor[14]priorityAckColor[14]priorityNackColor[15]priorityAckColor[15]true1199true269true3299true4169true5319true6299true7119true8109true9109falsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalse1-12-23-30-0,4-15 + + diff --git a/examples/CI-Eng-Sample/displays/CIENG_Alarms.xml b/examples/CI-Eng-Sample/displays/CIENG_Alarms.xml new file mode 100644 index 0000000..e495e82 --- /dev/null +++ b/examples/CI-Eng-Sample/displays/CIENG_Alarms.xml @@ -0,0 +1,39 @@ + + + + + +Alarms +true +1880 +760 +15 + +true + + + + + + +500 +true +false +2OverviewAlways showntrue10.0 +3RoughShown when viewing viewing a large areatrue25.0 +4StandardShown when using the default view settingtrue100.0 +5DetailShown only when viewing a small areatrue400.0 +6IntricaciesShown only when viewing a very small areatrue1000.0 +1Layer1 +9 +7940.0380.0380.0380.0940.0940.00.00.0falsetrue +80.01080.0459940.0229.1217.9217.9930.0930.00.00.0truetrue +9CURRENT ALARMStrue78.336.911.011.048.348.30.00.0 +10All areas - acknowledge with the check box or right-clicktrue150.959.29.09.0120.9120.90.00.0 +11falsetruepriorityNackColor[00]priorityAckColor[00]priorityNackColor[01]priorityAckColor[01]priorityNackColor[02]priorityAckColor[02]priorityNackColor[03]priorityAckColor[03]priorityNackColor[04]priorityAckColor[04]priorityNackColor[05]priorityAckColor[05]priorityNackColor[06]priorityAckColor[06]priorityNackColor[07]priorityAckColor[07]priorityNackColor[08]priorityAckColor[08]priorityNackColor[09]priorityAckColor[09]priorityNackColor[10]priorityAckColor[10]priorityNackColor[11]priorityAckColor[11]priorityNackColor[12]priorityAckColor[12]priorityNackColor[13]priorityAckColor[13]priorityNackColor[14]priorityAckColor[14]priorityNackColor[15]priorityAckColor[15]true1213true274true3320true4181true5341true6320true7128true8117true9117falsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalse1-12-23-30-0,4-15 +120.01080.0688940.0603.5145.3145.3930.0930.00.00.0truetrue +13ALARM HISTORY - TANK 1true96.8483.911.011.066.866.80.00.0 +14Historical overview filtered on alarm selection area CIENG_TANK1true166.5506.39.09.0136.5136.50.00.0 +15falsetruepriorityNackColor[00]priorityAckColor[00]priorityNackColor[01]priorityAckColor[01]priorityNackColor[02]priorityAckColor[02]priorityNackColor[03]priorityAckColor[03]priorityNackColor[04]priorityAckColor[04]priorityNackColor[05]priorityAckColor[05]priorityNackColor[06]priorityAckColor[06]priorityNackColor[07]priorityAckColor[07]priorityNackColor[08]priorityAckColor[08]priorityNackColor[09]priorityAckColor[09]priorityNackColor[10]priorityAckColor[10]priorityNackColor[11]priorityAckColor[11]priorityNackColor[12]priorityAckColor[12]priorityNackColor[13]priorityAckColor[13]priorityNackColor[14]priorityAckColor[14]priorityNackColor[15]priorityAckColor[15]true1213true274true3320true4181true5341true6320true7128true8117true9117falsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalse1-12-23-30-0,4-15CIENG_TANK1 + + diff --git a/examples/CI-Eng-Sample/displays/CIENG_Control.xml b/examples/CI-Eng-Sample/displays/CIENG_Control.xml new file mode 100644 index 0000000..5501c0c --- /dev/null +++ b/examples/CI-Eng-Sample/displays/CIENG_Control.xml @@ -0,0 +1,96 @@ + + + + + +Process control +true +1880 +760 +72 + +true + + + + + + +500 +true +false +2OverviewAlways showntrue10.0 +3RoughShown when viewing viewing a large areatrue25.0 +4StandardShown when using the default view settingtrue100.0 +5DetailShown only when viewing a small areatrue400.0 +6IntricaciesShown only when viewing a very small areatrue1000.0 +1Layer1 +66 +7940.0380.0380.0380.0940.0940.00.00.0falsetrue +80.02160.0551472.5192.8181.6181.6462.5462.50.00.0truetrue +9SETPOINT -> PLC1 (MODBUS LOOPBACK)true134.836.911.011.0104.8104.80.00.0 +10Slider, spinner and input field write PLC1.SETPOINT; READBACK returns through Modbustrue218.259.29.09.0188.2188.20.00.0 +11100.00.00.010.05.0truetruefalsefalse0.0CI-Eng-Sample.PLC1.SETPOINTItemValue +12SPINNERtrue61.0176.68.08.021.021.00.00.0 +13true5.00.0100.0false0.0CI-Eng-Sample.PLC1.SETPOINTItemValue +14INPUT FIELDtrue228.3176.68.08.028.328.30.00.0 +15999true0.0CI-Eng-Sample.PLC1.SETPOINTItemValue +16SETPOINTtrue383.4176.68.08.023.423.40.00.0 +170.0999true381.9210.120.020.021.921.90.00.00.01CI-Eng-Sample.PLC1.SETPOINTItemValue +18READBACK (data bar + scale)true105.8261.58.08.065.865.80.00.0 +19true0.0100.00.01CI-Eng-Sample.PLC1.READBACKItemValue +20100.00.010.05.0999false +2145.0270.0false790.0195.695.095.095.095.00.00.0truefalse +22179.80.5false790.0195.695.095.095.095.00.00.0truefalse0.0java.lang.Doublejava.lang.Double0.0100.00.5270.01CI-Eng-Sample.PLC1.READBACKItemValue0.0java.lang.Doublejava.lang.Double0.0100.0179.7545.01CI-Eng-Sample.PLC1.READBACKItemValue +230.0999true790.0191.118.018.081.081.00.00.00.01CI-Eng-Sample.PLC1.READBACKItemValue +24true790.0223.59.09.040.040.00.00.0 +25Readbacktrue790.0306.210.010.095.095.00.00.0 +26706.040.26.06.06.06.00.00.0falsetrue0.0java.lang.Booleanfasttools.jwui.common.property.paint.PaintSetfalsetrue1CI-Eng-Sample.PLC1.COMM_OKItemValue +27station CIENG_PLCtrue762.939.19.09.044.944.90.00.0 +280.02160.05511407.5192.8181.6181.6462.5462.50.00.0truetrue +29DIGITAL COMMAND -> PLC1.CMDtrue1052.836.911.011.087.887.80.00.0 +30Toggle and push buttons write the coil; FEEDBACK is read back from the input bittrue1139.059.29.09.0174.0174.00.00.0 +310.0CI-Eng-Sample.PLC1.CMDItemValue + + +341360.0156.560.060.060.060.00.00.0truetrue0.0java.lang.Booleanfasttools.jwui.common.property.paint.PaintSetfalsetrue1CI-Eng-Sample.PLC1.FEEDBACKItemValue +35FEEDBACKtrue1360.0156.512.012.060.060.00.00.0 +36LAST CHANGE OF FEEDBACKtrue1525.3109.58.08.065.365.30.00.0 +37truetrue0.01CI-Eng-Sample.PLC1.FEEDBACKItemUpdTime +38STATUStrue1478.5187.88.08.018.518.50.00.0 +39NORMALtrue1493.6214.612.012.033.633.60.00.00.01CI-Eng-Sample.PLC1.FEEDBACKItemStatusMnemonic +400.02160.0551472.5567.2181.6181.6462.5462.50.00.0truetrue +41PUMP 1true50.5411.311.011.020.520.50.00.0 +42Combo box, buttons and check box write PUMP1.MODE / PUMP1.RUNNING (mode changes are audited)true257.7433.69.09.0227.7227.70.00.0 +43MODE (COMBO BOX)true90.2456.08.08.050.250.20.00.0 +440.0CI-Eng-Sample.PUMP1.MODEItemValue + + +47RUN COMMAND (CHECK BOX, MANUAL MODE)true152.1543.28.08.0112.1112.10.00.0 +48false0.0CI-Eng-Sample.PUMP1.RUNNINGItemValue +49DESCRIPTION (TEXT FIELD)true102.4625.98.08.062.462.40.00.0 +50false0.01CI-Eng-Sample.PUMP1.MODEItemDesc +51655.0530.955.055.055.055.00.00.0truetrue0.0java.lang.Booleanfasttools.jwui.common.property.paint.PaintSetfalsetrue1CI-Eng-Sample.PUMP1.RUNNINGItemValue +52P1true655.0529.812.012.055.055.00.00.0 +53RUN TIME (INTEGRATOR)true670.0621.48.08.0110.0110.00.00.0 +540.09999999true705.6651.617.017.044.444.40.00.00.01CI-Eng-Sample.PUMP1.RUNNING.RUN_SECONDSItemValue +55strue756.4653.89.09.02.42.40.00.0 +560.02160.05511407.5567.2181.6181.6462.5462.50.00.0truetrue +57TANK 1 - ALARM TESTtrue1021.5411.311.011.056.556.50.00.0 +58Stop live data first, then drive TANK1.LEVEL across its limits (H 80 / HH 90 / L 20 / LL 10)true1150.2433.69.09.0185.2185.20.00.0 +59100.00.00.010.05.0truetruefalsefalse0.0CI-Eng-Sample.TANK1.LEVELItemValue + + + + + +65LEVELtrue988.2641.58.08.013.213.20.00.0 +660.0999.9true1026.2680.625.025.051.251.20.00.00.01CI-Eng-Sample.TANK1.LEVELItemValue0.0java.lang.Doublefasttools.jwui.common.property.paint.PaintSet0.010.020.080.090.01CI-Eng-Sample.TANK1.LEVELItemValue +67ITEM STATUStrue1211.7641.58.08.031.731.70.00.0 +68NORMALtrue1226.3678.417.017.046.346.30.00.00.01CI-Eng-Sample.TANK1.LEVELItemStatusMnemonic0.0java.lang.Doublefasttools.jwui.common.property.paint.PaintSet0.010.020.080.090.01CI-Eng-Sample.TANK1.LEVELItemValue +6945.0270.0false1720.0581.290.090.090.090.00.00.0truefalse +70179.80.5false1720.0581.290.090.090.090.00.00.0truefalse0.0java.lang.Doublejava.lang.Double0.0100.00.5270.01CI-Eng-Sample.TANK1.LEVELItemValue0.0java.lang.Doublejava.lang.Double0.0100.0179.7545.01CI-Eng-Sample.TANK1.LEVELItemValue0.0java.lang.Doublefasttools.jwui.common.property.paint.PaintSet0.010.020.080.090.01CI-Eng-Sample.TANK1.LEVELItemValue +71100.00.020.05.0999225.0-270.0 +720.0999.9true1720.0581.220.020.060.060.00.00.00.01CI-Eng-Sample.TANK1.LEVELItemValue + + diff --git a/examples/CI-Eng-Sample/displays/CIENG_Header.xml b/examples/CI-Eng-Sample/displays/CIENG_Header.xml new file mode 100644 index 0000000..6fed28e --- /dev/null +++ b/examples/CI-Eng-Sample/displays/CIENG_Header.xml @@ -0,0 +1,67 @@ + + + + + +Header +true +1920 +96 +43 + +true + + + + + + +500 +true +false +2OverviewAlways showntrue10.0 +3RoughShown when viewing viewing a large areatrue25.0 +4StandardShown when using the default view settingtrue100.0 +5DetailShown only when viewing a small areatrue400.0 +6IntricaciesShown only when viewing a very small areatrue1000.0 +1Layer1 +37 +7960.048.048.048.0960.0960.00.00.0falsetrue +8960.095.00.50.5960.0960.00.00.0falsetrue +90.46670.466750.048.030.030.030.030.00.00.0falsetrue +10CItrue50.048.014.014.030.030.00.00.0 +11CI-Eng-Sampletrue171.133.015.015.075.175.10.00.0 +12Operations dashboard | Tank farm demotrue201.862.010.010.0105.8105.80.00.0 +130.09520.2353604.048.034.034.084.084.00.00.0truetrue +14TANK LEVELtrue561.830.08.08.027.827.80.00.0 +150.0999.9true563.256.016.016.029.229.20.00.00.01CI-Eng-Sample.TANK1.LEVELItemValue0.0java.lang.Doublefasttools.jwui.common.property.paint.PaintSet0.010.020.080.090.01CI-Eng-Sample.TANK1.LEVELItemValue +16%true642.459.09.09.04.44.40.00.0 +170.09520.2353784.048.034.034.084.084.00.00.0truetrue +18INFLOWtrue733.030.08.08.019.019.00.00.0 +190.09999.9true749.156.016.016.035.135.10.00.00.01CI-Eng-Sample.TANK1.INFLOWItemValue +20m3/htrue830.259.09.09.012.212.20.00.0 +210.09520.2353964.048.034.034.084.084.00.00.0truetrue +22VOLUMEtrue914.530.08.08.020.520.50.00.0 +230.09999.9true929.156.016.016.035.135.10.00.00.01CI-Eng-Sample.TANK1.CALC.VOLUMEItemValue +24m3true1005.359.09.09.07.37.30.00.0 +250.09520.23531144.048.034.034.084.084.00.00.0truetrue +26PUMP 1true1092.530.08.08.018.518.50.00.0 +271083.057.09.09.09.09.00.00.0falsetrue0.0java.lang.Booleanfasttools.jwui.common.property.paint.PaintSetfalsetrue1CI-Eng-Sample.PUMP1.RUNNINGItemValue +28RUNNINGtrue1132.256.012.012.032.232.20.00.00.0java.lang.Booleanjava.lang.Booleanfalsefalsetruetrue1CI-Eng-Sample.PUMP1.RUNNINGItemValue +29STOPPEDtrue1130.256.012.012.030.230.20.00.00.0java.lang.Booleanjava.lang.Booleanfalsetruetruefalse1CI-Eng-Sample.PUMP1.RUNNINGItemValue +300.09520.23531324.048.034.034.084.084.00.00.0truetrue +31COMMUNICATIONtrue1297.930.08.08.043.943.90.00.0 +321261.057.07.07.07.07.00.00.0falsetrue0.0java.lang.Booleanfasttools.jwui.common.property.paint.PaintSetfalsetrue1CI-Eng-Sample.PLC1.COMM_OKItemValue +33PLC1true1286.756.010.010.012.712.70.00.0 +341337.057.07.07.07.07.00.00.0falsetrue0.0java.lang.Booleanfasttools.jwui.common.property.paint.PaintSetfalsetrue1CI-Eng-Sample.UA.COMM_OKItemValue +35OPC UAtrue1370.556.010.010.020.520.50.00.0 +360.06400.23531549.048.034.034.0125.0125.00.00.0truetrue +37LIVE DATAtrue1462.430.08.08.024.424.40.00.0 +381542.029.06.06.06.06.00.00.0falsetrue0.0java.lang.Booleanfasttools.jwui.common.property.paint.PaintSetfalsetrue1CI-Eng-Sample.DEMO.FEED_ONItemValue + + + +42LAST UPDATEtrue1823.730.08.08.031.731.70.00.0 +43falsetrue0.01CI-Eng-Sample.DEMO.COUNTERItemUpdTime + + diff --git a/examples/CI-Eng-Sample/displays/CIENG_Overview.xml b/examples/CI-Eng-Sample/displays/CIENG_Overview.xml new file mode 100644 index 0000000..545581a --- /dev/null +++ b/examples/CI-Eng-Sample/displays/CIENG_Overview.xml @@ -0,0 +1,100 @@ + + + + + +Overview +true +1880 +760 +76 + +true + + + + + + +500 +true +false +2OverviewAlways showntrue10.0 +3RoughShown when viewing viewing a large areatrue25.0 +4StandardShown when using the default view settingtrue100.0 +5DetailShown only when viewing a small areatrue400.0 +6IntricaciesShown only when viewing a very small areatrue1000.0 +1Layer1 +70 +7940.0380.0380.0380.0940.0940.00.00.0falsetrue +80.01800.0271565.0380.0368.8368.8555.0555.00.00.0truetrue +9PROCESS - TANK 1true76.836.911.011.046.846.80.00.0 +10Click the tank for its faceplatetrue92.459.29.09.062.462.40.00.0 +11250.0377.88.08.0190.0190.00.00.0falsetrue +12250.0377.85.05.0190.0190.00.00.0falsetrue0.0java.lang.Doublejava.lang.Boolean0.0false5.0true1CI-Eng-Sample.TANK1.INFLOWItemValue +13INFLOWtrue79.0288.48.08.019.019.00.00.0 +140.09999.9true109.7321.920.020.049.749.70.00.00.01CI-Eng-Sample.TANK1.INFLOWItemValue +15m3/htrue227.7326.410.010.013.713.70.00.0 +16Tank 1 - click for the faceplate0.15000.0671560.0380.0268.2268.2120.0120.00.00.0truetrueCIENG_TankFaceplateCIENG_Popupdefault +170.10910.0467560.0380.0257.1257.1110.0110.00.00.0falsetrue0.50.0java.lang.Doublejava.lang.Double0.0100.00.01.01CI-Eng-Sample.TANK1.LEVELItemValue0.0java.lang.Doublefasttools.jwui.common.property.paint.PaintSet0.010.020.080.090.01CI-Eng-Sample.TANK1.LEVELItemValueCIENG_TankFaceplateCIENG_Popupdefault +18TANK 1true560.082.714.014.0110.0110.00.00.0 +190.0999.9true560.0363.225.025.0100.0100.00.00.00.01CI-Eng-Sample.TANK1.LEVELItemValue +20% leveltrue560.0404.610.010.0100.0100.00.00.0 +21691.0174.41.01.09.09.00.00.0falsetrue +22HH 90true721.1174.49.09.015.115.10.00.0 +23691.0225.81.01.09.09.00.00.0falsetrue +24H 80true717.2225.89.09.011.211.20.00.0 +25691.0534.21.01.09.09.00.00.0falsetrue +26L 20true715.8534.29.09.09.89.80.00.0 +27691.0585.61.01.09.09.00.00.0falsetrue +28LL 10true718.2585.69.09.012.212.20.00.0 + +30755.0603.58.08.075.075.00.00.0falsetrue +31755.0603.55.05.075.075.00.00.0falsetrue0.01CI-Eng-Sample.PUMP1.RUNNINGItemValue +32875.0603.545.045.045.045.00.00.0truetrue0.0java.lang.Booleanfasttools.jwui.common.property.paint.PaintSetfalsetrue1CI-Eng-Sample.PUMP1.RUNNINGItemValue +33P1true875.0603.512.012.045.045.00.00.0 +341005.0603.58.08.085.085.00.00.0falsetrue +351005.0603.55.05.085.085.00.00.0falsetrue0.01CI-Eng-Sample.PUMP1.RUNNINGItemValue +36PUMP 1true875.0680.69.09.075.075.00.00.0 +37AUTOtrue875.0704.110.010.075.075.00.00.00.0java.lang.Doublejava.lang.Boolean0.0false1.0true1CI-Eng-Sample.PUMP1.MODEItemValue +38MANUALtrue875.0704.110.010.075.075.00.00.00.0java.lang.Doublejava.lang.Boolean0.0true1.0false1CI-Eng-Sample.PUMP1.MODEItemValue +390.06960.0434975.0285.0184.4184.4115.0115.00.00.0truetrue +40VOLUME (TANK1.CALC)true926.2125.28.08.050.250.20.00.0 +410.09999.9true911.1153.115.015.035.135.10.00.00.01CI-Eng-Sample.TANK1.CALC.VOLUMEItemValue +42m3true1035.3155.49.09.07.37.30.00.0 +43FLOW PER SECOND (JFLOW)true938.4196.78.08.062.462.40.00.0 +440.0999.99true911.1224.615.015.035.135.10.00.00.01CI-Eng-Sample.TANK1.JFLOW.sPerMinItemValue +45m3/strue1039.7226.99.09.011.711.70.00.0 +46LEVEL MAXIMUMtrue914.0268.28.08.038.038.00.00.0 +470.0999.9true905.2296.215.015.029.229.20.00.00.01CI-Eng-Sample.TANK1.LEVEL.MAXItemValue +48%true1032.4298.49.09.04.44.40.00.0 +49COUNTER (DEMO.INCR1)true930.1339.88.08.054.154.10.00.0 +500.0999true893.5367.715.015.017.617.60.00.00.01CI-Eng-Sample.DEMO.COUNTERItemValue +51true1030.0369.99.09.02.02.00.00.0 +52true0.0100.00.01CI-Eng-Sample.DEMO.COUNTERItemValue +53PUMP RUN TIMEtrue913.0429.28.08.037.037.00.00.0 +540.09999999true906.7451.512.012.030.730.70.00.00.01CI-Eng-Sample.PUMP1.RUNNING.RUN_SECONDSItemValue +55strue1032.4452.69.09.02.42.40.00.0 +560.02700.05421500.0195.6184.4184.4370.0370.00.00.0truetrue +57KEY FIGUREStrue1182.736.911.011.032.732.70.00.0 +5845.0270.0false1255.0195.695.095.095.095.00.00.0truefalse +59179.80.5false1255.0195.695.095.095.095.00.00.0truefalse0.0java.lang.Doublejava.lang.Double0.0100.00.5270.01CI-Eng-Sample.TANK1.LEVELItemValue0.0java.lang.Doublejava.lang.Double0.0100.0179.7545.01CI-Eng-Sample.TANK1.LEVELItemValue0.0java.lang.Doublefasttools.jwui.common.property.paint.PaintSet0.010.020.080.090.01CI-Eng-Sample.TANK1.LEVELItemValue +600.0999.9true1255.0191.118.018.081.081.00.00.00.01CI-Eng-Sample.TANK1.LEVELItemValue0.0java.lang.Doublefasttools.jwui.common.property.paint.PaintSet0.010.020.080.090.01CI-Eng-Sample.TANK1.LEVELItemValue +61%true1255.0223.59.09.040.040.00.00.0 +62Leveltrue1255.0306.210.010.095.095.00.00.0 +6345.0270.0false1500.0195.695.095.095.095.00.00.0truefalse +64179.80.5false1500.0195.695.095.095.095.00.00.0truefalse0.0java.lang.Doublejava.lang.Double0.0500.00.5270.01CI-Eng-Sample.TANK1.INFLOWItemValue0.0java.lang.Doublejava.lang.Double0.0500.0179.7545.01CI-Eng-Sample.TANK1.INFLOWItemValue +650.09999true1500.0191.118.018.081.081.00.00.00.01CI-Eng-Sample.TANK1.INFLOWItemValue +66m3/htrue1500.0223.59.09.040.040.00.00.0 +67Inflowtrue1500.0306.210.010.095.095.00.00.0 +6845.0270.0false1745.0195.695.095.095.095.00.00.0truefalse +69179.80.5false1745.0195.695.095.095.095.00.00.0truefalse0.0java.lang.Doublejava.lang.Double0.0200.00.5270.01CI-Eng-Sample.TANK1.CALC.VOLUMEItemValue0.0java.lang.Doublejava.lang.Double0.0200.0179.7545.01CI-Eng-Sample.TANK1.CALC.VOLUMEItemValue +700.0999.9true1745.0191.118.018.081.081.00.00.00.01CI-Eng-Sample.TANK1.CALC.VOLUMEItemValue +71m3true1745.0223.59.09.040.040.00.00.0 +72Volumetrue1745.0306.210.010.095.095.00.00.0 +730.02700.05591500.0570.0178.8178.8370.0370.00.00.0truetrue +74LAST 10 MINUTEStrue1195.3416.911.011.045.345.30.00.0 +75Micro trend: level (teal, 0-100 %) and inflow (violet, 0-500 m3/h)true1284.5439.29.09.0134.5134.50.00.0 +762truetruetruefalseitemName[0]scaleMin[0]0.0scaleMax[0]100.0color[0]stroke[0]itemName[1]scaleMin[1]0.0scaleMax[1]500.0color[1]stroke[1]0.01CI-Eng-Sample.TANK1.LEVELItemName0.01CI-Eng-Sample.TANK1.INFLOWItemName + + diff --git a/examples/CI-Eng-Sample/displays/CIENG_System.xml b/examples/CI-Eng-Sample/displays/CIENG_System.xml new file mode 100644 index 0000000..76d37e2 --- /dev/null +++ b/examples/CI-Eng-Sample/displays/CIENG_System.xml @@ -0,0 +1,84 @@ + + + + + +System +true +1880 +760 +60 + +true + + + + + + +500 +true +false +2OverviewAlways showntrue10.0 +3RoughShown when viewing viewing a large areatrue25.0 +4StandardShown when using the default view settingtrue100.0 +5DetailShown only when viewing a small areatrue400.0 +6IntricaciesShown only when viewing a very small areatrue1000.0 +1Layer1 +54 +7940.0380.0380.0380.0940.0940.00.00.0falsetrue +80.03330.0559310.0190.0178.8178.8300.0300.00.00.0truetrue +9SERVER HEALTHtrue70.936.911.011.040.940.90.00.0 +10Real values of this PC, written by the live-data feedtrue137.259.29.09.0107.2107.20.00.0 +1145.0270.0false160.0201.2100.0100.0100.0100.00.00.0truefalse +12179.80.5false160.0201.2100.0100.0100.0100.00.00.0truefalse0.0java.lang.Doublejava.lang.Double0.0100.00.5270.01CI-Eng-Sample.SYSTEM.CPU_LOADItemValue0.0java.lang.Doublejava.lang.Double0.0100.0179.7545.01CI-Eng-Sample.SYSTEM.CPU_LOADItemValue0.0java.lang.Doublefasttools.jwui.common.property.paint.PaintSet0.080.090.01CI-Eng-Sample.SYSTEM.CPU_LOADItemValue +130.0999.9true160.0196.718.018.086.086.00.00.00.01CI-Eng-Sample.SYSTEM.CPU_LOADItemValue +14%true160.0229.19.09.040.040.00.00.0 +15CPU loadtrue160.0317.410.010.0100.0100.00.00.0 +1645.0270.0false450.0201.2100.0100.0100.0100.00.00.0truefalse +17179.80.5false450.0201.2100.0100.0100.0100.00.00.0truefalse0.0java.lang.Doublejava.lang.Double0.0100.00.5270.01CI-Eng-Sample.SYSTEM.DISK_CItemValue0.0java.lang.Doublejava.lang.Double0.0100.0179.7545.01CI-Eng-Sample.SYSTEM.DISK_CItemValue0.0java.lang.Doublefasttools.jwui.common.property.paint.PaintSet0.080.090.01CI-Eng-Sample.SYSTEM.DISK_CItemValue +180.0999.9true450.0196.718.018.086.086.00.00.00.01CI-Eng-Sample.SYSTEM.DISK_CItemValue +19%true450.0229.19.09.040.040.00.00.0 +20Disk C: usedtrue450.0317.410.010.0100.0100.00.00.0 +210.03330.0559920.0190.0178.8178.8300.0300.00.00.0truetrue +22COMMUNICATION AND PROCESSEStrue731.636.911.011.091.691.60.00.0 +230.02140.2440920.091.624.624.6280.0280.00.00.0falsetrue +24665.091.69.09.09.09.00.00.0falsetrue0.0java.lang.Booleanfasttools.jwui.common.property.paint.PaintSetfalsetrue1CI-Eng-Sample.PLC1.COMM_OKItemValue +25Modbus station CIENG_PLCtrue765.591.610.010.077.577.50.00.0 +26NORMALtrue1165.691.610.010.024.424.40.00.00.01CI-Eng-Sample.PLC1.COMM_OKItemStatusMnemonic +270.02140.2440920.0149.824.624.6280.0280.00.00.0falsetrue +28665.0149.89.09.09.09.00.00.0falsetrue0.0java.lang.Booleanfasttools.jwui.common.property.paint.PaintSetfalsetrue1CI-Eng-Sample.UA.COMM_OKItemValue +29OPC UA client station CIENG_UAtrue778.7149.810.010.090.790.70.00.0 +30NORMALtrue1165.6149.810.010.024.424.40.00.00.01CI-Eng-Sample.UA.COMM_OKItemStatusMnemonic +310.02140.2440920.0207.924.624.6280.0280.00.00.0falsetrue +32665.0207.99.09.09.09.00.00.0falsetrue0.0java.lang.Doublefasttools.jwui.common.property.paint.PaintSet0.00.51CI-Eng-Sample.UA.SRV_STATEItemValue +33OPC UA server state (0 = running)true784.5207.910.010.096.596.50.00.0 +34NORMALtrue1165.6207.910.010.024.424.40.00.00.01CI-Eng-Sample.UA.SRV_STATEItemStatusMnemonic +350.02140.2440920.0266.024.624.6280.0280.00.00.0falsetrue +36665.0266.09.09.09.09.00.00.0falsetrue0.0java.lang.Doublefasttools.jwui.common.property.paint.PaintSet0.00.51CI-Eng-Sample.SYSTEM.PING_LOCALHOSTItemValue +37localhost reachabletrue743.1266.010.010.055.155.10.00.0 +38NORMALtrue1165.6266.010.010.024.424.40.00.00.01CI-Eng-Sample.SYSTEM.PING_LOCALHOSTItemStatusMnemonic +390.02140.2440920.0324.124.624.6280.0280.00.00.0falsetrue +40665.0324.19.09.09.09.00.00.0falsetrue0.0java.lang.Doublefasttools.jwui.common.property.paint.PaintSet0.00.51CI-Eng-Sample.SYSTEM.PROC_ALMItemValue +41ALARM process (alm) runningtrue772.3324.110.010.084.384.30.00.0 +42NORMALtrue1165.6324.110.010.024.424.40.00.00.01CI-Eng-Sample.SYSTEM.PROC_ALMItemStatusMnemonic +430.03120.05591550.0190.0178.8178.8320.0320.00.00.0truetrue +44OPC UA LOOPBACKtrue1299.736.911.011.049.749.70.00.0 +45TANK1.LEVEL read back through CI Server's own OPC UA servertrue1385.559.29.09.0135.5135.50.00.0 +46TANK1.LEVELtrue1290.787.28.08.030.730.70.00.0 +470.0999.9true1303.9125.222.022.043.943.90.00.00.01CI-Eng-Sample.TANK1.LEVELItemValue +48true0.0100.00.01CI-Eng-Sample.TANK1.LEVELItemValue +49LAST UPDATEtrue1291.7212.48.08.031.731.70.00.0 +50falsetrue0.01CI-Eng-Sample.TANK1.LEVELItemUpdTime +51UA.LEVEL_COPYtrue1596.187.28.08.036.136.10.00.0 +520.0999.9true1603.9125.222.022.043.943.90.00.00.01CI-Eng-Sample.UA.LEVEL_COPYItemValue +53true0.0100.00.01CI-Eng-Sample.UA.LEVEL_COPYItemValue +54LAST UPDATEtrue1591.7212.48.08.031.731.70.00.0 +55falsetrue0.01CI-Eng-Sample.UA.LEVEL_COPYItemUpdTime +56100.00.010.05.0999false +570.01080.0542940.0564.4184.4184.4930.0930.00.00.0truetrue +58REPORTStrue52.9405.711.011.022.922.90.00.0 +59Report component: select CIENG_TANK1 or CIENG_HTML, generate and viewtrue193.3428.19.09.0163.3163.30.00.0 +60 + + diff --git a/examples/CI-Eng-Sample/displays/CIENG_TankFaceplate.xml b/examples/CI-Eng-Sample/displays/CIENG_TankFaceplate.xml new file mode 100644 index 0000000..b2a8c55 --- /dev/null +++ b/examples/CI-Eng-Sample/displays/CIENG_TankFaceplate.xml @@ -0,0 +1,66 @@ + + + + + +Tank 1 faceplate +true +420 +600 +42 + +true + + + + + + +500 +true +false +2OverviewAlways showntrue10.0 +3RoughShown when viewing viewing a large areatrue25.0 +4StandardShown when using the default view settingtrue100.0 +5DetailShown only when viewing a small areatrue400.0 +6IntricaciesShown only when viewing a very small areatrue1000.0 +1Layer1 +36 +7210.0300.0300.0300.0210.0210.00.00.0falsetrue +8210.026.026.026.0210.0210.00.00.0falsetrue +9TANK 1 | LEVELtrue77.526.012.012.057.557.50.00.0 + +11Tank 1 level (%)true57.073.09.09.037.037.00.00.00.01CI-Eng-Sample.TANK1.LEVELItemDesc +120.0999.9true78.5114.028.028.058.558.50.00.00.01CI-Eng-Sample.TANK1.LEVELItemValue0.0java.lang.Doublefasttools.jwui.common.property.paint.PaintSet0.010.020.080.090.01CI-Eng-Sample.TANK1.LEVELItemValue +13%true230.3118.012.012.06.36.30.00.0 +14STATUStrue381.5100.08.08.018.518.50.00.0 +15NORMALtrue366.4123.013.013.033.633.60.00.00.01CI-Eng-Sample.TANK1.LEVELItemStatusMnemonic0.0java.lang.Doublefasttools.jwui.common.property.paint.PaintSet0.010.020.080.090.01CI-Eng-Sample.TANK1.LEVELItemValue +16true0.0100.00.01CI-Eng-Sample.TANK1.LEVELItemValue +17100.00.020.05.0999true +18ALARM LIMITStrue225.1168.08.08.035.135.10.00.0 +190.05710.3529295.0203.017.017.0105.0105.00.00.0falsetrue +20193.0203.017.017.03.03.00.00.0falsetrue +21High-Hightrue233.8203.09.09.027.827.80.00.0 +220.0999.9true368.1203.013.013.021.921.90.00.00.01CI-Eng-Sample.TANK1.LEVELItemHHL +230.05710.3529295.0243.017.017.0105.0105.00.00.0falsetrue +24193.0243.017.017.03.03.00.00.0falsetrue +25Hightrue218.7243.09.09.012.712.70.00.0 +260.0999.9true368.1243.013.013.021.921.90.00.00.01CI-Eng-Sample.TANK1.LEVELItemHL +270.05710.3529295.0283.017.017.0105.0105.00.00.0falsetrue +28193.0283.017.017.03.03.00.00.0falsetrue +29Lowtrue216.7283.09.09.010.710.70.00.0 +300.0999.9true368.1283.013.013.021.921.90.00.00.01CI-Eng-Sample.TANK1.LEVELItemLL +310.05710.3529295.0323.017.017.0105.0105.00.00.0falsetrue +32193.0323.017.017.03.03.00.00.0falsetrue +33Low-Lowtrue229.9323.09.09.023.923.90.00.0 +340.0999.9true368.1323.013.013.021.921.90.00.00.01CI-Eng-Sample.TANK1.LEVELItemLLL +35MAXIMUM SEENtrue229.5360.08.08.039.539.50.00.0 +360.0999.9true219.2386.016.016.029.229.20.00.00.01CI-Eng-Sample.TANK1.LEVEL.MAXItemValue +37LAST UPDATEtrue221.7420.08.08.031.731.70.00.0 +38falsetrue0.01CI-Eng-Sample.TANK1.LEVELItemUpdTime +391truetruetruefalseitemName[0]scaleMin[0]0.0scaleMax[0]100.0color[0]stroke[0]0.01CI-Eng-Sample.TANK1.LEVELItemName + + + + + diff --git a/examples/CI-Eng-Sample/displays/CIENG_Trends.xml b/examples/CI-Eng-Sample/displays/CIENG_Trends.xml new file mode 100644 index 0000000..feff209 --- /dev/null +++ b/examples/CI-Eng-Sample/displays/CIENG_Trends.xml @@ -0,0 +1,48 @@ + + + + + +Trends +true +1880 +760 +24 + +true + + + + + + +500 +true +false +2OverviewAlways showntrue10.0 +3RoughShown when viewing viewing a large areatrue25.0 +4StandardShown when using the default view settingtrue100.0 +5DetailShown only when viewing a small areatrue400.0 +6IntricaciesShown only when viewing a very small areatrue1000.0 +1Layer1 +18 +7940.0380.0380.0380.0940.0940.00.00.0falsetrue +80.01450.0271700.0380.0368.8368.8690.0690.00.00.0truetrue +9false-1true00false@NULLfalse001360715falsefalse@NULLfalsetruetruetruetruefalsetrue0.0truefalsefalsefalsefalsefalsefalsefalse5000truetruefalsetruefalse0050truefalseTank 1 - level and inflowtruetrue0true0@NULLtruetruetrue0truetruetrue@NULL@NULL10.0100.0false<description>Tank 1 level (%)</description><legendText></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"/><annotationVisible>false</annotationVisible><timeShift>0</timeShift></pen><pen type="pen"><type>0</type><color type="colorSet" r="139" g="92" b="246"/><stroke type="stroke" width="2.0"/><paint>@NULL</paint><visible>true</visible><visibleLegend>true</visibleLegend><source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.INFLOW"/><axisVisible>false</axisVisible><axisPosition>0</axisPosition><labelVisible>true</labelVisible><majorTickVisible>true</majorTickVisible><minorTickVisible>true</minorTickVisible><axisColor>@NULL</axisColor><labelColor>@NULL</labelColor><scaleRangeType>1</scaleRangeType><minimum>0.0</minimum><maximum>500.0</maximum><procentual>false</procentual><title/><description>Tank 1 inflow (m3/h)</description><legendText></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"/><annotationVisible>false</annotationVisible><timeShift>0</timeShift></pen><timeRange type="timeRangeLast" count="10"><type type="timeUnit" value="TimeUnitMinute"/></timeRange><updateInterval>5</updateInterval><fillHistory>true</fillHistory><updating>true</updating></chartPanel></config><x>700.0</x><y>380.0</y><top>357.6</top><bottom>357.6</bottom><left>680.0</left><right>680.0</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionInternalServiced"/></data></chart> +<rectangle type="componentData"><htmlId>10</htmlId><roundingX>0.0426</roundingX><roundingY>0.0840</roundingY><x>1635.0</x><y>130.2</y><top>119.0</top><bottom>119.0</bottom><left>235.0</left><right>235.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="48" g="61" b="77"/></strokePaint><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="28" g="35" b="45"/></fillPaint></rectangle> +<text type="componentData"><htmlId>11</htmlId><value>LEVEL</value><font type="font" name="Segoe UI" bold="true" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1435.1</x><y>36.9</y><top>11.0</top><bottom>11.0</bottom><left>15.1</left><right>15.1</right><rotation>0.0</rotation><shear>0.0</shear></text> +<number type="componentData"><htmlId>12</htmlId><value>0.0</value><format>999.9</format><font type="font" name="Consolas" bold="true" size="20" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="20" g="184" b="166"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1783.2</x><y>36.9</y><top>15.0</top><bottom>15.0</bottom><left>26.8</left><right>26.8</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></number> +<text type="componentData"><htmlId>13</htmlId><value>%</value><font type="font" name="Segoe UI" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1818.4</x><y>36.9</y><top>9.0</top><bottom>9.0</bottom><left>4.4</left><right>4.4</right><rotation>0.0</rotation><shear>0.0</shear></text> +<microTrend type="componentData" x="1635.0" y="148.6" top="83.8" bottom="83.8" left="215.0" right="215.0" rotation="0.0" shear="0.0"><htmlId>14</htmlId><numberOfPens>1</numberOfPens><realTime>true</realTime><fillWithHistory>true</fillWithHistory><microTrendBackgroundFillOn>true</microTrendBackgroundFillOn><lowHighFillOn>false</lowHighFillOn><microTrendBackgroundFillColor type="colorSet" r="22" g="27" b="34"/><microTrendBackgroundColor type="colorSet" r="48" g="61" b="77"/><property type="componentProperty"><name>itemName[0]</name><value/></property><property type="componentProperty"><name>scaleMin[0]</name><value>0.0</value></property><property type="componentProperty"><name>scaleMax[0]</name><value>100.0</value></property><property type="componentProperty"><name>color[0]</name><value type="colorSet" r="20" g="184" b="166"/></property><property type="componentProperty"><name>stroke[0]</name><value type="stroke" width="2.0"/></property><data type="data"><action type="actionInternalServiced"/><action type="actionConnectTo"><property type="property" name="microTrend.itemName[0]"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemName</itemAttribute></connection></action></data></microTrend> +<rectangle type="componentData"><htmlId>15</htmlId><roundingX>0.0426</roundingX><roundingY>0.0840</roundingY><x>1635.0</x><y>379.4</y><top>119.0</top><bottom>119.0</bottom><left>235.0</left><right>235.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="48" g="61" b="77"/></strokePaint><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="28" g="35" b="45"/></fillPaint></rectangle> +<text type="componentData"><htmlId>16</htmlId><value>INFLOW</value><font type="font" name="Segoe UI" bold="true" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1441.0</x><y>286.1</y><top>11.0</top><bottom>11.0</bottom><left>21.0</left><right>21.0</right><rotation>0.0</rotation><shear>0.0</shear></text> +<number type="componentData"><htmlId>17</htmlId><value>0.0</value><format>9999.9</format><font type="font" name="Consolas" bold="true" size="20" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="92" b="246"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1777.8</x><y>286.1</y><top>15.0</top><bottom>15.0</bottom><left>32.2</left><right>32.2</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.INFLOW</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></number> +<text type="componentData"><htmlId>18</htmlId><value>m3/h</value><font type="font" name="Segoe UI" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1826.2</x><y>286.1</y><top>9.0</top><bottom>9.0</bottom><left>12.2</left><right>12.2</right><rotation>0.0</rotation><shear>0.0</shear></text> +<microTrend type="componentData" x="1635.0" y="397.9" top="83.8" bottom="83.8" left="215.0" right="215.0" rotation="0.0" shear="0.0"><htmlId>19</htmlId><numberOfPens>1</numberOfPens><realTime>true</realTime><fillWithHistory>true</fillWithHistory><microTrendBackgroundFillOn>true</microTrendBackgroundFillOn><lowHighFillOn>false</lowHighFillOn><microTrendBackgroundFillColor type="colorSet" r="22" g="27" b="34"/><microTrendBackgroundColor type="colorSet" r="48" g="61" b="77"/><property type="componentProperty"><name>itemName[0]</name><value/></property><property type="componentProperty"><name>scaleMin[0]</name><value>0.0</value></property><property type="componentProperty"><name>scaleMax[0]</name><value>500.0</value></property><property type="componentProperty"><name>color[0]</name><value type="colorSet" r="139" g="92" b="246"/></property><property type="componentProperty"><name>stroke[0]</name><value type="stroke" width="2.0"/></property><data type="data"><action type="actionInternalServiced"/><action type="actionConnectTo"><property type="property" name="microTrend.itemName[0]"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.INFLOW</itemName><itemAttribute>ItemName</itemAttribute></connection></action></data></microTrend> +<rectangle type="componentData"><htmlId>20</htmlId><roundingX>0.0426</roundingX><roundingY>0.0840</roundingY><x>1635.0</x><y>628.7</y><top>119.0</top><bottom>119.0</bottom><left>235.0</left><right>235.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="48" g="61" b="77"/></strokePaint><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="28" g="35" b="45"/></fillPaint></rectangle> +<text type="componentData"><htmlId>21</htmlId><value>CPU LOAD</value><font type="font" name="Segoe UI" bold="true" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1446.8</x><y>535.4</y><top>11.0</top><bottom>11.0</bottom><left>26.8</left><right>26.8</right><rotation>0.0</rotation><shear>0.0</shear></text> +<number type="componentData"><htmlId>22</htmlId><value>0.0</value><format>999.9</format><font type="font" name="Consolas" bold="true" size="20" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="59" g="130" b="246"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1783.2</x><y>535.4</y><top>15.0</top><bottom>15.0</bottom><left>26.8</left><right>26.8</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.SYSTEM.CPU_LOAD</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></number> +<text type="componentData"><htmlId>23</htmlId><value>%</value><font type="font" name="Segoe UI" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1818.4</x><y>535.4</y><top>9.0</top><bottom>9.0</bottom><left>4.4</left><right>4.4</right><rotation>0.0</rotation><shear>0.0</shear></text> +<microTrend type="componentData" x="1635.0" y="647.1" top="83.8" bottom="83.8" left="215.0" right="215.0" rotation="0.0" shear="0.0"><htmlId>24</htmlId><numberOfPens>1</numberOfPens><realTime>true</realTime><fillWithHistory>false</fillWithHistory><microTrendBackgroundFillOn>true</microTrendBackgroundFillOn><lowHighFillOn>false</lowHighFillOn><microTrendBackgroundFillColor type="colorSet" r="22" g="27" b="34"/><microTrendBackgroundColor type="colorSet" r="48" g="61" b="77"/><property type="componentProperty"><name>itemName[0]</name><value/></property><property type="componentProperty"><name>scaleMin[0]</name><value>0.0</value></property><property type="componentProperty"><name>scaleMax[0]</name><value>100.0</value></property><property type="componentProperty"><name>color[0]</name><value type="colorSet" r="59" g="130" b="246"/></property><property type="componentProperty"><name>stroke[0]</name><value type="stroke" width="2.0"/></property><data type="data"><action type="actionInternalServiced"/><action type="actionConnectTo"><property type="property" name="microTrend.itemName[0]"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.SYSTEM.CPU_LOAD</itemName><itemAttribute>ItemName</itemAttribute></connection></action></data></microTrend> + </coreObjectDefinition> +</visualization> diff --git a/examples/CI-Eng-Sample/displays/deploy_displays.cmd b/examples/CI-Eng-Sample/displays/deploy_displays.cmd index f4d289a..55ab3ef 100644 --- a/examples/CI-Eng-Sample/displays/deploy_displays.cmd +++ b/examples/CI-Eng-Sample/displays/deploy_displays.cmd @@ -3,12 +3,11 @@ rem Deploy the CI-Eng-Sample displays into the operator interface (deployment DE 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. +rem The files are generated by generator\build.py (already in this folder; rerun only after changes). cd /d "%~dp0" set WAP=%TLS_WAP_PATH% if not defined TLS_WAP_PATH set WAP=C:\Users\Public\Yokogawa\tls\wap -copy /y CIENG_Tank.xml "%WAP%\cfg\operatorInterfaces\DEPLOY\displays\" -copy /y CIENG_Menu.xml "%WAP%\cfg\operatorInterfaces\DEPLOY\displays\" -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 +for %%d in (CIENG_Header CIENG_Overview CIENG_Control CIENG_Trends CIENG_Alarms CIENG_System CIENG_AlarmBanner CIENG_TankFaceplate) do ( + copy /y %%d.xml "%WAP%\cfg\operatorInterfaces\DEPLOY\displays\" > nul + call jwuiutl.cmd -e HTML -i -f DEPLOY %%d +) diff --git a/examples/CI-Eng-Sample/displays/generator/.gitignore b/examples/CI-Eng-Sample/displays/generator/.gitignore new file mode 100644 index 0000000..c18dd8d --- /dev/null +++ b/examples/CI-Eng-Sample/displays/generator/.gitignore @@ -0,0 +1 @@ +__pycache__/ diff --git a/examples/CI-Eng-Sample/displays/generator/README.md b/examples/CI-Eng-Sample/displays/generator/README.md new file mode 100644 index 0000000..5f6628b --- /dev/null +++ b/examples/CI-Eng-Sample/displays/generator/README.md @@ -0,0 +1,44 @@ +# Display generator (CI-Eng-Sample operator HMI) + +A small Python tool that **writes the CI-Eng-Sample display files** (`..\CIENG_*.xml`) instead of +drawing them in the Edit Module. The XML is the same format the Edit Module saves (display +definition 1.3.0.0, *HTML display* on), so the files run in the Operator Interface (desktop) and in +the HTML display (web), and they can still be opened and changed in the Edit Module afterwards +(but a later generator run overwrites such changes). + +Built and tested with CI Server R1.03.00, Python 3.12 and Pillow, 2026-10-06. + +## Files + +| File | Purpose | +|---|---| +| `cixml.py` | Library: a `Display` class with one method per component (rectangle, text, number, number/text/date-time field, button, toggle, check box, slider, spinner, combo box, data bar, scales, arc / ring gauge, lamp, alarm overview, report, micro trend, trend), item connections, linear and threshold transformations, actions (open / close display, set item value, execute command) and the dark colour theme | +| `build.py` | The eight sample displays: `CIENG_Header`, `CIENG_Overview`, `CIENG_Control`, `CIENG_Trends`, `CIENG_Alarms`, `CIENG_System`, `CIENG_AlarmBanner` (layout `CIENG_Operator`) and `CIENG_TankFaceplate` (layout `CIENG_Popup`) | + +## Use + +``` +python build.py (writes ..\CIENG_*.xml) +python build.py <folder> (writes into another folder) +``` + +Then deploy with `..\deploy_displays.cmd`. Requirements: Python 3, Pillow (`pip install pillow`; +used to measure text widths with the Windows fonts Segoe UI and Consolas). Without Pillow it falls +back to an estimate and left/right-aligned texts land slightly off. + +## How it works (rules learned on R1.03.00) + +- Positions are boxes (left, top, width, height); the file stores the centre plus half sizes. +- Texts and numbers use *keep original size*: the HTML export draws them at their font size centred + on the box (otherwise the text is stretched to the box). The box is therefore shrunk to the + measured text width for left / right alignment. +- Rectangle rounding is stored as a fraction (0..1) of the half size (values above 1 draw an + ellipse in the web client). +- The tab displays are designed 1880 x 680 and stretched to 1880 x 760 (`design_h`): panels, bars, + lists and trends grow, texts / controls / round shapes keep their size and only move. +- Ring gauges are symmetric about the horizontal axis (gap on the right, value growing from 9 + o'clock up and down) because the desktop draws arc angles mirrored compared with the web. +- The live-data button runs `C:\Users\Public\CI-Eng-Sample\feed\cieng_feed_start.cmd` on the + server (`FEED_START` in `build.py`; installed by `..\..\feed\install_feed.ps1`). +- Trend: `trend(..., web_spares=True)` pads a trend to 50 pens so it also draws on the web; the + sample trend uses `web_spares=False` (2 pens, clean desktop hairline, no line on the web). diff --git a/examples/CI-Eng-Sample/displays/generator/build.py b/examples/CI-Eng-Sample/displays/generator/build.py new file mode 100644 index 0000000..7109dc6 --- /dev/null +++ b/examples/CI-Eng-Sample/displays/generator/build.py @@ -0,0 +1,351 @@ +"""Build the CI-Eng-Sample demo displays (CI Server R1.03.00, HTML mode = desktop + web). + + python build.py [<output folder>] (default: the displays folder, ..) + +See README.md in this folder. + +Displays: CIENG_Header, CIENG_Overview, CIENG_Control, CIENG_Trends, CIENG_Alarms, CIENG_System, +CIENG_AlarmBanner (frames of layout CIENG_Operator) and CIENG_TankFaceplate (layout CIENG_Popup). +""" +import os, sys +sys.path.insert(0, os.path.dirname(__file__)) +from cixml import * + +S = 'CI-Eng-Sample.' +LEVEL, INFLOW, VOLUME = S + 'TANK1.LEVEL', S + 'TANK1.INFLOW', S + 'TANK1.CALC.VOLUME' +LVL_COLORS = [(0, 'red'), (10, 'amber'), (20, 'teal'), (80, 'amber'), (90, 'red')] # LL/L/normal/H/HH +# live-data feed, installed by feed\install_feed.ps1 into a fixed folder outside CI Server +FEED_START = r'cmd /c "C:\Users\Public\CI-Eng-Sample\feed\cieng_feed_start.cmd"' +W, H, HD = 1880, 760, 680 # content displays (tab frames): 1880 x 760 (about 2.5:1, between the + # 16:9 and 16:10 content areas); coordinates below are designed for 680 high +FACEPLATE = act_open('CIENG_TankFaceplate', 'CIENG_Popup', 'default') +FACEPLATE_CLICK = act_open('CIENG_TankFaceplate', 'CIENG_Popup', 'default', event='Clicked b1') + + +def card(d, l, t, w, h, title, sub=None): + d.rect(l, t, w, h, fill='card', stroke='line', r=10) + d.text(l + 20, t + 12, w - 40, 22, title.upper(), 11, 'muted', bold=True) + if sub: + d.text(l + 20, t + 34, w - 40, 18, sub, 10, 'dim') + + +def kv(d, l, t, w, label, item, fmt, unit, size=22, color='text', extra=()): + d.text(l, t, w, 16, label, 10, 'muted') + d.number(l, t + 18, w - 50, 30, item, fmt, size, color, align='Left', extra=extra) + d.text(l + w - 48, t + 26, 48, 18, unit, 11, 'muted') + + +def level_color(prop='number.fillPaint'): + return conn(prop, LEVEL, transform=tr_threshold(LVL_COLORS)) + + +def gauge(d, cx, cy, r, item, mn, mx, fmt, unit, label, color='teal', thresholds=None, extra=()): + d.ring_gauge(cx, cy, r, item, mn, mx, color, 12, thresholds) + d.number(cx - r + 14, cy - 22, 2 * r - 28, 36, item, fmt, 26, align='Center', extra=extra) + d.text(cx - 40, cy + 16, 80, 18, unit, 11, 'muted', align='Center') + d.text(cx - r, cy + r - 6, 2 * r, 20, label, 12, 'text', bold=True, align='Center') + + +def build_header(): + d = Display('CIENG_Header', 1920, 96, 'Header', bg='panel') + d.rect(0, 0, 1920, 96, fill='panel') + d.line(0, 95, 1920, 95, 'line', 1) + d.rect(20, 18, 60, 60, fill='blue', r=14) + d.text(20, 34, 60, 28, 'CI', 22, 'white', bold=True, align='Center') + d.text(96, 18, 380, 30, 'CI-Eng-Sample', 22, 'text', bold=True) + d.text(96, 52, 400, 20, 'Operations dashboard | Tank farm demo', 12, 'muted') + # KPI chips + chips = [(520, 'TANK LEVEL', LEVEL, '999.9', '%', [level_color()]), + (700, 'INFLOW', INFLOW, '9999.9', 'm3/h', []), + (880, 'VOLUME', VOLUME, '9999.9', 'm3', [])] + for x, label, item, fmt, unit, extra in chips: + d.rect(x, 14, 168, 68, fill='card', stroke='line', r=8) + d.text(x + 14, 22, 140, 16, label, 10, 'muted', bold=True) + d.number(x + 14, 40, 100, 32, item, fmt, 22, align='Left', extra=extra) + d.text(x + 118, 50, 46, 18, unit, 11, 'muted') + x = 1060 + d.rect(x, 14, 168, 68, fill='card', stroke='line', r=8) + d.text(x + 14, 22, 140, 16, 'PUMP 1', 10, 'muted', bold=True) + d.lamp(x + 14, 48, 18, S + 'PUMP1.RUNNING') + for txt, col, on in (('RUNNING', 'green', True), ('STOPPED', 'muted', False)): + d.text(x + 40, 44, 120, 24, txt, 14, col, bold=True) + d.parts[-1] = d.parts[-1].replace('</text>', data([conn('text.visible', S + 'PUMP1.RUNNING', + transform=tr_threshold([(False, not on), (True, on)], 'Boolean', 'Boolean'))]) + '</text>') + x = 1240 + d.rect(x, 14, 168, 68, fill='card', stroke='line', r=8) + d.text(x + 14, 22, 140, 16, 'COMMUNICATION', 10, 'muted', bold=True) + d.lamp(x + 14, 50, 14, S + 'PLC1.COMM_OK', off='red') + d.text(x + 34, 46, 50, 20, 'PLC1', 12, 'text') + d.lamp(x + 90, 50, 14, S + 'UA.COMM_OK', off='red') + d.text(x + 110, 46, 50, 20, 'OPC UA', 12, 'text') + # live data start/stop + x = 1424 + d.rect(x, 14, 250, 68, fill='card', stroke='line', r=8) + d.text(x + 14, 22, 120, 16, 'LIVE DATA', 10, 'muted', bold=True) + d.lamp(x + 112, 23, 12, S + 'DEMO.FEED_ON') + d.button(x + 14, 44, 104, 30, 'Start', [act_set(S + 'DEMO.FEED_ON', 1), act_cmd(FEED_START)], fg='white', bg='green', + tip='Start the live-data feed (cieng_feed.ps1) on the server') + d.button(x + 130, 44, 104, 30, 'Stop', [act_set(S + 'DEMO.FEED_ON', 0)], fg='text', bg='card2', + tip='Stop the feed (ends within 5 s)') + # faceplate + clock + d.button(1688, 14, 92, 68, 'Tank 1', [FACEPLATE], fg='white', bg='blue', tip='Open the Tank 1 faceplate popup') + d.text(1792, 22, 120, 16, 'LAST UPDATE', 10, 'muted', bold=True) + d.time_text(1792, 44, 122, 28, S + 'DEMO.COUNTER', 9) + return d + + +def build_overview(): + d = Display('CIENG_Overview', W, H, 'Overview', design_h=HD) + d.rect(0, 0, W, HD, fill='bg') + card(d, 10, 10, 1110, 660, 'Process - Tank 1', 'Click the tank for its faceplate') + # inflow pipe + flow indicator + d.rect(60, 330, 380, 16, fill='track') + d.rect(60, 333, 380, 10, fill='teal', actions=[conn('rectangle.visible', INFLOW, + transform=tr_threshold([(0, False), (5, True)], 'Double', 'Boolean'))]) + d.text(60, 250, 200, 16, 'INFLOW', 10, 'muted', bold=True) + d.number(60, 268, 150, 40, INFLOW, '9999.9', 30, align='Left') + d.text(214, 282, 60, 20, 'm3/h', 12, 'muted') + # tank + d.rect(440, 100, 240, 480, fill='panel', stroke='line', sw=2, r=18, actions=[FACEPLATE_CLICK], + tip='Tank 1 - click for the faceplate') + d.rect(450, 110, 220, 460, fill='blue', r=12, fill_amount=0.5, fill_dir='FillDirectionUp', + actions=[conn('rectangle.fillAmount', LEVEL, transform=tr_linear(0, 100, 0, 1)), + conn('rectangle.fillPaint', LEVEL, transform=tr_threshold( + [(0, (185, 28, 28)), (10, (180, 83, 9)), (20, (37, 99, 235)), (80, (180, 83, 9)), (90, (185, 28, 28))])), + FACEPLATE_CLICK]) + d.text(450, 60, 220, 28, 'TANK 1', 16, 'text', bold=True, align='Center') + d.number(460, 300, 200, 50, LEVEL, '999.9', 40, 'white', align='Center') + d.text(460, 352, 200, 20, '% level', 12, 'text', align='Center') + for pct, lab, col in ((90, 'HH 90', 'red'), (80, 'H 80', 'amber'), (20, 'L 20', 'amber'), (10, 'LL 10', 'red')): + y = 570 - pct * 4.6 + d.line(682, y, 700, y, col, 2) + d.text(706, y - 9, 60, 18, lab, 10, col, bold=True) + d.button(470, 594, 180, 32, 'Open faceplate', [FACEPLATE], fg='white', bg='blue') + # outlet pipe + pump + d.rect(680, 532, 150, 16, fill='track') + d.rect(680, 535, 150, 10, fill='teal', actions=[conn('rectangle.visible', S + 'PUMP1.RUNNING')]) + d.ellipse(830, 495, 90, 90, fill='off', stroke='line', sw=2, actions=[ + conn('ellipse.fillPaint', S + 'PUMP1.RUNNING', transform=tr_threshold([(False, 'off'), (True, 'green')], 'Boolean'))]) + d.text(830, 528, 90, 24, 'P1', 16, 'white', bold=True, align='Center') + d.rect(920, 532, 170, 16, fill='track') + d.rect(920, 535, 170, 10, fill='teal', actions=[conn('rectangle.visible', S + 'PUMP1.RUNNING')]) + d.text(800, 600, 150, 18, 'PUMP 1', 11, 'muted', bold=True, align='Center') + for txt, col, val in (('AUTO', 'teal', 1), ('MANUAL', 'amber', 0)): + d.text(800, 620, 150, 20, txt, 13, col, bold=True, align='Center') + d.parts[-1] = d.parts[-1].replace('</text>', data([conn('text.visible', S + 'PUMP1.MODE', transform=tr_threshold( + [(0, val == 0), (1, val == 1)], 'Double', 'Boolean'))]) + '</text>') + # info column + x = 860 + d.rect(x, 90, 230, 330, fill='panel', stroke='line', r=8) + kv(d, x + 16, 104, 200, 'VOLUME (TANK1.CALC)', VOLUME, '9999.9', 'm3') + kv(d, x + 16, 168, 200, 'FLOW PER SECOND (JFLOW)', S + 'TANK1.JFLOW.sPerMin', '999.99', 'm3/s') + kv(d, x + 16, 232, 200, 'LEVEL MAXIMUM', S + 'TANK1.LEVEL.MAX', '999.9', '%') + kv(d, x + 16, 296, 200, 'COUNTER (DEMO.INCR1)', S + 'DEMO.COUNTER', '999', '') + d.databar(x + 16, 352, 198, 10, S + 'DEMO.COUNTER', 0, 100, 'violet', 'track', 'Right') + d.text(x + 16, 376, 200, 16, 'PUMP RUN TIME', 10, 'muted') + d.number(x + 16, 392, 150, 24, S + 'PUMP1.RUNNING.RUN_SECONDS', '9999999', 16, align='Left') + d.text(x + 170, 396, 40, 18, 's', 11, 'muted') + # gauges + card(d, 1130, 10, 740, 330, 'Key figures') + gauge(d, 1255, 175, 95, LEVEL, 0, 100, '999.9', '%', 'Level', thresholds=LVL_COLORS, extra=[level_color()]) + gauge(d, 1500, 175, 95, INFLOW, 0, 500, '9999', 'm3/h', 'Inflow', 'violet') + gauge(d, 1745, 175, 95, VOLUME, 0, 200, '999.9', 'm3', 'Volume', 'blue') + card(d, 1130, 350, 740, 320, 'Last 10 minutes', 'Micro trend: level (teal, 0-100 %) and inflow (violet, 0-500 m3/h)') + d.micro_trend(1150, 410, 700, 240, [(LEVEL, 0, 100, 'teal'), (INFLOW, 0, 500, 'violet')]) + return d + + +def build_control(): + d = Display('CIENG_Control', W, H, 'Process control', design_h=HD) + d.rect(0, 0, W, HD, fill='bg') + # setpoint -> Modbus loopback + card(d, 10, 10, 925, 325, 'Setpoint -> PLC1 (Modbus loopback)', 'Slider, spinner and input field write PLC1.SETPOINT; READBACK returns through Modbus') + d.slider(40, 70, 600, 64, S + 'PLC1.SETPOINT', 0, 100, 10, 5) + d.text(40, 150, 140, 16, 'SPINNER', 10, 'muted', bold=True) + d.spinner(40, 170, 140, 36, S + 'PLC1.SETPOINT', 0, 100, 5) + d.text(200, 150, 140, 16, 'INPUT FIELD', 10, 'muted', bold=True) + d.number_field(200, 170, 140, 36, S + 'PLC1.SETPOINT', '999', 16) + d.text(360, 150, 160, 16, 'SETPOINT', 10, 'muted', bold=True) + d.number(360, 168, 120, 40, S + 'PLC1.SETPOINT', '999', 28, 'blue', align='Left') + d.text(40, 226, 300, 16, 'READBACK (data bar + scale)', 10, 'muted', bold=True) + d.databar(40, 248, 600, 18, S + 'PLC1.READBACK', 0, 100, 'blue', 'track', 'Right') + d.rect_scale(40, 268, 600, 36, 0, 100, 10, 5, vertical=False) + gauge(d, 790, 175, 95, S + 'PLC1.READBACK', 0, 100, '999', '', 'Readback', 'blue') + d.lamp(700, 30, 12, S + 'PLC1.COMM_OK', off='red') + d.text(718, 26, 200, 18, 'station CIENG_PLC', 11, 'muted') + # digital command + card(d, 945, 10, 925, 325, 'Digital command -> PLC1.CMD', 'Toggle and push buttons write the coil; FEEDBACK is read back from the input bit') + d.toggle(975, 80, 200, 48, 'CMD (toggle)', S + 'PLC1.CMD', 14) + d.button(975, 150, 95, 40, 'Set ON', [act_set(S + 'PLC1.CMD', 1)], fg='white', bg='green') + d.button(1080, 150, 95, 40, 'Set OFF', [act_set(S + 'PLC1.CMD', 0)], fg='text', bg='card2') + d.ellipse(1300, 80, 120, 120, fill='off', stroke='line', sw=3, actions=[ + conn('ellipse.fillPaint', S + 'PLC1.FEEDBACK', transform=tr_threshold([(False, 'off'), (True, 'green')], 'Boolean'))]) + d.text(1300, 128, 120, 24, 'FEEDBACK', 13, 'white', bold=True, align='Center') + d.text(1460, 90, 380, 16, 'LAST CHANGE OF FEEDBACK', 10, 'muted', bold=True) + d.datetime_field(1460, 112, 300, 30, S + 'PLC1.FEEDBACK', 'ItemUpdTime', 13) # date/time field (editable on the web) + d.text(1460, 160, 380, 16, 'STATUS', 10, 'muted', bold=True) + d.text(1460, 180, 380, 24, 'NORMAL', 16, 'text', bold=True) + d.parts[-1] = d.parts[-1].replace('</text>', data([conn('text.value', S + 'PLC1.FEEDBACK', 'ItemStatusMnemonic')]) + '</text>') + # pump + card(d, 10, 345, 925, 325, 'Pump 1', 'Combo box, buttons and check box write PUMP1.MODE / PUMP1.RUNNING (mode changes are audited)') + d.text(40, 400, 160, 16, 'MODE (COMBO BOX)', 10, 'muted', bold=True) + d.combo(40, 420, 200, 34, S + 'PUMP1.MODE', '0;Manual;1;Auto', 14) + d.button(260, 420, 110, 34, 'Manual', [act_set(S + 'PUMP1.MODE', 0)], fg='text', bg='card2') + d.button(380, 420, 110, 34, 'Auto', [act_set(S + 'PUMP1.MODE', 1)], fg='white', bg='blue') + d.text(40, 478, 300, 16, 'RUN COMMAND (CHECK BOX, MANUAL MODE)', 10, 'muted', bold=True) + d.checkbox(40, 498, 240, 32, 'Pump running', S + 'PUMP1.RUNNING', 14) + d.text(40, 552, 300, 16, 'DESCRIPTION (TEXT FIELD)', 10, 'muted', bold=True) + d.text_field(40, 572, 450, 30, S + 'PUMP1.MODE', 'ItemDesc', 13) + d.ellipse(600, 420, 110, 110, fill='off', stroke='line', sw=3, actions=[ + conn('ellipse.fillPaint', S + 'PUMP1.RUNNING', transform=tr_threshold([(False, 'off'), (True, 'green')], 'Boolean'))]) + d.text(600, 462, 110, 24, 'P1', 18, 'white', bold=True, align='Center') + d.text(560, 548, 220, 16, 'RUN TIME (INTEGRATOR)', 10, 'muted', bold=True, align='Center') + d.number(560, 566, 190, 34, S + 'PUMP1.RUNNING.RUN_SECONDS', '9999999', 24, align='Right') + d.text(754, 576, 30, 18, 's', 12, 'muted') + # alarm test + card(d, 945, 345, 925, 325, 'Tank 1 - alarm test', 'Stop live data first, then drive TANK1.LEVEL across its limits (H 80 / HH 90 / L 20 / LL 10)') + d.slider(975, 410, 560, 64, LEVEL, 0, 100, 10, 5) + for i, (lab, v, col, fg) in enumerate((('Low-Low 5', 5, 'red', 'white'), ('Low 15', 15, 'amber', 'white'), + ('Normal 50', 50, 'teal', 'white'), ('High 85', 85, 'amber', 'white'), + ('High-High 95', 95, 'red', 'white'))): + d.button(975 + i * 114, 500, 106, 38, lab, [act_set(LEVEL, v)], fg=fg, bg=col) + d.text(975, 566, 200, 16, 'LEVEL', 10, 'muted', bold=True) + d.number(975, 584, 160, 50, LEVEL, '999.9', 38, align='Left', extra=[level_color()]) + d.text(1180, 566, 300, 16, 'ITEM STATUS', 10, 'muted', bold=True) + d.text(1180, 590, 300, 34, 'NORMAL', 22, 'text', bold=True) + d.parts[-1] = d.parts[-1].replace('</text>', data([conn('text.value', LEVEL, 'ItemStatusMnemonic'), + conn('text.fillPaint', LEVEL, transform=tr_threshold(LVL_COLORS))]) + '</text>') + d.ring_gauge(1720, 520, 90, LEVEL, 0, 100, 'teal', 14, LVL_COLORS) + d.circ_scale(1720, 520, 120, 0, 100, 20, 5) + d.number(1660, 500, 120, 40, LEVEL, '999.9', 26, align='Center') + return d + + +def build_trends(): + d = Display('CIENG_Trends', W, H, 'Trends', design_h=HD) + d.rect(0, 0, W, HD, fill='bg') + d.rect(10, 10, 1380, 660, fill='panel', stroke='line', r=10) + d.trend(20, 20, 1360, 640, [(LEVEL, 'teal', 0, 100, 'Tank 1 level (%)'), + (INFLOW, 'violet', 0, 500, 'Tank 1 inflow (m3/h)')], 10, 'Tank 1 - level and inflow', + web_spares=False) # user choice: hairline shows 2 values; the web main trend then draws no line + for i, (title, item, mn, mx, col, fmt, unit) in enumerate(( + ('Level', LEVEL, 0, 100, 'teal', '999.9', '%'), ('Inflow', INFLOW, 0, 500, 'violet', '9999.9', 'm3/h'), + ('CPU load', S + 'SYSTEM.CPU_LOAD', 0, 100, 'blue', '999.9', '%'))): + t = 10 + i * 223 + card(d, 1400, t, 470, 213, title) + d.number(1660, t + 8, 150, 30, item, fmt, 20, col, align='Right') + d.text(1814, t + 14, 50, 18, unit, 11, 'muted') + d.micro_trend(1420, t + 48, 430, 150, [(item, mn, mx, col)], history=(i < 2)) # CPU_LOAD has no history + return d + + +def build_alarms(): + d = Display('CIENG_Alarms', W, H, 'Alarms', design_h=HD) + d.rect(0, 0, W, HD, fill='bg') + card(d, 10, 10, 1860, 390, 'Current alarms', 'All areas - acknowledge with the check box or right-click') + d.alarm_overview(20, 60, 1840, 330, size=13) + card(d, 10, 410, 1860, 260, 'Alarm history - Tank 1', 'Historical overview filtered on alarm selection area CIENG_TANK1') + d.alarm_overview(20, 460, 1840, 200, 'HistoricalAlarms', asa='CIENG_TANK1', size=13) + return d + + +def build_system(): + d = Display('CIENG_System', W, H, 'System', design_h=HD) + d.rect(0, 0, W, HD, fill='bg') + card(d, 10, 10, 600, 320, 'Server health', 'Real values of this PC, written by the live-data feed') + th = [(0, 'teal'), (80, 'amber'), (90, 'red')] + gauge(d, 160, 180, 100, S + 'SYSTEM.CPU_LOAD', 0, 100, '999.9', '%', 'CPU load', thresholds=th) + gauge(d, 450, 180, 100, S + 'SYSTEM.DISK_C', 0, 100, '999.9', '%', 'Disk C: used', 'blue', thresholds=th) + card(d, 620, 10, 600, 320, 'Communication and processes') + rows = ((S + 'PLC1.COMM_OK', 'Modbus station CIENG_PLC', 'Boolean', None), + (S + 'UA.COMM_OK', 'OPC UA client station CIENG_UA', 'Boolean', None), + (S + 'UA.SRV_STATE', 'OPC UA server state (0 = running)', 'Double', [(0, 'green'), (0.5, 'red')]), + (S + 'SYSTEM.PING_LOCALHOST', 'localhost reachable', 'Double', [(0, 'red'), (0.5, 'green')]), + (S + 'SYSTEM.PROC_ALM', 'ALARM process (alm) running', 'Double', [(0, 'red'), (0.5, 'green')])) + for i, (item, lab, inp, tbl) in enumerate(rows): + y = 60 + i * 52 + d.rect(640, y, 560, 44, fill='panel', r=6) + if inp == 'Boolean': + d.lamp(656, y + 13, 18, item, off='red') + else: + d.lamp(656, y + 13, 18, item, inp='Double', table=tbl) + d.text(688, y + 12, 340, 20, lab, 13, 'text') + d.text(1040, y + 12, 150, 20, 'NORMAL', 12, 'muted', align='Right') + d.parts[-1] = d.parts[-1].replace('</text>', data([conn('text.value', item, 'ItemStatusMnemonic')]) + '</text>') + card(d, 1230, 10, 640, 320, 'OPC UA loopback', 'TANK1.LEVEL read back through CI Server\'s own OPC UA server') + for i, (lab, item, col) in enumerate((('TANK1.LEVEL', LEVEL, 'teal'), ('UA.LEVEL_COPY', S + 'UA.LEVEL_COPY', 'blue'))): + x = 1260 + i * 300 + d.text(x, 70, 260, 16, lab, 10, 'muted', bold=True) + d.number(x, 90, 200, 44, item, '999.9', 32, col, align='Left') + d.databar(x, 150, 260, 18, item, 0, 100, col, 'track', 'Right') + d.text(x, 182, 260, 16, 'LAST UPDATE', 10, 'muted', bold=True) + d.time_text(x, 202, 260, 28, item, 13) + d.rect_scale(1260, 250, 560, 34, 0, 100, 10, 5, vertical=False) + card(d, 10, 340, 1860, 330, 'Reports', 'Report component: select CIENG_TANK1 or CIENG_HTML, generate and view') + d.report(20, 390, 1840, 270) + return d + + +def build_banner(): + d = Display('CIENG_AlarmBanner', 1920, 96, 'Alarm banner', bg='panel') + # Desktop: frames inside a <tab> ignore their zoom attribute; the layout command with a zoom argument + # applies it. Only ONE command can run at a time (more give "IllegalStateException: A command is + # already being executed"), so only the Overview tab is fitted here; the toolbar / menu / F-keys + # open the other tabs with fitDisplay. Web: the plain open action (web ignores ACTION commands). + d.rect(0, 0, 1920, 96, fill='panel', actions=[ + act_open('CIENG_Overview', 'CIENG_Operator', 'ovw', event='On entry'), + act_cmd('ACTION navigate to ovw CIENG_Overview stretchDisplay', server=False, event='On entry')]) + d.line(0, 0, 1920, 0, 'line', 1) + d.rect(10, 7, 170, 82, fill='card', stroke='line', r=8) + d.text(24, 13, 70, 18, 'ALARMS', 12, 'muted', bold=True) + d.ellipse(96, 14, 16, 16, fill='off', actions=[conn('ellipse.fillPaint', LEVEL, transform=tr_threshold( + [(0, 'red'), (10, 'amber'), (20, 'green'), (80, 'amber'), (90, 'red')]))]) + d.text(118, 13, 60, 18, 'Tank 1', 12, 'text') + d.button(24, 44, 142, 34, 'Alarm list', [act_open('CIENG_Alarms', 'CIENG_Operator', 'alm')], fg='white', bg='blue', size=13) + # 4 rows of 20 px (14 px font, web) + border: no empty white area below the rows when 4+ alarms + d.alarm_overview(190, 7, 1722, 82, size=14, banner=True) + return d + + +def build_faceplate(): + d = Display('CIENG_TankFaceplate', 420, 600, 'Tank 1 faceplate', bg='card') + d.rect(0, 0, 420, 600, fill='card') + d.rect(0, 0, 420, 52, fill='card2') + d.text(20, 14, 300, 24, 'TANK 1 | LEVEL', 15, 'text', bold=True) + d.button(370, 10, 36, 32, 'X', [act_close()], fg='text', bg='card', tip='Close') + d.text(20, 64, 380, 18, 'Tank 1 level (%)', 11, 'muted') + d.parts[-1] = d.parts[-1].replace('</text>', data([conn('text.value', LEVEL, 'ItemDesc')]) + '</text>') + d.number(20, 86, 200, 56, LEVEL, '999.9', 44, align='Left', extra=[level_color()]) + d.text(224, 106, 30, 24, '%', 16, 'muted') + d.text(270, 92, 130, 16, 'STATUS', 10, 'muted', bold=True, align='Right') + d.text(250, 110, 150, 26, 'NORMAL', 16, 'text', bold=True, align='Right') + d.parts[-1] = d.parts[-1].replace('</text>', data([conn('text.value', LEVEL, 'ItemStatusMnemonic'), + conn('text.fillPaint', LEVEL, transform=tr_threshold(LVL_COLORS))]) + '</text>') + d.databar(40, 160, 60, 280, LEVEL, 0, 100, 'blue', 'track', 'Up') + d.rect_scale(104, 160, 44, 280, 0, 100, 20, 5) + d.text(190, 160, 210, 16, 'ALARM LIMITS', 10, 'muted', bold=True) + for i, (lab, attr, col) in enumerate((('High-High', 'ItemHHL', 'red'), ('High', 'ItemHL', 'amber'), + ('Low', 'ItemLL', 'amber'), ('Low-Low', 'ItemLLL', 'red'))): + y = 186 + i * 40 + d.rect(190, y, 210, 34, fill='panel', r=6) + d.rect(190, y, 6, 34, fill=col) + d.text(206, y + 8, 100, 18, lab, 12, 'text') + d.number(300, y + 4, 90, 26, LEVEL, '999.9', 16, col, attr=attr) + d.text(190, 352, 210, 16, 'MAXIMUM SEEN', 10, 'muted', bold=True) + d.number(190, 370, 140, 32, S + 'TANK1.LEVEL.MAX', '999.9', 22, align='Left') + d.text(190, 412, 210, 16, 'LAST UPDATE', 10, 'muted', bold=True) + d.time_text(190, 430, 210, 24, LEVEL, 11) + d.micro_trend(20, 460, 380, 80, [(LEVEL, 0, 100, 'teal')]) + d.button(20, 552, 120, 34, 'Trends', [act_open('CIENG_Trends', 'CIENG_Operator', 'trd')], fg='text', bg='card2') + d.button(150, 552, 120, 34, 'Alarms', [act_open('CIENG_Alarms', 'CIENG_Operator', 'alm')], fg='text', bg='card2') + d.button(280, 552, 120, 34, 'Close', [act_close()], fg='white', bg='blue') + return d + + +if __name__ == '__main__': + out = sys.argv[1] if len(sys.argv) > 1 else os.path.join(os.path.dirname(os.path.abspath(__file__)), '..') + for b in (build_header, build_overview, build_control, build_trends, build_alarms, build_system, build_banner, + build_faceplate): + disp = b() + disp.save(out) + print(disp.name, len(disp.parts), 'components') diff --git a/examples/CI-Eng-Sample/displays/generator/cixml.py b/examples/CI-Eng-Sample/displays/generator/cixml.py new file mode 100644 index 0000000..0aeb559 --- /dev/null +++ b/examples/CI-Eng-Sample/displays/generator/cixml.py @@ -0,0 +1,583 @@ +"""Small XML writer for CI Server R1.03 display files (Edit Module format 1.3.0.0). + +Positions are given as boxes (left, top, width, height) in display pixels; CI Server stores a +component as its centre (x, y) plus half sizes (top, bottom, left, right). +Element and property names follow the installed component definitions +(%TLS_WAP_PATH%\\cfg\\operatorInterfaces\\DEPLOY\\components\\*.xml) and factory displays. +""" +from xml.sax.saxutils import escape + +# ---------------------------------------------------------------- theme (dark dashboard) +C = { + 'bg': (13, 17, 23), 'panel': (22, 27, 34), 'card': (28, 35, 45), 'card2': (36, 45, 57), + 'line': (48, 61, 77), 'text': (230, 237, 243), 'muted': (139, 152, 168), 'dim': (88, 100, 116), + 'blue': (59, 130, 246), 'teal': (20, 184, 166), 'green': (34, 197, 94), 'amber': (245, 158, 11), + 'red': (239, 68, 68), 'violet': (139, 92, 246), 'off': (71, 85, 105), 'white': (255, 255, 255), + 'track': (40, 50, 64), +} +FONT_UI = 'Segoe UI' +FONT_NUM = 'Consolas' + + +def rgb(c): + c = C.get(c, c) if isinstance(c, str) else c + return 'r="%d" g="%d" b="%d"' % tuple(c) + + +def colorset(tag, c): + return '<%s type="colorSet" %s/>' % (tag, rgb(c)) + + +def paint(tag, c): + return '<%s type="paint"><paint type="colorSet" %s/></%s>' % (tag, rgb(c), tag) + + +def font(size, bold=False, name=FONT_UI, tag='font'): + b = ' bold="true"' if bold else '' + return '<%s type="font" name="%s"%s size="%d" underline="false" strikethrough="false"/>' % (tag, name, b, size) + + +def esc(s): + return escape(str(s)) + + +def box_attrs(l, t, w, h): + return 'x="%.1f" y="%.1f" top="%.1f" bottom="%.1f" left="%.1f" right="%.1f" rotation="0.0" shear="0.0"' % ( + l + w / 2.0, t + h / 2.0, h / 2.0, h / 2.0, w / 2.0, w / 2.0) + + +def box_elems(l, t, w, h): + return ('<x>%.1f</x><y>%.1f</y><top>%.1f</top><bottom>%.1f</bottom><left>%.1f</left><right>%.1f</right>' + '<rotation>0.0</rotation><shear>0.0</shear>') % (l + w / 2.0, t + h / 2.0, h / 2.0, h / 2.0, w / 2.0, w / 2.0) + + +_FONTS = {} + + +def text_width(s, size, bold=False, name=FONT_UI): + """Width in display pixels, measured with the Windows font (matches the HTML export within ~3 %).""" + try: + from PIL import ImageFont + fn = {(FONT_UI, False): 'segoeui.ttf', (FONT_UI, True): 'segoeuib.ttf', + (FONT_NUM, False): 'consola.ttf', (FONT_NUM, True): 'consolab.ttf'}[(name, bool(bold))] + key = (fn, size) + if key not in _FONTS: + _FONTS[key] = ImageFont.truetype(r'C:\Windows\Fonts\%s' % fn, size) + return _FONTS[key].getlength(s) * 0.975 + except Exception: + return len(s) * size * 0.55 + + +def fit(l, w, s, size, align, bold=False, name=FONT_UI): + """Text and numbers are exported with keepOriginalSize: drawn at natural size, centred on the box. + Shrink the box to the measured text width so 'Left' / 'Right' alignment still lands right.""" + est = min(w, max(4.0, text_width(s, size, bold, name))) + if align == 'Left': + return l, est + if align == 'Right': + return l + w - est, est + return l, w + + +# ---------------------------------------------------------------- data connections +def tr_linear(i0, i1, o0, o1): + return ('<transformation type="transformationLinear"><inputType>java.lang.Double</inputType>' + '<outputType>java.lang.Double</outputType><inputValueStart>%s</inputValueStart>' + '<inputValueEnd>%s</inputValueEnd><outputValueStart>%s</outputValueStart>' + '<outputValueEnd>%s</outputValueEnd></transformation>') % (float(i0), float(i1), float(o0), float(o1)) + + +def tr_threshold(table, inp='Double', out='Paint'): + """table: list of (input, output). Output for Paint = colour key/tuple, Boolean = bool.""" + itype = {'Double': 'java.lang.Double', 'Boolean': 'java.lang.Boolean'}[inp] + otype = {'Paint': 'fasttools.jwui.common.property.paint.PaintSet', 'Boolean': 'java.lang.Boolean', + 'Color': 'fasttools.jtools.common.property.color.ColorSet'}[out] + rows = [] + for i, o in table: + iv = ('true' if i else 'false') if inp == 'Boolean' else repr(float(i)) + if out == 'Paint': + ov = '<thresholdOut type="paint"><paint type="colorSet" %s/></thresholdOut>' % rgb(o) + elif out == 'Color': + ov = '<thresholdOut type="colorSet" %s/>' % rgb(o) + else: + ov = '<thresholdOut>%s</thresholdOut>' % ('true' if o else 'false') + rows.append('<thresholdIn>%s</thresholdIn>%s' % (iv, ov)) + return ('<transformation type="transformationThreshold"><inputType>%s</inputType><outputType>%s</outputType>' + '<thresholdTable type="thresholdTable">%s</thresholdTable></transformation>') % (itype, otype, ''.join(rows)) + + +def conn(prop, item, attr='ItemValue', direction=1, transform=''): + """Connect component property <prop> (e.g. 'number.value') to an item attribute. + direction 1 = read, 2 = write, None = read and write (as the factory toggle buttons).""" + d = '' if direction is None else '<direction>%d</direction>' % direction + return ('<action type="actionConnectTo"><property type="property" name="%s"/>' + '<filter type="filter"><value>0.0</value></filter>%s<connection type="connection">%s' + '<itemName>%s</itemName><itemAttribute>%s</itemAttribute></connection></action>') % ( + prop, transform, d, esc(item), attr) + + +def act_set(item, value): + return ('<action type="actionSetItemAttribute"><event type="event" event="On action"/>' + '<filter type="filter"><value>%s</value></filter><connection type="connection"><direction>2</direction>' + '<location type="nodeName" node="$default$"/><itemName>%s</itemName><itemAttribute>ItemValue</itemAttribute>' + '</connection></action>') % (float(value), esc(item)) + + +def act_open(display, layout=None, frame=None, event='On action'): + lay = '' + if layout or frame: + lay = ('<type type="displayActivationType" value="ActivateSpecific"/><display>%s</display>' + '<layout>%s</layout><layoutFrame>%s</layoutFrame>') % (display, layout or '', frame or '') + return '<action type="actionActivateDisplay"><event type="event" event="%s"/>%s</action>' % (event, lay) + return ('<action type="actionActivateDisplay"><event type="event" event="%s"/><display>%s</display>' + '</action>') % (event, display) + + +def act_close(event='On action'): + return '<action type="actionExitDisplay"><event type="event" event="%s"/></action>' % event + + +def act_cmd(command, server=True, event='On action'): + return ('<action type="actionExecuteCommand"><event type="event" event="%s"/><command>%s</command>' + '<onServer>%s</onServer></action>') % (event, esc(command), 'true' if server else 'false') + + +def data(actions): + return '<data type="data">%s</data>' % ''.join(actions) if actions else '' + + +# ---------------------------------------------------------------- display builder +class Display: + def __init__(self, name, width, height, title, bg='bg', design_h=None): + self.name, self.w, self.h, self.title, self.bg = name, width, height, title, bg + # Coordinates are written for a display design_h high and stretched vertically to height: + # panels, bars and lists grow, text / controls / round shapes keep their size and only move. + self.sy = float(height) / design_h if design_h else 1.0 + self.parts = [] + self.hid = 6 # 1 = layer, 2..6 = visibility groups + + def _b(self, l, t, w, h, stretch): + if self.sy == 1.0: + return l, t, w, h + if stretch: + return l, t * self.sy, w, h * self.sy + return l, (t + h / 2.0) * self.sy - h / 2.0, w, h + + def _id(self): + self.hid += 1 + return '<htmlId>%d</htmlId>' % self.hid + + def add(self, s): + self.parts.append(s) + + # ----- shapes + def rect(self, l, t, w, h, fill='card', stroke=None, sw=1.0, r=0, actions=(), tip=None, fill_amount=None, + fill_dir=None, visible=True): + l, t, w, h = self._b(l, t, w, h, h > 40) + s = '<rectangle type="componentData">' + self._id() + if tip: + s += '<toolTipText>%s</toolTipText>' % esc(tip) + if r: + # stored as a fraction (0..1) of the half width / half height (web client + # ExtendedRectangle: rx = width / 2 * roundingX); pixel values > 1 draw an ellipse + s += '<roundingX>%.4f</roundingX><roundingY>%.4f</roundingY>' % (min(1.0, 2.0 * r / w), min(1.0, 2.0 * r / h)) + s += box_elems(l, t, w, h) + s += '<stroke type="stroke" width="%.1f"/>' % sw + if stroke: + s += '<strokeOn>true</strokeOn>' + paint('strokePaint', stroke) + else: + s += '<strokeOn>false</strokeOn>' + if fill: + s += '<fillOn>true</fillOn>' + paint('fillPaint', fill) + else: + s += '<fillOn>false</fillOn>' + if fill_amount is not None: + s += '<fillAmount>%s</fillAmount>' % fill_amount + if fill_dir: + s += '<fillDirection type="fillDirection" value="%s"/>' % fill_dir + if not visible: + s += '<visible>false</visible>' + s += data(actions) + '</rectangle>' + self.add(s) + + def ellipse(self, l, t, w, h, fill='green', stroke=None, sw=1.0, actions=(), tip=None): + l, t, w, h = self._b(l, t, w, h, False) + s = '<ellipse type="componentData">' + self._id() + if tip: + s += '<toolTipText>%s</toolTipText>' % esc(tip) + s += box_elems(l, t, w, h) + '<stroke type="stroke" width="%.1f"/>' % sw + s += ('<strokeOn>true</strokeOn>' + paint('strokePaint', stroke)) if stroke else '<strokeOn>false</strokeOn>' + s += ('<fillOn>true</fillOn>' + paint('fillPaint', fill)) if fill else '<fillOn>false</fillOn>' + s += data(actions) + '</ellipse>' + self.add(s) + + def arc(self, cx, cy, rad, start, extent, color='blue', sw=10.0, actions=()): + cy = cy * self.sy + s = '<arc type="componentData">' + self._id() + s += '<startAngle>%.1f</startAngle><extentAngle>%.1f</extentAngle><closed>false</closed>' % (start, extent) + s += box_elems(cx - rad, cy - rad, 2 * rad, 2 * rad) + s += '<stroke type="stroke" width="%.1f" endCap="butt"/><strokeOn>true</strokeOn>' % sw + s += paint('strokePaint', color) + '<fillOn>false</fillOn>' + s += data(actions) + '</arc>' + self.add(s) + + def line(self, x1, y1, x2, y2, color='line', sw=2.0, actions=()): + # a line is stored by its bounding box; direction by the sign of the extents is not available, + # so only horizontal / vertical lines are used here + l, t = min(x1, x2), min(y1, y2) + w, h = abs(x2 - x1), abs(y2 - y1) + # drawn as a thin filled rectangle: a <line> without curve points is placed wrongly on the web + if h < w: + self.rect(l, t - sw / 2.0, max(w, 1), sw, fill=color, actions=actions) + else: + self.rect(l - sw / 2.0, t, sw, max(h, 1), fill=color, actions=actions) + + # ----- text and numbers + def text(self, l, t, w, h, value, size=12, color='text', bold=False, align='Left', actions=(), name=FONT_UI, + bgfill=None): + l, t, w, h = self._b(l, t, w, h, False) + s = '<text type="componentData">' + self._id() + '<value>%s</value>' % esc(value) + s += font(size, bold, name) + paint('fillPaint', color) + l, w = fit(l, w, str(value), size, align, bold, name) + s += '<justification type="textJustification" value="TextJustificationCenter"/>' + if bgfill: + s += '<backgroundOn>true</backgroundOn>' + paint('backgroundPaint', bgfill) + s += '<stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize>' + s += box_elems(l, t, w, h) + data(actions) + '</text>' + self.add(s) + + def number(self, l, t, w, h, item, fmt='999.9', size=22, color='text', bold=True, align='Right', attr='ItemValue', + extra=()): + l, t, w, h = self._b(l, t, w, h, False) + s = '<number type="componentData">' + self._id() + '<value>0.0</value><format>%s</format>' % fmt + s += font(size, bold, FONT_NUM) + paint('fillPaint', color) + l, w = fit(l, w, fmt.replace('9', '0'), size, align, bold, FONT_NUM) + s += '<justification type="textJustification" value="TextJustificationCenter"/>' + s += '<stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize>' + s += box_elems(l, t, w, h) + data([conn('number.value', item, attr)] + list(extra)) + '</number>' + self.add(s) + + def number_field(self, l, t, w, h, item, fmt='9999', size=14, editable=True, attr='ItemValue', as_datetime=False): + l, t, w, h = self._b(l, t, w, h, False) + s = '<numberField type="componentData" %s>' % box_attrs(l, t, w, h) + self._id() + s += font(size, True, FONT_NUM) + '<format>%s</format>' % fmt + s += '<editable>%s</editable>' % ('true' if editable else 'false') + if as_datetime: + s += '<asDateTime>true</asDateTime>' + s += colorset('foregroundColor', 'text') + colorset('backgroundColor', 'card2') + s += '<justification type="jTextJustification" value="TextJustificationRight"/>' + s += data([conn('numberField.value', item, attr, direction=None if editable else 1)]) + '</numberField>' + self.add(s) + + def text_field(self, l, t, w, h, item, attr='ItemDescription', size=12): + l, t, w, h = self._b(l, t, w, h, False) + s = '<textField type="componentData" %s>' % box_attrs(l, t, w, h) + self._id() + s += font(size) + '<editable>false</editable>' + s += colorset('foregroundColor', 'text') + colorset('backgroundColor', 'card2') + s += data([conn('textField.value', item, attr)]) + '</textField>' + self.add(s) + + def time_text(self, l, t, w, h, item, size=12, color='text', align='Left'): + """Last update time of an item: number field with asDateTime (epoch seconds -> local date and time).\n The web dateTimeField only shows a value when editable (white input boxes).""" + self.number_field(l, t, w, h, item, '', size, editable=False, attr='ItemUpdTime', as_datetime=True) + def datetime_field(self, l, t, w, h, item, attr='ItemUpdTime', size=12, editable=True): + l, t, w, h = self._b(l, t, w, h, False) + s = '<dateTimeField type="componentData" %s>' % box_attrs(l, t, w, h) + self._id() + s += font(size) + colorset('foregroundColor', 'text') + s += '<editable>%s</editable><secondsVisible>true</secondsVisible>' % ('true' if editable else 'false') + s += colorset('backgroundColor', 'card2') + s += data([conn('dateTimeField.value', item, attr)]) + '</dateTimeField>' + self.add(s) + + # ----- controls + def button(self, l, t, w, h, label, actions, fg='text', bg='card2', size=12, bold=True, tip=None, extra=()): + l, t, w, h = self._b(l, t, w, h, False) + s = '<button type="componentData" %s>' % box_attrs(l, t, w, h) + self._id() + if tip: + s += '<toolTipText>%s</toolTipText>' % esc(tip) + s += '<label>%s</label>' % esc(label) + font(size, bold) + s += colorset('foregroundColor', fg) + colorset('backgroundColor', bg) + s += data(list(actions) + list(extra)) + '</button>' + self.add(s) + + def toggle(self, l, t, w, h, label, item, size=12): + l, t, w, h = self._b(l, t, w, h, False) + s = '<toggleButton type="componentData" %s>' % box_attrs(l, t, w, h) + self._id() + s += '<label>%s</label>' % esc(label) + font(size, True) + s += colorset('foregroundColor', 'text') + colorset('backgroundColor', 'card2') + s += data([conn('toggleButton.value', item, direction=None)]) + '</toggleButton>' + self.add(s) + + def checkbox(self, l, t, w, h, label, item, size=12): + l, t, w, h = self._b(l, t, w, h, False) + s = '<checkBox type="componentData" %s>' % box_attrs(l, t, w, h) + self._id() + s += '<label>%s</label>' % esc(label) + font(size) + s += '<opaque>false</opaque>' + colorset('foregroundColor', 'text') + colorset('backgroundColor', 'card') + s += data([conn('checkBox.value', item, direction=None)]) + '</checkBox>' + self.add(s) + + def slider(self, l, t, w, h, item, mn, mx, major, minor=None, size=10): + l, t, w, h = self._b(l, t, w, h, False) + s = '<slider type="componentData" %s>' % box_attrs(l, t, w, h) + self._id() + s += '<maximum>%s</maximum><minimum>%s</minimum><value>%s</value>' % (float(mx), float(mn), float(mn)) + s += '<majorTickSpacing>%s</majorTickSpacing><minorTickSpacing>%s</minorTickSpacing>' % ( + float(major), float(minor or major)) + s += '<paintLabels>true</paintLabels><paintTicks>true</paintTicks><trackDrag>false</trackDrag>' + s += font(size) + '<opaque>false</opaque>' + colorset('foregroundColor', 'muted') + s += data([conn('slider.value', item, direction=None)]) + '</slider>' + self.add(s) + + def spinner(self, l, t, w, h, item, mn, mx, step=1, size=14): + l, t, w, h = self._b(l, t, w, h, False) + s = '<spinner type="componentData" %s>' % box_attrs(l, t, w, h) + self._id() + s += '<editable>true</editable><step>%s</step><minimum>%s</minimum><maximum>%s</maximum>' % ( + float(step), float(mn), float(mx)) + s += font(size, True, FONT_NUM) + colorset('foregroundColor', 'text') + colorset('backgroundColor', 'card2') + s += '<zoomEnabled>false</zoomEnabled>' + s += data([conn('spinner.value', item, direction=None)]) + '</spinner>' + self.add(s) + + def combo(self, l, t, w, h, item, options, size=12): + l, t, w, h = self._b(l, t, w, h, False) + """options: 'value;Text;value;Text' (web client format).""" + s = '<comboBox type="componentData" %s>' % box_attrs(l, t, w, h) + self._id() + s += '<label>%s</label>' % esc(options) + font(size) + colorset('foregroundColor', 'text') + s += data([conn('comboBox.value', item, direction=None)]) + '</comboBox>' + self.add(s) + + # ----- indicators + def databar(self, l, t, w, h, item, lo=0, hi=100, fg='blue', bg='track', direction='Up', border=None): + l, t, w, h = self._b(l, t, w, h, h > w) + s = '<dataBar type="componentData" %s>' % box_attrs(l, t, w, h) + self._id() + s += '<fillOn>true</fillOn>' + paint('background', bg) + paint('foreground', fg) + s += paint('borderColor', border or bg) + paint('foregroundBorderColor', fg) + s += '<lowLimit>%s</lowLimit><highLimit>%s</highLimit>' % (float(lo), float(hi)) + s += '<growthDirection type="growthDirection" value="GrowthDirection%s"/>' % direction + s += data([conn('dataBar.value', item)]) + '</dataBar>' + self.add(s) + + def rect_scale(self, l, t, w, h, mn, mx, major, minor, vertical=True, fmt='999', size=10): + l, t, w, h = self._b(l, t, w, h, h > w) + s = '<rectangularScale type="componentData" %s>' % box_attrs(l, t, w, h) + self._id() + s += '<maximum>%s</maximum><minimum>%s</minimum><majorTickSpacing>%s</majorTickSpacing>' % ( + float(mx), float(mn), float(major)) + s += '<minorTickSpacing>%s</minorTickSpacing><format>%s</format><vertical>%s</vertical>' % ( + float(minor), fmt, 'true' if vertical else 'false') + s += colorset('color', 'muted') + font(size) + '</rectangularScale>' + self.add(s) + + def circ_scale(self, cx, cy, rad, mn, mx, major, minor, start=225, extent=-270, fmt='999', size=9): + cy = cy * self.sy + s = '<circularScale type="componentData" %s>' % box_attrs(cx - rad, cy - rad, 2 * rad, 2 * rad) + self._id() + s += '<maximum>%s</maximum><minimum>%s</minimum><majorTickSpacing>%s</majorTickSpacing>' % ( + float(mx), float(mn), float(major)) + s += '<minorTickSpacing>%s</minorTickSpacing><format>%s</format>' % (float(minor), fmt) + s += '<startAngle>%s</startAngle><extentAngle>%s</extentAngle>' % (float(start), float(extent)) + s += colorset('color', 'muted') + font(size) + '</circularScale>' + self.add(s) + + def ring_gauge(self, cx, cy, rad, item, mn, mx, color='teal', sw=12.0, thresholds=None): + """270 degree ring with the gap on the right; the value arc grows from 9 o'clock up and down. + The Operator Interface (desktop) draws arc angles mirrored about the horizontal axis compared + with the web client, so only shapes symmetric about that axis look the same on both: + track 45..315 degrees, value arc centred on 180 degrees (start = 180 - extent / 2).""" + self.arc(cx, cy, rad, 45, 270, 'track', sw) + acts = [conn('arc.extentAngle', item, transform=tr_linear(mn, mx, 0.5, 270)), + conn('arc.startAngle', item, transform=tr_linear(mn, mx, 179.75, 45))] + if thresholds: + acts.append(conn('arc.strokePaint', item, transform=tr_threshold(thresholds))) + self.arc(cx, cy, rad, 179.75, 0.5, color, sw, acts) + + def lamp(self, l, t, d, item, on='green', off='off', inp='Boolean', table=None): + tbl = table or [(False, off), (True, on)] + self.ellipse(l, t, d, d, fill=off, actions=[conn('ellipse.fillPaint', item, + transform=tr_threshold(tbl, inp))]) + + # ----- complex components + def alarm_overview(self, l, t, w, h, overview='CurrentAlarms', asa=None, size=12, banner=False): + l, t, w, h = self._b(l, t, w, h, True) + s = '<alarmOverview type="componentData" %s>' % box_attrs(l, t, w, h) + self._id() + s += '<zoomEnabled>false</zoomEnabled>' + s += '<overviewType type="alarmOverview" value="%s"/>' % overview + # dark rows: background, unacknowledged / acknowledged row colour per priority, text colours + s += '<opaque>true</opaque>' + colorset('backgroundColor', 'panel') + for c, col in (('Alarm', (248, 113, 113)), ('Normal', 'text'), ('Ackn', 'muted'), ('Info', 'muted'), + ('Diag', 'amber'), ('Deactive', 'muted'), ('Recover', 'green')): + s += colorset('eventType%sAckColor' % c, col) + colorset('eventType%sNackColor' % c, col) + for p in range(0, 16): + s += ('<property type="componentProperty"><name>priorityNackColor[%02d]</name><value type="colorSet" %s/></property>' + '<property type="componentProperty"><name>priorityAckColor[%02d]</name><value type="colorSet" %s/></property>' + ) % (p, rgb((64, 24, 30) if p <= 3 else (36, 45, 57)), p, rgb('card')) + s += font(size) + font(size, False, FONT_UI, 'alarmLineFont') + font(size - 1, True, FONT_UI, 'buttonFont') + # explicit columns: order and widths spread over the whole component width (autoFit off) + cols = [('AlarmTime', 200), ('Priority', 70), ('Section', 300), ('Tag', 170), ('ItemDesciption', 320), + ('Text', 300), ('AlarmType', 120), ('Value', 110), ('Acknowledged', 110)] + scale = (w - 24.0) / sum(c[1] for c in cols) + for i, (c, cw) in enumerate(cols): + s += '<column%sVisible>true</column%sVisible><column%sPosition>%d</column%sPosition>' % (c, c, c, i + 1, c) + s += '<column%sWidth>%d</column%sWidth>' % (c, int(cw * scale), c) + hide = ['CEventActor', 'CEventCat', 'CEventCondition', 'CEventSource', 'CEventSubCond', 'EventActor', + 'EventCat', 'EventCondition', 'EventSource', 'EventSubCond', 'Installation', 'ItemName', + 'OriginalTime', 'Quality', 'Unit', 'User', 'Sub', 'EngUnits', 'Location', 'InstallationDescription', + 'UnitDescription', 'SectionDescription', 'AlarmCollection', 'EventID', 'ConditionID', 'BranchID', + 'PriorityText'] # AlarmAttribute is an array property + for c in hide: + s += '<column%sVisible>false</column%sVisible>' % (c, c) + if banner: + s += ('<statusLineVisible>false</statusLineVisible><autoFit>false</autoFit><stopMoreVisible>false' + '</stopMoreVisible><headingVisible>false</headingVisible><dateTimeSelectorVisible>false' + '</dateTimeSelectorVisible><filterSelectorVisible>false</filterSelectorVisible>') + else: + # autoFit in a tab that is hidden while loading squeezes all columns to nothing (web) + s += '<autoFit>false</autoFit>' + s += '<highAlarmPriorityRange>1-1</highAlarmPriorityRange><mediumAlarmPriorityRange>2-2</mediumAlarmPriorityRange>' + s += '<lowAlarmPriorityRange>3-3</lowAlarmPriorityRange><diagnosticAlarmPriorityRange>0-0,4-15</diagnosticAlarmPriorityRange>' + if asa: + s += ('<userDataFilterType type="alarmUserFilter" value="UserDataFilterASA"/>' + '<userDataFilterValue>%s</userDataFilterValue>' + '<dataFilterType type="alarmDataFilter" value="DataFilterUserFiler"/>') % asa + s += '<data type="data"><action type="actionInternalServiced"/></data></alarmOverview>' + self.add(s) + + def report(self, l, t, w, h, report=None): + l, t, w, h = self._b(l, t, w, h, True) + s = '<reporting type="componentData" %s>' % box_attrs(l, t, w, h) + self._id() + if report: + s += '<reportSelected>%s</reportSelected>' % esc(report) + s += '<data type="data"><action type="actionInternalServiced"/></data></reporting>' + self.add(s) + + def micro_trend(self, l, t, w, h, pens, time_range=600, history=True): + l, t, w, h = self._b(l, t, w, h, True) + """pens: list of (item, min, max, colour).""" + s = '<microTrend type="componentData" %s>' % box_attrs(l, t, w, h) + self._id() + s += '<numberOfPens>%d</numberOfPens><realTime>true</realTime><fillWithHistory>%s</fillWithHistory>' % (len(pens), 'true' if history else 'false') + s += '<microTrendBackgroundFillOn>true</microTrendBackgroundFillOn><lowHighFillOn>false</lowHighFillOn>' + s += colorset('microTrendBackgroundFillColor', 'panel') + colorset('microTrendBackgroundColor', 'line') + acts = ['<action type="actionInternalServiced"/>'] + for i, (item, mn, mx, col) in enumerate(pens): + s += ('<property type="componentProperty"><name>itemName[%d]</name><value/></property>' + '<property type="componentProperty"><name>scaleMin[%d]</name><value>%s</value></property>' + '<property type="componentProperty"><name>scaleMax[%d]</name><value>%s</value></property>' + '<property type="componentProperty"><name>color[%d]</name><value type="colorSet" %s/></property>' + '<property type="componentProperty"><name>stroke[%d]</name><value type="stroke" width="2.0"/></property>' + ) % (i, i, float(mn), i, float(mx), i, rgb(col), i) + acts.append(conn('microTrend.itemName[%d]' % i, item, 'ItemName')) + s += data(acts) + '</microTrend>' + self.add(s) + + def trend(self, l, t, w, h, pens, minutes=10, title='', web_spares=True): + l, t, w, h = self._b(l, t, w, h, True) + """pens: list of (item, colour, min, max, description). Padded to 50 visible pens (ISS-041).""" + def pen(item, col, mn, mx, desc, spare=0): + if spare: + col_x = colorset('color', 'panel') + stroke, legend, vis_leg, rng, mn_s, mx_s, typ = '0.0', ' ' * spare, 'false', 1, '1.0E30', '2.0E30', 1 + desc = '' + else: + col_x = colorset('color', col) + stroke, legend, vis_leg, rng, mn_s, mx_s, typ = '2.0', '', 'true', 1, repr(float(mn)), repr(float(mx)), 0 + return ('<pen type="pen"><type>%d</type>%s<stroke type="stroke" width="%s"/><paint>@NULL</paint>' + '<visible>true</visible><visibleLegend>%s</visibleLegend>' + '<source type="sourceID" uri="ci:/item/%s"/><axisVisible>%s</axisVisible><axisPosition>0</axisPosition>' + '<labelVisible>true</labelVisible><majorTickVisible>true</majorTickVisible><minorTickVisible>true</minorTickVisible>' + '<axisColor>@NULL</axisColor><labelColor>@NULL</labelColor><scaleRangeType>%d</scaleRangeType>' + '<minimum>%s</minimum><maximum>%s</maximum><procentual>false</procentual><title/>' + '<description>%s</description><legendText>%s</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"/>' + '<annotationVisible>false</annotationVisible><timeShift>0</timeShift></pen>') % ( + typ, col_x, stroke, vis_leg, esc(item), 'true' if (not spare and pens and item == pens[0][0]) else 'false', + rng, mn_s, mx_s, esc(desc), legend) + body = ''.join(pen(*p) for p in pens) + if web_spares: # the web trend draws only with 50 visible pens (ISS-041); the desktop hairline then lists 50 values + body += ''.join(pen(pens[0][0], None, 0, 0, '', i) for i in range(1, 51 - len(pens))) + s = ('<chart type="componentData">' + self._id() + + '<config type="graphicInfo"><version type="version" value="1.3.0.0"/>' + '<backgroundBorder type="border" value="BorderEmpty"/><penPanelVisible>false</penPanelVisible>' + '<penPanelHeight>-1</penPanelHeight><toolbarVisible>true</toolbarVisible>' + '<toolbarPosition type="borderLayoutPosition" value="PositionNorth"/><shiftOffset>0</shiftOffset>' + '<shiftLength>0</shiftLength><enterpriseGroupLocation type="nodeName" node="$display$"/>' + '<chartPanel><name/><author/><version type="version" value="1.3.0.0"/><description/>' + '<forAllUsers>false</forAllUsers><template>false</template><group>@NULL</group><XyMode>false</XyMode>' + '<x>0</x><y>0</y><width>%d</width><heigth>%d</heigth><iconized>false</iconized>' + '<backgroundBorder type="border" value="BorderEmpty"/>%s' + '<backgroundPaint type="paint"><paint type="colorSet" %s/></backgroundPaint>' + '<plotAreaBorder type="border" value="BorderEmpty"/><plotAreaTransparent>false</plotAreaTransparent>' + '<plotAreaIcon>@NULL</plotAreaIcon><plotAreaPaint type="paint"><paint type="colorSet" %s/></plotAreaPaint>' + '%s<hairlineVisible>false</hairlineVisible><antialiasingText>true</antialiasingText>' + '<antialiasingData>true</antialiasingData><renderMode type="chartRendering" value="Rendering2d"/>' + '<timeNavigatorVisible>true</timeNavigatorVisible><timeRangeControlVisible>true</timeRangeControlVisible>' + '<autoUpdateInterval>false</autoUpdateInterval><legendVisible>true</legendVisible><legendTitle/>' + '<legendHeading/>%s%s%s<legendTransparancy>0.0</legendTransparancy>' + '<legendBorderType type="border" value="BorderEmpty"/><legendPositionType type="position" value="PositionNorthEast"/>' + '<timeSliderVisible>true</timeSliderVisible><timeSliderAbove>false</timeSliderAbove>' + '<valueSliderVisible>false</valueSliderVisible><valueSliderLeft>false</valueSliderLeft>' + '<xAxisReversed>false</xAxisReversed><yAxisReversed>false</yAxisReversed><projectorReversed>false</projectorReversed>' + '<scalingFonts>false</scalingFonts><maximumPens>50</maximumPens><pensPerPack>0</pensPerPack>' + '<triggerPen>0</triggerPen><timeAxisVisible>true</timeAxisVisible><timeAxisMajorTickVisible>true</timeAxisMajorTickVisible>' + '<timeAxisMinorTickVisible>false</timeAxisMinorTickVisible>%s%s%s' + '<timeAxisLabelVisible>true</timeAxisLabelVisible><timeAxisLongLabelVisible>false</timeAxisLongLabelVisible>' + '<timeAxisLabelRotation>0</timeAxisLabelRotation><timeAxisTitle/><timeAxisTitleRotation>0</timeAxisTitleRotation>' + '<timeAxisTitlePlacement>50</timeAxisTitlePlacement><timeAxisMajorGridVisible>true</timeAxisMajorGridVisible>' + '%s<timeAxisMajorGridStroke type="stroke" width="1.0" endCap="butt" lineJoin="bevel"/>' + '<timeAxisMinorGridVisible>false</timeAxisMinorGridVisible>%s' + '<timeAxisMinorGridStroke type="stroke" width="1.0" endCap="butt" lineJoin="bevel"/>' + '<headerText>%s</headerText>%s%s<headerJustification type="jTextJustification" value="TextJustificationLeft"/>' + '<footerText/>%s%s<footerJustification type="jTextJustification" value="TextJustificationLeft"/>' + '<enterprisePrimarySourceLocation type="nodeName" node="$default$"/>' + '<enterpriseSecondarySourceLocation type="nodeName" node="$default$"/>' + '<enterprisePrimaryHistoryLocation type="nodeName" node="$default$"/>' + '<enterpriseSecondaryHistoryLocation type="nodeName" node="$default$"/>' + '<updateFromHistory>true</updateFromHistory><useSampleInterval>true</useSampleInterval>' + '<sampleInterval>0</sampleInterval><optimised>true</optimised>%s' + '<timeRange type="timeRangeLast" count="%d"><type type="timeUnit" value="TimeUnitMinute"/></timeRange>' + '<updateInterval>5</updateInterval><fillHistory>true</fillHistory><updating>true</updating>' + '</chartPanel></config>%s<data type="data"><action type="actionInternalServiced"/></data></chart>') % ( + w, h, colorset('foregroundColor', 'muted'), rgb('panel'), rgb('panel'), colorset('hairlineColor', 'muted'), + colorset('legendColor', 'text'), colorset('legendBackgroundColor', 'panel'), font(11, False, FONT_UI, 'legendFont'), + colorset('timeAxisColor', 'muted'), font(11, False, FONT_UI, 'timeAxisFont'), colorset('timeAxisLabelColor', 'muted'), + colorset('timeAxisMajorGridColor', 'line'), colorset('timeAxisMinorGridColor', 'line'), + esc(title), colorset('headerColor', 'text'), font(12, True, FONT_UI, 'headerFont'), + colorset('footerColor', 'muted'), font(11, False, FONT_UI, 'footerFont'), body, minutes, box_elems(l, t, w, h)) + self.add(s) + + # ----- output + def xml(self): + vg = '' + for i, (n, d, z) in enumerate([('Overview', 'Always shown', 10.0), ('Rough', 'Shown when viewing viewing a large area', 25.0), + ('Standard', 'Shown when using the default view setting', 100.0), + ('Detail', 'Shown only when viewing a small area', 400.0), + ('Intricacies', 'Shown only when viewing a very small area', 1000.0)]): + vg += ('<visibilityGroup type="componentData"><htmlId>%d</htmlId><name>%s</name><description>%s</description>' + '<minimumZoomEnabled>true</minimumZoomEnabled><minimumZoomFactor>%s</minimumZoomFactor>' + '</visibilityGroup>\n') % (i + 2, n, d, z) + head = ('<?xml version="1.0" encoding="utf-8" ?>\n<visualization protocolVersion="1.3.0.0">\n <globalSection/>\n' + ' <coreObjectDefinition type="displayDefinition">\n<version type="version" value="1.3.0.0"/>\n' + '<title>%s\ntrue\n%d\n%d\n' + '%d\n' + '%s\ntrue\n%s\n%s\n%s\n\n' + '' + '\n' + '\n' + '500\ntrue\nfalse\n' + ) % (esc(self.title), self.w, self.h, self.hid, colorset('backgroundColor', self.bg), + colorset('defaultBgColor', self.bg), colorset('defaultFgColor', 'text'), font(12, False, FONT_UI, 'defaultFont')) + layer = '1Layer1\n' + body = '%d\n' % len(self.parts) + # full-size background rectangle first (the web client ignores the display background colour on some frames) + return (head + vg + layer + body + '\n'.join(self.parts) + + '\n \n\n') + + def save(self, folder): + import os + with open(os.path.join(folder, self.name + '.xml'), 'w', encoding='utf-8', newline='\r\n') as f: + f.write(self.xml()) diff --git a/examples/CI-Eng-Sample/displays/remove_displays.cmd b/examples/CI-Eng-Sample/displays/remove_displays.cmd index 785aacc..3505bb9 100644 --- a/examples/CI-Eng-Sample/displays/remove_displays.cmd +++ b/examples/CI-Eng-Sample/displays/remove_displays.cmd @@ -1,11 +1,9 @@ @echo off rem Remove the CI-Eng-Sample displays (operator interface and HTML version). CI Server R1.03.00. -rem Close CIENG_Tank, CIENG_Menu and CIENG_TrendLab in the Edit Module first. +rem Close them 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" +for %%d in (CIENG_Header CIENG_Overview CIENG_Control CIENG_Trends CIENG_Alarms CIENG_System CIENG_AlarmBanner CIENG_TankFaceplate) do ( + if exist "%WAP%\cfg\operatorInterfaces\DEPLOY\displays\%%d.xml" del /q "%WAP%\cfg\operatorInterfaces\DEPLOY\displays\%%d.xml" + if exist "%WAP%\mobileoperator\operatorInterfaces\DEPLOY\displays\%%d.html" del /q "%WAP%\mobileoperator\operatorInterfaces\DEPLOY\displays\%%d.html" +) diff --git a/examples/CI-Eng-Sample/layouts/CIENG_Operator.xml b/examples/CI-Eng-Sample/layouts/CIENG_Operator.xml index 205b5ca..09d6b7a 100644 --- a/examples/CI-Eng-Sample/layouts/CIENG_Operator.xml +++ b/examples/CI-Eng-Sample/layouts/CIENG_Operator.xml @@ -1,11 +1,13 @@ - + CIENG_Operator: menu, navigation toolbar, header frame "hdr" (CIENG_Header), tab set "default" + with frames ovw / ctl / trd / alm / sys, alarm banner frame (CIENG_AlarmBanner), status line. + CIENG_Popup: faceplate window (CIENG_TankFaceplate). No AOG displays are used. + Desktop: frames inside a ignore their zoom attribute; the navigate commands carry + stretchDisplay instead (and CIENG_AlarmBanner opens the Overview tab that way at logon). --> - - + + - + + - - - + + + - + + - - - - - - + + + + + + - - - - - + + + + - - + + + + + + + + - - - - - - + + + + + + + + + + + + + - + - + - + - + + + + + + diff --git a/examples/CI-Eng-Sample/layouts/layout.ps1 b/examples/CI-Eng-Sample/layouts/layout.ps1 index 18d6129..d114a38 100644 --- a/examples/CI-Eng-Sample/layouts/layout.ps1 +++ b/examples/CI-Eng-Sample/layouts/layout.ps1 @@ -31,4 +31,4 @@ if (-not $Remove) { # Check that the result is still well-formed XML before writing it. [xml]$null = $text [IO.File]::WriteAllText($file, $text, (New-Object Text.UTF8Encoding($false))) -if ($Remove) { 'CIENG_Operator layout removed' } else { 'CIENG_Operator layout added' } +if ($Remove) { 'CIENG_Operator / CIENG_Popup layouts removed' } else { 'CIENG_Operator / CIENG_Popup layouts added' } From f565e4bb5a56afc919bb9ea9d8c881f6b6c4f160 Mon Sep 17 00:00:00 2001 From: cliu Date: Tue, 6 Oct 2026 10:26:19 +1100 Subject: [PATCH 3/7] Sample: remove CIENG_Tank, CIENG_Menu and CIENG_TrendLab (replaced by the CIENG_* HMI) - Deleted the three old displays; add_trend_spares.ps1 kept as a documented tool - 19b_audit_item_df.qli: operator writes now come from the Manual / Auto buttons on CIENG_Control - Tested on CI Server R1.03.00 2026-10-06: remove_displays / deploy_displays cycle leaves exactly the 8 new displays; Manual / Auto on CIENG_Control audited as ITEM.VALUE.MODIFY.OPER-INTERFACE (user, old/new value) Co-Authored-By: Claude Opus 5.5 --- examples/CI-Eng-Sample/19b_audit_item_df.qli | 2 +- .../CI-Eng-Sample/displays/CIENG_Menu.xml | 97 - .../CI-Eng-Sample/displays/CIENG_Tank.xml | 2626 ----------------- .../CI-Eng-Sample/displays/CIENG_TrendLab.xml | 2598 ---------------- 4 files changed, 1 insertion(+), 5322 deletions(-) delete mode 100644 examples/CI-Eng-Sample/displays/CIENG_Menu.xml delete mode 100644 examples/CI-Eng-Sample/displays/CIENG_Tank.xml delete mode 100644 examples/CI-Eng-Sample/displays/CIENG_TrendLab.xml diff --git a/examples/CI-Eng-Sample/19b_audit_item_df.qli b/examples/CI-Eng-Sample/19b_audit_item_df.qli index e4a82c3..e4eb290 100644 --- a/examples/CI-Eng-Sample/19b_audit_item_df.qli +++ b/examples/CI-Eng-Sample/19b_audit_item_df.qli @@ -5,7 +5,7 @@ ENGLISH 1.03.00 ! CI-Eng-Sample: switch on "Audit trailing wanted" (AUDIT_INFO) for PUMP1.MODE (loaded with -! dssqld -m). Operator writes from a display (buttons Manual (0) / Auto (1) on CIENG_Tank) are +! dssqld -m). Operator writes from a display (buttons Manual / Auto on CIENG_Control) are ! then stored as ITEM.VALUE.MODIFY.OPER-INTERFACE with old and new value; with AUDIT_INFO 0 they ! are not audited at all. Changes through DSS (dssqld, Engineering Module) are audited anyway. @FIELDS diff --git a/examples/CI-Eng-Sample/displays/CIENG_Menu.xml b/examples/CI-Eng-Sample/displays/CIENG_Menu.xml deleted file mode 100644 index 85dac15..0000000 --- a/examples/CI-Eng-Sample/displays/CIENG_Menu.xml +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - true - 200 - 700 - 2 - - - - - - - - - - - 500 - true - false - - 2 - Overview - Always shown - true - 10.0 - - - 3 - Rough - Shown when viewing viewing a large area - true - 25.0 - - - 4 - Standard - Shown when using the default view setting - true - 100.0 - - - 5 - Detail - Shown only when viewing a small area - true - 400.0 - - - 6 - Intricacies - Shown only when viewing a very small area - true - 1000.0 - - - 1 - Layer1 - - 3 - - - - - \ No newline at end of file diff --git a/examples/CI-Eng-Sample/displays/CIENG_Tank.xml b/examples/CI-Eng-Sample/displays/CIENG_Tank.xml deleted file mode 100644 index fdca304..0000000 --- a/examples/CI-Eng-Sample/displays/CIENG_Tank.xml +++ /dev/null @@ -1,2626 +0,0 @@ - - - - - - - - - - - - - - - - - true - 1984 - 760 - 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 - - 9 - - 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 - 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 - 50 - 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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL?historygroup=CIENG_SCAN10S"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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> - <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 ref="17"/> - </chart> - <button type="componentData" x="404.0" y="68.0" top="20.0" bottom="20.0" left="84.0" right="84.0" rotation="0.0" shear="0.0"> - <htmlId>11</htmlId> - <label>Operator layout</label> - <data type="data"> - <action type="actionActivateDisplay"> - <event type="event" event="On action"/> - <type type="displayActivationType" value="ActivateSpecific"/> - <display>CIENG_Tank</display> - <layout>CIENG_Operator</layout> - <layoutFrame>default</layoutFrame> - </action> - </data> - </button> - <text type="componentData"> - <htmlId>12</htmlId> - <value>Pump 1 mode (0 manual, 1 auto)</value> - <stroke type="stroke" width="1.0"/> - <keepOriginalSize>true</keepOriginalSize> - <x>330.0</x> - <y>120.0</y> - <top>5.3125</top> - <bottom>5.3125</bottom> - <left>90.0</left> - <right>90.0</right> - <rotation>0.0</rotation> - <shear>0.0</shear> - </text> - <numberField type="componentData" x="480.0" y="120.0" top="16.0" bottom="16.0" left="30.0" right="30.0" rotation="0.0" shear="0.0"> - <htmlId>13</htmlId> - <data type="data"> - <action type="actionConnectTo"> - <property type="property" name="numberField.value"/> - <filter type="filter"> - <value>0.0</value> - </filter> - <connection type="connection"> - <itemName>CI-Eng-Sample.PUMP1.MODE</itemName> - <itemAttribute>ItemValue</itemAttribute> - </connection> - </action> - </data> - </numberField> - <button type="componentData" x="590.0" y="120.0" top="16.0" bottom="16.0" left="56.0" right="56.0" rotation="0.0" shear="0.0"> - <htmlId>14</htmlId> - <label>Manual (0)</label> - <data type="data"> - <action type="actionSetItemAttribute"> - <event type="event" event="On action"/> - <filter type="filter"> - <value>0.0</value> - </filter> - <connection type="connection"> - <direction>2</direction> - <location type="nodeName" node="$default$"/> - <itemName>CI-Eng-Sample.PUMP1.MODE</itemName> - <itemAttribute>ItemValue</itemAttribute> - </connection> - </action> - </data> - </button> - <button type="componentData" x="716.0" y="120.0" top="16.0" bottom="16.0" left="56.0" right="56.0" rotation="0.0" shear="0.0"> - <htmlId>15</htmlId> - <label>Auto (1)</label> - <data type="data"> - <action type="actionSetItemAttribute"> - <event type="event" event="On action"/> - <filter type="filter"> - <value>1.0</value> - </filter> - <connection type="connection"> - <direction>2</direction> - <location type="nodeName" node="$default$"/> - <itemName>CI-Eng-Sample.PUMP1.MODE</itemName> - <itemAttribute>ItemValue</itemAttribute> - </connection> - </action> - </data> - </button> - </coreObjectDefinition> -</visualization> \ No newline at end of file diff --git a/examples/CI-Eng-Sample/displays/CIENG_TrendLab.xml b/examples/CI-Eng-Sample/displays/CIENG_TrendLab.xml deleted file mode 100644 index 3037666..0000000 --- a/examples/CI-Eng-Sample/displays/CIENG_TrendLab.xml +++ /dev/null @@ -1,2598 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<visualization protocolVersion="1.3.0.0"> - <globalSection> - <intRef id="17"> - <sharedObject type="data"> - <action type="actionInternalServiced"/> - </sharedObject> - </intRef> - <intRef id="20"> - <sharedObject type="protection" active="false" password=""> - <userProtection type="userProtection" user=""/> - </sharedObject> - </intRef> - </globalSection> - <coreObjectDefinition type="displayDefinition"> - <version type="version" value="1.3.0.0"/> - <html>true</html> - <width>1000</width> - <height>860</height> - <referenceCheck>8</referenceCheck> - <defaultBgColor type="colorSet" r="255" g="255" b="255"/> - <defaultFgColor type="colorSet" r="0" g="0" b="0"/> - <defaultFont type="font" name="Tahoma" size="11" underline="false" strikethrough="false"/> - <defaultStroke type="stroke" width="1.0"/> - <grid type="grid" gridVisible="true" snappingActive="true" verticalSnapInterval="8" horizontalSnapInterval="8" onTop="false"> - <color type="colorSet" r="0" g="0" b="0"/> - </grid> - <revisionHistory type="revisionHistory"> - <revision type="revision" who="ADMIN" when="2026.10.02 09:00:00.000 AEST" what="Created" where="PXiSEDev"/> - </revisionHistory> - <blinkDelay>500</blinkDelay> - <blinkEnabled>true</blinkEnabled> - <mousePassThrough>false</mousePassThrough> - <visibilityGroup type="componentData"> - <htmlId>2</htmlId> - <name>Overview</name> - <description>Always shown</description> - <minimumZoomEnabled>true</minimumZoomEnabled> - <minimumZoomFactor>10.0</minimumZoomFactor> - </visibilityGroup> - <visibilityGroup type="componentData"> - <htmlId>3</htmlId> - <name>Rough</name> - <description>Shown when viewing viewing a large area</description> - <minimumZoomEnabled>true</minimumZoomEnabled> - <minimumZoomFactor>25.0</minimumZoomFactor> - </visibilityGroup> - <visibilityGroup type="componentData"> - <htmlId>4</htmlId> - <name>Standard</name> - <description>Shown when using the default view setting</description> - <minimumZoomEnabled>true</minimumZoomEnabled> - <minimumZoomFactor>100.0</minimumZoomFactor> - </visibilityGroup> - <visibilityGroup type="componentData"> - <htmlId>5</htmlId> - <name>Detail</name> - <description>Shown only when viewing a small area</description> - <minimumZoomEnabled>true</minimumZoomEnabled> - <minimumZoomFactor>400.0</minimumZoomFactor> - </visibilityGroup> - <visibilityGroup type="componentData"> - <htmlId>6</htmlId> - <name>Intricacies</name> - <description>Shown only when viewing a very small area</description> - <minimumZoomEnabled>true</minimumZoomEnabled> - <minimumZoomFactor>1000.0</minimumZoomFactor> - </visibilityGroup> - <visualizationLayer type="componentData"> - <htmlId>1</htmlId> - <name>Layer1</name> - </visualizationLayer> - <componentCountHint>4</componentCountHint> - <text type="componentData"> - <htmlId>7</htmlId> - <value>CI-Eng-Sample trend lab</value> - <stroke type="stroke" width="1.0"/> - <keepOriginalSize>true</keepOriginalSize> - <x>100.0</x> - <y>24.0</y> - <top>5.3125</top> - <bottom>5.3125</bottom> - <left>70.0</left> - <right>70.0</right> - <rotation>0.0</rotation> - <shear>0.0</shear> - </text> - <chart type="componentData"> - <htmlId>8</htmlId> - <config type="graphicInfo"> - <version type="version" value="1.3.0.0"/> - <backgroundBorder type="border" value="BorderEmpty"/> - <penPanelVisible>false</penPanelVisible> - <penPanelHeight>-1</penPanelHeight> - <toolbarVisible>true</toolbarVisible> - <toolbarPosition type="borderLayoutPosition" value="PositionNorth"/> - <shiftOffset>0</shiftOffset> - <shiftLength>0</shiftLength> - <protection ref="20"/> - <enterpriseGroupLocation type="nodeName" node="$display$"/> - <chartPanel> - <name/> - <author/> - <version type="version" value="1.3.0.0"/> - <description/> - <forAllUsers>false</forAllUsers> - <template>false</template> - <group>@NULL</group> - <XyMode>false</XyMode> - <x>0</x> - <y>0</y> - <width>800</width> - <heigth>400</heigth> - <iconized>false</iconized> - <backgroundBorder type="border" value="BorderEmpty"/> - <foregroundColor type="colorSet" r="0" g="0" b="0"/> - <backgroundPaint type="paint"> - <paint type="colorSet" r="240" g="240" b="240"/> - </backgroundPaint> - <plotAreaBorder type="border" value="BorderEmpty"/> - <plotAreaTransparent>true</plotAreaTransparent> - <plotAreaIcon>@NULL</plotAreaIcon> - <plotAreaPaint type="paint"> - <paint type="colorSet" r="255" g="255" b="255"/> - </plotAreaPaint> - <hairlineColor type="colorSet" r="0" g="0" b="0"/> - <hairlineVisible>false</hairlineVisible> - <antialiasingText>false</antialiasingText> - <antialiasingData>true</antialiasingData> - <renderMode type="chartRendering" value="Rendering2d"/> - <timeNavigatorVisible>true</timeNavigatorVisible> - <timeRangeControlVisible>true</timeRangeControlVisible> - <autoUpdateInterval>false</autoUpdateInterval> - <legendVisible>true</legendVisible> - <legendTitle/> - <legendHeading/> - <legendColor type="colorSet" r="0" g="0" b="0"/> - <legendBackgroundColor type="colorSet" r="240" g="240" b="240"/> - <legendFont type="font" name="Tahoma" size="11" underline="false" strikethrough="false"/> - <legendTransparancy>0.2705882352941177</legendTransparancy> - <legendBorderType type="border" value="BorderLine"/> - <legendPositionType type="position" value="PositionNorthEast"/> - <timeSliderVisible>true</timeSliderVisible> - <timeSliderAbove>false</timeSliderAbove> - <valueSliderVisible>true</valueSliderVisible> - <valueSliderLeft>false</valueSliderLeft> - <xAxisReversed>false</xAxisReversed> - <yAxisReversed>false</yAxisReversed> - <projectorReversed>false</projectorReversed> - <scalingFonts>false</scalingFonts> - <maximumPens>50</maximumPens> - <pensPerPack>0</pensPerPack> - <triggerPen>0</triggerPen> - <timeAxisVisible>true</timeAxisVisible> - <timeAxisMajorTickVisible>true</timeAxisMajorTickVisible> - <timeAxisMinorTickVisible>false</timeAxisMinorTickVisible> - <timeAxisColor type="colorSet" r="0" g="0" b="0"/> - <timeAxisFont type="font" name="Tahoma" size="11" underline="false" strikethrough="false"/> - <timeAxisLabelColor type="colorSet" r="0" g="0" b="0"/> - <timeAxisLabelVisible>true</timeAxisLabelVisible> - <timeAxisLongLabelVisible>true</timeAxisLongLabelVisible> - <timeAxisLabelRotation>0</timeAxisLabelRotation> - <timeAxisTitle/> - <timeAxisTitleRotation>0</timeAxisTitleRotation> - <timeAxisTitlePlacement>50</timeAxisTitlePlacement> - <timeAxisMajorGridVisible>true</timeAxisMajorGridVisible> - <timeAxisMajorGridColor type="colorSet" r="192" g="192" b="192"/> - <timeAxisMajorGridStroke type="stroke" width="1.0" endCap="butt" lineJoin="bevel"/> - <timeAxisMinorGridVisible>false</timeAxisMinorGridVisible> - <timeAxisMinorGridColor type="colorSet" r="192" g="192" b="192"/> - <timeAxisMinorGridStroke type="stroke" width="1.0" endCap="butt" lineJoin="bevel"/> - <headerText/> - <headerColor type="colorSet" r="0" g="0" b="0"/> - <headerFont type="font" name="Tahoma" size="11" underline="false" strikethrough="false"/> - <headerJustification type="jTextJustification" value="TextJustificationLeft"/> - <footerText/> - <footerColor type="colorSet" r="0" g="0" b="0"/> - <footerFont type="font" name="Tahoma" size="11" underline="false" strikethrough="false"/> - <footerJustification type="jTextJustification" value="TextJustificationLeft"/> - <enterprisePrimarySourceLocation type="nodeName" node="$default$"/> - <enterpriseSecondarySourceLocation type="nodeName" node="$default$"/> - <enterprisePrimaryHistoryLocation type="nodeName" node="$default$"/> - <enterpriseSecondaryHistoryLocation type="nodeName" node="$default$"/> - <updateFromHistory>true</updateFromHistory> - <useSampleInterval>true</useSampleInterval> - <sampleInterval>0</sampleInterval> - <optimised>true</optimised> - <chartProtection ref="20"/> - <pen type="pen"> - <type>256</type> - <color type="colorSet" r="65" g="105" b="225"/> - <stroke type="stroke" width="1.5"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>true</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>true</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>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="ci:/item/CI-Eng-Sample.TANK1.INFLOW?historygroup=CIENG_EVENT"/> - <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>Tank 1 inflow</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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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>1</type> - <color type="colorSet" r="240" g="240" b="240"/> - <stroke type="stroke" width="0.0"/> - <paint>@NULL</paint> - <visible>true</visible> - <visibleLegend>false</visibleLegend> - <source type="sourceID" uri="ci:/item/CI-Eng-Sample.TANK1.LEVEL"/> - <axisVisible>false</axisVisible> - <axisPosition>0</axisPosition> - <labelVisible>true</labelVisible> - <majorTickVisible>true</majorTickVisible> - <minorTickVisible>true</minorTickVisible> - <axisColor>@NULL</axisColor> - <labelColor>@NULL</labelColor> - <scaleRangeType>1</scaleRangeType> - <minimum>1.0E30</minimum> - <maximum>2.0E30</maximum> - <procentual>false</procentual> - <title/> - <description></description> - <legendText> </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> - <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>10</updateInterval> - <fillHistory>true</fillHistory> - <updating>true</updating> - </chartPanel> - </config> - <x>500.0</x> - <y>350.0</y> - <top>290.0</top> - <bottom>290.0</bottom> - <left>480.0</left> - <right>480.0</right> - <rotation>0.0</rotation> - <shear>0.0</shear> - <data ref="17"/> - </chart> - <text type="componentData"> - <htmlId>20</htmlId> - <value>Micro trend (LEVEL, INFLOW)</value> - <stroke type="stroke" width="1.0"/> - <keepOriginalSize>true</keepOriginalSize> - <x>110.0</x> - <y>670.0</y> - <top>5.3125</top> - <bottom>5.3125</bottom> - <left>90.0</left> - <right>90.0</right> - <rotation>0.0</rotation> - <shear>0.0</shear> - </text> - <microTrend type="componentData" x="220.0" y="760.0" top="70.0" bottom="70.0" left="200.0" right="200.0" rotation="0.0" shear="0.0"> - <htmlId>21</htmlId> - <numberOfPens>2</numberOfPens> - <realTime>true</realTime> - <fillWithHistory>true</fillWithHistory> - <property type="componentProperty"> - <name>itemName[0]</name> - <value/> - </property> - <property type="componentProperty"> - <name>scaleMin[0]</name> - <value>0.0</value> - </property> - <property type="componentProperty"> - <name>scaleMax[0]</name> - <value>100.0</value> - </property> - <property type="componentProperty"> - <name>itemName[1]</name> - <value/> - </property> - <property type="componentProperty"> - <name>scaleMin[1]</name> - <value>0.0</value> - </property> - <property type="componentProperty"> - <name>scaleMax[1]</name> - <value>500.0</value> - </property> - <data type="data"> - <action type="actionInternalServiced"/> - <action type="actionConnectTo"> - <property type="property" name="microTrend.itemName[0]"/> - <filter type="filter"> - <value>0.0</value> - </filter> - <connection type="connection"> - <direction>1</direction> - <itemName>CI-Eng-Sample.TANK1.LEVEL</itemName> - <itemAttribute>ItemName</itemAttribute> - </connection> - </action> - <action type="actionConnectTo"> - <property type="property" name="microTrend.itemName[1]"/> - <filter type="filter"> - <value>0.0</value> - </filter> - <connection type="connection"> - <direction>1</direction> - <itemName>CI-Eng-Sample.TANK1.INFLOW</itemName> - <itemAttribute>ItemName</itemAttribute> - </connection> - </action> - </data> - </microTrend> - </coreObjectDefinition> -</visualization> From f3e024620a8064365ade0a57622c0b8d3d25b612 Mon Sep 17 00:00:00 2001 From: cliu <cliu@noreply.git.yokogawa.tech> Date: Tue, 6 Oct 2026 10:44:52 +1100 Subject: [PATCH 4/7] Sample: demo user CIENG (no password) and group CIENG_OPERATOR - 08_auth_group_df.qli: + CIENG_OPERATOR (factory OPERATOR actions + EXECUTE_GENERAL_COMMANDS for the server-side live-data Start) - 08b_user_df.qli (new): CIENG, PASSWORD "" given explicitly, layout CIENG_Operator, initial display CIENG_Overview; loaded by load.cmd after 08 - 85_remove_auth_group_df.qli: removes CIENG before CIENG_OPERATOR and CIENG_VIEWER - remove.cmd: log out every CIENG session first (a group with an open session of its user cannot be removed: DSSP-E-NODEL in USER_VAL; a retry stopped DSSSDA03 with DUR-F-BAD_SIZE) - Tested on CI Server R1.03.00 2026-10-06: full remove.cmd / load.cmd (load 0 errors); CIENG logon with empty password on web and desktop lands on CIENG_Overview; ADMIN keeps the default layout; Start as CIENG; displays bind to the recreated items in a fresh session Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --- examples/CI-Eng-Sample/08_auth_group_df.qli | 11 ++++++++++- examples/CI-Eng-Sample/08b_user_df.qli | 15 +++++++++++++++ .../CI-Eng-Sample/85_remove_auth_group_df.qli | 7 ++++++- examples/CI-Eng-Sample/load.cmd | 4 +++- examples/CI-Eng-Sample/remove.cmd | 3 +++ 5 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 examples/CI-Eng-Sample/08b_user_df.qli diff --git a/examples/CI-Eng-Sample/08_auth_group_df.qli b/examples/CI-Eng-Sample/08_auth_group_df.qli index eb0c8c0..66e58a1 100644 --- a/examples/CI-Eng-Sample/08_auth_group_df.qli +++ b/examples/CI-Eng-Sample/08_auth_group_df.qli @@ -4,10 +4,19 @@ ENGLISH @VERSION 1.03.00 -! CI-Eng-Sample read-only authorization group (IM 36K10C10-01EN 2.4), CI Server R1.03.00 +! CI-Eng-Sample authorization groups (IM 36K10C10-01EN 2.4), CI Server R1.03.00: +! CIENG_VIEWER read-only; CIENG_OPERATOR for the demo user CIENG (08b_user_df.qli) ! Actions are NAME values from AUTH_ACTION_DF. @FIELDS NAME,DESCRIPTION,ACTION_NAME_1,ACTION_NAME_2,ACTION_NAME_3,ACTION_NAME_4 @AUTH_GROUP_DF "CIENG_VIEWER","CI-Eng-Sample read-only viewer","ITEM_READ","SECTION_READ","ALARM_CURRENT_READ","ALARM_CHRONO_READ" + +! CIENG_OPERATOR: the actions of the factory group OPERATOR (R1.03.00) plus EXECUTE_GENERAL_COMMANDS, +! needed for the server-side command of the live-data button Start (feed\cieng_feed_start.cmd). +@FIELDS +NAME,DESCRIPTION,ACTION_NAME_1,ACTION_NAME_2,ACTION_NAME_3,ACTION_NAME_4,ACTION_NAME_5,ACTION_NAME_6,ACTION_NAME_7,ACTION_NAME_8,ACTION_NAME_9,ACTION_NAME_10,ACTION_NAME_11,ACTION_NAME_12,ACTION_NAME_13,ACTION_NAME_14,ACTION_NAME_15,ACTION_NAME_16,ACTION_NAME_17,ACTION_NAME_18,ACTION_NAME_19,ACTION_NAME_20,ACTION_NAME_21,ACTION_NAME_22,ACTION_NAME_23,ACTION_NAME_24,ACTION_NAME_25,ACTION_NAME_26,ACTION_NAME_27,ACTION_NAME_28,ACTION_NAME_29,ACTION_NAME_30,ACTION_NAME_31,ACTION_NAME_32,ACTION_NAME_33,ACTION_NAME_34,ACTION_NAME_35,ACTION_NAME_36,ACTION_NAME_37,ACTION_NAME_38,ACTION_NAME_39,ACTION_NAME_40,ACTION_NAME_41,ACTION_NAME_42,ACTION_NAME_43,ACTION_NAME_44,ACTION_NAME_45,ACTION_NAME_46,ACTION_NAME_47,ACTION_NAME_48,ACTION_NAME_49,ACTION_NAME_50,ACTION_NAME_51,ACTION_NAME_52,ACTION_NAME_53,ACTION_NAME_54,ACTION_NAME_55,ACTION_NAME_56,ACTION_NAME_57,ACTION_NAME_58,ACTION_NAME_59,ACTION_NAME_60,ACTION_NAME_61,ACTION_NAME_62,ACTION_NAME_63,ACTION_NAME_64,ACTION_NAME_65,ACTION_NAME_66,ACTION_NAME_67,ACTION_NAME_68,ACTION_NAME_69,ACTION_NAME_70,ACTION_NAME_71,ACTION_NAME_72,ACTION_NAME_73,ACTION_NAME_74,ACTION_NAME_75 + +@AUTH_GROUP_DF +"CIENG_OPERATOR","CI-Eng-Sample operator (OPERATOR + server commands)","ALARM_ACK_READ","ALARM_AOI_READ","ALARM_ASA_READ","ALARM_CHRONO_READ","ALARM_CURRENT_ACK","ALARM_CURRENT_READ","ALARM_DISPLAY_READ","ALARM_FO_READ","ALARM_FU_READ","ALARM_GROUP_READ","ALARM_NOT_DEST_READ","ALARM_NOT_USR_READ","AUDIT_EVENT_CLAS_READ","AUDIT_SELGRP_READ","AUDIT_TRAIL_READ","AUTH_ACTION_READ","AUTH_GROUP_READ","CLASS_ATTR_VAL_READ","CLASS_INCLUDED_READ","CLASS_READ","CLASS_SIGNALS_READ","DISPLAY_READ","EXTERNAL_ALARM_READ","FOLDER_READ","HIS_GROUP_FORCE_ROLLOVER","HIS_GROUP_READ","HIS_UNITS_READ","INSTALL_BLOCK_UNBLOCK","INSTALL_READ","ITEM_ACK_ALARM","ITEM_HISTORY_READ","ITEM_HIS_READ","ITEM_MODIFY_APPLICATION_FLAG","ITEM_MODIFY_BLOCKED_VALUE","ITEM_MODIFY_DEADBAND","ITEM_MODIFY_HISTORY","ITEM_MODIFY_LIMIT_HIGH","ITEM_MODIFY_LIMIT_HIGH_HIGH","ITEM_MODIFY_LIMIT_LOW","ITEM_MODIFY_LIMIT_LOW_LOW","ITEM_MODIFY_QUALITY_CODE","ITEM_MODIFY_STATUS","ITEM_MODIFY_STRING_VALUE","ITEM_MODIFY_VALUE","ITEM_READ","ITEM_READ_ALARM_TYPE","NODE_HOST_READ","NODE_LOCAL_READ","OBJECT_READ","OBJECT_SIGNALS_READ","OPC_GROUP_READ","REPORT_CANCEL","REPORT_DELETE_GENERATED_REPORT","REPORT_GENERATE_ADHOC","REPORT_MAINTAIN_LOGBOOK","REPORT_PRINT","REPORT_READ","REPORT_READ_GENERATED_REPORT","SCAN_TYPE_READ","SCHEME_READ","SECTION_BLOCK_UNBLOCK","SECTION_READ","SEQUENCE_READ","STATION_ON_OFF_SCAN","STATION_READ","STATUS_READ","SUB_ITEM_READ","SYMBOL_READ","SYS_LOG_READ","TRIGGER_GROUP_READ","UAC_METHOD_MODIFY","UAC_METHOD_READ","UNIT_BLOCK_UNBLOCK","UNIT_READ","EXECUTE_GENERAL_COMMANDS" diff --git a/examples/CI-Eng-Sample/08b_user_df.qli b/examples/CI-Eng-Sample/08b_user_df.qli new file mode 100644 index 0000000..ff930ff --- /dev/null +++ b/examples/CI-Eng-Sample/08b_user_df.qli @@ -0,0 +1,15 @@ +@LANGUAGE +ENGLISH + +@VERSION +1.03.00 + +! CI-Eng-Sample demo user CIENG (IM 36K10C10-01EN 2.5), CI Server R1.03.00: group CIENG_OPERATOR, +! logs on to layout CIENG_Operator with display CIENG_Overview (Operator Interface and web). +! Empty password: PASSWORD "" must be given explicitly (tested 2026-10-06: without the field the +! user has no password set and every logon fails with DSS-E-UNK_USER). +@FIELDS +NAME,DESCRIPTION,AUTH_GROUP,PROCESS_AREAS,LOGOFF_TIMEOUT,LAYOUT,INITIAL_DISPLAY,PASSWORD + +@USER_DF +"CIENG","CI-Eng-Sample demo user (no password)","CIENG_OPERATOR","1-999",0,"CIENG_Operator","CIENG_Overview","" diff --git a/examples/CI-Eng-Sample/85_remove_auth_group_df.qli b/examples/CI-Eng-Sample/85_remove_auth_group_df.qli index 1ad82be..3e82566 100644 --- a/examples/CI-Eng-Sample/85_remove_auth_group_df.qli +++ b/examples/CI-Eng-Sample/85_remove_auth_group_df.qli @@ -4,9 +4,14 @@ ENGLISH @VERSION 1.03.00 -! Remove the CI-Eng-Sample authorization group (remove its users first) +! Remove the CI-Eng-Sample user and authorization groups (the user first: a group with users +! cannot be removed) @FIELDS NAME +@USER_DF +"CIENG" + @AUTH_GROUP_DF +"CIENG_OPERATOR" "CIENG_VIEWER" diff --git a/examples/CI-Eng-Sample/load.cmd b/examples/CI-Eng-Sample/load.cmd index 11bb469..a2fc680 100644 --- a/examples/CI-Eng-Sample/load.cmd +++ b/examples/CI-Eng-Sample/load.cmd @@ -17,8 +17,10 @@ rem Processing: trigger group, class (compiled on load via COMPILE = 1), object dssqld -i 05_trigger_df.qli -l 05_trigger_df.qlo dssqld -i 06_class_df.qli -l 06_class_df.qlo dssqld -i 07_object_df.qli -l 07_object_df.qlo -rem Authorization: read-only group (no users are created by the sample) +rem Authorization: groups CIENG_VIEWER (read-only) and CIENG_OPERATOR (demo user) dssqld -i 08_auth_group_df.qli -l 08_auth_group_df.qlo +rem Demo user CIENG (no password; logs on to the CIENG_Operator layout) +dssqld -i 08b_user_df.qli -l 08b_user_df.qlo rem Equipment: Modbus loopback line, station, scan type, points, connected items. rem The station needs the Modbus slave mirror (equipment\eqpciengslv_start.cmd, see README). dssqld -i 09_modbus_line_df.qli -l 09_modbus_line_df.qlo diff --git a/examples/CI-Eng-Sample/remove.cmd b/examples/CI-Eng-Sample/remove.cmd index 3fd02aa..39a097b 100644 --- a/examples/CI-Eng-Sample/remove.cmd +++ b/examples/CI-Eng-Sample/remove.cmd @@ -1,6 +1,9 @@ @echo off rem Remove CI-Eng-Sample from a CI Server R1.03 TEST system (also deletes its history). rem Run in an elevated prompt while CI Server is running; call this script by full path. +rem Log out every CIENG session first (Operator Interface and web): an authorization group cannot +rem be removed while a session of its user is open (DSSP-E-NODEL ... in dataset USER_VAL); a retry in that +rem state stopped the DSSSDA03 process (DUR-F-BAD_SIZE) on R1.03.00 and needed a CI Server restart. rem Order: audit report + selection group, reports, printer, OPC UA, Modbus, auth group, object, class, trigger group, storage links, stop + delete storage groups, items, sections (children first). rem A storage group with an active unit cannot be deleted (HIS-E-GROUPHASUNT), so the rem group first gets a stop time one minute ahead; the script waits until it has passed. From 0e5a39361cb90d45d32234ad434f413f5a35456e Mon Sep 17 00:00:00 2001 From: cliu <cliu@noreply.git.yokogawa.tech> Date: Tue, 6 Oct 2026 10:48:09 +1100 Subject: [PATCH 5/7] Sample README: operator HMI, demo user CIENG and live-data feed - Contents / files: DEMO.FEED_ON, CIENG_OPERATOR, user CIENG, CIENG_* displays, generator, feed; old displays and trend_feed.ps1 removed; add_trend_spares.ps1 kept as a tool - Displays and layout rewritten (install steps, logon as CIENG, display table, screen sizes with untested zoom estimates marked, known limits, removal); new Live data section - remove.cmd note on open CIENG sessions; monitoring / audit / planned additions updated - Tested on CI Server R1.03.00 2026-10-06: deploy and logon steps (stages 2-4), layout.ps1 -Remove restores Layouts.xml byte for byte, install_feed.ps1 -Remove / reinstall Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --- examples/CI-Eng-Sample/README.md | 103 ++++++++++++++++++++++--------- 1 file changed, 74 insertions(+), 29 deletions(-) diff --git a/examples/CI-Eng-Sample/README.md b/examples/CI-Eng-Sample/README.md index 3fd68c0..e917c21 100644 --- a/examples/CI-Eng-Sample/README.md +++ b/examples/CI-Eng-Sample/README.md @@ -4,7 +4,8 @@ A small, invented sample project that anyone with this repo can load into a CI S **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. +Built and tested on CI Server R1.03.00 (unlicensed test system), 2026-09-30; operator HMI, demo +user and live-data feed added 2026-10-06. ## Load and remove @@ -21,6 +22,10 @@ cmd /c "<repo>\examples\CI-Eng-Sample\remove.cmd" - **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. +- Before `remove.cmd`, log out every `CIENG` session (Operator Interface and web): a group + cannot be removed while a session of its user is open (`DSSP-E-NODEL` … `USER_VAL`), and a + retry in that state stopped the `DSSSDA03` process (`DUR-F-BAD_SIZE`) until CI Server was + restarted (2026-10-06). - `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. @@ -43,6 +48,7 @@ cmd /c "<repo>\examples\CI-Eng-Sample\remove.cmd" | `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` | +| `CI-Eng-Sample.DEMO.FEED_ON` | Item, Boolean | 1 while the live-data feed runs in display mode (`feed\cieng_feed.ps1 -UntilFlag`); the display button *Stop* writes 0 | | `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` | @@ -72,7 +78,9 @@ cmd /c "<repo>\examples\CI-Eng-Sample\remove.cmd" | `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. | +| `CIENG_VIEWER` | Authorization group | Read-only: `ITEM_READ`, `SECTION_READ`, `ALARM_CURRENT_READ`, `ALARM_CHRONO_READ` | +| `CIENG_OPERATOR` | Authorization group | The actions of the factory group `OPERATOR` plus `EXECUTE_GENERAL_COMMANDS` (server-side command of the live-data button) | +| `CIENG` | User | Demo user, **no password**, group `CIENG_OPERATOR`; logs on to layout `CIENG_Operator` with display `CIENG_Overview` (desktop and web). The only user the sample creates; `ADMIN` is not changed. | | `CIENG_FILE` | Printer device + destination | FILE output to `%TLS_LST_PATH%\cieng_report.txt` (overwritten by each printed report); destination visible to operators | | `CIENG_TANK1` | Report | Values of the `TANK1` items + last-hour statistics of one item (ad-hoc parameter chosen in an item browser, default `LEVEL`); daily 06:00 local time and ad hoc; output `CIENG_FILE`; lifetime 1 week | | `CIENG_INFLOW_HI` | Report | Generated 5 s after `TANK1.INFLOW` rises above 400; output `CIENG_FILE` | @@ -96,7 +104,8 @@ New items start with status 13 (`NOT INIT`) until a value is written. | `03_his_group_df.qli` | Item storage groups (`HIS_GROUP_DF`): event, scan, aggregation | | `04_item_his_df.qli` | Items in the storage group (`ITEM_HIS_DF`, name `<group>:<item>`) | | `05_trigger_df.qli`, `06_class_df.qli`, `07_object_df.qli` | Trigger group; classes (source in the `METHOD` memo, `@"` … `"@`, `COMPILE` 1; Traditional and Java); objects (`ATTR_VALUE_1` = prompt answer) | -| `08_auth_group_df.qli` | Authorization group (`AUTH_GROUP_DF`) | +| `08_auth_group_df.qli` | Authorization groups (`AUTH_GROUP_DF`) | +| `08b_user_df.qli` | Demo user `CIENG` (`USER_DF`); `PASSWORD ""` given explicitly - without the field the user has no password set and every logon fails (`DSS-E-UNK_USER`) | | `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 | @@ -110,14 +119,13 @@ New items start with status 13 (`NOT INIT`) until a value is written. | `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 (audit `79`, reports and printer `83`/`84` first, 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`, `PUMP1.MODE` field with buttons *Manual (0)* / *Auto (1)* (write the item), alarm overview, trend of `TANK1.LEVEL` (padded with 49 spare pens so it also draws in the browser), button *Operator layout* | | `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/CIENG_*.xml` | The operator HMI: 8 displays in HTML mode (desktop and web), see *Displays and layout* | +| `displays/generator/` | `build.py` + `cixml.py` write the `CIENG_*.xml` files (Python 3 + Pillow); `README.md` there describes the tool | +| `layouts/CIENG_Operator.xml`, `layouts/layout.ps1` | Layout block (`CIENG_Operator`, `CIENG_Popup`) and the script that adds/removes it in `Layouts.xml` | +| `displays/add_trend_spares.ps1` | Pads every trend in a display file to 50 visible pens (web workaround, ISS-041); safe to run again. Kept as a tool; the sample trend is not padded | | `displays/deploy_displays.cmd`, `remove_displays.cmd` | Copy the displays into the operator interface and export their HTML versions / delete them | +| `feed/cieng_feed.ps1`, `cieng_feed_start.cmd`, `install_feed.ps1` | Live-data feed (test values for the tank, pump and system items), its start wrapper for the display button, and the installer into `C:\Users\Public\CI-Eng-Sample\feed` | | `monitoring/*.sup.txt` | Setup-file lines for the monitoring processes (not applied by `load.cmd`) | ## Modbus slave mirror (for station CIENG_PLC) @@ -162,35 +170,72 @@ priority 1). To try it on a test system: `itmval -p -n CI-Eng-Sample.TANK1.LEVEL ## Displays and layout (optional) +A dark dashboard-style operator HMI with its own layout (no AOG displays). All displays are in +HTML mode, so the same files run in the Operator Interface (desktop) and in the browser (web). No admin rights needed. After `load.cmd`: -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. -3. Operator Interface (desktop): open `CIENG_Tank` from the display box and click - **Operator layout** - a second window opens with the sample menu (File / View / Displays), - toolbar, `CIENG_Menu` on the left, `CIENG_Tank` in the main frame `default` and the alarm - banner. HTML display (web): `http://localhost:8080/mobileoperator/?d=CIENG_Tank&l=CIENG_Operator` - (CI Server login). +1. `displays\deploy_displays.cmd` copies the 8 displays into the operator interface and creates + their HTML versions. +2. `powershell -ExecutionPolicy Bypass -File layouts\layout.ps1` adds the layouts + `CIENG_Operator` and `CIENG_Popup` to `Layouts.xml` (first run saves + `Layouts-before-CIENG.xml`). **Restart the Operator Interface** afterwards: it reads the + layouts only at start. +3. `powershell -ExecutionPolicy Bypass -File feed\install_feed.ps1` installs the live-data feed + (see *Live data*). +4. Log in as **`CIENG`** (no password): Operator Interface, or the web at + `http://localhost:8080/mobileoperator/`. Other users: `?l=CIENG_Operator` (web) or + `jwuipoi.cmd -layout CIENG_Operator` (desktop). -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 is padded the same way (1 real pen + 49 spares). +| Display | Where | Shows | +|---|---|---| +| `CIENG_Header` | top frame | KPIs (level coloured by its limits, inflow, volume, pump, PLC / OPC UA communication), live data *Start* / *Stop* with lamp, *Tank 1* faceplate button, last update | +| `CIENG_Overview` | tab *Overview* | Tank 1 mimic (inflow pipe, level fill coloured by limits, limit marks, pump, outlet pipes), volume / flow / maximum / counter / run time, three ring gauges, micro trend; click the tank for the faceplate | +| `CIENG_Control` | tab *Process control* | Slider, spinner and input field on `PLC1.SETPOINT` with Modbus readback; toggle and *Set ON / OFF* on `PLC1.CMD` with `FEEDBACK` lamp; pump mode combo box and *Manual* / *Auto* buttons (audited), run check box; level test slider and buttons LL / L / Normal / H / HH | +| `CIENG_Trends` | tab *Trends* | Trend of level and inflow (10 min, 2 pens) and micro trends for level, inflow and CPU | +| `CIENG_Alarms` | tab *Alarms* | Current alarms and alarm history of `CIENG_TANK1` | +| `CIENG_System` | tab *System* | CPU and disk gauges, communication and process lamps with status, OPC UA loopback, report component | +| `CIENG_AlarmBanner` | bottom frame | Tank 1 alarm lamp, *Alarm list* button, 4-row alarm banner | +| `CIENG_TankFaceplate` | layout `CIENG_Popup` | Level, status, limits, maximum, last update, micro trend, *Trends* / *Alarms* / *Close* | -Remove: `layouts\layout.ps1 -Remove` (restores the file exactly) and -`displays\remove_displays.cmd`. Close the displays in the Edit Module first. See skill +Screen sizes: designed for 1920 x 1080. The desktop opens the tabs with `stretchDisplay`, so they +fill any monitor (slightly stretched where the ratio differs); maximise the window, it opens over +the taskbar. The web client does not zoom displays: use full screen (F11) and the browser zoom +(estimates, not tested: about 100 % at 1920 x 1080, 80 % at 1536 x 864, 70 % at 1366 x 768). + +Known limits (R1.03.00): the trend draws no line in the browser (a web trend needs 50 pens, +ISS-041; the 2-pen trend keeps the desktop hairline box readable); the empty part of the alarm +lists stays white; a tab opened by clicking the tab strip itself keeps its zoom until it is opened +once from the toolbar, menu or F1–F6. + +Remove: `layouts\layout.ps1 -Remove` (restores the file exactly), `displays\remove_displays.cmd` +and `feed\install_feed.ps1 -Remove`. Close the displays in the Edit Module first. See skill `graphics`. +## Live data + +The sample items are internal: after a CI Server start they stay `NOT INIT`, so displays, trends +and alarms show nothing until values are written. `feed\cieng_feed.ps1` writes them every 5 s: + +| Option | Effect | +|---|---| +| (none) | Runs `-Seconds` (default 3600): `TANK1.LEVEL` 50 ± 25 % (inside the limits), `TANK1.INFLOW` 250 ± 150 m3/h; `PUMP1.RUNNING` follows the inflow in auto mode | +| `-Alarms` | `TANK1.LEVEL` 50 ± 33 %: crosses L 20 and H 80, so alarms appear (manual acknowledgement) | +| `-System` | Also writes `SYSTEM.CPU_LOAD` / `DISK_C` / `PING_LOCALHOST` / `PROC_ALM` with this PC's values; skipped while the monitoring processes run (they write the same items) | +| `-UntilFlag` | Runs while `DEMO.FEED_ON` = 1 (display buttons *Start* / *Stop*) | + +The header button *Start* runs `C:\Users\Public\CI-Eng-Sample\feed\cieng_feed_start.cmd` on the +server (as the CI Server service account; needs a group with `EXECUTE_GENERAL_COMMANDS`), which +starts the feed with `-UntilFlag -Alarms -System`. Only one copy runs at a time. Log: +`%TLS_LST_PATH%\cieng_feed.log`. Stop the feed before manual tests with `itmval` (it overwrites the +values within 5 s). After a CI Server restart the *Live data* lamp can stay green although no feed +runs: click *Start*. + ## 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`. +testing. While they run, the live-data feed leaves the `SYSTEM` items alone (`-System` is skipped). See the `system-management` skill, task `monitoring-processes.md`. ## Reports @@ -215,7 +260,7 @@ Engineering Module is in the audit trail (skill `audit-trail`): - Generate `CIENG_AUDIT` (ad hoc, like the other reports) to list the last hour of changes on `CI-Eng-Sample.*`: time, dataset, field, action, source, user, old and new value. -- Operator writes: with the displays deployed, click *Manual (0)* / *Auto (1)* on `CIENG_Tank`; +- Operator writes: with the displays deployed, click *Manual* / *Auto* on `CIENG_Control`; each click is stored as `ITEM.VALUE.MODIFY.OPER-INTERFACE` because `PUMP1.MODE` has *Audit trailing wanted* (`19b_audit_item_df.qli`). - Export: `dssqld -e audit.qlo -d AUDIT_TRAIL` (whole trail) or a qli with `@SELECT` (keep `NAME` @@ -231,7 +276,7 @@ selection group. | Phase | Adds | |---|---| -| 10 | A symbol and a faceplate popup (displays and the operator layout exist) | +| 10 | A symbol (the faceplate popup `CIENG_TankFaceplate` exists since 2026-10-06) | ## Rules From 266e9e3710fd2147a0f2318ae7d3f2b3ff6cb251 Mon Sep 17 00:00:00 2001 From: cliu <cliu@noreply.git.yokogawa.tech> Date: Tue, 6 Oct 2026 11:16:58 +1100 Subject: [PATCH 6/7] Sample: CIENG uses the factory OPERATOR group; correct arc and rounding notes - Group CIENG_OPERATOR dropped (08, 85, load.cmd, README): the live-data Start also works for a user in the factory group OPERATOR (tested 2026-10-06 as OPER), so EXECUTE_GENERAL_COMMANDS is not needed; 08b_user_df.qli gives CIENG the group OPERATOR - remove.cmd / README: open CIENG session note reworded - Generator README / cixml.py: arc angles run clockwise from 3 o'clock on desktop and web (fixed and connected; the earlier "mirrored on the desktop" note was wrong); rounding above 1 draws an ellipse on both clients - Tested on CI Server R1.03.00 2026-10-06: CIENG logon (empty password) and Start with group OPERATOR; test display with static and connected arcs on both clients Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --- examples/CI-Eng-Sample/08_auth_group_df.qli | 11 +---------- examples/CI-Eng-Sample/08b_user_df.qli | 4 ++-- examples/CI-Eng-Sample/85_remove_auth_group_df.qli | 4 +--- examples/CI-Eng-Sample/README.md | 13 ++++++------- examples/CI-Eng-Sample/displays/generator/README.md | 9 +++++---- examples/CI-Eng-Sample/displays/generator/cixml.py | 6 +++--- examples/CI-Eng-Sample/load.cmd | 2 +- examples/CI-Eng-Sample/remove.cmd | 5 ++--- 8 files changed, 21 insertions(+), 33 deletions(-) diff --git a/examples/CI-Eng-Sample/08_auth_group_df.qli b/examples/CI-Eng-Sample/08_auth_group_df.qli index 66e58a1..eb0c8c0 100644 --- a/examples/CI-Eng-Sample/08_auth_group_df.qli +++ b/examples/CI-Eng-Sample/08_auth_group_df.qli @@ -4,19 +4,10 @@ ENGLISH @VERSION 1.03.00 -! CI-Eng-Sample authorization groups (IM 36K10C10-01EN 2.4), CI Server R1.03.00: -! CIENG_VIEWER read-only; CIENG_OPERATOR for the demo user CIENG (08b_user_df.qli) +! CI-Eng-Sample read-only authorization group (IM 36K10C10-01EN 2.4), CI Server R1.03.00 ! Actions are NAME values from AUTH_ACTION_DF. @FIELDS NAME,DESCRIPTION,ACTION_NAME_1,ACTION_NAME_2,ACTION_NAME_3,ACTION_NAME_4 @AUTH_GROUP_DF "CIENG_VIEWER","CI-Eng-Sample read-only viewer","ITEM_READ","SECTION_READ","ALARM_CURRENT_READ","ALARM_CHRONO_READ" - -! CIENG_OPERATOR: the actions of the factory group OPERATOR (R1.03.00) plus EXECUTE_GENERAL_COMMANDS, -! needed for the server-side command of the live-data button Start (feed\cieng_feed_start.cmd). -@FIELDS -NAME,DESCRIPTION,ACTION_NAME_1,ACTION_NAME_2,ACTION_NAME_3,ACTION_NAME_4,ACTION_NAME_5,ACTION_NAME_6,ACTION_NAME_7,ACTION_NAME_8,ACTION_NAME_9,ACTION_NAME_10,ACTION_NAME_11,ACTION_NAME_12,ACTION_NAME_13,ACTION_NAME_14,ACTION_NAME_15,ACTION_NAME_16,ACTION_NAME_17,ACTION_NAME_18,ACTION_NAME_19,ACTION_NAME_20,ACTION_NAME_21,ACTION_NAME_22,ACTION_NAME_23,ACTION_NAME_24,ACTION_NAME_25,ACTION_NAME_26,ACTION_NAME_27,ACTION_NAME_28,ACTION_NAME_29,ACTION_NAME_30,ACTION_NAME_31,ACTION_NAME_32,ACTION_NAME_33,ACTION_NAME_34,ACTION_NAME_35,ACTION_NAME_36,ACTION_NAME_37,ACTION_NAME_38,ACTION_NAME_39,ACTION_NAME_40,ACTION_NAME_41,ACTION_NAME_42,ACTION_NAME_43,ACTION_NAME_44,ACTION_NAME_45,ACTION_NAME_46,ACTION_NAME_47,ACTION_NAME_48,ACTION_NAME_49,ACTION_NAME_50,ACTION_NAME_51,ACTION_NAME_52,ACTION_NAME_53,ACTION_NAME_54,ACTION_NAME_55,ACTION_NAME_56,ACTION_NAME_57,ACTION_NAME_58,ACTION_NAME_59,ACTION_NAME_60,ACTION_NAME_61,ACTION_NAME_62,ACTION_NAME_63,ACTION_NAME_64,ACTION_NAME_65,ACTION_NAME_66,ACTION_NAME_67,ACTION_NAME_68,ACTION_NAME_69,ACTION_NAME_70,ACTION_NAME_71,ACTION_NAME_72,ACTION_NAME_73,ACTION_NAME_74,ACTION_NAME_75 - -@AUTH_GROUP_DF -"CIENG_OPERATOR","CI-Eng-Sample operator (OPERATOR + server commands)","ALARM_ACK_READ","ALARM_AOI_READ","ALARM_ASA_READ","ALARM_CHRONO_READ","ALARM_CURRENT_ACK","ALARM_CURRENT_READ","ALARM_DISPLAY_READ","ALARM_FO_READ","ALARM_FU_READ","ALARM_GROUP_READ","ALARM_NOT_DEST_READ","ALARM_NOT_USR_READ","AUDIT_EVENT_CLAS_READ","AUDIT_SELGRP_READ","AUDIT_TRAIL_READ","AUTH_ACTION_READ","AUTH_GROUP_READ","CLASS_ATTR_VAL_READ","CLASS_INCLUDED_READ","CLASS_READ","CLASS_SIGNALS_READ","DISPLAY_READ","EXTERNAL_ALARM_READ","FOLDER_READ","HIS_GROUP_FORCE_ROLLOVER","HIS_GROUP_READ","HIS_UNITS_READ","INSTALL_BLOCK_UNBLOCK","INSTALL_READ","ITEM_ACK_ALARM","ITEM_HISTORY_READ","ITEM_HIS_READ","ITEM_MODIFY_APPLICATION_FLAG","ITEM_MODIFY_BLOCKED_VALUE","ITEM_MODIFY_DEADBAND","ITEM_MODIFY_HISTORY","ITEM_MODIFY_LIMIT_HIGH","ITEM_MODIFY_LIMIT_HIGH_HIGH","ITEM_MODIFY_LIMIT_LOW","ITEM_MODIFY_LIMIT_LOW_LOW","ITEM_MODIFY_QUALITY_CODE","ITEM_MODIFY_STATUS","ITEM_MODIFY_STRING_VALUE","ITEM_MODIFY_VALUE","ITEM_READ","ITEM_READ_ALARM_TYPE","NODE_HOST_READ","NODE_LOCAL_READ","OBJECT_READ","OBJECT_SIGNALS_READ","OPC_GROUP_READ","REPORT_CANCEL","REPORT_DELETE_GENERATED_REPORT","REPORT_GENERATE_ADHOC","REPORT_MAINTAIN_LOGBOOK","REPORT_PRINT","REPORT_READ","REPORT_READ_GENERATED_REPORT","SCAN_TYPE_READ","SCHEME_READ","SECTION_BLOCK_UNBLOCK","SECTION_READ","SEQUENCE_READ","STATION_ON_OFF_SCAN","STATION_READ","STATUS_READ","SUB_ITEM_READ","SYMBOL_READ","SYS_LOG_READ","TRIGGER_GROUP_READ","UAC_METHOD_MODIFY","UAC_METHOD_READ","UNIT_BLOCK_UNBLOCK","UNIT_READ","EXECUTE_GENERAL_COMMANDS" diff --git a/examples/CI-Eng-Sample/08b_user_df.qli b/examples/CI-Eng-Sample/08b_user_df.qli index ff930ff..cd40d12 100644 --- a/examples/CI-Eng-Sample/08b_user_df.qli +++ b/examples/CI-Eng-Sample/08b_user_df.qli @@ -4,7 +4,7 @@ ENGLISH @VERSION 1.03.00 -! CI-Eng-Sample demo user CIENG (IM 36K10C10-01EN 2.5), CI Server R1.03.00: group CIENG_OPERATOR, +! CI-Eng-Sample demo user CIENG (IM 36K10C10-01EN 2.5), CI Server R1.03.00: factory group OPERATOR, ! logs on to layout CIENG_Operator with display CIENG_Overview (Operator Interface and web). ! Empty password: PASSWORD "" must be given explicitly (tested 2026-10-06: without the field the ! user has no password set and every logon fails with DSS-E-UNK_USER). @@ -12,4 +12,4 @@ ENGLISH NAME,DESCRIPTION,AUTH_GROUP,PROCESS_AREAS,LOGOFF_TIMEOUT,LAYOUT,INITIAL_DISPLAY,PASSWORD @USER_DF -"CIENG","CI-Eng-Sample demo user (no password)","CIENG_OPERATOR","1-999",0,"CIENG_Operator","CIENG_Overview","" +"CIENG","CI-Eng-Sample demo user (no password)","OPERATOR","1-999",0,"CIENG_Operator","CIENG_Overview","" diff --git a/examples/CI-Eng-Sample/85_remove_auth_group_df.qli b/examples/CI-Eng-Sample/85_remove_auth_group_df.qli index 3e82566..a3de5fd 100644 --- a/examples/CI-Eng-Sample/85_remove_auth_group_df.qli +++ b/examples/CI-Eng-Sample/85_remove_auth_group_df.qli @@ -4,8 +4,7 @@ ENGLISH @VERSION 1.03.00 -! Remove the CI-Eng-Sample user and authorization groups (the user first: a group with users -! cannot be removed) +! Remove the CI-Eng-Sample user and authorization group (the user first) @FIELDS NAME @@ -13,5 +12,4 @@ NAME "CIENG" @AUTH_GROUP_DF -"CIENG_OPERATOR" "CIENG_VIEWER" diff --git a/examples/CI-Eng-Sample/README.md b/examples/CI-Eng-Sample/README.md index e917c21..57e0bf0 100644 --- a/examples/CI-Eng-Sample/README.md +++ b/examples/CI-Eng-Sample/README.md @@ -22,10 +22,10 @@ cmd /c "<repo>\examples\CI-Eng-Sample\remove.cmd" - **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. -- Before `remove.cmd`, log out every `CIENG` session (Operator Interface and web): a group - cannot be removed while a session of its user is open (`DSSP-E-NODEL` … `USER_VAL`), and a +- Before `remove.cmd`, log out every `CIENG` session (Operator Interface and web): on 2026-10-06 + an open session kept its user's authorization group in use (`DSSP-E-NODEL` … `USER_VAL`), and a retry in that state stopped the `DSSSDA03` process (`DUR-F-BAD_SIZE`) until CI Server was - restarted (2026-10-06). + restarted. - `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. @@ -79,8 +79,7 @@ cmd /c "<repo>\examples\CI-Eng-Sample\remove.cmd" | `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` | -| `CIENG_OPERATOR` | Authorization group | The actions of the factory group `OPERATOR` plus `EXECUTE_GENERAL_COMMANDS` (server-side command of the live-data button) | -| `CIENG` | User | Demo user, **no password**, group `CIENG_OPERATOR`; logs on to layout `CIENG_Operator` with display `CIENG_Overview` (desktop and web). The only user the sample creates; `ADMIN` is not changed. | +| `CIENG` | User | Demo user, **no password**, factory group `OPERATOR`; logs on to layout `CIENG_Operator` with display `CIENG_Overview` (desktop and web). The only user the sample creates; `ADMIN` is not changed. | | `CIENG_FILE` | Printer device + destination | FILE output to `%TLS_LST_PATH%\cieng_report.txt` (overwritten by each printed report); destination visible to operators | | `CIENG_TANK1` | Report | Values of the `TANK1` items + last-hour statistics of one item (ad-hoc parameter chosen in an item browser, default `LEVEL`); daily 06:00 local time and ad hoc; output `CIENG_FILE`; lifetime 1 week | | `CIENG_INFLOW_HI` | Report | Generated 5 s after `TANK1.INFLOW` rises above 400; output `CIENG_FILE` | @@ -104,7 +103,7 @@ New items start with status 13 (`NOT INIT`) until a value is written. | `03_his_group_df.qli` | Item storage groups (`HIS_GROUP_DF`): event, scan, aggregation | | `04_item_his_df.qli` | Items in the storage group (`ITEM_HIS_DF`, name `<group>:<item>`) | | `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 groups (`AUTH_GROUP_DF`) | +| `08_auth_group_df.qli` | Authorization group (`AUTH_GROUP_DF`) | | `08b_user_df.qli` | Demo user `CIENG` (`USER_DF`); `PASSWORD ""` given explicitly - without the field the user has no password set and every logon fails (`DSS-E-UNK_USER`) | | `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`) | @@ -224,7 +223,7 @@ and alarms show nothing until values are written. `feed\cieng_feed.ps1` writes t | `-UntilFlag` | Runs while `DEMO.FEED_ON` = 1 (display buttons *Start* / *Stop*) | The header button *Start* runs `C:\Users\Public\CI-Eng-Sample\feed\cieng_feed_start.cmd` on the -server (as the CI Server service account; needs a group with `EXECUTE_GENERAL_COMMANDS`), which +server (as the CI Server service account `CIX_PROCESS`; the factory group `OPERATOR` is enough), which starts the feed with `-UntilFlag -Alarms -System`. Only one copy runs at a time. Log: `%TLS_LST_PATH%\cieng_feed.log`. Stop the feed before manual tests with `itmval` (it overwrites the values within 5 s). After a CI Server restart the *Live data* lamp can stay green although no feed diff --git a/examples/CI-Eng-Sample/displays/generator/README.md b/examples/CI-Eng-Sample/displays/generator/README.md index 5f6628b..30d5ee9 100644 --- a/examples/CI-Eng-Sample/displays/generator/README.md +++ b/examples/CI-Eng-Sample/displays/generator/README.md @@ -32,12 +32,13 @@ back to an estimate and left/right-aligned texts land slightly off. - Texts and numbers use *keep original size*: the HTML export draws them at their font size centred on the box (otherwise the text is stretched to the box). The box is therefore shrunk to the measured text width for left / right alignment. -- Rectangle rounding is stored as a fraction (0..1) of the half size (values above 1 draw an - ellipse in the web client). +- Rectangle rounding is stored as a fraction (0..1) of the half size; values above 1 draw an + ellipse (desktop and web). - The tab displays are designed 1880 x 680 and stretched to 1880 x 760 (`design_h`): panels, bars, lists and trends grow, texts / controls / round shapes keep their size and only move. -- Ring gauges are symmetric about the horizontal axis (gap on the right, value growing from 9 - o'clock up and down) because the desktop draws arc angles mirrored compared with the web. +- Arc angles (desktop and web alike, fixed or connected): degrees **clockwise** from 3 o'clock + (screen y points down), negative values allowed - not the counter-clockwise maths convention. + The ring gauges have the gap on the right and the value growing from 9 o'clock up and down. - The live-data button runs `C:\Users\Public\CI-Eng-Sample\feed\cieng_feed_start.cmd` on the server (`FEED_START` in `build.py`; installed by `..\..\feed\install_feed.ps1`). - Trend: `trend(..., web_spares=True)` pads a trend to 50 pens so it also draws on the web; the diff --git a/examples/CI-Eng-Sample/displays/generator/cixml.py b/examples/CI-Eng-Sample/displays/generator/cixml.py index 0aeb559..ce24e45 100644 --- a/examples/CI-Eng-Sample/displays/generator/cixml.py +++ b/examples/CI-Eng-Sample/displays/generator/cixml.py @@ -378,9 +378,9 @@ class Display: def ring_gauge(self, cx, cy, rad, item, mn, mx, color='teal', sw=12.0, thresholds=None): """270 degree ring with the gap on the right; the value arc grows from 9 o'clock up and down. - The Operator Interface (desktop) draws arc angles mirrored about the horizontal axis compared - with the web client, so only shapes symmetric about that axis look the same on both: - track 45..315 degrees, value arc centred on 180 degrees (start = 180 - extent / 2).""" + Arc angles run clockwise from 3 o'clock on both clients (tested 2026-10-06, fixed and + connected angles): track 45..315 degrees, value arc centred on 180 degrees + (start = 180 - extent / 2).""" self.arc(cx, cy, rad, 45, 270, 'track', sw) acts = [conn('arc.extentAngle', item, transform=tr_linear(mn, mx, 0.5, 270)), conn('arc.startAngle', item, transform=tr_linear(mn, mx, 179.75, 45))] diff --git a/examples/CI-Eng-Sample/load.cmd b/examples/CI-Eng-Sample/load.cmd index a2fc680..88eef9a 100644 --- a/examples/CI-Eng-Sample/load.cmd +++ b/examples/CI-Eng-Sample/load.cmd @@ -17,7 +17,7 @@ rem Processing: trigger group, class (compiled on load via COMPILE = 1), object dssqld -i 05_trigger_df.qli -l 05_trigger_df.qlo dssqld -i 06_class_df.qli -l 06_class_df.qlo dssqld -i 07_object_df.qli -l 07_object_df.qlo -rem Authorization: groups CIENG_VIEWER (read-only) and CIENG_OPERATOR (demo user) +rem Authorization: read-only group CIENG_VIEWER dssqld -i 08_auth_group_df.qli -l 08_auth_group_df.qlo rem Demo user CIENG (no password; logs on to the CIENG_Operator layout) dssqld -i 08b_user_df.qli -l 08b_user_df.qlo diff --git a/examples/CI-Eng-Sample/remove.cmd b/examples/CI-Eng-Sample/remove.cmd index 39a097b..49b7b48 100644 --- a/examples/CI-Eng-Sample/remove.cmd +++ b/examples/CI-Eng-Sample/remove.cmd @@ -1,9 +1,8 @@ @echo off rem Remove CI-Eng-Sample from a CI Server R1.03 TEST system (also deletes its history). rem Run in an elevated prompt while CI Server is running; call this script by full path. -rem Log out every CIENG session first (Operator Interface and web): an authorization group cannot -rem be removed while a session of its user is open (DSSP-E-NODEL ... in dataset USER_VAL); a retry in that -rem state stopped the DSSSDA03 process (DUR-F-BAD_SIZE) on R1.03.00 and needed a CI Server restart. +rem Log out every CIENG session first (Operator Interface and web): on R1.03.00 an open session kept +rem its user's authorization group in use (DSSP-E-NODEL ... USER_VAL), and a retry stopped DSSSDA03. rem Order: audit report + selection group, reports, printer, OPC UA, Modbus, auth group, object, class, trigger group, storage links, stop + delete storage groups, items, sections (children first). rem A storage group with an active unit cannot be deleted (HIS-E-GROUPHASUNT), so the rem group first gets a stop time one minute ahead; the script waits until it has passed. From ecf1f226f2da38222cb8feede0b0689974bf2cd6 Mon Sep 17 00:00:00 2001 From: cliu <cliu@noreply.git.yokogawa.tech> Date: Tue, 6 Oct 2026 11:25:41 +1100 Subject: [PATCH 7/7] Knowledge: sample operator HMI findings (layouts, display XML, users), ISS-068..075 - layouts.md: tab set must be the last child of its frame set (web); desktop tab frames ignore zoom (navigate ... stretchDisplay); web activates the last tab loaded; web tab labels = display title; one layout command at a time; connectionState breaks the web layout (corrects 6.3); per-user layout verified on desktop and web - create-display.md: new section "Writing display XML directly" (text size, rounding, arc angles clockwise on both clients, Clicked b1, web item attributes, asDateTime, server-side command as CIX_PROCESS with group OPERATOR, alarm overview columns / white area) - deploy-displays.md: 8-display sample scripts; jwuiutl -v re-saves files - trend.md: CIENG_TrendLab as history, cieng_feed.ps1, 50-pen hairline trade-off, component opaque, micro trend "Record not found" without history - users-groups.md: PASSWORD "" for an empty password; sample user CIENG; open session blocks group removal (DSSSDA03 stopped) - configure-audit.md, L25 / R30 / C50 summaries, SKILL.md, issues ISS-068..075, progress rows - Every statement tested on CI Server R1.03.00 2026-10-02..06 (desktop and web, test display and test layouts removed afterwards) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --- .../audit-trail/tasks/configure-audit.md | 3 +- .../authorization/tasks/users-groups.md | 27 ++++++++++++--- .claude/skills/graphics/SKILL.md | 3 +- .../skills/graphics/tasks/create-display.md | 34 +++++++++++++++---- .../skills/graphics/tasks/deploy-displays.md | 21 ++++++++---- .claude/skills/graphics/tasks/layouts.md | 33 ++++++++++++------ .claude/skills/graphics/tasks/trend.md | 27 ++++++++++----- knowledge/issues.md | 10 +++++- knowledge/manuals/IM36K10C50-01EN.md | 11 ++++-- knowledge/manuals/IM36K10L25-01EN.md | 3 +- knowledge/manuals/IM36K10R30-01EN.md | 19 +++++++---- knowledge/progress.md | 3 ++ 12 files changed, 145 insertions(+), 49 deletions(-) diff --git a/.claude/skills/audit-trail/tasks/configure-audit.md b/.claude/skills/audit-trail/tasks/configure-audit.md index 90e62af..8684bfc 100644 --- a/.claude/skills/audit-trail/tasks/configure-audit.md +++ b/.claude/skills/audit-trail/tasks/configure-audit.md @@ -35,7 +35,8 @@ switching anything off. `ITEM_DF` / `SUB_ITEM_DF` / `EXTERNAL_ALARM_DF` field `AUDIT_INFO` (default 0). It switches the `ITEM.*` / `SUB-ITEM.*` events raised by ITEM Service for **operator writes**. Verified on -`CI-Eng-Sample.PUMP1.MODE` with the buttons on display `CIENG_Tank`: +`CI-Eng-Sample.PUMP1.MODE` with the buttons on display `CIENG_Tank` (2026-10-01; re-checked +2026-10-06 with *Manual* / *Auto* on `CIENG_Control`: same events, user and old / new value): - `AUDIT_INFO` 1: a button write 0 → 1 stored `ITEM` `VALUE` `MODIFY` `OPER-INTERFACE`, user `ADMIN`, old 0 / new 1, plus `ITEM` `STATUS` `MODIFY` (13 → 9). - `AUDIT_INFO` 0: the write 1 → 0 left **no** audit record. diff --git a/.claude/skills/authorization/tasks/users-groups.md b/.claude/skills/authorization/tasks/users-groups.md index 8da8f1d..cb1f84c 100644 --- a/.claude/skills/authorization/tasks/users-groups.md +++ b/.claude/skills/authorization/tasks/users-groups.md @@ -41,8 +41,11 @@ NAME,DESCRIPTION,ACTION_NAME_1,ACTION_NAME_2,ACTION_NAME_3,ACTION_NAME_4 Required: `NAME` (≤ 32) and `AUTH_GROUP` (an existing group). Optional: `DESCRIPTION`, `PROCESS_AREAS` (e.g. `"1-999"`), `LOGOFF_TIMEOUT` (minutes, 0–999), `INITIAL_DISPLAY`, -`LOCALE`, `ENTERPRISE`, playback fields. A password is **not** required on import; set it in -the Engineering Module (the user does this, not Claude). Template: +`LOCALE`, `ENTERPRISE`, `LAYOUT`, playback fields. Password: without a `PASSWORD` field the user +is created **without any password set** and every logon fails with *DSS-E-UNK_USER Unknown user +name/password combination*; set the password in the Engineering Module (the user does this, not +Claude). A user with an **empty** password is created by giving `PASSWORD ""` explicitly +(tested 2026-10-06, sample user `CIENG`: logon on desktop and web). Template: ``` @FIELDS @@ -81,6 +84,20 @@ NAME ## Test system (2026-09-30) -Group `CIENG_VIEWER` and user `CIENG_TEST` (no password, logoff 15 min) loaded with 0 errors, -exported back as defined, then removed (1 + 1 removed, 0 errors). The group is part of -CI-Eng-Sample; the sample creates no users. +Group `CIENG_VIEWER` and user `CIENG_TEST` (no `PASSWORD` field, logoff 15 min) loaded with 0 +errors, exported back as defined, then removed (1 + 1 removed, 0 errors). Logon was not tried; +such a user cannot log on (see *User*). The group is part of CI-Eng-Sample. + +## Sample user (2026-10-06) + +`examples/CI-Eng-Sample/08b_user_df.qli`: user `CIENG`, `PASSWORD ""`, factory group `OPERATOR`, +`LAYOUT` `CIENG_Operator`, `INITIAL_DISPLAY` `CIENG_Overview`; logs on to that layout on the desktop +and on the web (no `?l=` needed). Removal (`85_remove_auth_group_df.qli`) removes the user before +the group. + +**Log out all sessions of a user before removing its group**: while a session is open the group +is still referenced in `USER_VAL` and `dssqld -r` fails with *DSSP-E-NODEL … in dataset +USER_VAL*; logging out did not free it at once, and a retry in that state stopped the process +`DSSSDA03` (*DUR-F-BAD_SIZE, Negative size not allowed*; later requests failed with +*DUR-F-UNKNOWN_ATT*) until CI Server was restarted (2026-10-06, ISS-073). After a restart the +group was removed without error. `USER_VAL` exports only its header (no way to list sessions). diff --git a/.claude/skills/graphics/SKILL.md b/.claude/skills/graphics/SKILL.md index e49bb9f..a70a4a6 100644 --- a/.claude/skills/graphics/SKILL.md +++ b/.claude/skills/graphics/SKILL.md @@ -38,10 +38,11 @@ Rules: | 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 | +| Write display XML directly / with the sample generator (text size, rounding, arc angles, item attributes for the web, server-side command, alarm overview columns) | `tasks/create-display.md` (*Writing display XML directly*), `examples/CI-Eng-Sample/displays/generator/` | verified 2026-10-06 | | 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; every parameter and command, desktop vs web (§6) | `tasks/layouts.md` | verified (dual screen, per-user layout from docs) | +| Operator layouts (`Layouts.xml`): windows, menus, toolbars, frames, popups, kiosk screens; open displays in frames and layouts; every parameter and command, desktop vs web (§6) | `tasks/layouts.md` | verified (per-user layout 2026-10-06; dual screen 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 index 7b675fb..0419507 100644 --- a/.claude/skills/graphics/tasks/create-display.md +++ b/.claude/skills/graphics/tasks/create-display.md @@ -1,14 +1,15 @@ --- 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 +source: IM 36K10C50-01EN §1.2, §1.7, §2, §4.8.1; practiced on CI-Eng-Sample (display CIENG_Tank) 2026-10-01; display XML written by the sample generator and checked on desktop and web 2026-10-02 to 2026-10-06 (installed web client code, component definitions in DEPLOY\components) 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`. +The user draws; Claude gives the steps and checks the result. The sample displays +`examples/CI-Eng-Sample/displays/CIENG_*.xml` are not drawn but written by a generator +(`displays/generator/`); *Writing display XML directly* lists the rules they follow. ## Steps for the user @@ -38,8 +39,8 @@ 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). -- Write a fixed value with a button (verified in the HTML display, `CIENG_Tank` *Manual (0)* / - *Auto (1)*): `<button>` › `<data>` › `<action type="actionSetItemAttribute">` with +- Write a fixed value with a button (verified in the HTML display, buttons *Manual* / *Auto* on + the former `CIENG_Tank` and, since 2026-10-06, on `CIENG_Control`): `<button>` › `<data>` › `<action type="actionSetItemAttribute">` with `<event type="event" event="On action"/>`, `<filter type="filter"><value>1.0</value></filter>` and a `<connection>` with `<direction>2</direction>`, `<itemName>`, `<itemAttribute>ItemValue` (the factory popups use `ItemValueOW`, presumably the overwrite variant like `itmval -o`; not tested). The factory popup `AOG_SetNumberPV` uses the @@ -51,6 +52,25 @@ grep -n "<html>\|<width>\|<height>\|itemName\|itemId\|<source" <DisplayName>.xml Sample displays therefore carry no `<itemId>`; for displays made in the Edit Module, reconnect or remove the ids after reloading items (ISS-052). +## Writing display XML directly (verified 2026-10-02 to 2026-10-06) + +The Edit Module stores one element per component (`<text>`, `<number>`, `<rectangle>`, `<arc>`, +`<button>`, `<slider>` …, names as in `DEPLOY\components\*.xml`), its position as centre plus half +sizes, and the connections in `<data>`. Files written by hand or by a script load in the Edit +Module, the Operator Interface and the HTML display, if these rules are kept (sample generator: +`examples/CI-Eng-Sample/displays/generator/`): + +| Topic | Rule (R1.03.00) | +|---|---| +| Text / number size | With `<keepOriginalSize>false` the HTML export **scales the text to its box** (e.g. `scale(0.98, 3.80)` in a 40 px box); with `true` it is drawn at its font size, centred on the box (tested 2026-10-06) | +| Rectangle rounding | `roundingX` / `roundingY` are a **fraction 0..1** of the half width / height; values above 1 draw an ellipse, on the desktop and on the web (tested 2026-10-06) | +| Arc angles | `startAngle` / `extentAngle` in degrees **clockwise** from 3 o'clock (screen y down), negative values allowed; the same on both clients, fixed or connected (tested 2026-10-06: 0/90 = lower-right quarter) | +| Click on a shape | event `Clicked b1` (buttons: `On action`), e.g. an *Open display* action on a rectangle (2026-10-02) | +| Item attributes for the web | `ItemValue`, `ItemDesc`, `ItemStatusMnemonic`, `ItemUpdTime` (epoch seconds), `ItemHHL` / `ItemHL` / `ItemLL` / `ItemLLL` (limits), `ItemName` (micro trend pens), list in the web client code; `ItemDescription` does not exist (sample faceplate and Control tab, 2026-10-06) | +| Showing a time | number field with `<asDateTime>true` connected to `ItemUpdTime`; a `dateTimeField` shows the value on the web only when editable (2026-10-02/06) | +| Server-side command | `<action type="actionExecuteCommand">` with `<command>` and `<onServer>true</onServer>` runs on the CI Server node as the service account `CIX_PROCESS`, also from the web; a user in the factory group `OPERATOR` may use it (tested 2026-10-06, sample live-data *Start*) | +| Alarm overview | `autoFit` true in a tab that is hidden while loading squeezes all columns to ~0 px on the web: set `autoFit` false and give `column<Name>Width`; `column…Visible` for `AlarmAttribute` is an array property (a plain value fails the HTML export with `ClassCastException`); the empty part of the list stays **white** on both clients (no property; web: `jquery.dataTables.css` forces it); web rows are 20 px at a 14 px font (2026-10-02/06) | + ## Verified (CIENG_Tank, 2026-10-01) Text `CI-Eng-Sample Tank 1`, number field on `TANK1.LEVEL` (live: 72 → 61), alarm overview @@ -58,4 +78,6 @@ Text `CI-Eng-Sample Tank 1`, number field on `TANK1.LEVEL` (live: 72 → 61), al `CI-Eng-Sample.TANK1.LEVEL [CIENG_SCAN10S]` = highest-priority storage group). In the HTML 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`). The sample file is now padded with -`add_trend_spares.ps1` (49 spares) and draws in the browser too. +`add_trend_spares.ps1` (49 spares) and draws in the browser too. `CIENG_Tank` was replaced by the +generated `CIENG_*` displays on 2026-10-06; they carry no `<itemId>` and found the recreated items +after a full `remove.cmd` / `load.cmd` cycle in a fresh session (2026-10-06). diff --git a/.claude/skills/graphics/tasks/deploy-displays.md b/.claude/skills/graphics/tasks/deploy-displays.md index 4a98bee..e659933 100644 --- a/.claude/skills/graphics/tasks/deploy-displays.md +++ b/.claude/skills/graphics/tasks/deploy-displays.md @@ -1,7 +1,7 @@ --- 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 +source: IM 36K10C50-01EN §1.5; IM 36K10R30-01EN §1.1, §4; practiced on CI-Eng-Sample 2026-10-01; sample operator HMI (8 displays) and validate test 2026-10-06 status: verified --- @@ -12,17 +12,19 @@ No admin rights needed (`C:\Users\Public\Yokogawa\tls\wap`). `jwuiutl.cmd` is in ## 1. Deploy / remove (sample scripts) -`examples/CI-Eng-Sample/displays/deploy_displays.cmd`: copies `CIENG_Tank.xml` to +`examples/CI-Eng-Sample/displays/deploy_displays.cmd`: copies the 8 sample displays +(`CIENG_Header`, `CIENG_Overview`, … `CIENG_TankFaceplate`) to `%TLS_WAP_PATH%\cfg\operatorInterfaces\DEPLOY\displays\` and runs -`jwuiutl.cmd -e HTML -i -f DEPLOY CIENG_Tank` (HTML into +`jwuiutl.cmd -e HTML -i -f DEPLOY <name>` for each (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. +`remove_displays.cmd` deletes both files of each (close the displays in the Edit Module first). +Deploy after `load.cmd` so the items exist. Verified 2026-10-06: remove → 0 sample files left, +deploy → exactly the 8 XML + 8 HTML files. 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) +## 2. Validate (re-saves the validated files) ``` cmd /c "jwuiutl.cmd -d -v -i -l <scratch>\validate.txt" @@ -33,6 +35,13 @@ display <name>:` with `Problem: <component>: Connected item is not found (<item> `*** 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. +**`-v` also re-saves** (tested 2026-10-06: `jwuiutl -d -v -i -l … CIENG_Test` reported *No problems +found* and rewrote the file, 9 618 → 11 191 bytes: default values dropped, positions moved into +attributes - same content). Run it on copies, or redeploy the source files afterwards. On +2026-10-02 a validation of eight displays once hung on one of them and left `<name>.lck` and +`<name>.xml.tmp` (stop the `java` process, delete both files); not reproduced on 2026-10-06 +(ISS-075). + ## 3. Search ``` diff --git a/.claude/skills/graphics/tasks/layouts.md b/.claude/skills/graphics/tasks/layouts.md index a7a755d..02e9085 100644 --- a/.claude/skills/graphics/tasks/layouts.md +++ b/.claude/skills/graphics/tasks/layouts.md @@ -1,7 +1,7 @@ --- task: Configure operator layouts (Layouts.xml): windows, menus, toolbars, frames, popups; open displays in frames and layouts version: R1.03 -source: Layouts.readme (installed, %TLS_WAP_PATH%\cfg\operatorInterfaces\DEPLOY\layouts); IM 36K10R30-01EN §1, §4.7; IM 36K10C50-01EN §4.12; practiced with CI-Eng-Sample (layout CIENG_Operator) in the Operator Interface (desktop) and the HTML display 2026-10-01; parameter-by-parameter test (§6) on both clients 2026-10-02, web behaviour also read from the installed web client code (mobileoperator fasttools.min.js) +source: Layouts.readme (installed, %TLS_WAP_PATH%\cfg\operatorInterfaces\DEPLOY\layouts); IM 36K10R30-01EN §1, §4.7; IM 36K10C50-01EN §4.12; practiced with CI-Eng-Sample (layout CIENG_Operator) in the Operator Interface (desktop) and the HTML display 2026-10-01; parameter-by-parameter test (§6) on both clients 2026-10-02, web behaviour also read from the installed web client code (mobileoperator fasttools.min.js); sample operator HMI (layouts CIENG_Operator with a tab set and CIENG_Popup, user CIENG) and test layouts on both clients 2026-10-06 status: verified (parameters tested on desktop and web 2026-10-02 except print orientation/margins, playback, multi-screen positions and the maximumTabs limit for new tabs) --- @@ -27,7 +27,8 @@ reference is `Layouts.readme` in the same folder; `Layouts-original.xml` is the toolbar commands) open their targets in a frame called `default`. At login the user profile's *Initial display* replaces the `initialDisplay` of frame `default` (desktop; web: `?d=`). - Layouts used by **both** clients must have the web-compatible shape (§6.1): per frame set at - most one `n*` division, and at most one nested frame set, placed in that `n*` slot. Always + most one `n*` division, and at most one nested frame set, placed in that `n*` slot. A `<tab>` + set must be the **last** child of its frame set (§6.6). Always set `title` and `drawBorder`. - Menu items whose command has an on/off state (`toolbar`, `statusline`, `playback record`) **must** be `type="check"`: otherwise the Operator Interface fails at start @@ -89,11 +90,11 @@ reference is `Layouts.readme` in the same folder; `Layouts-original.xml` is the |---|---| | Button / component (Edit Module, *Actions* sheet → *Open display*) | Display, **Layout** (empty = current window), **Frame**, parameters; stored as `<action type="actionActivateDisplay">` with `<type … value="ActivateSpecific"/>`, `<display>`, `<layout>`, `<layoutFrame>` | | Menu / toolbar | `navigate to <frame> <display>` (current window only) | -| Login | User profile *Layout* and *Initial display* (Engineering Module, Authorization > Users); empty layout = `default` (from docs; not changed on the test system) | +| Login | User profile *Layout* and *Initial display* (Engineering Module, Authorization > Users, or `USER_DF` `LAYOUT` / `INITIAL_DISPLAY`); empty layout = `default`. Verified 2026-10-06 with the sample user `CIENG` (layout `CIENG_Operator`, display `CIENG_Overview`): applied on the desktop **and** at web logon without `?l=` | | HTML display | URL `?d=<display>&l=<layout>` | -| Script on a component | *Execute command* with `ACTION <layout command>`, e.g. `ACTION toggleSize 50,50,710x520` | +| Script on a component | *Execute command* (client side) with `ACTION <layout command>`, e.g. `ACTION toggleSize 50,50,710x520`. Desktop only: the web client ignores it (2026-10-02). **One command at a time**: a second `ACTION` while the first runs fails with *IllegalStateException: A command is already being executed* (desktop, tested 2026-10-06 with two `ACTION reload all` on one button) | -Verified behaviour (desktop): a button with layout `CIENG_Operator` opened a **second window** +Verified behaviour (desktop, 2026-10-01, with the former sample layout `CIENG_Operator`): a button with that layout opened a **second window** (1600 × 900, own menu/toolbar/frames); buttons without layout opened their display in the main frame of the current window; **Back** returned. A button with layout `popup` opened a separate window: always on top, only a close button, sized to the display (`fitFrames`), and minimised @@ -119,8 +120,10 @@ setpoint dialogs). The browser window is the main layout (its size and window options are ignored); other layouts open as windows inside the page; print, look-and-feel and the debug key are not supported; pick -the layout with `&l=`. Verified: `?d=CIENG_Tank&l=CIENG_Operator` showed the sample menu, -toolbar, navigation frame and banner. +the layout with `&l=`, or let the user profile choose it (§3). Verified 2026-10-06: +`?l=CIENG_Operator` (and a plain logon as `CIENG`) showed the sample menu, navigation toolbar, +header, tab set and banner. The web client does not zoom displays (§6.1), so size them for the +browser window. ## 6. Parameter reference: desktop vs web (tested 2026-10-02) @@ -139,7 +142,7 @@ browser and in the web client code. "n/a" = the browser window is the main layou | `n*` fractions (`2*,1*`) | **not honoured** (sizes follow the displays, e.g. 800:88 px) | every `n*` becomes the *main* panel; two `n*` overwrite each other, only the last display shows | | Divisions per frame set | any | first = top/left, last = bottom/right, `n*` = main; more do not fit | | Nested `frame-set` | anywhere, several | **always placed in the parent's main panel**; two nested sets, or one in an edge position, break the page (stays on *Loading…*) | -| Frame `zoom` (`fitDisplay`, `stretchDisplay`, `n%`) | applied | ignored (always 100 %) | +| Frame `zoom` (`fitDisplay`, `stretchDisplay`, `n%`) | applied, **except for frames inside a `<tab>`** (shown at 100 %; use `navigate to <frame> <display> fitDisplay|stretchDisplay`, tested 2026-10-06) | ignored (always 100 %) | | `borderStyle` | drawn | only with `drawBorder="true"`; every value except `none` becomes a 1 px line | | `stackSize` | honoured | honoured; default when missing = 1 | | `zoomingAllowed="false"` | `zoom` commands on that frame do nothing | zoom not supported at all | @@ -172,7 +175,7 @@ browser and in the web client code. "n/a" = the browser window is the main layou | Toolbar `left` / `right` | shown | **not shown** | | Toolbar `bottom` | **not shown** (two layouts tried) | not shown | | Toolbar item `combo`, `editableCombo`, `dropdownList` | shown | shown | -| Status line, all 8 types | shown | shown | +| Status line, all 8 types | shown | 7 shown; **`connectionState` breaks the layout**: at login `createStatusline` fails (*Cannot read properties of undefined (reading 'split')*) and no frame is created (tested 2026-10-06, ISS-068) | ### 6.4 Commands @@ -221,7 +224,10 @@ Factory pattern (works on both clients): a `<tab name="default">` holding frames | Parameter | Desktop | Web | |---|---|---| -| Tab labels | display title (the profile's initial display goes into the first tab) | display name | +| Tab labels | display title (the profile's initial display goes into the first tab) | display **title** (`_` until the display is loaded; verified 2026-10-06 with the sample tabs) | +| Frame `zoom` on a tab frame or on `<tab>` | ignored (100 %); `navigate to <tab frame> <display> stretchDisplay` applies it (sample: toolbar, menu and an *On entry* `ACTION` of the banner) | not supported | +| Active tab after login | the profile's initial display tab | the **last** tab whose display loaded; the sample banner (loaded after the tab set) opens `CIENG_Overview` in its tab with an *On entry* action to bring Overview to the front | +| Position of `<tab>` in its frame set | any | must be the **last** child: the tab click handler uses the last panel created in the frame set; tab set first (banner after it): labels stay `_`, *Unable to switch/load requested display*, tab clicks fail, the banner frame is missing (tested 2026-10-06, ISS-069) | | `tabPosition` `bottom` / `left` | applied | **ignored** (always top) | | `navigate to <tab set name> <display>` | replaces the display in the **active** tab; no new tab | — | | `navigate to <tab frame name> <display>` | shows it in that tab | — | @@ -239,3 +245,10 @@ Interface restart required before the layout was found; desktop and web windows above; F11 (`toggleSize fullScreen`) worked within the taskbar limits; after restarting the Operator Interface the main window still used the factory `default` layout (Admin profile unchanged). + +2026-10-06 (sample operator HMI): `layout.ps1` add / remove / add with `CIENG_Operator` (tab set +in a nested frame set, last child) and `CIENG_Popup`; removal restored `Layouts.xml` byte for +byte. User `CIENG` lands in `CIENG_Operator` on Overview on both clients; ADMIN keeps the +default layout. Test layouts (removed again): tab set first in its frame set (web broken), +`maximumTabs` 8 with 2 tab frames (no extra tab on the web), status line with `connectionState` +(web broken). diff --git a/.claude/skills/graphics/tasks/trend.md b/.claude/skills/graphics/tasks/trend.md index 088675b..939cf76 100644 --- a/.claude/skills/graphics/tasks/trend.md +++ b/.claude/skills/graphics/tasks/trend.md @@ -1,22 +1,25 @@ --- 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 +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, removed 2026-10-06) 2026-10-02; sample trends CIENG_Trends / CIENG_TankFaceplate and a test display on both clients 2026-10-06 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. +The settings below were tested on the sample display `CIENG_TrendLab` (removed from the sample +on 2026-10-06). Method used: change one XML value in the display, deploy, *View > Reload* in the +client, compare. Current sample: `CIENG_Trends` (trend with 2 pens and micro trends) and the +micro trends on `CIENG_Overview` and `CIENG_TankFaceplate`. ## 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). + `feed/cieng_feed.ps1` (writes sine waves with `itmval` every 5 s; `-Seconds` = run time, + default 3600; it replaced `displays/trend_feed.ps1` on 2026-10-06), or the sample displays' + live-data button *Start*. - **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 @@ -120,7 +123,13 @@ rotation, zoom. Outputs (⇨): *Hairline value[n]*, *Time range begin/end*, *Upd 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: one hidden real pen (49 visible) and nothing draws again (checked). - Cost: 50 history requests per trend. + Cost: 50 history requests per trend. **Desktop side effect**: the hairline box lists every + visible pen, so it shows 50 values (the user found this unusable); `hairlineVisible` false does + not help, as the hairline can still be switched on from the trend toolbar. The sample trend + `CIENG_Trends` therefore keeps its 2 pens and draws no line on the web (2026-10-06). +- Component level (outside `<chartPanel>`): `<opaque>true` with `<backgroundColor>` turned the + frame around the plot **light** on the desktop instead of dark (2026-10-06, reverted); + `backgroundPaint` in the chart panel has no effect (ISS-056). - **Web check of the settings** (2026-10-02, padded scratch copy of `CIENG_TrendLab`, checked in the browser; supported-property lists: IM 36K10C50 Table 2.27-28, IM 36K10R30 §4.8.7): @@ -134,6 +143,8 @@ rotation, zoom. Outputs (⇨): *Hairline value[n]*, *Time range begin/end*, *Upd time, then stayed blank on several later opens (ISS-055). Cause: *Number of pens* resets all pen sources, so fixed item names can be lost during load. **Connect** `microTrend.itemName[n]` to the item with attribute `ItemName` instead (`<action type="actionConnectTo">`, `<direction>1`, - `<itemAttribute>ItemName`; sample `CIENG_TrendLab`): both pens then drew on every open; the + `<itemAttribute>ItemName`; samples `CIENG_Overview`, `CIENG_Trends`): both pens then drew on every open; the history fill still failed at times on the web and on the desktop (only the live part drew; - ISS-055 open). + ISS-055 open). `fillWithHistory` true on an item that is in **no** storage group (e.g. + `SYSTEM.CPU_LOAD`) gives the message *Record not found* when the display opens, on the desktop + and on the web (tested 2026-10-06): set it false for such items. diff --git a/knowledge/issues.md b/knowledge/issues.md index c8ba004..56689a7 100644 --- a/knowledge/issues.md +++ b/knowledge/issues.md @@ -74,7 +74,7 @@ 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. **Cause 1 found 2026-10-02**: `setNumberOfPens()` calls `updatePenSource()`, which replaces every pen source with an empty one, so fixed `itemName[n]` values are lost when *Number of pens* is applied after them during load (order varies). Fix in the sample: connect `microTrend.itemName[n]` to the item with attribute `ItemName` (as the factory/test displays do); both pens then drew on 3 of 3 opens. **Remaining**: on 1 of 3 opens only the live part drew (no history fill); every property set calls `startTrend()` again, so history requests are repeated and can cancel each other (web-client code, not fixable in the display). The Operator Interface (desktop) showed the same: both pens live, no history fill on the next open, so the fill problem is not web-only. After a CI Server restart (14:30): web first open of a copy of the display drew both pens with history; the next opens (another copy, and the same display again) showed only the live part; the desktop drew history on one display and only the live part on the custom-range copy. No pattern found yet. Earlier note: 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-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. **Cause 1 found 2026-10-02**: `setNumberOfPens()` calls `updatePenSource()`, which replaces every pen source with an empty one, so fixed `itemName[n]` values are lost when *Number of pens* is applied after them during load (order varies). Fix in the sample: connect `microTrend.itemName[n]` to the item with attribute `ItemName` (as the factory/test displays do); both pens then drew on 3 of 3 opens. **Remaining**: on 1 of 3 opens only the live part drew (no history fill); every property set calls `startTrend()` again, so history requests are repeated and can cancel each other (web-client code, not fixable in the display). The Operator Interface (desktop) showed the same: both pens live, no history fill on the next open, so the fill problem is not web-only. After a CI Server restart (14:30): web first open of a copy of the display drew both pens with history; the next opens (another copy, and the same display again) showed only the live part; the desktop drew history on one display and only the live part on the custom-range copy. No pattern found yet. Earlier note: 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` (removed 2026-10-06; micro trends now on `CIENG_Overview`, `CIENG_Trends`, `CIENG_TankFaceplate`) | | 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` | | ISS-057 | 2026-10-02 | DATA EXPOSURE (filter, manual vs installed) | IM 36K10G10 §10.1 gives the filter example `"NAME" like "ABC*"` (quoted field name). On R1.05 a `DATA_EXPOSURE_DF` record with `RECORDS` = `"NAME" LIKE "<Section>*"` made `DBCSND` log `DSS-E-FLT_SYN_ERR` (+ `DSSF-E-CMP_NO_SUCC`, `DBC-E-DSS_SUB`, `DBC-E-SUB_DAT`, `DBC-E-DAT_HND`) and exit (`DUR-W-REM_PROC`), stopping **all** exposures. Tested on the user's R1.05 system (AID.WRPS items, exposure `WRPS-ITEM-VAL`). | closed | Closed 2026-10-02 (confirmed by user; user decision: installed software is the reference): the unquoted form `NAME LIKE "<Section>*"` compiles and data flows. Tested in R1.05 only. | `.claude/skills/data-access/tasks/rdbms-exposure.md` (done); `knowledge/manuals/IM36K10G10-01EN.md` (done); `knowledge/manuals/IM36K10L45-01EN.md` §8 (done) | | ISS-058 | 2026-10-02 | DATA EXPOSURE (ITEM_HISTORY, manual vs installed) | IM 36K10G10 ch. 10 lists `ITEM_HISTORY` as an exposure source (filter required). The installed `dbc.sup` (R1.03 and R1.05, identical) has the change-log line `PCL Aug-19 e12150 Refactor to support MS-SQL/ODBC, remove ITM history support`. An `ITEM_HISTORY` record (all fields, quoted filter, ISS-057) on the user's R1.05 system never created its table; it was disabled and then deleted, so whether ITEM_HISTORY works with a correct filter is **not tested**. | open | Treat ITEM_HISTORY exposure as unsupported and use `ITEM_VALUES` with `AGG_INTERVAL`. To close: on an R1.05 system, create an `ITEM_HISTORY` record with an unquoted filter and check whether `DBCSND` stays up and the table is created. | `.claude/skills/data-access/tasks/rdbms-exposure.md`; `knowledge/manuals/IM36K10G10-01EN.md`; `knowledge/manuals/IM36K10L45-01EN.md` §8 | @@ -87,3 +87,11 @@ development system (see "Test system" in `progress.md`); they do not exist on ot | ISS-065 | 2026-10-02 | GRAPHICS (layouts, web) | The web client (HTML display) supports only part of `Layouts.xml`: nested frame sets only in the parent's main (`n*`) slot (other placements hang on *Loading…*), frame `zoom` and navigate zoom ignored, `zoom`/`print`/`login`/`toolbar`/`statusline`/`lookfeel`/`playback` not supported, menu `sub`/`check`/`radio` items and left/right/bottom toolbars not shown, a layout without `title` shows *undefined*. Not described in the readme or IM 36K10R30. | open | Documented in the task (§6, tested and read from the web client code). Close when the user confirms. | `.claude/skills/graphics/tasks/layouts.md` §6 (done) | | ISS-066 | 2026-10-02 | GRAPHICS (layouts) | Readme options that do not work as described in R1.03: a toolbar with `position="bottom"` is not shown (desktop and web; left/right work on the desktop); `initialPosition="centreFrame"` opens the window at 0,0 on the desktop; translations are used only for the exact locale (no fallback from `en_AU` to `en`). | open | Documented in the task. Close when the user confirms. | `.claude/skills/graphics/tasks/layouts.md` §6 (done) | | ISS-067 | 2026-10-02 | GRAPHICS (layouts, tabs) | Readme: `<tab>` provides defaults (`closeTabAllowed`, `stackSize`, …) for its frames, and `maximumTabs`, `minimumTabLabelWidth`, `tabButtonGap`, `tabPosition` control the tabs. Observed: defaults on `<tab>` are not inherited (close buttons only with `closeTabAllowed` on each frame); `maximumTabs` does not limit the initial tabs; label width and gap show no effect on the desktop; the web client ignores `tabPosition` (always top) and hangs when the tab set sits next to the nav frame at the top level (factory shape with a nested frame set works). | open | Documented in the task; use the factory pattern. Close when the user confirms. | `.claude/skills/graphics/tasks/layouts.md` §6.6 (done) | +| ISS-068 | 2026-10-06 | GRAPHICS (layouts, web) | `layouts.md` §6.3 (2026-10-02) lists all 8 status line types as shown on the web. A layout whose status line contains `connectionState` (a type listed in `Layouts.readme`) does not start in the HTML display: at login `createStatusline` fails with *Cannot read properties of undefined (reading 'split')* and no frame is created (menu and toolbar only). Seen with the demo layout and reproduced with test layout `LT_ConnState` 2026-10-06. The desktop was not re-tested. | open | Documented in `layouts.md` §6.3 (web: 7 types shown). Close when the user confirms. | `.claude/skills/graphics/tasks/layouts.md` §6.3 (done) | +| ISS-069 | 2026-10-06 | GRAPHICS (layouts, tabs, web) | In the HTML display a `<tab>` set works only as the **last** child of its frame set: the tab click handler (`LayoutWindow.js`) uses the last panel created in the frame set. With the tab set first (banner frame after it, test layout `LT_TabFirst` 2026-10-06) the tab labels stay `_`, the console shows *Unable to switch/load requested display* and *Cannot set properties of undefined (setting 'active')*, tab clicks fail and the banner frame is missing. Not in `Layouts.readme` or IM 36K10R30. | open | Rule added (`layouts.md` §1, §6.6); sample `CIENG_Operator` uses the factory shape. Close when the user confirms. | `.claude/skills/graphics/tasks/layouts.md` §1, §6.6 (done) | +| ISS-070 | 2026-10-06 | GRAPHICS (layouts, tabs, desktop) | The Operator Interface ignores `zoom` (`fitDisplay`, `stretchDisplay`) on frames inside a `<tab>` and on the `<tab>` element: the displays are shown at 100 % (cropped on a small, unused space on a large monitor; F5 *Reload all* did not change it). The layout command `navigate to <tab frame> <display> fitDisplay|stretchDisplay` does apply the zoom (sample: toolbar, menu and an *On entry* `ACTION` of `CIENG_AlarmBanner`, 2026-10-03/06). A tab opened by clicking the tab strip keeps the zoom it had. | open | Documented in `layouts.md` §6.1 / §6.6. Close when the user confirms. | `.claude/skills/graphics/tasks/layouts.md` §6.1, §6.6 (done) | +| ISS-071 | 2026-10-06 | GRAPHICS (layout commands, desktop) | Only one layout command can run at a time: five *Execute command* `ACTION navigate …` actions in one *On entry* gave *IllegalStateException: A command is already being executed* (2026-10-03); reproduced 2026-10-06 with two `ACTION reload all` on one button (test display `CIENG_Test`). Layout commands cannot be chained (`Layouts.readme` has no separator). | open | Documented in `layouts.md` §3. Close when the user confirms. | `.claude/skills/graphics/tasks/layouts.md` §3 (done) | +| ISS-072 | 2026-10-06 | AUTH (users, quick load) | A user loaded with `dssqld` without a `PASSWORD` field (as `users-groups.md` advised: "a password is not required on import") has **no** password set: every logon fails with *DSS-E-UNK_USER Unknown user name/password combination*, also with an empty password; clearing the password in the Engineering Module made it work. With `PASSWORD ""` given explicitly the user logs on with an empty password on the desktop and the web (sample user `CIENG`, 2026-10-06). | closed | Answered by test 2026-10-06; `users-groups.md` corrected, sample `08b_user_df.qli` uses `PASSWORD ""`. Close when the user confirms. | `.claude/skills/authorization/tasks/users-groups.md` (done); `examples/CI-Eng-Sample/08b_user_df.qli` (done) | +| ISS-073 | 2026-10-06 | DSS (remove group / DSSSDA) | Removing an authorization group while a session of one of its users is open fails with *DSSP-E-NODEL … in dataset USER_VAL*; after logging out the session was still referenced, and a retry stopped the process `DSSSDA03` (*DUR-F-BAD_SIZE, Negative size not allowed*; `DUR-W-REM_PROC … exited unexpectedly`); following DSS requests failed with *DUR-F-UNKNOWN_ATT … DSSSDA03* until CI Server was restarted (2026-10-06). After the restart the group was removed without error. `USER_VAL` exports only its header, so open sessions cannot be listed. | open | Workaround: log out the user's sessions and restart CI Server before removing the group; noted in the sample `remove.cmd` / README and `users-groups.md`. Not repeated on purpose (it stops a CI Server process). Report to Yokogawa. | `.claude/skills/authorization/tasks/users-groups.md` (done); `examples/CI-Eng-Sample/remove.cmd`, `README.md` (done) | +| ISS-074 | 2026-10-06 | GRAPHICS (HTML display login) | IM 36K10R30 §4 lists the user profile fields used by the HTML display login as "… initial display, locale (layout not)". On R1.03.00 the profile's *Layout* is used too: a logon as `CIENG` (layout `CIENG_Operator`) at `/mobileoperator/` without `?l=` opened `CIENG_Operator` (2026-10-02 with ADMIN, 2026-10-06 with `CIENG`). | open | Installed software is the reference; R30 summary and `layouts.md` §3 updated. Close when the user confirms. | `knowledge/manuals/IM36K10R30-01EN.md` (done); `.claude/skills/graphics/tasks/layouts.md` §3, §5 (done) | +| ISS-075 | 2026-10-06 | GRAPHICS (`jwuiutl -v`) | `deploy-displays.md` called `jwuiutl -v` "report only", but `jwuiutl -d -v -i -l <log> <display>` re-saves the validated display (normalised XML: defaults dropped, positions as attributes; 9 618 → 11 191 bytes for `CIENG_Test`, 2026-10-06). On 2026-10-02 a validation of eight displays hung on one and left `<name>.lck` and `<name>.xml.tmp`; not reproduced on 2026-10-06. | open | Documented in `deploy-displays.md` §2 and the C50 summary. Close when the user confirms. | `.claude/skills/graphics/tasks/deploy-displays.md` §2 (done); `knowledge/manuals/IM36K10C50-01EN.md` (done) | diff --git a/knowledge/manuals/IM36K10C50-01EN.md b/knowledge/manuals/IM36K10C50-01EN.md index d83ae50..1940b60 100644 --- a/knowledge/manuals/IM36K10C50-01EN.md +++ b/knowledge/manuals/IM36K10C50-01EN.md @@ -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; 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 +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); generated sample displays (CIENG_*, most components: shapes, arc, text, number/text/date-time fields, buttons, toggle, check box, slider, spinner, combo box, data bar, scales, alarm overview, report, micro trend, trend) checked on desktop and web 2026-10-06; symbols, other actions and the tutorial from docs --- # Edit Module (R1.03) @@ -46,7 +46,9 @@ display. Displays are XML files (`IM36K10R30-01EN.md` §1). Section numbers refe **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`. +wrote `mobileoperator\operatorInterfaces\DEPLOY\displays\CIENG_Tank.html`. 2026-10-06: `-v` with +a display name also **re-saved** that display (normalised XML, same content; skill `graphics`, +`tasks/deploy-displays.md` §2). ## 3. Components (§2) @@ -87,7 +89,7 @@ Symbols* and *Validate all Displays* (with all tabs closed); a symbol can be lin 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) +## 6. What the display file stores (verified with CIENG_Tank, removed from the sample 2026-10-06) - `<coreObjectDefinition type="displayDefinition">` with `<html>true</html>`, `<width>`, `<height>`, grid, revision history, visibility groups, layers. @@ -99,6 +101,9 @@ CI Portal, display's server, enterprise, node). 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. +- Rules for writing display XML directly (text size, rounding, arc angles, item attributes for + the web, server-side commands, alarm overview columns): skill `graphics`, + `tasks/create-display.md`, verified 2026-10-06 with the generated `CIENG_*` displays. ## 7. Tutorial (§6) diff --git a/knowledge/manuals/IM36K10L25-01EN.md b/knowledge/manuals/IM36K10L25-01EN.md index 0d89a5b..e92810a 100644 --- a/knowledge/manuals/IM36K10L25-01EN.md +++ b/knowledge/manuals/IM36K10L25-01EN.md @@ -83,7 +83,8 @@ as *dataset* events — `SUBJECT_GROUP` = dataset name (`ITEM_DF`, `ITEM_VAL`, ` `AUDIT_INFO` (*Audit trailing wanted*, default 0; also on `SUB_ITEM_DF`, `EXTERNAL_ALARM_DF`) made no difference for these tools; it switches the `ITEM.*` events of **operator writes**: a button on display `CIENG_Tank` stored `ITEM.VALUE.MODIFY.OPER-INTERFACE` (old/new, user) with -`AUDIT_INFO` 1 and nothing with 0 (verified, ISS-049). A changed `STORAGE` flag takes effect only after the notifying process +`AUDIT_INFO` 1 and nothing with 0 (verified, ISS-049; the same events from *Manual* / *Auto* on +`CIENG_Control`, 2026-10-06). A changed `STORAGE` flag takes effect only after the notifying process re-reads it (`ECL_REFRESH`, up to 30 minutes, both directions; verified, ISS-050). ## 4. Setup files (§4.2) diff --git a/knowledge/manuals/IM36K10R30-01EN.md b/knowledge/manuals/IM36K10R30-01EN.md index 883cbe7..927c1dc 100644 --- a/knowledge/manuals/IM36K10R30-01EN.md +++ b/knowledge/manuals/IM36K10R30-01EN.md @@ -3,7 +3,7 @@ manual: IM 36K10R30-01EN title: Graphic Display Setup edition: 3rd Edition, Sep. 2023 version: R1.03 -status: HTML display (Mobile Operator) and a project layout (CIENG_Operator) verified in the Operator Interface (desktop) and the HTML display 2026-10-01; dataset forms, form language and dual screen from docs +status: HTML display (Mobile Operator) and a project layout (CIENG_Operator) verified in the Operator Interface (desktop) and the HTML display 2026-10-01; sample operator HMI with tab set, popup layout and per-user layout verified on both clients 2026-10-06; dataset forms, form language and dual screen from docs --- # Graphic Display Setup (R1.03) @@ -38,13 +38,16 @@ empty = `deploy`). - 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`. + *Layout* field (Engineering Module, Authorization > Users); empty = `default`. Verified + 2026-10-06 with the sample user `CIENG` on the desktop and in the HTML display. - 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. -- **Verified (2026-10-01)**: sample layout `CIENG_Operator` (skill `graphics`, task `layouts.md`): +- **Verified (2026-10-01, former sample layout)**: sample layout `CIENG_Operator` (skill `graphics`, task `layouts.md`): second window from an *Open display* action, own menu/toolbar/frames, `$default` title, popup layout, F11; the Operator Interface reads `Layouts.xml` only at start. The installed - `Layouts.readme` is the full reference for options and commands. + `Layouts.readme` is the full reference for options and commands. Since 2026-10-06 + `CIENG_Operator` is the sample operator HMI (header frame, tab set, banner) with the popup + layout `CIENG_Popup`; web and desktop findings for tab sets in `layouts.md` §6.6. - **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 @@ -72,8 +75,10 @@ property files and language codes (§3.5). *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 operator + not, per this manual). **Installed software**: the profile's *Layout* is used as well - a + logon as `CIENG` without `?l=` opened `CIENG_Operator` (2026-10-06, ISS-074). Login control: + `dssana.sup` interface *mobile operator*. +- **Verified (2026-10-01)**: `http://localhost:8080/mobileoperator/?d=CIENG_Tank` showed the operator frame (menu, navigation buttons, alarm banner, status line) and the display; the number field updated live; the alarm overview listed the sample's alarms. **Reloading the browser page ends the session** (login again); use the display's own menu *View > Reload* instead (keeps the @@ -84,7 +89,7 @@ property files and language codes (§3.5). 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 +- **Test system**: the HTML trend of `CIENG_Tank` (removed from the sample 2026-10-06) 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 diff --git a/knowledge/progress.md b/knowledge/progress.md index 8fd9c2f..c82ea79 100644 --- a/knowledge/progress.md +++ b/knowledge/progress.md @@ -139,6 +139,9 @@ now come before classes and objects (phase 6), and the other interfaces follow a | 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). | | C50/R30 | Web check of each trend setting (4 batches on a padded scratch copy, checked in the browser by Claude) ([task](../.claude/skills/graphics/tasks/trend.md) §6) | passed | passed | 2026-10-02. Works / ignored / different table in the task; matches IM 36K10C50 Table 2.27-28 except `timeShift` (error message) and *Show in legend* (ISS-056). A hidden real pen breaks the 50-pen workaround (confirmed). | | C50 | Remaining trend settings: custom time range, `Rendering3dOrt`, `RenderingCSS` ([task](../.claude/skills/graphics/tasks/trend.md) §4) | passed | passed | 2026-10-02. Custom range on desktop and web (desktop: no live update); 3dOrt draws black lines; CSS mode makes the display unloadable. | +| R30/C50 | Sample operator HMI: 8 generated `CIENG_*` displays, layouts `CIENG_Operator` (header, tab set, banner) and `CIENG_Popup`, live-data feed with server-side *Start* / *Stop* ([sample README](../examples/CI-Eng-Sample/README.md), [layouts](../.claude/skills/graphics/tasks/layouts.md) §6.6) | passed | passed | 2026-10-06 on desktop and web. Replaces `CIENG_Tank`, `CIENG_Menu`, `CIENG_TrendLab`. Tab sets: last child of the frame set (ISS-069), desktop zoom via `navigate … stretchDisplay` (ISS-070), one layout command at a time (ISS-071), `connectionState` breaks the web layout (ISS-068). | +| C50 | Writing display XML directly: text size, rounding, arc angles, web item attributes, server-side command, alarm overview columns ([task](../.claude/skills/graphics/tasks/create-display.md)) | passed | passed | 2026-10-06, test display `CIENG_Test` (removed) on both clients; arc angles clockwise from 3 o'clock on both clients (an earlier note on mirrored angles was wrong); `jwuiutl -v` re-saves (ISS-075). | +| C10 | Sample user `CIENG` with empty password via quick load, profile layout and initial display ([task](../.claude/skills/authorization/tasks/users-groups.md)) | passed | passed | 2026-10-06: `PASSWORD ""` needed (ISS-072); web logon uses the profile layout (ISS-074); group removal with an open session stopped `DSSSDA03` (ISS-073). Factory group `OPERATOR` is enough for the server-side *Start*. | | 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). |