RDBMS data exposure to SQL Server (tested in R1.05 only) #21
8 changed files with 315 additions and 5 deletions
|
|
@ -8,10 +8,13 @@ description: >-
|
||||||
security policy, trusting client certificates, UaExpert), check why an OPC connection fails
|
security policy, trusting client certificates, UaExpert), check why an OPC connection fails
|
||||||
(BadCertificateUntrusted, BadSecurityChecksFailed, item stays NOT INIT), configure DCOM or DCOM
|
(BadCertificateUntrusted, BadSecurityChecksFailed, item stays NOT INIT), configure DCOM or DCOM
|
||||||
tunnelling for OPC Classic, use ODBC / SimbaClient / SQL on datasets, or check the ODBC server
|
tunnelling for OPC Classic, use ODBC / SimbaClient / SQL on datasets, or check the ODBC server
|
||||||
(odbsrv, port 1583, SSL certificate). Sources IM 36K10L45-01EN, IM 36K10E20-01EN.
|
(odbsrv, port 1583, SSL certificate), or copy item values and timestamps into Microsoft SQL
|
||||||
|
Server with RDBMS data exposure (dbc.sup, DEM_CONNECTION, DBCSND, DBCDEM, DATA_EXPOSURE_DF,
|
||||||
|
data exposure aggregation interval AGG_INTERVAL, ITEM_VALUES, SQL login, DSS-E-FLT_SYN_ERR).
|
||||||
|
Sources IM 36K10L45-01EN, IM 36K10E20-01EN, IM 36K10G10-01EN ch. 10.
|
||||||
---
|
---
|
||||||
|
|
||||||
# Data access: OPC and ODBC (R1.03)
|
# Data access: OPC, ODBC and RDBMS data exposure (R1.03; RDBMS exposure tested in R1.05 only)
|
||||||
|
|
||||||
Background: `knowledge/manuals/IM36K10L45-01EN.md` (ODBC, OPC DA/A&E/UA client and server,
|
Background: `knowledge/manuals/IM36K10L45-01EN.md` (ODBC, OPC DA/A&E/UA client and server,
|
||||||
setup files), `IM36K10E20-01EN.md` (Engineering Module forms, certificates, PubSub). Equipment
|
setup files), `IM36K10E20-01EN.md` (Engineering Module forms, certificates, PubSub). Equipment
|
||||||
|
|
@ -28,6 +31,8 @@ Rules:
|
||||||
node's) DA/A&E server: deadlock (manual §5.3). The OPC **UA** loopback is fine.
|
node's) DA/A&E server: deadlock (manual §5.3). The OPC **UA** loopback is fine.
|
||||||
- Changing `opxsys.sup`, `opxuas.sup`, `odbsrv.sup` or `ServerConfig.xml` needs admin rights and
|
- Changing `opxsys.sup`, `opxuas.sup`, `odbsrv.sup` or `ServerConfig.xml` needs admin rights and
|
||||||
a restart: hand it to the user (skill `portal-setup`, task `change-setup-file.md`).
|
a restart: hand it to the user (skill `portal-setup`, task `change-setup-file.md`).
|
||||||
|
- The same applies to `dbc.sup` (RDBMS data exposure). SQL Server changes (mixed mode, logins,
|
||||||
|
jobs) are on another system: only with the user's and the SQL Server owner's agreement.
|
||||||
|
|
||||||
| Task | File | Status |
|
| Task | File | Status |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
|
|
@ -37,3 +42,4 @@ Rules:
|
||||||
| OPC DA / A&E client and server, DCOM, DCOM tunnelling | L45 summary §3–§5 | from docs (DA loopback not allowed) |
|
| OPC DA / A&E client and server, DCOM, DCOM tunnelling | L45 summary §3–§5 | from docs (DA loopback not allowed) |
|
||||||
| ODBC with SimbaClient | L45 summary §1 | from docs; ODBC server not running on the test system (ISS-008) |
|
| ODBC with SimbaClient | L45 summary §1 | from docs; ODBC server not running on the test system (ISS-008) |
|
||||||
| OPC UA alarms (external alarms), methods, PubSub | L45 §6, E20 §2–§4 | from docs |
|
| OPC UA alarms (external alarms), methods, PubSub | L45 §6, E20 §2–§4 | from docs |
|
||||||
|
| RDBMS data exposure to SQL Server: SQL login, `dbc.sup` `DEM_CONNECTION`, `DATA_EXPOSURE_DF` (filter syntax), item aggregation interval, checks, table behaviour, SQL-side retention | `tasks/rdbms-exposure.md` | tested in R1.05 only (`ITEM_VALUES`); `ITEM_HISTORY` / `ITEM_INPUTS` not tested |
|
||||||
|
|
|
||||||
263
.claude/skills/data-access/tasks/rdbms-exposure.md
Normal file
263
.claude/skills/data-access/tasks/rdbms-exposure.md
Normal file
|
|
@ -0,0 +1,263 @@
|
||||||
|
---
|
||||||
|
task: RDBMS data exposure — copy item values into Microsoft SQL Server (dbc.sup, DATA_EXPOSURE_DF, item aggregation interval)
|
||||||
|
version: R1.05
|
||||||
|
source: IM 36K10G10-01EN ch. 10 (§10.1, §10.2); IM 36K10C10-01EN §3.3 (Item management › Data exposure aggregation); installed tls\sup\dbc.sup, tls\src\data_exposure_df.dss, tls\src\item_df.dss; practiced on a user system 2026-10-02
|
||||||
|
status: tested in R1.05 only
|
||||||
|
---
|
||||||
|
|
||||||
|
# RDBMS data exposure to SQL Server
|
||||||
|
|
||||||
|
**Tested in R1.05 only** (CI Server R1.05.00 r11609M, user system, SQL Server 2022 Developer
|
||||||
|
Edition on a separate domain-joined host). Not re-tested on R1.03 or on CI-Eng-Sample (user
|
||||||
|
decision 2026-10-02). On the R1.03 development machine the files `dbc.sup`,
|
||||||
|
`data_exposure_df.dss` and `item_df.dss` were checked read-only and match what is described
|
||||||
|
here (`dbc.sup` is identical in R1.03 and R1.05).
|
||||||
|
|
||||||
|
**Changes live configuration on two systems** (SQL Server and CI Server): follow the user's
|
||||||
|
chosen way of working. SQL Server changes on a shared server need the owner's agreement.
|
||||||
|
|
||||||
|
## How it works
|
||||||
|
|
||||||
|
- `DBCSND` (sender) subscribes to the exposed CI Server data and sends it to `DBCDEM`
|
||||||
|
(receiver, the *data exposure module*), which writes it to SQL Server through ODBC.
|
||||||
|
`DEM_NODE = 0` in `dbc.sup` = receiver on the local node. `dbcdem.exe` is 64-bit.
|
||||||
|
- Each exposure is a record in dataset **`DATA_EXPOSURE_DF`** (Engineering Module: *Reporting ›
|
||||||
|
Data exposures*). CI Server creates the SQL table itself when the first record is exposed.
|
||||||
|
- For source **`ITEM_VALUES`**, rows are produced only for items whose **`ITEM_DF.AGG_INTERVAL`**
|
||||||
|
(item form › *Item management* › data exposure aggregation; 60 s–7 days, 0 = off, default 0)
|
||||||
|
is set. Each interval adds rows with the value, min, max, average and sample count.
|
||||||
|
- Other sources per the manual: `ITEM_HISTORY` (needs a filter; see ISS-058), `ITEM_INPUTS`
|
||||||
|
(values written in SQL go back to CI Server), any other dataset on change. Only
|
||||||
|
`ITEM_VALUES` was tested.
|
||||||
|
- Manual warning (not tested): **deleting a data exposure drops its target table**, even if
|
||||||
|
another exposure uses the same table.
|
||||||
|
|
||||||
|
## 1. SQL Server: read-only checks
|
||||||
|
|
||||||
|
In SSMS on the SQL host:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SELECT SERVERPROPERTY('IsIntegratedSecurityOnly') AS WindowsOnly; -- 1 = Windows only, 0 = mixed
|
||||||
|
EXEC xp_readerrorlog 0, 1, N'Server is listening on'; -- TCP port(s)
|
||||||
|
SELECT name, is_disabled FROM sys.server_principals WHERE name = 'sa';
|
||||||
|
```
|
||||||
|
|
||||||
|
From the CI Server:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
Test-NetConnection <sqlhost> -Port 1433
|
||||||
|
```
|
||||||
|
|
||||||
|
Pass: `TcpTestSucceeded : True`. If TCP 1433 already listens and the test passes, no TCP/IP or
|
||||||
|
firewall change is needed.
|
||||||
|
|
||||||
|
## 2. Choose the authentication
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
(Get-CimInstance Win32_Service -Filter "Name='StartCIServer'").StartName
|
||||||
|
```
|
||||||
|
|
||||||
|
The CI Service normally runs as the **local** account `.\CIX_PROCESS`, also on a domain-joined
|
||||||
|
CI Server. A SQL Server on another host cannot authenticate a local account, so Windows
|
||||||
|
authentication does not work there: use a **SQL login** (ISS-059). The manual's advice to add
|
||||||
|
`CIX_PROCESS` to SQL Server as a Windows user only applies when that account is known to the
|
||||||
|
SQL host (domain account, or SQL Server on the same machine).
|
||||||
|
|
||||||
|
## 3. SQL Server: mixed mode (only if `WindowsOnly = 1`)
|
||||||
|
|
||||||
|
Server › *Properties* › *Security* › **SQL Server and Windows Authentication mode**, then restart
|
||||||
|
the SQL Server service. The restart drops all connections on that server: agree a time with the
|
||||||
|
owner. Make sure `sa` is disabled or has a strong password first. Check: `WindowsOnly` = 0.
|
||||||
|
|
||||||
|
## 4. SQL Server: login with db_owner on one database
|
||||||
|
|
||||||
|
Create it at **server** level (*Security › Logins › New Login*), not under *Database › Security ›
|
||||||
|
Users* (that only maps an existing login). Do not call it `db_owner` (that is a role).
|
||||||
|
|
||||||
|
```sql
|
||||||
|
CREATE LOGIN <login> WITH PASSWORD = '<password>', DEFAULT_DATABASE = <database>, CHECK_POLICY = ON, CHECK_EXPIRATION = OFF;
|
||||||
|
USE <database>;
|
||||||
|
CREATE USER <login> FOR LOGIN <login>;
|
||||||
|
ALTER ROLE db_owner ADD MEMBER <login>;
|
||||||
|
```
|
||||||
|
|
||||||
|
`db_owner` is needed because CI Server creates (and may drop or recreate) its tables. Keep the
|
||||||
|
database for CI Server only.
|
||||||
|
|
||||||
|
## 5. CI Server: test the ODBC login
|
||||||
|
|
||||||
|
64-bit PowerShell on the CI Server (prompts for the password, reads only):
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$pw = Read-Host "password" -AsSecureString; $plain = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($pw)); $c = New-Object System.Data.Odbc.OdbcConnection("Driver={SQL Server};Server=<sqlhost>;Database=<database>;Uid=<login>;Pwd=$plain"); $c.Open(); $cmd = $c.CreateCommand(); $cmd.CommandText = "SELECT SUSER_NAME(), DB_NAME()"; $r = $cmd.ExecuteReader(); [void]$r.Read(); "{0} | {1}" -f $r[0], $r[1]; $c.Close()
|
||||||
|
```
|
||||||
|
|
||||||
|
Pass: `<login> | <database>`. The legacy `{SQL Server}` driver worked with SQL Server 2022.
|
||||||
|
|
||||||
|
## 6. CI Server: `DEM_CONNECTION` in `dbc.sup`
|
||||||
|
|
||||||
|
Admin rights; back up the file first. Change **only** the active `DEM_CONNECTION=` line near the
|
||||||
|
end (not the commented `! DEM_CONNECTION` in the `!DEFAULT` block):
|
||||||
|
|
||||||
|
```
|
||||||
|
DEM_CONNECTION="Driver={SQL Server};Server=<sqlhost>;Database=<database>;Uid=<login>;Pwd=<password>"
|
||||||
|
```
|
||||||
|
|
||||||
|
- The password is typed as is (no quotes or brackets). A `;` in it needs `Pwd={…}` (a `}` inside
|
||||||
|
is doubled); a `"` cannot be used.
|
||||||
|
- The password is plain text in the file. A system DSN (manual §10.2) only avoids that with
|
||||||
|
Windows authentication, which step 2 rules out for a remote SQL Server. Check who can read
|
||||||
|
`tls\sup` (ISS-061).
|
||||||
|
- Other `dbc.sup` keywords (queues, batches, retries, `ITH_GRAN_SEC`, `SND_BURST_RATE`,
|
||||||
|
`SND_AUTO_RECREATE`, `SND_NEED_SYNC`) were left at their defaults.
|
||||||
|
|
||||||
|
Restart CI Server (elevated, Edit/Engineering Module closed): `Restart-Service StartCIServer`.
|
||||||
|
|
||||||
|
## 7. Check the DBC processes
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
Get-Process dbcsnd, dbcdem -ErrorAction SilentlyContinue
|
||||||
|
```
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$m = Select-String -Path "$env:TLS_LOG_PATH\umhlog.log" -Pattern 'From: DBCSND'; $n = $m[-1].LineNumber; $a = Get-Content "$env:TLS_LOG_PATH\umhlog.log"; $a[($n-1)..($n+8)]
|
||||||
|
```
|
||||||
|
|
||||||
|
(Use the same with `From: DBCDEM`. `-Tail 300` can miss the block on a busy log.)
|
||||||
|
|
||||||
|
| Message | Meaning |
|
||||||
|
|---|---|
|
||||||
|
| `DBCDEM`: `DBC-I-DB_INI_OK, Database connection initialisation SUCCEEDED` | SQL connection works |
|
||||||
|
| `DBCDEM`: `FSL-F-SU_EOF, End of file on setup file` | Harmless, at every start |
|
||||||
|
| `DBCSND`: `DBC-I-DEM_CON, Connection established to data exposure module` | Sender running |
|
||||||
|
| `DBCSND`: `DSS-E-FLT_SYN_ERR` / `DSSF-E-CMP_NO_SUCC` / `DBC-E-DSS_SUB` / `DBC-E-SUB_DAT` / `DBC-E-DAT_HND`, then `DUR-W-REM_PROC, Process DBCSND exited unexpectedly` | A `RECORDS` filter does not compile (step 8). **One bad record stops all exposures.** DBCSND is not restarted automatically: fix, then restart CI Server |
|
||||||
|
|
||||||
|
## 8. Data exposure records
|
||||||
|
|
||||||
|
List existing ones (read-only):
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
dssqld -e dexp.qli -d DATA_EXPOSURE_DF -c -l dexp.lst
|
||||||
|
```
|
||||||
|
|
||||||
|
Fields (`tls\src\data_exposure_df.dss`): `NAME`, `DESCRIPTION`, `EXPOSED_DATA` (source dataset,
|
||||||
|
e.g. `ITEM_VALUES`), `REMOTE_TABLE`, `ENABLED`, `UPDATE_PERIOD`, `RECORDS` (filter),
|
||||||
|
`EXPOSED_FIELD_1`…`32` with `REMOTE_COL_1`…`32`, `REF_NAME/SOURCE/VALUE_1`…`8`, `ALL_FIELDS`.
|
||||||
|
|
||||||
|
Tested `ITEM_VALUES` record (`ENABLED` 1, `UPDATE_PERIOD` 0, `ALL_FIELDS` 0):
|
||||||
|
|
||||||
|
| Exposed field | Remote column |
|
||||||
|
|---|---|
|
||||||
|
| `NAME` | `NAME` |
|
||||||
|
| `VALUE` | `VALUE` |
|
||||||
|
| `VALUE.MIN` | `VALUE_MIN` |
|
||||||
|
| `VALUE.MAX` | `VALUE_MAX` |
|
||||||
|
| `VALUE.AVG` | `VALUE_AVG` |
|
||||||
|
| `VALUE.COUNT` | `VALUE_COUNT` |
|
||||||
|
| `TIMESTAMP` | `TIMESTAMP` |
|
||||||
|
|
||||||
|
**Filter syntax:** write the field name **without quotes**: `NAME LIKE "<Section>*"`. The manual's
|
||||||
|
example `"NAME" like "ABC*"` (quoted field) fails with `DSS-E-FLT_SYN_ERR` (ISS-057). In a quick
|
||||||
|
load file quotes inside a string are doubled. Write `.qli` files as ASCII
|
||||||
|
(`Set-Content -Encoding ascii`).
|
||||||
|
|
||||||
|
Change a field (here: fix the filter):
|
||||||
|
|
||||||
|
```
|
||||||
|
@FIELDS
|
||||||
|
NAME,RECORDS
|
||||||
|
|
||||||
|
@DATA_EXPOSURE_DF
|
||||||
|
"<exposure>","NAME LIKE ""<Section>*"""
|
||||||
|
```
|
||||||
|
|
||||||
|
`dssqld -m <file>.qli -l <file>.qlo` → 1 modified, 0 errors. Disable instead of deleting with
|
||||||
|
`NAME,ENABLED` / `"<exposure>",0`. Delete with `dssqld -r` and only the key
|
||||||
|
(`@FIELDS NAME`, `"<exposure>"`) → 1 removed — this drops the target table (manual).
|
||||||
|
|
||||||
|
## 9. Aggregation interval on the items
|
||||||
|
|
||||||
|
Read for a whole section (read-only; RQL `%` wildcard; verified also on R1.03):
|
||||||
|
|
||||||
|
```
|
||||||
|
set @next 0;
|
||||||
|
set @page_size 0;
|
||||||
|
select name, agg_interval from item_df where name like '<Section>.%';
|
||||||
|
quit;
|
||||||
|
```
|
||||||
|
|
||||||
|
`cmd /c "rptgen -s rptgen.rpt < agg.rql"` (skill `reporting`, task `rql-interactive.md`).
|
||||||
|
|
||||||
|
Set it with `dssqld -m`:
|
||||||
|
|
||||||
|
```
|
||||||
|
@FIELDS
|
||||||
|
NAME,AGG_INTERVAL
|
||||||
|
|
||||||
|
@ITEM_DF
|
||||||
|
"<Section>.<Tag>","1 Minutes"
|
||||||
|
```
|
||||||
|
|
||||||
|
`0` switches it off. The change took effect **without a CI Server restart**; rows appeared
|
||||||
|
within a few minutes.
|
||||||
|
|
||||||
|
## 10. Check the SQL table
|
||||||
|
|
||||||
|
```sql
|
||||||
|
USE <database>;
|
||||||
|
SELECT name, create_date FROM sys.tables WHERE name = '<table>';
|
||||||
|
SELECT COUNT(*) AS row_count, MIN([TIMESTAMP]) AS oldest FROM dbo.<table>;
|
||||||
|
SELECT TOP 20 NAME, VALUE, VALUE_MIN, VALUE_MAX, VALUE_AVG, VALUE_COUNT,
|
||||||
|
DATEADD(second, [TIMESTAMP], '1970-01-01') AS local_time
|
||||||
|
FROM dbo.<table> ORDER BY [TIMESTAMP] DESC;
|
||||||
|
```
|
||||||
|
|
||||||
|
Pass: the row count grows by about one row per item per interval.
|
||||||
|
|
||||||
|
## Behaviour observed (R1.05)
|
||||||
|
|
||||||
|
- Table created by CI Server: `NAME` varchar, `VALUE`/`VALUE_MIN`/`VALUE_MAX`/`VALUE_AVG`
|
||||||
|
float, `VALUE_COUNT` int, `TIMESTAMP` int; clustered key (`NAME`, `TIMESTAMP`). Rows are
|
||||||
|
inserted (the table is a history), not updated.
|
||||||
|
- `TIMESTAMP` = seconds since 1970 in CI Server **local time** (like RQL dates). Readable:
|
||||||
|
`DATEADD(second, [TIMESTAMP], '1970-01-01')`.
|
||||||
|
- `VALUE_COUNT` = updates in the interval (an analog item updated every second ≈ 55 per minute;
|
||||||
|
a steady item 1).
|
||||||
|
- Interval boundaries follow the start of exposure (e.g. :23 s), not the clock minute.
|
||||||
|
- In one snapshot, steady items had no row for the latest interval while changing items did
|
||||||
|
(ISS-060). Until that is clear, read a steady item's value at time T as its last row at or
|
||||||
|
before T.
|
||||||
|
- Rows **survive a CI Server restart** with `SND_NEED_SYNC = YES` (oldest timestamp unchanged,
|
||||||
|
count kept growing).
|
||||||
|
- Existing history is not back-filled: data starts when exposure starts.
|
||||||
|
- Volume: about one row per item per interval (49 items at 1 minute ≈ 70,000 rows a day).
|
||||||
|
Nothing deletes old rows.
|
||||||
|
|
||||||
|
## Optional: retention on the SQL side
|
||||||
|
|
||||||
|
Not part of CI Server. A SQL Server Agent job (not available on SQL Express) that deletes old
|
||||||
|
rows in small batches so CI Server's inserts are not blocked; owner `sa` works even with `sa`
|
||||||
|
disabled:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
USE msdb;
|
||||||
|
EXEC dbo.sp_add_job @job_name = N'<job>', @owner_login_name = N'sa';
|
||||||
|
EXEC dbo.sp_add_jobstep @job_name = N'<job>', @step_name = N'Delete old rows',
|
||||||
|
@subsystem = N'TSQL', @database_name = N'<database>', @command = N'
|
||||||
|
DECLARE @cutoff int = DATEDIFF(second, ''1970-01-01'', DATEADD(day, -<days>, GETDATE()));
|
||||||
|
DECLARE @n int = 1;
|
||||||
|
WHILE @n > 0
|
||||||
|
BEGIN
|
||||||
|
DELETE TOP (5000) FROM dbo.<table> WHERE [TIMESTAMP] < @cutoff;
|
||||||
|
SET @n = @@ROWCOUNT;
|
||||||
|
IF @n > 0 WAITFOR DELAY ''00:00:01'';
|
||||||
|
END';
|
||||||
|
EXEC dbo.sp_add_schedule @schedule_name = N'<job> daily 03:00', @freq_type = 4, @freq_interval = 1, @active_start_time = 030000;
|
||||||
|
EXEC dbo.sp_attach_schedule @job_name = N'<job>', @schedule_name = N'<job> daily 03:00';
|
||||||
|
EXEC dbo.sp_add_jobserver @job_name = N'<job>', @server_name = N'(local)';
|
||||||
|
```
|
||||||
|
|
||||||
|
Test: `EXEC msdb.dbo.sp_start_job @job_name = N'<job>';` then `msdb.dbo.sysjobhistory`
|
||||||
|
(`run_status` 1 = succeeded). Change the retention later with `sp_update_jobstep` (and
|
||||||
|
`sp_update_job @new_name` if the name contains the period). `GETDATE()` uses the SQL host's
|
||||||
|
clock; a different time zone only shifts the cut-off by hours.
|
||||||
|
|
@ -35,6 +35,13 @@ Run from the repo root, preferably elevated. Changes nothing. One line per check
|
||||||
The first lines show the version and build (e.g. `R1.03.00 … (r10200M)`).
|
The first lines show the version and build (e.g. `R1.03.00 … (r10200M)`).
|
||||||
- The web ports actually used are `SECURE_PORT_NUMBER` / `NON_SECURE_PORT_NUMBER` in
|
- The web ports actually used are `SECURE_PORT_NUMBER` / `NON_SECURE_PORT_NUMBER` in
|
||||||
`%TLS_ROOT_PATH%\tls\sup\jwuiisg.sup` (8443 / 8080 by default).
|
`%TLS_ROOT_PATH%\tls\sup\jwuiisg.sup` (8443 / 8080 by default).
|
||||||
|
- Folder rights (not in the script): setup files can hold passwords (e.g. `dbc.sup`). Check
|
||||||
|
who can read and change them:
|
||||||
|
`foreach ($r in (Get-Acl "$env:TLS_ROOT_PATH\tls\sup").Access) { "{0} : {1}" -f $r.IdentityReference, $r.FileSystemRights }`.
|
||||||
|
Under Program Files, Users can read; an install outside Program Files (e.g.
|
||||||
|
`C:\Yokogawa\CIServer`, seen on an R1.05 system) can inherit *Authenticated Users: Modify*,
|
||||||
|
so any signed-in user can change setup files (ISS-061). Fixing it is a site decision (IT
|
||||||
|
Security Tool).
|
||||||
|
|
||||||
## Test system result (2026-09-30)
|
## Test system result (2026-09-30)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -76,3 +76,8 @@ development system (see "Test system" in `progress.md`); they do not exist on ot
|
||||||
| 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-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` |
|
||||||
| 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-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 |
|
||||||
|
| ISS-059 | 2026-10-02 | DATA EXPOSURE (authentication) | IM 36K10G10 §10.2 says to add the `CIX_PROCESS` account to SQL Server as a Windows user (db_owner) in a domain. The CI Service runs as the **local** `.\CIX_PROCESS` (also on the user's domain-joined R1.05 CI Server), which a SQL Server on another host cannot authenticate. | closed | Closed 2026-10-02 (confirmed by user): use a SQL login with db_owner on the target database; SQL Server set to mixed mode (needs a SQL Server restart). Windows authentication only if the SQL host knows the account (not tested). Tested in R1.05 only. | `.claude/skills/data-access/tasks/rdbms-exposure.md` (done); `knowledge/manuals/IM36K10G10-01EN.md` (done) |
|
||||||
|
| ISS-060 | 2026-10-02 | DATA EXPOSURE (rows of steady items) | IM 36K10G10 ch. 10 says `ITEM_VALUES` is exposed once per interval, with the aggregation time as timestamp when the item did not change. In one snapshot on R1.05 (1-minute interval), changing items had rows at 02:13:23 while steady items (`VALUE_COUNT` 1) were still at 02:12:24. Whether steady items get a row every interval (maybe written later) or only after an update is not known. | open | Count rows per item over one hour (`SELECT NAME, COUNT(*) … WHERE [TIMESTAMP] > … GROUP BY NAME`) and compare steady with changing items. Until then the task says: take a steady item's last row at or before T. | `.claude/skills/data-access/tasks/rdbms-exposure.md` |
|
||||||
|
| ISS-061 | 2026-10-02 | INSTALLATION (folder permissions) | On the user's R1.05 system installed in `C:\Yokogawa\CIServer` (outside Program Files) `tls\sup` and `dbc.sup` inherit **Authenticated Users: Modify** (plus Users: Read): any signed-in user can read the SQL password in `dbc.sup` and change setup files. On the R1.03 development machine (Program Files) `tls\sup` gives Users: ReadAndExecute (read still possible, no write). | closed | Closed 2026-10-02 (user decision: shared internal dev/demo server, left as is). Option if needed, not applied or tested: `icacls <dbc.sup> /inheritance:r /grant:r "SYSTEM:(F)" "Administrators:(F)" "CIX_PROCESS:(R)"`; folder rights in general are set by the IT Security Tool. | `.claude/skills/installation-security/tasks/setup-check.md` (done); `.claude/skills/data-access/tasks/rdbms-exposure.md` (done) |
|
||||||
|
|
|
||||||
|
|
@ -141,7 +141,9 @@ recommended; tag and type cannot be changed (delete and recreate).
|
||||||
immediately* (keep value/status/quality over a warm restart instead of NOT INIT), process
|
immediately* (keep value/status/quality over a warm restart instead of NOT INIT), process
|
||||||
areas, comment 1/2, map position (WGS 84 latitude/longitude).
|
areas, comment 1/2, map position (WGS 84 latitude/longitude).
|
||||||
- *Item management*: blocked, OPC visible (+ read/write; also needs the section visible),
|
- *Item management*: blocked, OPC visible (+ read/write; also needs the section visible),
|
||||||
alarm inhibit, parent flags, data exposure aggregation interval (60 s–7 days, 0 = off).
|
alarm inhibit, parent flags, data exposure aggregation interval (60 s–7 days, 0 = off;
|
||||||
|
dataset field `ITEM_DF.AGG_INTERVAL`, e.g. `"1 Minutes"` by quick load; only for RDBMS
|
||||||
|
exposure of `ITEM_VALUES`, task `data-access/rdbms-exposure.md`, tested in R1.05 only).
|
||||||
- *Limits and filtering*: HH/H/L/LL, deadband (values may be rounded), scale high/low, limit
|
- *Limits and filtering*: HH/H/L/LL, deadband (values may be rounded), scale high/low, limit
|
||||||
clamping (HH-LL, H-L, scale, none), out-of-range support, trend axis limits, PIT values.
|
clamping (HH-LL, H-L, scale, none), out-of-range support, trend axis limits, PIT values.
|
||||||
String items: max length, default 80. The manual says max 100; the installed software
|
String items: max length, default 80. The manual says max 100; the installed software
|
||||||
|
|
|
||||||
|
|
@ -95,7 +95,12 @@ skill `audit-trail`.
|
||||||
**RDBMS exposure (ch. 10)**: copies CI Server data (`ITEM_VALUES` aggregated per interval,
|
**RDBMS exposure (ch. 10)**: copies CI Server data (`ITEM_VALUES` aggregated per interval,
|
||||||
`ITEM_HISTORY` with a mandatory filter, `ITEM_INPUTS` for writes back, or any dataset on
|
`ITEM_HISTORY` with a mandatory filter, `ITEM_INPUTS` for writes back, or any dataset on
|
||||||
change) into SQL tables. Configure the connection string or system DSN in `dbc.sup`; with
|
change) into SQL tables. Configure the connection string or system DSN in `dbc.sup`; with
|
||||||
Windows authentication add `CIX_PROCESS` to SQL Server (db_owner).
|
Windows authentication add `CIX_PROCESS` to SQL Server (db_owner). Deleting an exposure drops
|
||||||
|
its target table. **Tested in R1.05 only** for `ITEM_VALUES` (skill `data-access`, task
|
||||||
|
`rdbms-exposure.md`): the manual's filter example with a quoted field name (`"NAME" like
|
||||||
|
"ABC*"`) fails (ISS-057); the installed `dbc.sup` change log says ITEM_HISTORY support was
|
||||||
|
removed (ISS-058); with the local `.\CIX_PROCESS` a remote SQL Server needs a SQL login
|
||||||
|
(ISS-059).
|
||||||
|
|
||||||
**Other**: Item search (wildcards, copy/drag to Excel or Trend); Excel Add-in reports;
|
**Other**: Item search (wildcards, copy/drag to Excel or Trend); Excel Add-in reports;
|
||||||
history storage groups and archiving (phase 9).
|
history storage groups and archiving (phase 9).
|
||||||
|
|
|
||||||
|
|
@ -180,3 +180,24 @@ and 2.0, custom + automation interfaces), A&E client (`opxaec`), A&E server (`op
|
||||||
suggested test client.
|
suggested test client.
|
||||||
- Discovery: LDS on 4840 only when several servers are on a host; GDS for central certificate
|
- Discovery: LDS on 4840 only when several servers are on a host; GDS for central certificate
|
||||||
management (concepts only).
|
management (concepts only).
|
||||||
|
|
||||||
|
## 8. RDBMS data exposure (not in this manual)
|
||||||
|
|
||||||
|
IM 36K10L45 does not describe RDBMS data exposure; it is in the Tutorial (IM 36K10G10 ch. 10)
|
||||||
|
and the item form (IM 36K10C10 §3.3). Summary here because it is an ACCESS-type interface;
|
||||||
|
**tested in R1.05 only** (user system, 2026-10-02; R1.03 files checked read-only and identical).
|
||||||
|
Procedure: skill `data-access`, task `rdbms-exposure.md`.
|
||||||
|
|
||||||
|
- Processes `DBCSND` (sender, subscribes to DSS data) and `DBCDEM` (receiver, writes to MS SQL
|
||||||
|
Server via ODBC); setup file `dbc.sup` (sender and receiver tabs; connection string
|
||||||
|
`DEM_CONNECTION`, default `Driver={SQL Server};Server=localhost\SQLEXPRESS;…`).
|
||||||
|
- Exposures are records in `DATA_EXPOSURE_DF` (source dataset, remote table, filter `RECORDS`,
|
||||||
|
up to 32 field → column pairs or all fields). The target table is created by CI Server.
|
||||||
|
- `ITEM_VALUES` exposure is driven by the per-item aggregation interval `ITEM_DF.AGG_INTERVAL`
|
||||||
|
(60 s–7 days, 0 = off): value, min, max, average, count and a local-time `TIMESTAMP` (seconds
|
||||||
|
since 1970) per interval.
|
||||||
|
- Filter field names must not be quoted (`NAME LIKE "<Section>*"`); the manual's quoted example
|
||||||
|
fails and stops all exposures (ISS-057). `ITEM_HISTORY` exposure: manual vs installed change
|
||||||
|
log disagree (ISS-058).
|
||||||
|
- The CI Service account `.\CIX_PROCESS` is local, so a remote SQL Server needs a SQL login and
|
||||||
|
mixed mode (ISS-059).
|
||||||
|
|
|
||||||
|
|
@ -109,7 +109,7 @@ now come before classes and objects (phase 6), and the other interfaces follow a
|
||||||
| C10 | Integrator time unit: integration granule `itm_int_secs` in `itm.sup` ([task](../.claude/skills/item-engineering/tasks/sub-items.md)) | passed | passed | 60 → `RUN_SECONDS` +1 per minute; restored to 1 (file identical to backup), +1 per second again ([ISS-010](issues.md)). Elevated restarts run by the user. |
|
| C10 | Integrator time unit: integration granule `itm_int_secs` in `itm.sup` ([task](../.claude/skills/item-engineering/tasks/sub-items.md)) | passed | passed | 60 → `RUN_SECONDS` +1 per minute; restored to 1 (file identical to backup), +1 per second again ([ISS-010](issues.md)). Elevated restarts run by the user. |
|
||||||
| G10 | Displays, symbols, Operator Interface test | display done (phase 10); symbols not practiced | display added | Display `CIENG_Tank` built in the Edit Module and checked in the HTML display. |
|
| G10 | Displays, symbols, Operator Interface test | display done (phase 10); symbols not practiced | display added | Display `CIENG_Tank` built in the Edit Module and checked in the HTML display. |
|
||||||
| L41/C10 | Modbus TCP line, station, scan type, points, connected items by quick load ([task](../.claude/skills/equipment/tasks/modbus-station.md)) | passed | passed | Loopback to CI Server's own Modbus slave (`eqpmdcmem` + `eqpmdcslvtcp` on 5020, started by hand). Line load created and started `EQPCIENG`; removal stopped it and deleted its files. Write/read-back, off-scan/on-scan checked; full remove/reload from sample files. Protocol must be Open Modbus/TCP ([ISS-024](issues.md)). Mirror start files copied to `tls\com` by the user; after a restart everything came back under the CI Service and the setpoint was re-sent on connect. |
|
| L41/C10 | Modbus TCP line, station, scan type, points, connected items by quick load ([task](../.claude/skills/equipment/tasks/modbus-station.md)) | passed | passed | Loopback to CI Server's own Modbus slave (`eqpmdcmem` + `eqpmdcslvtcp` on 5020, started by hand). Line load created and started `EQPCIENG`; removal stopped it and deleted its files. Write/read-back, off-scan/on-scan checked; full remove/reload from sample files. Protocol must be Open Modbus/TCP ([ISS-024](issues.md)). Mirror start files copied to `tls\com` by the user; after a restart everything came back under the CI Service and the setpoint was re-sent on connect. |
|
||||||
| G10 | Alarms, reports, audit, RDBMS, history | alarms (phase 8), history (phase 9), reports (phase 11), audit (phase 12) done; RDBMS not practiced | alarms, history, reports, audit added | Covered in their own phases (7–12). |
|
| G10 | Alarms, reports, audit, RDBMS, history | alarms (phase 8), history (phase 9), reports (phase 11), audit (phase 12) done; RDBMS passed on a user R1.05 system (see the RDBMS row below) | alarms, history, reports, audit added; RDBMS n/a (tested in R1.05 only) | Covered in their own phases (7–12); RDBMS added 2026-10-02. |
|
||||||
| R10/R20 | Read a setup file: active settings and keyword help ([task](../.claude/skills/portal-setup/tasks/read-setup-file.md)) | passed | n/a | Read-only. Compared with the Setup File Editor GUI for `wfla_display.sup`, `wflgdi.sup` and all 9 tabs of `jwuiisg.sup`: fields and values identical. Manual differences logged as ISS-012 to ISS-017 (installed software taken as the reference). |
|
| R10/R20 | Read a setup file: active settings and keyword help ([task](../.claude/skills/portal-setup/tasks/read-setup-file.md)) | passed | n/a | Read-only. Compared with the Setup File Editor GUI for `wfla_display.sup`, `wflgdi.sup` and all 9 tabs of `jwuiisg.sup`: fields and values identical. Manual differences logged as ISS-012 to ISS-017 (installed software taken as the reference). |
|
||||||
| R10 | Check web access for CI View: ports, Remote Connect page, `DEPLOY` folder ([task](../.claude/skills/portal-setup/tasks/check-web-access.md)) | passed | n/a | 8080/8443 listening, page 200, six `DEPLOY` folders. |
|
| R10 | Check web access for CI View: ports, Remote Connect page, `DEPLOY` folder ([task](../.claude/skills/portal-setup/tasks/check-web-access.md)) | passed | n/a | 8080/8443 listening, page 200, six `DEPLOY` folders. |
|
||||||
| R10/R20 | Change a setup file safely ([task](../.claude/skills/portal-setup/tasks/change-setup-file.md)) | passed | n/a | `jwuiisg.sup` HTTP port 8080 → 8081 (text edit, elevated restart): 8081 served the page, 8080 refused; restored, hash identical to backup. Editor: *OK* writes at once, *Reset Field* restores the default (ISS-016). |
|
| R10/R20 | Change a setup file safely ([task](../.claude/skills/portal-setup/tasks/change-setup-file.md)) | passed | n/a | `jwuiisg.sup` HTTP port 8080 → 8081 (text edit, elevated restart): 8081 served the page, 8080 refused; restored, hash identical to backup. Editor: *OK* writes at once, *Reset Field* restores the default (ISS-016). |
|
||||||
|
|
@ -117,6 +117,7 @@ now come before classes and objects (phase 6), and the other interfaces follow a
|
||||||
| R10 | Login method / login control | not practiced | n/a | Moved to `dssana.sup` (ISS-017); phase 5 (C10) and 13 (J40). |
|
| R10 | Login method / login control | not practiced | n/a | Moved to `dssana.sup` (ISS-017); phase 5 (C10) and 13 (J40). |
|
||||||
| L45/E20 | OPC UA client → own OPC UA server loopback by quick load; certificate exchange; node IDs ([task](../.claude/skills/data-access/tasks/opcua-client.md)) | passed | passed | Station `CIENG_UA` (`opc.tcp://localhost:34493`, Basic256Sha256/SignAndEncrypt): `UA.LEVEL_COPY` follows `TANK1.LEVEL` (55, 62.5, 71, 33, 44.4), `UA.SRV_STATE` 0. Certificates trusted by the user (client side, then server side). Entity namespace `urn:Yokogawa:CI_SERVER_OPC_UA_SERVER` found by browsing `OPCUAC_TAG_DF` (ISS-032). Full remove/reload clean, reconnects without a new exchange. User configured a point in the Engineering Module: browse stores the item object, value node must be typed (ISS-033); test item/point removed afterwards. |
|
| L45/E20 | OPC UA client → own OPC UA server loopback by quick load; certificate exchange; node IDs ([task](../.claude/skills/data-access/tasks/opcua-client.md)) | passed | passed | Station `CIENG_UA` (`opc.tcp://localhost:34493`, Basic256Sha256/SignAndEncrypt): `UA.LEVEL_COPY` follows `TANK1.LEVEL` (55, 62.5, 71, 33, 44.4), `UA.SRV_STATE` 0. Certificates trusted by the user (client side, then server side). Entity namespace `urn:Yokogawa:CI_SERVER_OPC_UA_SERVER` found by browsing `OPCUAC_TAG_DF` (ISS-032). Full remove/reload clean, reconnects without a new exchange. User configured a point in the Engineering Module: browse stores the item object, value node must be typed (ISS-033); test item/point removed afterwards. |
|
||||||
| L45 | ACCESS read-only checks: processes, ports, OPC UA server config/PKI, ODBC server ([task](../.claude/skills/data-access/tasks/access-checks.md)) | passed | n/a | ISS-008 cause found: `odbsrv` cannot load its SSL certificate (folder `tls\pki\odbsrv` missing) and exits. |
|
| L45 | ACCESS read-only checks: processes, ports, OPC UA server config/PKI, ODBC server ([task](../.claude/skills/data-access/tasks/access-checks.md)) | passed | n/a | ISS-008 cause found: `odbsrv` cannot load its SSL certificate (folder `tls\pki\odbsrv` missing) and exits. |
|
||||||
|
| G10/C10 | RDBMS data exposure to SQL Server: SQL login, `dbc.sup` `DEM_CONNECTION`, `DATA_EXPOSURE_DF`, `ITEM_DF.AGG_INTERVAL`, SQL-side retention job ([task](../.claude/skills/data-access/tasks/rdbms-exposure.md)) | passed (R1.05 only) | n/a — tested in R1.05 only (user decision) | 2026-10-02 on the user's R1.05.00 system (not the R1.03 dev machine): 49 `AID.WRPS.*` items at 1 minute into a remote SQL Server 2022; rows survive a CI Server restart; 60-day purge job. Quoted filter field stopped DBCSND ([ISS-057](issues.md)); ITEM_HISTORY not tested ([ISS-058](issues.md)); SQL login needed ([ISS-059](issues.md)); steady-item rows ([ISS-060](issues.md)); folder rights ([ISS-061](issues.md)). R1.03 `dbc.sup` and dataset definitions checked read-only (identical). |
|
||||||
| L30 | BUS utilities: `durwfp`, setup files (`dur.sup`, `durm_1_udp.sup`, `time_table.sup`, `fmfprt.sup`) ([task](../.claude/skills/system-management/tasks/bus-utilities.md)) | passed (read-only) | n/a | `umhman`, `umhtestprog`, `umhmsg` fail (ISS-030). Unlicensed run-time limit hit and documented (ISS-031). |
|
| L30 | BUS utilities: `durwfp`, setup files (`dur.sup`, `durm_1_udp.sup`, `time_table.sup`, `fmfprt.sup`) ([task](../.claude/skills/system-management/tasks/bus-utilities.md)) | passed (read-only) | n/a | `umhman`, `umhtestprog`, `umhmsg` fail (ISS-030). Unlicensed run-time limit hit and documented (ISS-031). |
|
||||||
| L30 | MDUR node links, encryption, logical addresses, printer devices | not practiced | n/a | Single node, no printer devices. |
|
| L30 | MDUR node links, encryption, logical addresses, printer devices | not practiced | n/a | Single node, no printer devices. |
|
||||||
| L55 | CI Exchange for CENTUM VP / Prodigy | not practiced | n/a | Needs CENTUM VP (RGS, Vnet/IP) or Prodigy data. |
|
| L55 | CI Exchange for CENTUM VP / Prodigy | not practiced | n/a | Needs CENTUM VP (RGS, Vnet/IP) or Prodigy data. |
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue