R1.05 re-check: installation-security, data-access, equipment #27
13 changed files with 190 additions and 17 deletions
|
|
@ -47,7 +47,7 @@ Rules:
|
|||
|
||||
| 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 |
|
||||
| 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 |
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
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)
|
||||
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
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ Rules:
|
|||
|
||||
| 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) |
|
||||
| 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) |
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
task: Modbus TCP station by quick load (line, station, scan type, points, items)
|
||||
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
|
||||
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
|
||||
|
|
|
|||
|
|
@ -1,11 +1,15 @@
|
|||
# CI-Eng-Sample
|
||||
|
||||
A small, invented sample project that anyone with this repo can load into a CI Server
|
||||
**R1.03** test system. Skills use its names in their examples, and every skill task is
|
||||
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.
|
||||
|
||||
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
|
||||
|
||||
|
|
@ -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
|
||||
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
|
||||
|
||||
| Name | Kind | Details |
|
||||
|
|
|
|||
15
examples/CI-Eng-Sample/shared/clean_dss_tmp.ps1
Normal file
15
examples/CI-Eng-Sample/shared/clean_dss_tmp.ps1
Normal 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)"
|
||||
27
examples/CI-Eng-Sample/shared/reduced_load.cmd
Normal file
27
examples/CI-Eng-Sample/shared/reduced_load.cmd
Normal 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
|
||||
21
examples/CI-Eng-Sample/shared/reduced_remove.cmd
Normal file
21
examples/CI-Eng-Sample/shared/reduced_remove.cmd
Normal 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
|
||||
37
examples/CI-Eng-Sample/shared/snapshot.ps1
Normal file
37
examples/CI-Eng-Sample/shared/snapshot.ps1
Normal 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"
|
||||
36
examples/CI-Eng-Sample/shared/test_r105.ps1
Normal file
36
examples/CI-Eng-Sample/shared/test_r105.ps1
Normal 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 ' ')
|
||||
|
|
@ -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-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-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-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` |
|
||||
|
|
@ -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-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-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) |
|
||||
|
|
|
|||
|
|
@ -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). |
|
||||
| `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. |
|
||||
| `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. |
|
||||
| `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 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. |
|
||||
| `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. |
|
||||
|
|
@ -61,10 +61,10 @@ screenshot.
|
|||
| `alarm-management` | none | not started | |
|
||||
| `audit-trail` | none | 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 | |
|
||||
| `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
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
### 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
|
||||
re-tested on R1.05 by loading `CI-Eng-Sample` (all names `CIENG*`) onto the shared server. It
|
||||
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
|
||||
"verified on R1.03, files checked identical on R1.05".
|
||||
The user approved a reduced load (no history group, no user `CIENG`, no layouts/displays) that
|
||||
is removed again afterwards. Scripts: `examples/CI-Eng-Sample/shared/`.
|
||||
|
||||
- Load: 0 errors in every step; R1.05 accepts the sample's `@VERSION 1.03.00` files.
|
||||
- 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.
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue