R1.05 re-check: installation-security, data-access, equipment #27

Merged
cliu merged 8 commits from docs/r105-recheck-install-access-equipment into main 2026-10-08 19:13:20 +11:00
13 changed files with 190 additions and 17 deletions
Showing only changes of commit 39e58af2ff - Show all commits

View file

@ -47,7 +47,7 @@ Rules:
| Task | File | Status | | Task | File | Status |
|---|---|---| |---|---|---|
| OPC UA client to an OPC UA server (sample: loopback to CI Server's own server): line, station, subscription, points, certificate exchange, node IDs, browse via dataset | `tasks/opcua-client.md` | verified on R1.03; R1.05 files and datasets checked; loopback awaiting user decision (sample load) | | OPC UA client to an OPC UA server (sample: loopback to CI Server's own server): line, station, subscription, points, certificate exchange, node IDs, browse via dataset | `tasks/opcua-client.md` | verified on R1.03 and R1.05 (loopback re-tested 2026-10-08) |
| Make CI Server data available to OPC clients (OPC visible / Read / Write); CI Server OPC UA server endpoints, node IDs, certificates | `tasks/opcua-client.md` §1, §5 | verified on R1.03 (UA); DA/A&E from docs | | Make CI Server data available to OPC clients (OPC visible / Read / Write); CI Server OPC UA server endpoints, node IDs, certificates | `tasks/opcua-client.md` §1, §5 | verified on R1.03 (UA); DA/A&E from docs |
| Read-only checks: ACCESS processes, ports (34493, 1583, 34597), OPC UA server config and PKI, extended functions, certificate validity, ODBC server state | `tasks/access-checks.md` | verified on R1.05 (2026-10-08) | | Read-only checks: ACCESS processes, ports (34493, 1583, 34597), OPC UA server config and PKI, extended functions, certificate validity, ODBC server state | `tasks/access-checks.md` | verified on R1.05 (2026-10-08) |
| OPC UA client methods (`MTD_*` object, method form, `CIX_UAC_MTD` point) and R1.03 → R1.04 method upgrade | `tasks/opcua-client.md` §7 | from docs | | OPC UA client methods (`MTD_*` object, method form, `CIX_UAC_MTD` point) and R1.03 → R1.04 method upgrade | `tasks/opcua-client.md` §7 | from docs |

View file

@ -2,7 +2,7 @@
task: OPC UA client to an OPC UA server by quick load (loopback to CI Server's own OPC UA server) task: OPC UA client to an OPC UA server by quick load (loopback to CI Server's own OPC UA server)
version: R1.05 (first written for R1.03) version: R1.05 (first written for R1.03)
source: IM 36K10L45-01EN 5th ed. (Feb. 2026) §10, §11; IM 36K10E20-01EN 4th ed. (Feb. 2026) §2; practiced on CI-Eng-Sample 2026-10-01 on R1.03 (station CIENG_UA; full remove/reload; point also configured in the Engineering Module by the user and compared) source: IM 36K10L45-01EN 5th ed. (Feb. 2026) §10, §11; IM 36K10E20-01EN 4th ed. (Feb. 2026) §2; practiced on CI-Eng-Sample 2026-10-01 on R1.03 (station CIENG_UA; full remove/reload; point also configured in the Engineering Module by the user and compared)
status: verified on R1.03 (§1–§6). R1.05 (2026-10-08, read-only): line/station/subscription/point dataset definitions identical to R1.03, PKI folders and client setup files checked; the loopback itself awaits the user's decision to load CI-Eng-Sample on the shared R1.05 test server (V4), the new form fields were confirmed in the installed form definitions (point form `READ_NODE_INFO` / `REBROWSE`; method form node ID type, parent object node ID, manual arguments, no process-area field), the forms themselves not opened. §7 (methods) from docs. status: verified on R1.03 (§1–§6). R1.05 (2026-10-08, read-only): line/station/subscription/point dataset definitions identical to R1.03, PKI folders and client setup files checked; loopback re-tested on R1.05 2026-10-08 with the reduced sample load (certificate exchange as in §4, done by the user; COMM_OK 1, SRV_STATE 0, LEVEL_COPY follows TANK1.LEVEL; removed afterwards), the new form fields were confirmed in the installed form definitions (point form `READ_NODE_INFO` / `REBROWSE`; method form node ID type, parent object node ID, manual arguments, no process-area field), the forms themselves not opened. §7 (methods) from docs.
--- ---
# OPC UA client to an OPC UA server # OPC UA client to an OPC UA server

View file

@ -37,7 +37,7 @@ Rules:
| Task | File | Status | | Task | File | Status |
|---|---|---| |---|---|---|
| Modbus TCP station by quick load: line, station, scan type, points, connected items; test, off-scan, remove | `tasks/modbus-station.md` | verified | | Modbus TCP station by quick load: line, station, scan type, points, connected items; test, off-scan, remove | `tasks/modbus-station.md` | verified (R1.03; re-tested on R1.05 2026-10-08) |
| CI Server as Modbus slave (mirror `eqpmdcmem` + `eqpmdcslvtcp`) | `tasks/modbus-station.md` §1 | verified (by hand and via start file after a restart) | | CI Server as Modbus slave (mirror `eqpmdcmem` + `eqpmdcslvtcp`) | `tasks/modbus-station.md` §1 | verified (by hand and via start file after a restart) |
| Read-only equipment manager status with `eqpdbg` | `system-management` task `tuning-checks.md` | verified | | Read-only equipment manager status with `eqpdbg` | `system-management` task `tuning-checks.md` | verified |
| Forced scan (`eqpfrcscn`), hourly statistics (`eqpiostat`) | L40 summary | from docs (statistics empty, ISS-021) | | Forced scan (`eqpfrcscn`), hourly statistics (`eqpiostat`) | L40 summary | from docs (statistics empty, ISS-021) |

View file

@ -2,7 +2,7 @@
task: Modbus TCP station by quick load (line, station, scan type, points, items) task: Modbus TCP station by quick load (line, station, scan type, points, items)
version: R1.05 (first written for R1.03) version: R1.05 (first written for R1.03)
source: IM 36K10L41-01EN §2, §3.1–3.2, §3.6–3.7; IM 36K10C10-01EN §4.1; practiced on CI-Eng-Sample 2026-09-30 source: IM 36K10L41-01EN §2, §3.1–3.2, §3.6–3.7; IM 36K10C10-01EN §4.1; practiced on CI-Eng-Sample 2026-09-30
status: verified on R1.03 (2026-09-30); on R1.05 the datasets, setup files and start scripts were checked identical (2026-10-08, read-only), re-run awaiting the user's decision to load CI-Eng-Sample on the shared R1.05 server (V4 in knowledge/r105-verification.md) status: verified on R1.03 (2026-09-30); on R1.05 the datasets, setup files and start scripts were checked identical (2026-10-08, read-only), re-tested on R1.05 2026-10-08 with the reduced sample load on the shared test server (setpoint 1234 read back, COMM_OK 1, eqpdbg slave GOOD; mirror started for the test only; everything removed afterwards)
--- ---
# Modbus TCP station by quick load # Modbus TCP station by quick load

View file

@ -1,11 +1,15 @@
# CI-Eng-Sample # CI-Eng-Sample
A small, invented sample project that anyone with this repo can load into a CI Server A small, invented sample project that anyone with this repo can load into a CI Server
**R1.03** test system. Skills use its names in their examples, and every skill task is test system (R1.03 or R1.05). Skills use its names in their examples, and every skill task is
re-tested against it so that no other project is needed. 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; operator HMI, demo 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. user and live-data feed added 2026-10-06. Reduced load (below) tested on R1.05.00 on a shared
server, 2026-10-08: loads with 0 errors (the `@VERSION 1.03.00` headers are accepted).
**Every test ends with the system back in its original state:** remove what was loaded, stop
processes started for the test, undo certificate trust, delete scratch and temporary files.
## Load and remove ## Load and remove
@ -30,6 +34,24 @@ cmd /c "<repo>\examples\CI-Eng-Sample\remove.cmd"
has passed, so the script sets a stop time one minute ahead and waits. Removing the group has passed, so the script sets a stop time one minute ahead and waits. Removing the group
also deletes its history. also deletes its history.
### Testing on a shared server (`shared\`)
For a server that other projects use, where CI Server must not be restarted:
| Script | Does |
|---|---|
| `shared\snapshot.ps1 -Out <file>` | Read-only snapshot: record names (count, hash, `CIENG*` names) of every dataset the sample touches, file lists of `tls\com`, `sup`, `sav`, `lst`, the `pki` folders, running CI Server processes. Run before and after; compare the two files. |
| `shared\reduced_load.cmd` | `load.cmd` without the storage groups and history bindings (`03`, `04`: need a restart), the authorization group and user `CIENG` (`08`, `08b`: a password-less user on a shared server) and the layouts/displays (shared `Layouts.xml`) |
| `shared\test_r105.ps1` | Starts the Modbus slave mirror only for the test, checks classes, sub-items, Modbus loopback and OPC UA loopback with `itmval`, stops the mirror again |
| `shared\reduced_remove.cmd` | Removes exactly what `reduced_load.cmd` loaded |
| `shared\clean_dss_tmp.ps1 -Since <time>` | Deletes the `dss_*.tmp` files the test left in `%TLS_LST_PATH%` (ISS-091) |
Copy the whole sample folder to a temporary folder on the server, run from there, and delete
it afterwards. Also delete `%TLS_LOG_PATH%\OPXCIENG.log`. The OPC UA certificate exchange and
its undo are user steps (see below); the client's own certificate `<host>_OPXCIENG.der/.pem`
and the trusted copies stay in the `pki` folders and in `OPCUAC_PKI_CERTIFICATES_DF` until the
user deletes them.
## Current contents ## Current contents
| Name | Kind | Details | | Name | Kind | Details |

View file

@ -0,0 +1,15 @@
# Remove the DSS temporary files that a test session left in %TLS_LST_PATH%.
# Each dssqld run can leave a 0-byte dss_<n>_<id>.tmp there, and loading a class leaves its source
# text in one (verified on R1.05, 2026-10-08). Only files written since -Since are touched: 0-byte
# files, and non-empty files that contain sample text (CIENG / CI-Eng-Sample). Files in use are skipped.
# Usage: powershell -NoProfile -ExecutionPolicy Bypass -File clean_dss_tmp.ps1 -Since "2026-10-08T07:00:00"
param([Parameter(Mandatory = $true)][datetime]$Since)
$lst = $env:TLS_LST_PATH
$f = Get-ChildItem -Path $lst -Filter 'dss_*.tmp' | Where-Object { $_.LastWriteTime -ge $Since }
$ok = 0; $skip = 0
foreach ($i in $f) {
$mine = ($i.Length -eq 0) -or (Select-String -LiteralPath $i.FullName -Pattern 'CIENG|CI-Eng-Sample' -Quiet)
if (-not $mine) { $skip++; continue }
try { Remove-Item -LiteralPath $i.FullName -ErrorAction Stop; $ok++ } catch { $skip++ }
}
"deleted $ok, left $skip (other content or in use)"

View file

@ -0,0 +1,27 @@
@echo off
REM Reduced CI-Eng-Sample load for the shared R1.05 test server (2026-10-08).
REM Skips: history group/bindings (03, 04: need a CI Server restart), auth group and user (08, 08b),
REM layouts/displays. Run from the copied sample folder (this script lives in its shared subfolder).
cd /d "%~dp0.."
dssqld -i 01_section_df.qli -l 01_section_df.qlo
dssqld -i 01b_alarm_df.qli -l 01b_alarm_df.qlo
dssqld -i 02_item_df.qli -l 02_item_df.qlo
dssqld -i 02b_sub_item_df.qli -l 02b_sub_item_df.qlo
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
dssqld -i 09_modbus_line_df.qli -l 09_modbus_line_df.qlo
powershell -NoProfile -Command "Start-Sleep -Seconds 15"
dssqld -i 10_modbus_station_df.qli -l 10_modbus_station_df.qlo
dssqld -i 11_item_eqp_df.qli -l 11_item_eqp_df.qlo
dssqld -m 12_opc_visible_df.qli -l 12_opc_visible_df.qlo
dssqld -i 13_opcua_line_df.qli -l 13_opcua_line_df.qlo
powershell -NoProfile -Command "Start-Sleep -Seconds 10"
dssqld -i 14_opcua_station_df.qli -l 14_opcua_station_df.qlo
dssqld -i 15_item_opcua_df.qli -l 15_item_opcua_df.qlo
dssqld -m 16_item_alarm_df.qli -l 16_item_alarm_df.qlo
powershell -NoProfile -ExecutionPolicy Bypass -File 17_printer_df.ps1
dssqld -i 17_printer_df.qli -l 17_printer_df.qlo
dssqld -i 18_report_df.qli -l 18_report_df.qlo
dssqld -i 19_audit_df.qli -l 19_audit_df.qlo
dssqld -m 19b_audit_item_df.qli -l 19b_audit_item_df.qlo

View file

@ -0,0 +1,21 @@
@echo off
REM Removes the reduced CI-Eng-Sample load (reverse of reduced_load.cmd).
cd /d "%~dp0.."
dssqld -r 79_remove_audit_df.qli -l 79_remove_audit_df.qlo
dssqld -m 83a_stop_report_df.qli -l 83a_stop_report_df.qlo
dssqld -r 83_remove_report_df.qli -l 83_remove_report_df.qlo
dssqld -r 84_remove_printer_df.qli -l 84_remove_printer_df.qlo
if exist "%TLS_LST_PATH%\cieng_report.txt" del "%TLS_LST_PATH%\cieng_report.txt"
dssqld -r 76_remove_item_opcua_df.qli -l 76_remove_item_opcua_df.qlo
dssqld -r 77_remove_opcua_station_df.qli -l 77_remove_opcua_station_df.qlo
dssqld -r 78_remove_opcua_line_df.qli -l 78_remove_opcua_line_df.qlo
dssqld -r 80_remove_item_eqp_df.qli -l 80_remove_item_eqp_df.qlo
dssqld -r 81_remove_modbus_station_df.qli -l 81_remove_modbus_station_df.qlo
dssqld -r 82_remove_modbus_line_df.qli -l 82_remove_modbus_line_df.qlo
dssqld -r 86_remove_object_df.qli -l 86_remove_object_df.qlo
dssqld -r 87_remove_class_df.qli -l 87_remove_class_df.qlo
dssqld -r 88_remove_trigger_df.qli -l 88_remove_trigger_df.qlo
dssqld -r 90b_remove_sub_item_df.qli -l 90b_remove_sub_item_df.qlo
dssqld -r 91_remove_item_df.qli -l 91_remove_item_df.qlo
dssqld -r 92_remove_section_df.qli -l 92_remove_section_df.qlo
dssqld -r 93_remove_alarm_df.qli -l 93_remove_alarm_df.qlo

View file

@ -0,0 +1,37 @@
# Read-only snapshot of everything the reduced CI-Eng-Sample test can touch.
param([string]$Out)
$ErrorActionPreference = 'Continue'
$w = New-Object System.Collections.Generic.List[string]
$tmp = Join-Path $PSScriptRoot 'snapx'
New-Item -ItemType Directory -Force -Path $tmp | Out-Null
$ds = 'SECTION_DF','ITEM_DF','SUB_ITEM_DF','ALARM_ACK_DF','ALARM_AOI_DF','ALARM_ASA_DF','TRIGGER_DF',
'CLASS_DF','OBJECT_DF','LINE_DF','STATION_DF','POINT_DF','MODBUS_LINE_DF','MODBUS_STATION_DF',
'MODBUS_SCAN_TYPE_DF','MODBUS_POINT_DF','OPCUAC_LINE_DF','OPCUAC_STATION_DF',
'OPCUAC_SUBSCRIPTION_DF','OPCUAC_POINT_DF','PRINTER_DEV_DF','PRINTER_DEST_DF','REPORT_DF',
'AUDIT_SELGRP_DF','OPCUAC_PKI_CERTIFICATES_DF'
foreach ($d in $ds) {
$f = Join-Path $tmp "$d.qlo"
$null = & dssqld -e $f -d $d -c 2>&1
$names = @()
if (Test-Path $f) { $names = @(Import-Csv $f | ForEach-Object { $_.NAME }) | Sort-Object }
$sha = [BitConverter]::ToString((New-Object Security.Cryptography.SHA256Managed).ComputeHash([Text.Encoding]::UTF8.GetBytes(($names -join "`n")))).Replace('-','').Substring(0,16)
$mine = @($names | Where-Object { $_ -match 'CIENG|CI-Eng' })
$w.Add("DS $d count=$($names.Count) hash=$sha cieng=$($mine.Count) $($mine -join ';')")
}
Remove-Item -Recurse -Force $tmp
$root = $env:TLS_ALLUSERS_PATH
foreach ($sub in 'com','sup','sav','lst') {
foreach ($i in (Get-ChildItem -Path (Join-Path $env:TLS_ROOT_PATH "tls\$sub") -File | Sort-Object Name)) {
if ($sub -eq 'lst' -or $sub -eq 'sav') { $w.Add("FILE $sub\$($i.Name)") }
else { $w.Add("FILE $sub\$($i.Name) $($i.Length) $($i.LastWriteTime.ToString('s'))") }
}
}
foreach ($i in (Get-ChildItem -Path (Join-Path $root 'pki') -Recurse -File | Sort-Object FullName)) {
$w.Add("PKI $($i.FullName.Substring($root.Length)) $($i.Length)")
}
$exe = Join-Path $env:TLS_ROOT_PATH 'tls\exe'
foreach ($g in (Get-Process | Where-Object { $_.Path -like "$exe*" } | Group-Object Name | Sort-Object Name)) {
$w.Add("PROC $($g.Name) x$($g.Count)")
}
$w | Set-Content -Encoding utf8 $Out
"snapshot: $($w.Count) lines -> $Out"

View file

@ -0,0 +1,36 @@
# Functional test of the reduced CI-Eng-Sample load on R1.05. Starts the Modbus slave mirror only
# for the duration of the test and stops it again.
$P = 'CI-Eng-Sample'
function V($n) { (& itmval -g -n "$P.$n" 2>&1 | Out-String).Trim() -replace '\s+', ' ' }
function W($n, $v) { $null = & itmval -p -n "$P.$n" -v $v 2>&1 }
"--- start Modbus slave mirror"
$mem = Start-Process -FilePath eqpmdcmem -ArgumentList '-n','EQPMDCMEM' -WindowStyle Hidden -PassThru
Start-Sleep 3
$slv = Start-Process -FilePath eqpmdcslvtcp -ArgumentList '-n','EQPMDCSLVTCP','-p','5020' -WindowStyle Hidden -PassThru
"mirror pids $($mem.Id) $($slv.Id)"
"--- classes and sub-items"
"COUNTER t0: $(V 'DEMO.COUNTER')"; Start-Sleep 3; "COUNTER t3: $(V 'DEMO.COUNTER')"
W 'TANK1.LEVEL' 50; W 'TANK1.INFLOW' 120; Start-Sleep 3
"TANK1.CALC.VOLUME (expect 100): $(V 'TANK1.CALC.VOLUME')"
"TANK1.JFLOW.sPerMin (expect 2): $(V 'TANK1.JFLOW.sPerMin')"
"TANK1.LEVEL.MAX: $(V 'TANK1.LEVEL.MAX')"
"--- wait 45 s for Modbus station and OPC UA client"
Start-Sleep 45
W 'PLC1.SETPOINT' 1234; Start-Sleep 4
"PLC1.READBACK (expect 1234): $(V 'PLC1.READBACK')"
"PLC1.COMM_OK (expect 1): $(V 'PLC1.COMM_OK')"
"--- eqpdbg slave info"
('3', '1', '-1') -join "`n" | & eqpdbg 0 EQPCIENG 2>&1 | Select-String -Pattern 'scan status|Slave name|name|Line status|Good|requests' | Select-Object -First 12 | ForEach-Object { $_.Line.Trim() }
"--- OPC UA loopback"
"UA.COMM_OK: $(V 'UA.COMM_OK')"
"UA.SRV_STATE: $(V 'UA.SRV_STATE')"
"UA.LEVEL_COPY: $(V 'UA.LEVEL_COPY')"
$pki = $env:TLS_ALLUSERS_PATH + '\pki'
"client rejected: " + ((Get-ChildItem "$pki\opxuac\pkiclient\rejected" -File -ErrorAction SilentlyContinue | ForEach-Object Name) -join '; ')
"server rejected: " + ((Get-ChildItem "$pki\opxuas\pkiserver\rejected" -File -ErrorAction SilentlyContinue | ForEach-Object Name) -join '; ')
"--- stop mirror"
& durstp -msk -t 10 -p EQPMDCSLVTCP 2>&1 | Out-Null
& durstp -msk -t 10 -p EQPMDCMEM 2>&1 | Out-Null
Start-Sleep 2
"mirror still running: " + ((Get-Process -Id $mem.Id, $slv.Id -ErrorAction SilentlyContinue | ForEach-Object Id) -join ' ')

View file

@ -99,7 +99,7 @@ development system (see "Test system" in `progress.md`); they do not exist on ot
| ISS-077 | 2026-10-08 | EQUIPMENT (IEC 104 setup file, R1.05) | The installed template `eta104_eqt.sup` has a keyword `quality_code_parsing = Y\|N` (default N) that moves IEC 104 cause of transmission and quality flags into the item quality field instead of the item status. The 5th ed. manual does not describe it. | open | Behaviour not tested (no IEC 104 device). | `knowledge/manuals/IM36K10L41-01EN.md` §3.28–3.31 row (done) | | ISS-077 | 2026-10-08 | EQUIPMENT (IEC 104 setup file, R1.05) | The installed template `eta104_eqt.sup` has a keyword `quality_code_parsing = Y\|N` (default N) that moves IEC 104 cause of transmission and quality flags into the item quality field instead of the item status. The 5th ed. manual does not describe it. | open | Behaviour not tested (no IEC 104 device). | `knowledge/manuals/IM36K10L41-01EN.md` §3.28–3.31 row (done) |
| ISS-078 | 2026-10-08 | EQUIPMENT (EQT utilities, R1.05) | IM 36K10L40 4th ed. describes only `eqpfrcscn`, `eqpiostat` and `eqpdbg` (and still lists IEC 61850, I/O type 1636, under `eqpfrcscn`). R1.05 installs `eqtdbg` (same menu, default process `EQT`), `eqtfrcscn` (template `eqtfrcscn.tpl`) and `eqtiostat` (start line commented out in `equipment_start.cmd`). None is in the manual. | open | Documented from installed files only; `eqtdbg`/`eqtfrcscn` not run (shared server, no EQT line). | `knowledge/manuals/IM36K10L40-01EN.md` §1–3, installed section (done); `.claude/skills/equipment/SKILL.md` (done) | | ISS-078 | 2026-10-08 | EQUIPMENT (EQT utilities, R1.05) | IM 36K10L40 4th ed. describes only `eqpfrcscn`, `eqpiostat` and `eqpdbg` (and still lists IEC 61850, I/O type 1636, under `eqpfrcscn`). R1.05 installs `eqtdbg` (same menu, default process `EQT`), `eqtfrcscn` (template `eqtfrcscn.tpl`) and `eqtiostat` (start line commented out in `equipment_start.cmd`). None is in the manual. | open | Documented from installed files only; `eqtdbg`/`eqtfrcscn` not run (shared server, no EQT line). | `knowledge/manuals/IM36K10L40-01EN.md` §1–3, installed section (done); `.claude/skills/equipment/SKILL.md` (done) |
| ISS-079 | 2026-10-08 | EQUIPMENT (IEC 61850 client name) | IM 36K10L41 5th ed. §3.32 tells the user to give the IED engineer the client name "EQP850", while §3.32.1 and App. 1.3 use `EQT850`, the process name R1.05 actually uses. | open | Presumably `EQT850`; low priority. | `knowledge/manuals/IM36K10L41-01EN.md` §3.32 (done) | | ISS-079 | 2026-10-08 | EQUIPMENT (IEC 61850 client name) | IM 36K10L41 5th ed. §3.32 tells the user to give the IED engineer the client name "EQP850", while §3.32.1 and App. 1.3 use `EQT850`, the process name R1.05 actually uses. | open | Presumably `EQT850`; low priority. | `knowledge/manuals/IM36K10L41-01EN.md` §3.32 (done) |
| ISS-080 | 2026-10-08 | ACCESS (OPC UA client status item, R1.05) | IM 36K10E20 4th ed. §2.1.2 lists integer states 0–5 for the station `STATUS_ITEM` (0 preparing, 1 connected, 2 communication error and reconnecting, 3 connect attempt failed, 4 server shutdown received, 5 connection recreated); IM 36K10L45 5th ed. §10.9.2 still calls it a Boolean. On R1.03 a Boolean item with 1 = connected was verified. | open | Re-test on an R1.05 system with an Integer status item (not on the shared R1.05 test server without approval). | `.claude/skills/data-access/tasks/opcua-client.md` §2; `knowledge/manuals/IM36K10E20-01EN.md` | | ISS-080 | 2026-10-08 | ACCESS (OPC UA client status item, R1.05) | IM 36K10E20 4th ed. §2.1.2 lists integer states 0–5 for the station `STATUS_ITEM` (0 preparing, 1 connected, 2 communication error and reconnecting, 3 connect attempt failed, 4 server shutdown received, 5 connection recreated); IM 36K10L45 5th ed. §10.9.2 still calls it a Boolean. On R1.03 a Boolean item with 1 = connected was verified. | open | R1.05 (2026-10-08): with the sample's Boolean status item the station showed 0 / status 4 while the server rejected the client and 1 / status 5 when connected; integer states 2–5 still not observed. Re-test on an R1.05 system with an Integer status item (not on the shared R1.05 test server without approval). | `.claude/skills/data-access/tasks/opcua-client.md` §2; `knowledge/manuals/IM36K10E20-01EN.md` |
| ISS-081 | 2026-10-08 | ACCESS (OPC UA server `ServerConfig.xml`, R1.05) | IM 36K10L45 5th ed. §11.7 places `ServerConfig.xml` in `%TLS_ROOT_PATH%\tls\exe`; on the R1.05 test server it exists only in `%TLS_SAV_PATH%` (IM 36K10E20 4th ed. §3.4 agrees). On R1.03 it was in `tls\exe`. The R1.05 file only adds SDK blocks (roles, user password management, PubSub settings, thread pools). | closed | Installed software is the reference (standing user decision). Close when the user confirms. | `.claude/skills/data-access/tasks/access-checks.md`; `knowledge/manuals/IM36K10L45-01EN.md`; `knowledge/manuals/IM36K10E20-01EN.md` | | ISS-081 | 2026-10-08 | ACCESS (OPC UA server `ServerConfig.xml`, R1.05) | IM 36K10L45 5th ed. §11.7 places `ServerConfig.xml` in `%TLS_ROOT_PATH%\tls\exe`; on the R1.05 test server it exists only in `%TLS_SAV_PATH%` (IM 36K10E20 4th ed. §3.4 agrees). On R1.03 it was in `tls\exe`. The R1.05 file only adds SDK blocks (roles, user password management, PubSub settings, thread pools). | closed | Installed software is the reference (standing user decision). Close when the user confirms. | `.claude/skills/data-access/tasks/access-checks.md`; `knowledge/manuals/IM36K10L45-01EN.md`; `knowledge/manuals/IM36K10E20-01EN.md` |
| ISS-082 | 2026-10-08 | ACCESS (OPC UA server keywords, R1.05) | The manual names the switch that keeps the native model visible next to an imported information model `OPXUAS_ENABLE_NATIVE_MODEL_TREE`; the installed `opxuas.sup` has `OPXUAS_ENABLE_OWN_MODEL_TREE`. The installed file also has a hidden `OPXUAS_METHOD_TIMEOUT_MARGIN` (10000 ms) that the manual does not describe. | closed | Installed software is the reference (standing user decision). Close when the user confirms. | `knowledge/manuals/IM36K10L45-01EN.md` | | ISS-082 | 2026-10-08 | ACCESS (OPC UA server keywords, R1.05) | The manual names the switch that keeps the native model visible next to an imported information model `OPXUAS_ENABLE_NATIVE_MODEL_TREE`; the installed `opxuas.sup` has `OPXUAS_ENABLE_OWN_MODEL_TREE`. The installed file also has a hidden `OPXUAS_METHOD_TIMEOUT_MARGIN` (10000 ms) that the manual does not describe. | closed | Installed software is the reference (standing user decision). Close when the user confirms. | `knowledge/manuals/IM36K10L45-01EN.md` |
| ISS-083 | 2026-10-08 | ACCESS (OPC UA client setup defaults, R1.05) | IM 36K10L45 5th ed. §10.11 gives `OPXC_SERVICE_CALL_TIME_OUT` default 10 s; the installed template `epauac_eqp.sup` has 60 s. The template also has `OPXC_DISABLE_SAV_FILE`, `OPXC_ALARM_TIME_ATTRIBUTE` and a hidden `OPXC_CERT_EXP_PERIOD_WARN` (2 months) that the manual does not describe. The installed `opxuac_mon.sup` was not updated (still 10 s, none of the new keywords). | open | Installed software is the reference. Open question: whether per-process files created on R1.03 should get the new keywords after an upgrade. | `knowledge/manuals/IM36K10L45-01EN.md`; `.claude/skills/data-access/tasks/access-checks.md` | | ISS-083 | 2026-10-08 | ACCESS (OPC UA client setup defaults, R1.05) | IM 36K10L45 5th ed. §10.11 gives `OPXC_SERVICE_CALL_TIME_OUT` default 10 s; the installed template `epauac_eqp.sup` has 60 s. The template also has `OPXC_DISABLE_SAV_FILE`, `OPXC_ALARM_TIME_ATTRIBUTE` and a hidden `OPXC_CERT_EXP_PERIOD_WARN` (2 months) that the manual does not describe. The installed `opxuac_mon.sup` was not updated (still 10 s, none of the new keywords). | open | Installed software is the reference. Open question: whether per-process files created on R1.03 should get the new keywords after an upgrade. | `knowledge/manuals/IM36K10L45-01EN.md`; `.claude/skills/data-access/tasks/access-checks.md` |
@ -110,3 +110,4 @@ development system (see "Test system" in `progress.md`); they do not exist on ot
| ISS-088 | 2026-10-08 | WINDOWS (WMIC) | IM 36K01C10 5th ed. App. 1.3 still uses `wmic qfe list full`, but WMIC is not installed on Windows Server 2025 / 24H2 (missing on the R1.05 test server). `Get-HotFix` works there. | closed | Use `Get-HotFix`. Close when the user confirms. | `knowledge/manuals/IM36K01C10-01EN.md`; `tools/setup_check.ps1` | | ISS-088 | 2026-10-08 | WINDOWS (WMIC) | IM 36K01C10 5th ed. App. 1.3 still uses `wmic qfe list full`, but WMIC is not installed on Windows Server 2025 / 24H2 (missing on the R1.05 test server). `Get-HotFix` works there. | closed | Use `Get-HotFix`. Close when the user confirms. | `knowledge/manuals/IM36K01C10-01EN.md`; `tools/setup_check.ps1` |
| ISS-089 | 2026-10-08 | INSTALLATION (local groups, R1.05) | On the R1.05 test server (no dual-redundant platform, no IT Security Tool) the local group `RDC_GA_CLIENT` exists with member `CIX_PROCESS`. The Security Guide mentions this group only for the dual-redundant platform (IM 36K01C30 5th ed. §4.9). | closed | Information only: apparently created by the installer; no action. Close when the user confirms. | `knowledge/manuals/IM36K01C30-01EN.md` | | ISS-089 | 2026-10-08 | INSTALLATION (local groups, R1.05) | On the R1.05 test server (no dual-redundant platform, no IT Security Tool) the local group `RDC_GA_CLIENT` exists with member `CIX_PROCESS`. The Security Guide mentions this group only for the dual-redundant platform (IM 36K01C30 5th ed. §4.9). | closed | Information only: apparently created by the installer; no action. Close when the user confirms. | `knowledge/manuals/IM36K01C30-01EN.md` |
| ISS-090 | 2026-10-08 | DOCS (CI Server + PRM) | IM 36K01C10 5th ed. §4.1.1 requires PRM R4.06 or later in a note but R4.08 or later in Table 4.1.1-1 (integration code 1901-0302-03-01). | open | Use R4.08 until clarified (from docs; no PRM available). | `knowledge/manuals/IM36K01C10-01EN.md` | | ISS-090 | 2026-10-08 | DOCS (CI Server + PRM) | IM 36K01C10 5th ed. §4.1.1 requires PRM R4.06 or later in a note but R4.08 or later in Table 4.1.1-1 (integration code 1901-0302-03-01). | open | Use R4.08 until clarified (from docs; no PRM available). | `knowledge/manuals/IM36K01C10-01EN.md` |
| ISS-091 | 2026-10-08 | DSS (temporary files) | Each `dssqld` run (exports and quick loads) left a 0-byte `dss_<n>_<id>.tmp` in `%TLS_LST_PATH%`, and loading a class left a `dss_*.tmp` holding the class source (R1.05 test server: 34 files after one session of checks and a sample load/remove). They are not removed by CI Server. | closed | Test cleanup deletes them: `examples/CI-Eng-Sample/shared/clean_dss_tmp.ps1 -Since <test start>` (0-byte files and files with sample text only). Not checked on R1.03. Close when the user confirms. | `examples/CI-Eng-Sample/README.md` (done); `knowledge/r105-verification.md` (done) |

View file

@ -50,8 +50,8 @@ screenshot.
|---|---|---|---| |---|---|---|---|
| `system-check` | — | re-checked (read-only) | Version, paths, service, node, time on the R1.05 test server 2026-10-08. Start/stop not repeated (shared server). | | `system-check` | — | re-checked (read-only) | Version, paths, service, node, time on the R1.05 test server 2026-10-08. Start/stop not repeated (shared server). |
| `installation-security` | C10, C30 (large: IT security 3.0, LAPS, upgrade merge `jupgutl`, PRM) | re-checked (read-only) | 2026-10-08: skill, summaries and `tools/setup_check.ps1` updated to R1.05. Setup check run by hand on the R1.05 test server. Script run there too (12 OK, 5 CHECK, 20 DIFF; firewall check fixed). **Not tested:** IT security 2.0/3.0, LAPS, Vnet/IP, upgrade merge, PRM (not available there). ISS-086–090. | | `installation-security` | C10, C30 (large: IT security 3.0, LAPS, upgrade merge `jupgutl`, PRM) | re-checked (read-only) | 2026-10-08: skill, summaries and `tools/setup_check.ps1` updated to R1.05. Setup check run by hand on the R1.05 test server. Script run there too (12 OK, 5 CHECK, 20 DIFF; firewall check fixed). **Not tested:** IT security 2.0/3.0, LAPS, Vnet/IP, upgrade merge, PRM (not available there). ISS-086–090. |
| `data-access` | L45, E20 (large: REST API, OPC UA methods, information model mapper, certificate expiry, extended functions off by default), L50 dataset rename | re-checked (read-only) | 2026-10-08: skill and summaries updated, L45 section numbers remapped. Setup files, datasets, ports and certificates checked; Sample qli files unchanged. New form fields confirmed in the installed form definitions (V3); OPC UA loopback needs the sample loaded (V4, decision). **Not tested:** OPC A&E direct alarms, PubSub, imported information model. ISS-080–085. | | `data-access` | L45, E20 (large: REST API, OPC UA methods, information model mapper, certificate expiry, extended functions off by default), L50 dataset rename | re-checked (read-only) | 2026-10-08: skill and summaries updated, L45 section numbers remapped. Setup files, datasets, ports and certificates checked; Sample qli files unchanged. New form fields confirmed in the installed form definitions (V3); OPC UA loopback re-tested on R1.05 with the reduced sample load (V4, 2026-10-08), certificate exchange done by the user. **Not tested:** OPC A&E direct alarms, PubSub, imported information model. ISS-080–085. |
| `equipment` | L41 (IEC 61850, item status, App. 1); IEC 104/61850 drivers moved to `eqt`/`eta` | re-checked (read-only) | 2026-10-08: Modbus datasets, setup files and tools identical to R1.03; EQT family, IEC 61850 report control blocks and upgrade steps added. Sample qli files unchanged. `eqpdbg` main info run on R1.05 (V1); Modbus station re-test needs the sample loaded (V4, decision). **Not tested:** IEC 104 / IEC 61850 and the EQT tools (no device). ISS-076–079. | | `equipment` | L41 (IEC 61850, item status, App. 1); IEC 104/61850 drivers moved to `eqt`/`eta` | re-checked (read-only) | 2026-10-08: Modbus datasets, setup files and tools identical to R1.03; EQT family, IEC 61850 report control blocks and upgrade steps added. Sample qli files unchanged. `eqpdbg` main info run on R1.05 (V1); Modbus loopback re-tested on R1.05 with the reduced sample load (V4, 2026-10-08). **Not tested:** IEC 104 / IEC 61850 and the EQT tools (no device). ISS-076–079. |
| pyTOOLS (new) | P40 new | not started | No skill yet. | | pyTOOLS (new) | P40 new | not started | No skill yet. |
| `graphics` | C50, C60, R30 (small) | manual diff read | | | `graphics` | C50, C60, R30 (small) | manual diff read | |
| `history-management` | C40 §4.2 (REST API, pyTOOLS) | manual diff read | The REST API itself is described in skill `data-access` (L45 ch. 4); link to it from here. | | `history-management` | C40 §4.2 (REST API, pyTOOLS) | manual diff read | The REST API itself is described in skill `data-access` (L45 ch. 4); link to it from here. |
@ -61,10 +61,10 @@ screenshot.
| `alarm-management` | none | not started | | | `alarm-management` | none | not started | |
| `audit-trail` | none | not started | | | `audit-trail` | none | not started | |
| `authorization` | none (new `dss_ath_grp_u0104` loader) | not started | | | `authorization` | none (new `dss_ath_grp_u0104` loader) | not started | |
| `class-object-engineering` | none | not started | | | `class-object-engineering` | none | not started | Sample classes `CIENG_INCR`, `CIENG_TANK` (traditional) and `CIENG_JFLOW` (Java) loaded and ran correctly on R1.05 (V4, 2026-10-08). |
| `high-availability` | none | not started | | | `high-availability` | none | not started | |
| `reporting` | none | not started | | | `reporting` | none | not started | |
| `examples/CI-Eng-Sample` | — | not started | Awaiting the user's decision to load it on the shared server (V4 in `r105-verification.md`). | | `examples/CI-Eng-Sample` | — | re-tested | Reduced load (no history group, user or layouts) loaded, tested and removed on the shared R1.05 server 2026-10-08 (V4); scripts in `shared\`. Full load not tested on R1.05. |
## Manuals, in working order ## Manuals, in working order

View file

@ -78,10 +78,24 @@ form below, take a screenshot, and close it with *Cancel*:
If no OPC UA client line exists on the server, steps 3–4 need one: skip them and say so. If no OPC UA client line exists on the server, steps 3–4 need one: skip them and say so.
### V4. Needs a decision first: CI-Eng-Sample on the R1.05 test server ### V4. CI-Eng-Sample on the R1.05 test server: **reduced load tested 2026-10-08**
The sample tasks (Modbus mirror station, OPC UA loopback, items, alarms …) can only be The user approved a reduced load (no history group, no user `CIENG`, no layouts/displays) that
re-tested on R1.05 by loading `CI-Eng-Sample` (all names `CIENG*`) onto the shared server. It is removed again afterwards. Scripts: `examples/CI-Eng-Sample/shared/`.
adds records and starts extra equipment processes (`EQPCIENG` on port 5020), but touches no
other project's records. Load only after the user approves; otherwise these tasks stay - Load: 0 errors in every step; R1.05 accepts the sample's `@VERSION 1.03.00` files.
"verified on R1.03, files checked identical on R1.05". - Classes: `DEMO.COUNTER` counts (65 → 68 in 3 s); `TANK1.CALC.VOLUME` = 100 for level 50
(traditional class); `TANK1.JFLOW.sPerMin` = 2 for inflow 120 (Java class); sub-item
`TANK1.LEVEL.MAX` follows the level.
- Modbus loopback (mirror started for the test only): setpoint 1234 → readback 1234,
`PLC1.COMM_OK` = 1; `eqpdbg 0 EQPCIENG` slave info: `CIENG_PLC` ON_SCAN, line GOOD.
- OPC UA loopback: after the two certificate moves done by the user, `UA.COMM_OK` = 1 (status
5), `UA.SRV_STATE` = 0, `UA.LEVEL_COPY` followed `TANK1.LEVEL` (62.5). While the server still
rejected the client, the Boolean status item showed 0 with status 4 (ISS-080).
- Remove: 0 errors. Before/after snapshot: all datasets identical (count and name hash), no
`CIENG*` record left. Left over and cleaned: 34 `dss_*.tmp` files in `tls\lst` (ISS-091),
`OPXCIENG.log`, the temporary sample copy.
- **User step still open:** the certificate files of the test (client own certificate
`<host>_OPXCIENG.der/.pem`, the server certificate trusted in the client store, the client
certificate trusted in the server store) and their 2 extra `OPCUAC_PKI_CERTIFICATES_DF`
records. Claude is not allowed to change the certificate stores.