Merge pull request 'R1.05 re-check batch 3: alarms, audit, authorization, classes, HAC, reporting, pyTOOLS' (#29) from docs/r105-recheck-batch3 into main
Reviewed-on: #29
This commit is contained in:
commit
698dfad0f0
53 changed files with 1826 additions and 304 deletions
|
|
@ -1,25 +1,38 @@
|
||||||
---
|
---
|
||||||
name: alarm-management
|
name: alarm-management
|
||||||
description: >-
|
description: >-
|
||||||
CI Server R1.03 ALARM Service and alarm engineering. Use when the user wants to switch on
|
CI Server R1.05 ALARM Service and alarm engineering. Use when the user wants to switch on
|
||||||
alarms for an item (alarming, limits, HIGH / HIGH HIGH / LOW alarms, alarm state, priority,
|
alarms for an item (alarming, limits, HIGH / HIGH HIGH / LOW alarms, alarm state, priority,
|
||||||
alarm text), set up acknowledgement types (manual / automatic acknowledgement, ack matrix,
|
alarm text), set up acknowledgement types (manual / automatic acknowledgement, ack matrix,
|
||||||
ALARM_ACK_DF), areas of interest (AOI), alarm selection areas (ASA, alarm filter expressions,
|
ALARM_ACK_DF), areas of interest (AOI), alarm selection areas (ASA, alarm filter expressions,
|
||||||
compile), delayed or repeated alarms, first-out groups, alarm collections (first-up), read or
|
compile), delayed or repeated alarms, first-out groups, alarm collections (first-up), read or
|
||||||
acknowledge current alarms and alarm history (ALARM_CURRENT, ALARM_CHRONO), generate a test or
|
acknowledge current alarms and alarm history (ALARM_CURRENT, ALARM_CHRONO), acknowledge with a
|
||||||
informational event, check the alarm kernel or storage (ALM, ALH, ALDPRT, almdbg, alhdbg,
|
reason and approver (custom alarm acknowledgement), generate a test or informational event,
|
||||||
alm.sup, alh.sup, aldprt.sup), configure alarm e-mail / SMS notification (alnmgr, alnsmtp),
|
check the alarm kernel or storage (ALM, ALH, ALDPRT, almdbg, alhdbg, alm.sup, alh.sup,
|
||||||
alarm shelving (asbman), alarm sound (aldaco), alarm counting (aldcnt), external alarms (EAL,
|
aldprt.sup, ?*_alarm_start.cmd extension scripts), configure alarm e-mail / SMS notification
|
||||||
OPC UA alarms, CENTUM VP Vnet alarms) or analyse alarm performance (ASPA, alarm floods, KPIs,
|
(alnmgr, alnsmtp, alnsms), alarm shelving (asbman), alarm sound (aldaco), alarm counting
|
||||||
EEMUA 191, ISA 18.2). Sources IM 36K10L15-01EN, IM 36K10C20-01EN, IM 36K10E30-01EN.
|
(aldcnt), external alarms (EAL, OPC UA alarms, CENTUM VP Vnet alarms), analyse alarm
|
||||||
|
performance (ASPA, alarm floods, KPIs, EEMUA 191, ISA 18.2, KPI charts In Time / Too Late /
|
||||||
|
Not Ackn / Nuisance), or ask about the internal dataset ALARM_ATTRIBUTE_TEMP_DF. Sources
|
||||||
|
IM 36K10L15-01EN, IM 36K10C20-01EN, IM 36K10E30-01EN.
|
||||||
---
|
---
|
||||||
|
|
||||||
# Alarm management (R1.03)
|
# Alarm management (R1.05)
|
||||||
|
|
||||||
|
Re-checked for R1.05 on 2026-10-09 (read-only). The L15 and C20 manuals did not change in
|
||||||
|
substance (full text diff), E30 only got KPI chart labels. The installed alarm setup files,
|
||||||
|
setup templates and alarm dataset definitions are identical to R1.03, except: the start/stop
|
||||||
|
scripts call extension scripts, `alnsms.sup` has new defaults, and there is a new internal
|
||||||
|
dataset `ALARM_ATTRIBUTE_TEMP_DF` (details in `tasks/alarm-checks.md` §5). Paths below use the
|
||||||
|
`TLS_*` variables; the R1.05 test server has program and data under one root (see
|
||||||
|
`knowledge/version-differences.md`).
|
||||||
|
|
||||||
Background: `knowledge/manuals/IM36K10L15-01EN.md` (kernel, events, mechanisms, setup files,
|
Background: `knowledge/manuals/IM36K10L15-01EN.md` (kernel, events, mechanisms, setup files,
|
||||||
debuggers), `IM36K10C20-01EN.md` (Engineering Module forms, filters, grouping, shelving,
|
debuggers), `IM36K10C20-01EN.md` (Engineering Module forms, filters, grouping, shelving,
|
||||||
notifications, external alarms), `IM36K10E30-01EN.md` (ASPA tool and KPI targets). Item limits
|
notifications, external alarms), `IM36K10E30-01EN.md` (ASPA tool and KPI targets). Item limits
|
||||||
and statuses: skill `item-engineering`. OPC UA alarm sources: skill `data-access`.
|
and statuses: skill `item-engineering`. OPC UA alarm sources: skill `data-access`. Display-side
|
||||||
|
acknowledgement with reason and approver: skill `graphics` (`tasks/create-display.md`);
|
||||||
|
the audit record: skill `audit-trail`.
|
||||||
|
|
||||||
Rules:
|
Rules:
|
||||||
- Run `system-check` first; follow the user's chosen way of working.
|
- Run `system-check` first; follow the user's chosen way of working.
|
||||||
|
|
@ -29,20 +42,29 @@ Rules:
|
||||||
(L15 summary, C20 §A2).
|
(L15 summary, C20 §A2).
|
||||||
- Writing a value to force a test alarm changes live data (`system-management`, task
|
- Writing a value to force a test alarm changes live data (`system-management`, task
|
||||||
`read-write-item.md`): only on test items, and restore the value.
|
`read-write-item.md`): only on test items, and restore the value.
|
||||||
|
- **The alarm storage process `ALH` serves every client.** Do not put an alarm overview
|
||||||
|
filtered by an ASA on `SECTION` or `UNIT` on a display of a shared or production server, and
|
||||||
|
do not run heavy alarm queries (`ALARM_CHRONO` without a narrow time range, big ASPA fetches):
|
||||||
|
on the shared R1.05 test server such an overview kept `ALH` at a full CPU core and made every
|
||||||
|
other alarm list time out (ISS-136). Filter by item name or AOI, or use small item-based
|
||||||
|
lists.
|
||||||
- `almdbg` options 3, 13, 15, 17, 19, 20, 25, 26 and `alhdbg` 3, 4 change or stop things:
|
- `almdbg` options 3, 13, 15, 17, 19, 20, 25, 26 and `alhdbg` 3, 4 change or stop things:
|
||||||
never without approval. Read-only options are listed in `tasks/alarm-checks.md`.
|
never without approval. Read-only options are listed in `tasks/alarm-checks.md`.
|
||||||
- Setup files (`alm.sup`, `alh.sup`, `aldprt.sup`, `aln*.sup`, `asbman.sup`, `wfladi.sup`) need
|
- Setup files (`alm.sup`, `alh.sup`, `aldprt.sup`, `aln*.sup`, `asbman.sup`, `wfladi.sup`) need
|
||||||
admin rights and a restart: hand changes to the user (skill `portal-setup`, task
|
admin rights and a restart: hand changes to the user (skill `portal-setup`, task
|
||||||
`change-setup-file.md`).
|
`change-setup-file.md`). To start an extra alarm process (e.g. `aldcnt`, `alnsms`) with
|
||||||
|
CI Server on R1.05, prefer an extension script `<name>_alarm_start.cmd` /
|
||||||
|
`<name>_alarm_stop.cmd` in `tls\com` over editing `alarm_start.cmd` (ISS-121).
|
||||||
|
|
||||||
| Task | File | Status |
|
| Task | File | Status |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Acknowledgement type, area of interest, alarm selection area by quick load; compile check | `tasks/alarm-definitions.md` | verified |
|
| Acknowledgement type, area of interest, alarm selection area by quick load; compile check | `tasks/alarm-definitions.md` | verified (R1.03); R1.05: dataset definitions identical, sample definitions loaded with 0 errors (load check only, 2026-10-08) |
|
||||||
| Switch on alarming for an item; delay / repeat; test an alarm; read and acknowledge current alarms and history | `tasks/item-alarming.md` | verified |
|
| Switch on alarming for an item; delay / repeat; test an alarm; read and acknowledge current alarms and history | `tasks/item-alarming.md` | verified (R1.03); R1.05: definitions identical, sample item alarm loaded with 0 errors (2026-10-08); alarm behaviour not re-tested on the shared server |
|
||||||
| Read-only checks: alarm processes, destinations, statistics, item alarm parameters, storage group, setup files; generate an INFO event | `tasks/alarm-checks.md` | verified |
|
| Read-only checks: alarm processes, destinations, statistics, ack types, storage group, setup files; generate an INFO event | `tasks/alarm-checks.md` | verified (R1.03; read-only checks re-run on R1.05 2026-10-09; INFO event not generated on R1.05) |
|
||||||
|
| Custom alarm acknowledgement with reason and approver (display properties, `AUDIT_TRAIL` `APPROVAL_REASON` / `APPROVER`) | `tasks/item-alarming.md` §4, skill `graphics` | from docs (R1.04+), not tested (ISS-099) |
|
||||||
| First-out groups, alarm collections (first-up, status/ack/reset items) | C20 summary §A6 | from docs |
|
| First-out groups, alarm collections (first-up, status/ack/reset items) | C20 summary §A6 | from docs |
|
||||||
| Alarm overviews, priority labels, link display, shelving | C20 summary §A3, §A9, §A10 | from docs (needs displays, phase 10) |
|
| Alarm overviews, priority labels, link display, shelving | C20 summary §A3, §A9, §A10 | from docs (needs displays) |
|
||||||
| E-mail / SMS notification | L15 summary §10, C20 §A11 | from docs (needs an SMTP server without authentication) |
|
| E-mail / SMS notification | L15 summary §10, C20 §A11 | from docs (needs an SMTP server without authentication / a GSM modem); R1.05 `alnsms.sup` defaults changed (ISS-134) |
|
||||||
| Acoustic (`aldaco`) and count (`aldcnt`) destinations, split storage processes | L15 summary §7, §8 | from docs |
|
| Acoustic (`aldaco`) and count (`aldcnt`) destinations, split storage processes | L15 summary §7, §8 | from docs |
|
||||||
| External alarms (EAL) from OPC UA servers or CENTUM VP | C20 summary part B | from docs (no A&C source / Vnet on the test system) |
|
| External alarms (EAL) from OPC UA servers or CENTUM VP | C20 summary part B | from docs; not tested on R1.05 (no A&C source or Vnet on the test server, no EAL defined) |
|
||||||
| Alarm performance analysis (ASPA) | E30 summary | from docs |
|
| Alarm performance analysis (ASPA) | E30 summary | from docs (GUI not opened on either version) |
|
||||||
|
|
|
||||||
|
|
@ -1,24 +1,27 @@
|
||||||
---
|
---
|
||||||
task: Read-only checks of ALARM Service; generate an informational test event
|
task: Read-only checks of ALARM Service; generate an informational test event
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10L15-01EN §1, §2.6, §3.4, §4.3, §6; IM 36K10C20-01EN §A7; practiced on the test system 2026-10-01
|
source: IM 36K10L15-01EN §1, §2.6, §3.4, §4.3, §6; IM 36K10C20-01EN §A7 (4th editions, Feb. 2026; content as in the 3rd editions, Sep. 2023); practiced on the R1.03 test system 2026-10-01 and read-only on the R1.05 test server 2026-10-09
|
||||||
status: verified
|
status: verified on R1.03 (2026-10-01). R1.05 - verified (R1.05 test server, 2026-10-09): processes, durwfp, active setup-file lines, almdbg 1/9/12, alhdbg 1, predefined ack types and the ALH storage group; setup files, templates and alarm dataset definitions compared by hash with R1.03 (identical except the files in §5). The INFO event (§4) was not generated on R1.05 (it writes to the shared alarm history).
|
||||||
---
|
---
|
||||||
|
|
||||||
# ALARM Service checks
|
# ALARM Service checks
|
||||||
|
|
||||||
## 1. Processes and setup files (read-only)
|
## 1. Processes and setup files (read-only)
|
||||||
|
|
||||||
| Check | How | Test system result |
|
| Check | How | R1.03 result | R1.05 result (2026-10-09) |
|
||||||
|---|---|---|
|
|---|---|---|---|
|
||||||
| Processes | `tasklist` → `alm.exe`, `alh.exe`, `aldprt.exe`, `alnmgr.exe`, `alnsmtp.exe`, `asbman.exe`; `durwfp -p ALM -t 0` → 0 = attached | All six running (`tls\com\alarm_start.cmd`) |
|
| Processes | `tasklist` → `alm.exe`, `alh.exe`, `aldprt.exe`, `alnmgr.exe`, `alnsmtp.exe`, `asbman.exe`; `durwfp -p ALM -t 0` → exit code 0 = attached | All six running (`tls\com\alarm_start.cmd`) | Same six running, `durwfp` 0 for each; `alnsms` and `aldcnt` not running (not started by default) |
|
||||||
| Kernel setup | `%TLS_ROOT_PATH%\tls\sup\alm.sup` (active lines after `!ENDDEFAULT`) | `SYNC_COMM N`, `SYNC_MSG N`, `QUESIZE 25000`, `RECOVER_QUEUE Y`, `ACK_INFO` |
|
| Kernel setup | `%TLS_ROOT_PATH%\tls\sup\alm.sup` (active lines after `!ENDDEFAULT`) | `SYNC_COMM N`, `SYNC_MSG N`, `QUESIZE 25000`, `RECOVER_QUEUE Y`, `ACK_INFO` | Identical |
|
||||||
| Storage setup | `alh.sup` | `CURP`, `CURT`, `CHR`, `QUESIZE 8000`, `MAX-SEARCH 5`, `RECOVER_QUEUE Y`, `DB-JRNL WAL`, `DB-SYNC OFF` |
|
| Storage setup | `alh.sup` | `CURP`, `CURT`, `CHR`, `QUESIZE 8000`, `MAX-SEARCH 5`, `RECOVER_QUEUE Y`, `DB-JRNL WAL`, `DB-SYNC OFF` | Identical |
|
||||||
| Alarm printer | `aldprt.sup` | `FORMAT prio,2,spac,1,type,6,tdef,18,name,40,text,10`, `EVENTS repeat,info,ackn,alarm,prio,firstup` |
|
| Alarm printer | `aldprt.sup` | `FORMAT prio,2,spac,1,type,6,tdef,18,name,40,text,10`, `EVENTS repeat,info,ackn,alarm,prio,firstup` | Identical |
|
||||||
| Overview events | `wfladi.sup` `EVENTS` | `alarm,repeat,ackn,deact,info,recov,diag,firstup` (no `DIRECT`) |
|
| Overview events | `wfladi.sup` `EVENTS` | `alarm,repeat,ackn,deact,info,recov,diag,firstup` (no `DIRECT`) | Identical |
|
||||||
| Notification / shelving | `alnmgr.sup`, `alnsmtp.sup`, `alnsms.sup`, `asbman.sup` | Defaults: SMTP `localhost, 25`, SMS `COM1:`, `SYS_WIDE_SHELF N` |
|
| Notification / shelving | `alnmgr.sup`, `alnsmtp.sup`, `alnsms.sup`, `asbman.sup` | Defaults: SMTP `localhost, 25`, SMS `COM1:`, `SYS_WIDE_SHELF N` | Same, but `alnsms.sup` has a new message format and prefix (§5) |
|
||||||
| History storage group | `dssqld -e` filter `'NAME = "ALH"'` on `HIS_GROUP_DF` | Type Alarm, rollover 1 day, lifetime 52 weeks |
|
| History storage group | `dssqld -e` filter `'NAME = "ALH"'` on `HIS_GROUP_DF` | Type Alarm, rollover 1 day, lifetime 52 weeks | Same on a fresh install, so 52 weeks is the installed default, not a local change (the C20 manual says 2 days; ISS-036, ISS-135) |
|
||||||
| Definitions | `dssqld -e <out> -d ALARM_ACK_DF -c` (also `ALARM_AOI_DF`, `ALARM_ASA_DF`, `ALARM_FO_DF`, `ALARM_FU_DF`, `ALARM_PRIORITY_DF`, `EXTERNAL_ALARM_DF`, `STATUS_DF`) | Predefined ack types `AUTOMATIC`, `MANUAL`, `FULLMANUAL` and their `_EAL` variants; everything else is project data |
|
| Definitions | `dssqld -e <out> -d ALARM_ACK_DF -c` (also `ALARM_AOI_DF`, `ALARM_ASA_DF`, `ALARM_FO_DF`, `ALARM_FU_DF`, `ALARM_PRIORITY_DF`, `EXTERNAL_ALARM_DF`, `STATUS_DF`) | Predefined ack types `AUTOMATIC`, `MANUAL`, `FULLMANUAL` and their `_EAL` variants; everything else is project data | Same six predefined ack types (32 matrix fields `NA_N` … `A3N_A3`) |
|
||||||
|
|
||||||
|
Export only the small definition datasets this way. Never export `ALARM_CHRONO` without a
|
||||||
|
narrow filter on a shared or production server (skill rule, ISS-136).
|
||||||
|
|
||||||
## 2. Alarm kernel debugger `almdbg` (read-only options)
|
## 2. Alarm kernel debugger `almdbg` (read-only options)
|
||||||
|
|
||||||
|
|
@ -29,37 +32,56 @@ printf '1\n9\n12\n-1\n' | timeout 20 almdbg
|
||||||
printf '14\n<Section>.<Tag>\n10\n<ack type number>\n-1\n' | timeout 20 almdbg
|
printf '14\n<Section>.<Tag>\n10\n<ack type number>\n-1\n' | timeout 20 almdbg
|
||||||
```
|
```
|
||||||
|
|
||||||
|
In a PowerShell script, put the answers in a file (one per line, no blank lines) and start
|
||||||
|
`almdbg.exe` with `Start-Process -RedirectStandardInput <file> -RedirectStandardOutput <file>
|
||||||
|
-NoNewWindow -PassThru`, then wait with a timeout (`WaitForExit(25000)`).
|
||||||
|
|
||||||
| Option | Shows |
|
| Option | Shows |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 1 | Connected destinations, events sent, overflows (test system: `ALH`, `OPXUAS`, `ALNMGR`, `ALDPRT`) |
|
| 1 | Connected destinations, events sent, overflows (R1.03 test system: `ALH`, `OPXUAS`, `ALNMGR`, `ALDPRT`; R1.05 test server: the same plus `WFLADI` while an alarm overview is open) |
|
||||||
| 5 / 7 / 8 / 23 | First-out groups, first-out / continuation items, collections |
|
| 5 / 7 / 8 / 23 | First-out groups, first-out / continuation items, collections |
|
||||||
| 9 / 10 | Ack type numbers / matrix of one type (`A` automatic, `M` manual) |
|
| 9 / 10 | Ack type numbers (R1.05 fresh install: 1–6) / matrix of one type (`A` automatic, `M` manual) |
|
||||||
| 11 | Items with repeat or delay running |
|
| 11 | Items with repeat or delay running |
|
||||||
| 12 | Statistics: start time, item-based / non-item-based / external events received, events sent |
|
| 12 | Statistics: start time, item-based / non-item-based / external events received, events sent, list sizes (R1.05 output also shows a counter *non-item-based events 2*) |
|
||||||
| 14 | Item alarm parameters: monitoring, diagnostic, ack type number, collection, first-out, repeat, delay |
|
| 14 | Item alarm parameters: monitoring, diagnostic, ack type number, collection, first-out, repeat, delay |
|
||||||
|
|
||||||
The last `-1` makes DURTIM log `DUR-W-REM_PROC, Process ALMDBG_<pid> exited unexpectedly`
|
The menu range is −1 … 28 on both versions. The last `-1` makes DURTIM log
|
||||||
in `umhlog.log`: harmless. A blank answer takes the default shown in brackets; an empty line at
|
`DUR-W-REM_PROC, Process ALMDBG_<pid> exited unexpectedly` in `umhlog.log`: harmless. A blank
|
||||||
the main prompt repeats the previous action — never send blank lines blindly.
|
answer takes the default shown in brackets; an empty line at the main prompt repeats the
|
||||||
|
previous action — never send blank lines blindly.
|
||||||
|
|
||||||
## 3. Storage debugger `alhdbg`
|
## 3. Storage debugger `alhdbg`
|
||||||
|
|
||||||
`printf '1\n-1\n' | timeout 10 alhdbg` → storage groups with current unit, cell and start
|
`printf '1\n-1\n' | timeout 10 alhdbg` → storage groups with current unit, cell and start
|
||||||
time (test system: group 3, unit 80). Option 2 lists the units of one group. Options 3 (force
|
time (R1.03 and R1.05: group 3). Option 2 lists the units of one group. Options 3 (force
|
||||||
connect) and 4 (stop ALH) only with approval.
|
connect) and 4 (stop ALH) only with approval. Menu range −1 … 4 on both versions.
|
||||||
|
|
||||||
## 4. Generate an informational test event (`almdbg` 16)
|
## 4. Generate an informational test event (`almdbg` 16)
|
||||||
|
|
||||||
Changes the alarm history (adds one INFO event; no effect on current alarms). With approval:
|
Changes the alarm history (adds one INFO event; no effect on current alarms). With approval,
|
||||||
|
and only on a system where an extra history record does not matter:
|
||||||
|
|
||||||
```
|
```
|
||||||
printf '16\n\n0\n15\n<Section>.<Tag>\n<status text>\n<description>\n-1\n' | timeout 15 almdbg
|
printf '16\n\n0\n15\n<Section>.<Tag>\n<status text>\n<description>\n-1\n' | timeout 15 almdbg
|
||||||
```
|
```
|
||||||
|
|
||||||
Prompts: timestamp (blank = now), milliseconds, priority (0–15), name, status text,
|
Prompts: timestamp (blank = now), milliseconds, priority (0–15), name, status text,
|
||||||
description. Check with a filter `'EVENT_TYPE = "INFO"'` on `ALARM_CHRONO`.
|
description. Check with a filter `'EVENT_TYPE = "INFO"'` (plus a time range) on `ALARM_CHRONO`.
|
||||||
|
|
||||||
**Verified:** the event appears with `EVENT_TYPE` INFO, `ITEM_NAME` = the given name, `ALARM_TEXT`
|
**Verified (R1.03):** the event appears with `EVENT_TYPE` INFO, `ITEM_NAME` = the given name,
|
||||||
= status text, `DESCRIPTION` = description, priority 15, ack 1. Other text columns (`INSTALL`,
|
`ALARM_TEXT` = status text, `DESCRIPTION` = description, priority 15, ack 1. Other text columns
|
||||||
`UNIT`, `SUB`, `SOURCE`, `CATEGORY`, `CONDITION`) contain leftovers or unreadable characters
|
(`INSTALL`, `UNIT`, `SUB`, `SOURCE`, `CATEGORY`, `CONDITION`) contain leftovers or unreadable
|
||||||
(ISS-037): use the event only as a test marker.
|
characters (ISS-037): use the event only as a test marker. Not run on R1.05.
|
||||||
|
|
||||||
|
## 5. What changed in the installed files on R1.05
|
||||||
|
|
||||||
|
Compared with R1.03 by file hash (2026-10-08) and line by line (2026-10-09):
|
||||||
|
|
||||||
|
| File | Change |
|
||||||
|
|---|---|
|
||||||
|
| `alm.sup`, `alh.sup`, `aldprt.sup`, `aldaco.sup`, `aldcnt.sup`, `alnmgr.sup`, `alnsmtp.sup`, `asbman.sup`, `ald_spec_stat.sup`, `wfladi.sup` and their templates; `alarm_build`, `alarm_compile` | Identical |
|
||||||
|
| `alarm_start.cmd`, `alarm_stop.cmd` | At the end (start) / beginning (stop) they call every `?*_alarm_start.cmd` / `?*_alarm_stop.cmd` in `tls\com` (ISS-121). Processes started are the same as on R1.03 |
|
||||||
|
| `alnsms.sup` / `.tpl` | New format units `SECTION` and `NAME` in the help; active defaults changed: `BODY_FORMAT = PRIO,2,SPAC,1,TYPE,6,TDEF,18,TEXT,6,SECTION,120` (R1.03: priority, type, time, `NAM1`–`NAM4`, text) and `ALARM_PREFIX = PRIO` (R1.03 `<ALARM>`). `alnsms` is not started by default; not tested (ISS-134) |
|
||||||
|
| `almini.sup` | Licence line only (instance file) |
|
||||||
|
| Alarm dataset definitions (`alarm_*.dss`) | Identical, including `ALARM_CURRENT` and `ALARM_CHRONO`. `external_alarm_df.dss` differs only by a space; its data access server got an internal fix for record updates |
|
||||||
|
| `alarm_attribute_temp_df.dss` | **New**: dataset `ALARM_ATTRIBUTE_TEMP_DF`, same fields as `ALARM_ATTRIBUTE_DF` (`NAME`, `ATTRIBUTE_TYPE`, `STATION`, hidden `ATTRIBUTE_INDEX`, `SPARE`), described in its header as a temporary store for item-specific alarm attributes; concealed on an enterprise server, no data file, no index on `ATTRIBUTE_INDEX`. On the R1.05 test server it has 0 records and is referenced only by the data dictionary and the RESTful API server (`jrstsrv.jar`, alarm attribute class). Internal: do not load, export or back it up (ISS-133) |
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Acknowledgement types, areas of interest and alarm selection areas by quick load
|
task: Acknowledgement types, areas of interest and alarm selection areas by quick load
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10L15-01EN §2.3.4, §4.1.2; IM 36K10C20-01EN §A5, §A8; practiced on CI-Eng-Sample 2026-10-01
|
source: IM 36K10L15-01EN §2.3.4, §4.1.2; IM 36K10C20-01EN §A5, §A8 (4th editions, Feb. 2026; content as in the 3rd editions, Sep. 2023); practiced on CI-Eng-Sample 2026-10-01
|
||||||
status: verified
|
status: verified on R1.03 (2026-10-01). R1.05 - the dataset definitions ALARM_ACK_DF, ALARM_AOI_DF and ALARM_ASA_DF are identical to R1.03 and the six predefined ack types are the same (checked 2026-10-08/09); the sample's CIENG_ACK, CIENG_TANKS and its ASA loaded and were removed with 0 errors in the reduced sample load on the R1.05 test server (2026-10-08; load check only - ASA listing, delete refusal and the error cases were not re-run)
|
||||||
---
|
---
|
||||||
|
|
||||||
# Alarm definitions (quick load)
|
# Alarm definitions (quick load)
|
||||||
|
|
@ -96,8 +96,15 @@ NAME
|
||||||
|
|
||||||
`dssqld -r` after the items that refer to them are removed or changed.
|
`dssqld -r` after the items that refer to them are removed or changed.
|
||||||
|
|
||||||
## Verified (CI-Eng-Sample, 2026-10-01)
|
## Verified (CI-Eng-Sample)
|
||||||
|
|
||||||
`CIENG_ACK`, `CIENG_TANKS` (number 2), `CIENG_TANK1` (`SECTION = "CI-Eng-Sample.TANK1"`,
|
- R1.03 (2026-10-01): `CIENG_ACK`, `CIENG_TANKS` (number 2), `CIENG_TANK1`
|
||||||
compiled, valid) loaded and removed in a full sample remove/reload, 0 errors. A test ASA without
|
(`SECTION = "CI-Eng-Sample.TANK1"`, compiled, valid) loaded and removed in a full sample
|
||||||
spaces was stored invalid and then removed.
|
remove/reload, 0 errors. A test ASA without spaces was stored invalid and then removed.
|
||||||
|
- R1.05 (2026-10-08, R1.05 test server): the same definitions loaded and were removed with
|
||||||
|
0 errors in the reduced sample load. Only the load was checked.
|
||||||
|
|
||||||
|
**Do not use the sample ASA in an alarm overview on a shared or production server.** An
|
||||||
|
alarm overview filtered by an ASA on `SECTION` or `UNIT` kept `ALH` at a full CPU core on the
|
||||||
|
shared R1.05 test server and made every other alarm list time out (ISS-136). Use such ASAs for
|
||||||
|
notification destinations or tests only, or filter overviews by item name or AOI.
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Switch on alarming for an item, test an alarm, read and acknowledge alarms
|
task: Switch on alarming for an item, test an alarm, read and acknowledge alarms
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10L15-01EN §2.1–§2.3, IM 36K10C20-01EN §A2, §A5, §A12; IM 36K01A50 (ODBC acknowledge); practiced on CI-Eng-Sample 2026-10-01
|
source: IM 36K10L15-01EN §2.1–§2.3, IM 36K10C20-01EN §A2, §A5, §A12 (4th editions, Feb. 2026; content as in the 3rd editions, Sep. 2023); IM 36K01A50 §1.16 (ODBC acknowledge, unchanged in the 5th edition); IM 36K10C50-01EN §2.22, §4.12 (custom acknowledgement, R1.04+); practiced on CI-Eng-Sample 2026-10-01
|
||||||
status: verified
|
status: verified on R1.03 (2026-10-01). R1.05 - ITEM_DF alarm fields, STATUS_DF, ALARM_CURRENT and ALARM_CHRONO definitions identical to R1.03; the sample alarm on TANK1.LEVEL (ALARMING, CIENG_ACK, CIENG_TANKS) loaded with 0 errors on the R1.05 test server (2026-10-08, load check only). Raising, acknowledging, delaying and repeating an alarm were not re-tested on R1.05 (shared server). Custom acknowledgement with reason and approver - from docs, not tested (ISS-099).
|
||||||
---
|
---
|
||||||
|
|
||||||
# Item alarming
|
# Item alarming
|
||||||
|
|
@ -78,6 +78,25 @@ NAME,ACK
|
||||||
not `ITEM_NAME` (same rule as the ODBC known issue, IM 36K01A50). Acknowledging is an operator
|
not `ITEM_NAME` (same rule as the ODBC known issue, IM 36K01A50). Acknowledging is an operator
|
||||||
action: only with the user's approval.
|
action: only with the user's approval.
|
||||||
|
|
||||||
|
### 4.1 Acknowledge with a reason and an approver (R1.04 and later, from docs)
|
||||||
|
|
||||||
|
From R1.04 an operator display can ask for a **reason** (up to 256 characters) and an
|
||||||
|
**approver** (up to 128 characters) when an alarm is acknowledged; both are stored in the audit
|
||||||
|
trail (`AUDIT_TRAIL` fields `APPROVAL_REASON` and `APPROVER`, present in the R1.05 data
|
||||||
|
dictionary). The ALARM Service itself is unchanged: the alarm datasets and setup files are the
|
||||||
|
same as on R1.03, and the acknowledgement still ends up as an `ACKNOW` event. Two ways, both
|
||||||
|
built in the Edit Module (skill `graphics`, `tasks/create-display.md`; C50 §2.22, §4.12):
|
||||||
|
|
||||||
|
- the alarm overview's custom acknowledgement properties (*Use Custom Acknowledgement*, the
|
||||||
|
*External Acknowledgement* group with alarm key, approver, reason and trigger) — for item
|
||||||
|
alarms and external alarms;
|
||||||
|
- an *Update item/parameter* action on the item's *Acknowledged* attribute with reason and
|
||||||
|
approver — item alarms only.
|
||||||
|
|
||||||
|
The record is written by the AUDIT Service, so check the audit settings (skill `audit-trail`).
|
||||||
|
Not tested on either version (ISS-099): it needs a display change, which is not allowed on the
|
||||||
|
shared R1.05 test server.
|
||||||
|
|
||||||
## 5. Delay and repeat
|
## 5. Delay and repeat
|
||||||
|
|
||||||
`DELAY` = d: DIRECT at once, DELAY after d seconds (same original time); back to normal earlier
|
`DELAY` = d: DIRECT at once, DELAY after d seconds (same original time); back to normal earlier
|
||||||
|
|
@ -85,7 +104,7 @@ gives NORMAL and no DELAY. `REPEAT` = r: REPEAT every r seconds after the (delay
|
||||||
`RPT_COUNT` 1, 2, …. The current alarm overview shows DIRECT only if `wfladi.sup` `EVENTS`
|
`RPT_COUNT` 1, 2, …. The current alarm overview shows DIRECT only if `wfladi.sup` `EVENTS`
|
||||||
contains `DIRECT` (not installed by default).
|
contains `DIRECT` (not installed by default).
|
||||||
|
|
||||||
## Verified (CI-Eng-Sample `TANK1.LEVEL`, limits 10/20/80/90, ack type `CIENG_ACK` = MANUAL matrix)
|
## Verified on R1.03 (CI-Eng-Sample `TANK1.LEVEL`, limits 10/20/80/90, ack type `CIENG_ACK` = MANUAL matrix)
|
||||||
|
|
||||||
| Step | Result |
|
| Step | Result |
|
||||||
|---|---|
|
|---|---|
|
||||||
|
|
@ -99,3 +118,15 @@ contains `DIRECT` (not installed by default).
|
||||||
| Full sample remove/reload | 0 errors; the alarm test passed again |
|
| Full sample remove/reload | 0 errors; the alarm test passed again |
|
||||||
|
|
||||||
No alarm line from `ALDPRT` appeared in `umhlog.log` (ISS-035).
|
No alarm line from `ALDPRT` appeared in `umhlog.log` (ISS-035).
|
||||||
|
|
||||||
|
## R1.05 (R1.05 test server)
|
||||||
|
|
||||||
|
- 2026-10-08: the reduced sample load switched on alarming for `TANK1.LEVEL` (`CIENG_ACK`,
|
||||||
|
`CIENG_TANKS`) with 0 errors and removed it again with 0 errors. This was a load check only:
|
||||||
|
no alarm was raised or acknowledged.
|
||||||
|
- 2026-10-09 (read-only): `ITEM_DF`, `STATUS_DF`, `ALARM_CURRENT` and `ALARM_CHRONO` definitions,
|
||||||
|
`alm.sup`, `aldprt.sup` and `wfladi.sup` (no `DIRECT` in `EVENTS`) are identical to R1.03, so
|
||||||
|
the steps above are expected to behave the same. Awaiting user verification: steps 2–5 on a
|
||||||
|
test item of a non-shared R1.05 system (expected results as in the table above).
|
||||||
|
- Read `ALARM_CHRONO` only with a filter on item name **and** a time range: big history reads
|
||||||
|
load the alarm storage process that all clients share (ISS-136).
|
||||||
|
|
|
||||||
|
|
@ -1,20 +1,34 @@
|
||||||
---
|
---
|
||||||
name: audit-trail
|
name: audit-trail
|
||||||
description: >-
|
description: >-
|
||||||
CI Server R1.03 AUDIT Service and audit trail. Use when the user wants to know who changed
|
CI Server R1.05 AUDIT Service and audit trail. Use when the user wants to know who changed
|
||||||
what and when (item value written, limit or description changed, item / section / object /
|
what and when (item value written, limit or description changed, item / section / object /
|
||||||
report inserted or deleted, login, logout, failed login, alarm acknowledged or shelved), read
|
report inserted or deleted, login, logout, failed login, alarm acknowledged or shelved), read
|
||||||
or export the audit trail (AUDIT_TRAIL dataset, storage group ADT, old value / new value, user,
|
or export the audit trail (AUDIT_TRAIL dataset, storage group ADT, old value / new value, user,
|
||||||
source HMI / LOC-ENG-MOD / ENT-ENG-MOD / OPER-INTERFACE / ODBC / QUICKLOAD), make an audit
|
approval reason and approver of a change (APPROVAL_REASON, APPROVER, FDA Part 11), source
|
||||||
|
HMI / LOC-ENG-MOD / ENT-ENG-MOD / OPER-INTERFACE / REST-SERVER / PYTOOLS / PASSWORD-CHECK /
|
||||||
|
ODBC / QUICKLOAD, PENDING item writes), make an audit
|
||||||
report, switch auditing of an event type on or off (event classifiers, AUDIT_EVENT_CLAS_DF,
|
report, switch auditing of an event type on or off (event classifiers, AUDIT_EVENT_CLAS_DF,
|
||||||
STORAGE, "Audit trailing wanted" / AUDIT_INFO on an item), filter audit events (selection
|
STORAGE, "Audit trailing wanted" / AUDIT_INFO on an item), filter audit events (selection
|
||||||
groups, AUDIT_SELGRP_DF, expression sbid / sbgp / user / nval), print or log audit events
|
groups, AUDIT_SELGRP_DF, expression sbid / sbgp / user / nval), print or log audit events
|
||||||
(ADTLOG event logger, adtsys.sup, E_LAYOUT, SEL_GROUP), check AUDIT Service (adtsto, adtcol,
|
(ADTLOG event logger, adtsys.sup, E_LAYOUT, SEL_GROUP), check AUDIT Service (adtsto, adtcol,
|
||||||
adtdst, audit_start), or change how long the audit trail is kept (ADT lifetime). Source
|
adtdst, audit_start, ?*_audit_start.cmd extension scripts), or change how long the audit
|
||||||
IM 36K10L25-01EN.
|
trail is kept (ADT lifetime). Source IM 36K10L25-01EN.
|
||||||
---
|
---
|
||||||
|
|
||||||
# Audit trail (R1.03)
|
# Audit trail (R1.05)
|
||||||
|
|
||||||
|
Re-checked on R1.05 on 2026-10-09 (read-only). IM 36K10L25 4th edition changed only its contact
|
||||||
|
information, but the installed software has grown (none of it is in the manual):
|
||||||
|
- `AUDIT_TRAIL` has two new fields, `APPROVAL_REASON` (256) and `APPROVER` (128), filled by
|
||||||
|
display writes that carry a reason and approver (IM 36K10C50 §2.22, §4.12; ISS-099, ISS-140).
|
||||||
|
- 499 classifiers instead of 463: new action `PENDING` and new sources `REST-SERVER`, `PYTOOLS`,
|
||||||
|
`PASSWORD-CHECK` (ISS-141).
|
||||||
|
- `audit_start.cmd` / `audit_stop.cmd` call extension scripts `?*_audit_start.cmd` /
|
||||||
|
`?*_audit_stop.cmd` (ISS-142).
|
||||||
|
Processes, `ADT` group, selection-group dataset and `adtsys.sup` keywords are otherwise as on R1.03.
|
||||||
|
Paths: read `TLS_*` (`set TLS`); on the R1.05 test server program and data are both under
|
||||||
|
`C:\Yokogawa\CIServer\tls`. Skill text still shows R1.03 paths where it names a full path.
|
||||||
|
|
||||||
Background: `knowledge/manuals/IM36K10L25-01EN.md` (processes, classifiers, setup keywords,
|
Background: `knowledge/manuals/IM36K10L25-01EN.md` (processes, classifiers, setup keywords,
|
||||||
installed findings), `IM36K10G10-01EN.md` ch. 9 (overview), `IM36K10C40-01EN.md` (storage groups),
|
installed findings), `IM36K10G10-01EN.md` ch. 9 (overview), `IM36K10C40-01EN.md` (storage groups),
|
||||||
|
|
@ -33,7 +47,8 @@ Rules:
|
||||||
|
|
||||||
| Task | File | Status |
|
| Task | File | Status |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Check AUDIT Service: processes, storage group `ADT`, classifier and selection group counts | `tasks/audit-checks.md` | verified |
|
| Check AUDIT Service: processes, storage group `ADT`, classifier and selection group counts | `tasks/audit-checks.md` | verified (R1.03); verified on R1.05 2026-10-09 (read-only) |
|
||||||
| Read the audit trail: export, RQL query, audit report, what gets recorded by which tool | `tasks/read-audit-trail.md` | verified |
|
| Read the audit trail: export, RQL query, audit report, what gets recorded by which tool | `tasks/read-audit-trail.md` | verified (R1.03); on R1.05 RQL read, field list and sources checked 2026-10-09; the sample report load passed 2026-10-08 (load check only) |
|
||||||
| Choose what is stored (classifier `STORAGE`), selection groups, event logger `ADTLOG` | `tasks/configure-audit.md` | verified (operator-side item value events from docs, ISS-049) |
|
| Approval reason / approver in the audit trail (`APPROVAL_REASON`, `APPROVER`) | `tasks/read-audit-trail.md` §1a | verified on R1.05 that the fields exist and are filled for operator writes; custom alarm acknowledgement not tested (display changes not allowed on the shared server) |
|
||||||
|
| Choose what is stored (classifier `STORAGE`), selection groups, event logger `ADTLOG` | `tasks/configure-audit.md` | verified (R1.03, incl. operator-side item value events, ISS-049); on R1.05 files and datasets checked, selection group load passed 2026-10-08; `ADTLOG` not re-run (starting processes not allowed on the shared server) |
|
||||||
| Distributor process, extra collectors, new classifier entities in C | L25 summary §2, §5 | from docs |
|
| Distributor process, extra collectors, new classifier entities in C | L25 summary §2, §5 | from docs |
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Check AUDIT Service (processes, storage group ADT, classifiers, selection groups)
|
task: Check AUDIT Service (processes, storage group ADT, classifiers, selection groups)
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10L25-01EN §1.2, §2.1.1, §2.3.1, §4.1; practiced on the test system 2026-10-01
|
source: IM 36K10L25-01EN §1.2, §2.1.1, §2.3.1, §4.1 (4th ed., Feb. 2026; text unchanged from the 3rd ed.); practiced on the test system 2026-10-01
|
||||||
status: verified
|
status: verified on R1.03 (2026-10-01); verified on the R1.05 test server 2026-10-09 (read-only: processes, ADT group, classifier and selection group exports, start scripts, setup files)
|
||||||
---
|
---
|
||||||
|
|
||||||
# AUDIT Service checks
|
# AUDIT Service checks
|
||||||
|
|
@ -22,6 +22,13 @@ Default (`tls\com\audit_start.cmd`): `adtsto.exe` (storage, process `ADTSTO`) an
|
||||||
`ADTSTO` creates it). `adtdst` (distributor), `adtlog` (event logger) and `adtcol02` are only in
|
`ADTSTO` creates it). `adtdst` (distributor), `adtlog` (event logger) and `adtcol02` are only in
|
||||||
commented lines. Stop: `audit_stop.cmd` (`durstp` on `adt*`, admin).
|
commented lines. Stop: `audit_stop.cmd` (`durstp` on `adt*`, admin).
|
||||||
|
|
||||||
|
R1.05 (verified 2026-10-09): same two processes running, `adtlog` and `adtdst` not running
|
||||||
|
(`durwfp` 1). New in R1.05: `audit_start.cmd` ends by calling every
|
||||||
|
`%TLS_ROOT_PATH%\tls\com\?*_audit_start.cmd`, and `audit_stop.cmd` calls every
|
||||||
|
`?*_audit_stop.cmd` **before** it stops the `adt*` processes (ISS-142; same hook pattern as the
|
||||||
|
other start scripts, ISS-121). Use such a file for your own additions (e.g. a permanent
|
||||||
|
`ADTLOG`) instead of editing the product script. Not described in IM 36K10L25.
|
||||||
|
|
||||||
## 2. Storage group `ADT`
|
## 2. Storage group `ADT`
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
@ -33,8 +40,8 @@ NAME,LIFE_TIME,ROLLOVER_INT,START_TIME,STOP_TIME,TYPE
|
||||||
```
|
```
|
||||||
|
|
||||||
`dssqld -e adt.qlo adt.qli`. History type 6 (audit). Manual default when `ADTSTO` creates it:
|
`dssqld -e adt.qlo adt.qli`. History type 6 (audit). Manual default when `ADTSTO` creates it:
|
||||||
rollover 1 day, unit lifetime 2 days; the test system had **52 weeks** lifetime, rollover
|
rollover 1 day, unit lifetime 2 days; the R1.03 test system and the R1.05 test server both had
|
||||||
1 day. While storage of `ADT` is stopped, new events are refused (logged via UMH). Unit
|
**52 weeks** lifetime, rollover 1 day (type shown as `Audit` in the export). While storage of `ADT` is stopped, new events are refused (logged via UMH). Unit
|
||||||
details: skill `history-management`, `history-checks.md`.
|
details: skill `history-management`, `history-checks.md`.
|
||||||
|
|
||||||
## 3. Classifiers and selection groups
|
## 3. Classifiers and selection groups
|
||||||
|
|
@ -49,6 +56,16 @@ everything from source `COMPUTE` (PROCESS Service) on `ITEM`/`SUB-ITEM` values,
|
||||||
quality, limits and deadband, and `DATASET.NULL-ATTR.*.COMPUTE`. No selection groups exist
|
quality, limits and deadband, and `DATASET.NULL-ATTR.*.COMPUTE`. No selection groups exist
|
||||||
until you create one (the file `tls\dat\adt_sgp.dat` is created empty by `ADTSTO`).
|
until you create one (the file `tls\dat\adt_sgp.dat` is created empty by `ADTSTO`).
|
||||||
|
|
||||||
|
R1.05 test server (2026-10-09): **499** classifiers, all `BASIC_SET` 1, **478** with `STORAGE` 1.
|
||||||
|
The 36 extra ones are exactly the new action and sources (ISS-141): `PENDING` on
|
||||||
|
`ITEM.VALUE` / `ITEM.STATUS` (sources `HMI`, `LOC-ENG-MOD`, `OPER-INTERFACE`, `OTHERS`,
|
||||||
|
`VIA-OPC-UAS`, `COMPUTE`), and `REST-SERVER`, `PYTOOLS`, `PASSWORD-CHECK` on `CI-SERVER` login /
|
||||||
|
logout / login attempt and `DATASET` insert / modify / delete, plus `ITEM.VALUE`, `STATUS`,
|
||||||
|
`QUALITY-CODE` `MODIFY` for `REST-SERVER` and `PYTOOLS`. Off: the same 19 `COMPUTE`
|
||||||
|
classifiers as on R1.03 plus `ITEM.VALUE.PENDING.COMPUTE` and `ITEM.STATUS.PENDING.COMPUTE`.
|
||||||
|
(463 + 36 = 499 and 19 + 2 = 21 off; the R1.03 list itself is not kept in the repo.)
|
||||||
|
No selection groups on the R1.05 test server.
|
||||||
|
|
||||||
Files: `%TLS_DAT_PATH%\adt_ecl.*` (classifiers), `adt_sgp.*` (selection groups); audit records
|
Files: `%TLS_DAT_PATH%\adt_ecl.*` (classifiers), `adt_sgp.*` (selection groups); audit records
|
||||||
are in the history files of group `ADT` (`%TLS_HIS_PATH%`).
|
are in the history files of group `ADT` (`%TLS_HIS_PATH%`).
|
||||||
|
|
||||||
|
|
@ -57,3 +74,8 @@ are in the history files of group `ADT` (`%TLS_HIS_PATH%`).
|
||||||
Only `tls\sup\adtsys.sup` is installed (`QUESIZE = 200`, the rest commented): it is the keyword
|
Only `tls\sup\adtsys.sup` is installed (`QUESIZE = 200`, the rest commented): it is the keyword
|
||||||
reference and template. A process reads a setup file named after itself (`adtsto.sup`,
|
reference and template. A process reads a setup file named after itself (`adtsto.sup`,
|
||||||
`adtcol01.sup`, `adtlog.sup` …) if present. Keywords: `configure-audit.md` §4 and the L25 summary.
|
`adtcol01.sup`, `adtlog.sup` …) if present. Keywords: `configure-audit.md` §4 and the L25 summary.
|
||||||
|
|
||||||
|
R1.05 (2026-10-09): `adtsys.sup` / `adtsys.tpl` differ from R1.03 only by two new `E_LAYOUT`
|
||||||
|
units `APPRR` (approval reason) and `APPR` (approver) (ISS-140). `adtini.sup` differs only in
|
||||||
|
the licence lines; `fmfprt.sup` and the `AUDIT_EVENT_CLAS_DF` / `AUDIT_SELGRP_DF` dataset
|
||||||
|
definitions are identical; `dssqld.sup` still has `NO-EXPORT=AUDIT_TRAIL`.
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Choose what AUDIT Service stores (classifier STORAGE, AUDIT_INFO), define selection groups, run an event logger (ADTLOG)
|
task: Choose what AUDIT Service stores (classifier STORAGE, AUDIT_INFO), define selection groups, run an event logger (ADTLOG)
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10L25-01EN §2.4, §3, §4.2, App. 1; practiced on CI-Eng-Sample 2026-10-01
|
source: IM 36K10L25-01EN §2.4, §3, §4.2, App. 1 (4th ed., Feb. 2026); R1.05 `adtsys.sup`, `audit_start.cmd`; practiced on CI-Eng-Sample 2026-10-01
|
||||||
status: verified (PROCESS-side ITEM.* events from docs)
|
status: verified on R1.03 (2026-10-01; PROCESS-side ITEM.* events from docs). R1.05: classifier list, setup file and start scripts checked 2026-10-09 (read-only); selection group CIENG_ITEMS loaded with 0 errors 2026-10-08 (load check only); STORAGE change, ADTLOG and the new APPRR / APPR layout units not tested on the shared server (awaiting user verification)
|
||||||
---
|
---
|
||||||
|
|
||||||
# Configure the audit trail
|
# Configure the audit trail
|
||||||
|
|
@ -14,6 +14,9 @@ Each event type is a classifier `<SUBJECT>.<ATTRIBUTE>.<ACTION>.<SOURCE>` in
|
||||||
`BASIC_SET`, `STORAGE`). Only `STORAGE` can be changed. Configuration and DSS value changes use
|
`BASIC_SET`, `STORAGE`). Only `STORAGE` can be changed. Configuration and DSS value changes use
|
||||||
subject `DATASET` with attribute `NULL-ATTR`, e.g. `DATASET.NULL-ATTR.MODIFY.LOC-ENG-MOD`
|
subject `DATASET` with attribute `NULL-ATTR`, e.g. `DATASET.NULL-ATTR.MODIFY.LOC-ENG-MOD`
|
||||||
(Engineering Module) or `….ENT-ENG-MOD` (`dssqld`); logins use `CI-SERVER.NULL-ATTR.LOGIN.<source>`.
|
(Engineering Module) or `….ENT-ENG-MOD` (`dssqld`); logins use `CI-SERVER.NULL-ATTR.LOGIN.<source>`.
|
||||||
|
R1.05 adds action `PENDING` and sources `REST-SERVER`, `PYTOOLS`, `PASSWORD-CHECK` (499
|
||||||
|
classifiers; list in `audit-checks.md` §3, ISS-141); the REST API, pyTOOLS and Password Check
|
||||||
|
events can be switched off like any other.
|
||||||
|
|
||||||
List the classifiers (and which are off): `dssqld -e ecl.qlo -d AUDIT_EVENT_CLAS_DF`. Change:
|
List the classifiers (and which are off): `dssqld -e ecl.qlo -d AUDIT_EVENT_CLAS_DF`. Change:
|
||||||
|
|
||||||
|
|
@ -59,6 +62,8 @@ Expression language (from the compiler's own listing):
|
||||||
- Words compared with a constant: `nval oval` (new / old value).
|
- Words compared with a constant: `nval oval` (new / old value).
|
||||||
- Operators `= != > < >= <=`, `and`, `or`, parentheses. **No `LIKE`**: match a name prefix with a
|
- Operators `= != > < >= <=`, `and`, `or`, parentheses. **No `LIKE`**: match a name prefix with a
|
||||||
range, e.g. `sbid >= "<Section>." and sbid < "<Section>/"` (`/` sorts right after `.`).
|
range, e.g. `sbid >= "<Section>." and sbid < "<Section>/"` (`/` sorts right after `.`).
|
||||||
|
- R1.05: whether the compiler also accepts the new units `apprr` / `appr` was not tested
|
||||||
|
(compiling needs a load; awaiting user verification on a non-shared system).
|
||||||
|
|
||||||
Example (`examples/CI-Eng-Sample/19_audit_df.qli`):
|
Example (`examples/CI-Eng-Sample/19_audit_df.qli`):
|
||||||
|
|
||||||
|
|
@ -94,16 +99,21 @@ Filtered logger: `examples/CI-Eng-Sample/audit/adtlogci.sup` (`SEL_GROUP = "CIEN
|
||||||
`E_LAYOUT`, `TIMEFMT`, `HEADER`, `HEADER_AFTER`). The user copies it to
|
`E_LAYOUT`, `TIMEFMT`, `HEADER`, `HEADER_AFTER`). The user copies it to
|
||||||
`%TLS_ROOT_PATH%\tls\sup\` (admin); then `adtlog -n adtlogci` printed only the CI-Eng-Sample
|
`%TLS_ROOT_PATH%\tls\sup\` (admin); then `adtlog -n adtlogci` printed only the CI-Eng-Sample
|
||||||
changes (no logins), one line each under the header. If the selection group does not exist or
|
changes (no logins), one line each under the header. If the selection group does not exist or
|
||||||
did not compile, the logger logs an error and exits. To run it permanently, add a
|
did not compile, the logger logs an error and exits. To run it permanently (admin, restart):
|
||||||
`start /B /NORMAL %TLS_ROOT_PATH%\tls\exe\adtlog -n <name>` line to `audit_start.cmd` (admin,
|
- R1.03: add a `start /B /NORMAL %TLS_ROOT_PATH%\tls\exe\adtlog -n <name>` line to
|
||||||
restart).
|
`audit_start.cmd`.
|
||||||
|
- R1.05: put that line in your own `tls\com\<prefix>_audit_start.cmd` (e.g.
|
||||||
|
`cieng_audit_start.cmd`) and a matching `durstp` line in `<prefix>_audit_stop.cmd`;
|
||||||
|
`audit_start.cmd` / `audit_stop.cmd` call every `?*_audit_start.cmd` / `?*_audit_stop.cmd`
|
||||||
|
(ISS-142). The product script stays untouched, so an upgrade does not lose the line. From the
|
||||||
|
installed scripts; not tested (needs admin and a restart).
|
||||||
|
|
||||||
## 4. Setup keywords (`adtsys.sup` is the template)
|
## 4. Setup keywords (`adtsys.sup` is the template)
|
||||||
|
|
||||||
`MAX_OPEN_UNITS` (20), `PRT_DEV`, `QUESIZE` (kB), `SEL_GROUP`; `COL_PROC`, `DST_PROC`, `HIS_PROC`,
|
`MAX_OPEN_UNITS` (20), `PRT_DEV`, `QUESIZE` (kB), `SEL_GROUP`; `COL_PROC`, `DST_PROC`, `HIS_PROC`,
|
||||||
`STO_PROC` = `<node>, <name>`; `NODE_ECL_FILE`, `NODE_SGP_FILE`; `E_LAYOUT = <unit>,<width>,…`
|
`STO_PROC` = `<node>, <name>`; `NODE_ECL_FILE`, `NODE_SGP_FILE`; `E_LAYOUT = <unit>,<width>,…`
|
||||||
(`AAI1 ACND ACNM ACTM MAI1 NOND NONM NOTM NVAL NWLN OVAL REAS SACS SACT SATR SBGP SBID SPCE TERM
|
(`AAI1 ACND ACNM ACTM MAI1 NOND NONM NOTM NVAL NWLN OVAL REAS SACS SACT SATR SBGP SBID SPCE TERM
|
||||||
USER`), `E_NOSPACE`, `TIMEFMT` (`DD/MM/YY hh:mm:ss.ppp` default — milliseconds shown, as the
|
USER`; R1.05 adds `APPRR` approval reason and `APPR` approver, ISS-140), `E_NOSPACE`, `TIMEFMT` (`DD/MM/YY hh:mm:ss.ppp` default — milliseconds shown, as the
|
||||||
manual says); `ECL_REFRESH` (1800 s), `FLOWC` (30, 10), `HBEAT` (10), `TRYCON` (10); `FORM_FEED`,
|
manual says); `ECL_REFRESH` (1800 s), `FLOWC` (30, 10), `HBEAT` (10), `TRYCON` (10); `FORM_FEED`,
|
||||||
`HEADER` (repeat for more lines), `HEADER_AFTER` (re-print after n events; the header is also
|
`HEADER` (repeat for more lines), `HEADER_AFTER` (re-print after n events; the header is also
|
||||||
printed once at start). Which keyword applies to which process: L25 §4.2.2.
|
printed once at start). Which keyword applies to which process: L25 §4.2.2.
|
||||||
|
|
@ -111,5 +121,5 @@ printed once at start). Which keyword applies to which process: L25 §4.2.2.
|
||||||
## 5. Retention
|
## 5. Retention
|
||||||
|
|
||||||
Audit records live in history storage group `ADT` (rollover 1 day; lifetime 52 weeks on the
|
Audit records live in history storage group `ADT` (rollover 1 day; lifetime 52 weeks on the
|
||||||
test system). Longer/shorter retention = change `LIFE_TIME` of `ADT` (skill
|
R1.03 test system and on the R1.05 test server). Longer/shorter retention = change `LIFE_TIME` of `ADT` (skill
|
||||||
`history-management`); archive like any storage group. Ask before shortening it.
|
`history-management`); archive like any storage group. Ask before shortening it.
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Read the audit trail (export, RQL query, audit report) and know what each tool records
|
task: Read the audit trail (export, RQL query, audit report) and know what each tool records
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10L25-01EN §1.1, §2.1.2, §3.1, App. 1; IM 36K10G10-01EN ch. 9; practiced on CI-Eng-Sample 2026-10-01
|
source: IM 36K10L25-01EN §1.1, §2.1.2, §3.1, App. 1 (4th ed., Feb. 2026); IM 36K10C50-01EN §2.22, §4.12 (Feb. 2026); IM 36K10G10-01EN ch. 9; R1.05 `tls\src\audit_trail.dss`; practiced on CI-Eng-Sample 2026-10-01
|
||||||
status: verified
|
status: verified on R1.03 (2026-10-01); on the R1.05 test server 2026-10-09 (read-only) the dataset definition, an RQL read of the whole trail and the approval fields were checked; sample report CIENG_AUDIT loaded with 0 errors on 2026-10-08 (load check only, not generated)
|
||||||
---
|
---
|
||||||
|
|
||||||
# Read the audit trail
|
# Read the audit trail
|
||||||
|
|
@ -25,6 +25,37 @@ Read-only. Dataset `AUDIT_TRAIL` (storage group `ADT`); every field is read-only
|
||||||
| `ACTION_NODE`/`ACTION_PROCESS`, `NOTIFICATION_NODE`/`NOTIFICATION_PROCESS` | Node and process (`DSSSDA00`, `JHMISET1086`, `DSSQLD00875` …) |
|
| `ACTION_NODE`/`ACTION_PROCESS`, `NOTIFICATION_NODE`/`NOTIFICATION_PROCESS` | Node and process (`DSSSDA00`, `JHMISET1086`, `DSSQLD00875` …) |
|
||||||
| `OLD_VALUE`, `NEW_VALUE` | Text, max 64 characters (longer values are cut) |
|
| `OLD_VALUE`, `NEW_VALUE` | Text, max 64 characters (longer values are cut) |
|
||||||
| `REASON`, `APPLICATION_INFO`, `APPLICATION_SUB` | Free text from the notifying program (empty in the tests) |
|
| `REASON`, `APPLICATION_INFO`, `APPLICATION_SUB` | Free text from the notifying program (empty in the tests) |
|
||||||
|
| `APPROVAL_REASON` (256), `APPROVER` (128) | **R1.05** (R1.04 and later): reason and approver name given with the change (see §1a); read-only, select only |
|
||||||
|
|
||||||
|
### 1a. Approval reason and approver (R1.04 and later)
|
||||||
|
|
||||||
|
Added for FDA 21 CFR Part 11 (the definition calls them *CPP* approval fields, a change to a
|
||||||
|
critical process parameter). IM 36K10L25 does not mention them (ISS-140); IM 36K10C50 does:
|
||||||
|
- An *Update item/parameter* action on a display (§4.12) can carry a **Reason** (≤ 256
|
||||||
|
characters) and an **Approver** (≤ 128 characters), typed in or taken from display parameters.
|
||||||
|
- Alarm acknowledgement with reason and approver (§2.22): either through an item parameter
|
||||||
|
(attribute *Acknowledged* = 1, item alarms only) or through the alarm overview's
|
||||||
|
*External Acknowledgement* properties (*Alarm Key*, *Approver*, *Reason*, *Trigger*). Building
|
||||||
|
the display: skill `graphics`, `create-display.md`.
|
||||||
|
|
||||||
|
Verified on the R1.05 test server (2026-10-09, read-only RQL): the fields exist in
|
||||||
|
`AUDIT_TRAIL`; 3 records out of about 15 500 had both filled, all `ITEM` `VALUE` `MODIFY` from
|
||||||
|
`OPER-INTERFACE` (an operator write), with `REASON` empty — so the reason goes to
|
||||||
|
`APPROVAL_REASON`, not to `REASON`. An alarm acknowledgement with reason / approver was **not
|
||||||
|
tested** (no such display; displays must not be changed on the shared server). Read them with:
|
||||||
|
|
||||||
|
```
|
||||||
|
column r as 'A40' heading 'Reason';
|
||||||
|
column p as 'A20' heading 'Approver';
|
||||||
|
select action_time, subject_group, subject_ident, subject_action, user_name, approver p,
|
||||||
|
approval_reason r
|
||||||
|
from audit_trail
|
||||||
|
where approver > ' ' or approval_reason > ' '
|
||||||
|
order by action_time;
|
||||||
|
```
|
||||||
|
|
||||||
|
(`> ' '` finds non-empty text; this `where` clause was run on R1.05 with a shorter column list.)
|
||||||
|
On R1.03 these fields do not exist and the query fails.
|
||||||
|
|
||||||
## 2. What is recorded (verified on R1.03.00)
|
## 2. What is recorded (verified on R1.03.00)
|
||||||
|
|
||||||
|
|
@ -42,6 +73,18 @@ So `AUDIT_INFO` matters only for operator (and PROCESS) writes; DSS changes are
|
||||||
audited. The `SUBJECT_SOURCE` of a user interface comes from its *audit
|
audited. The `SUBJECT_SOURCE` of a user interface comes from its *audit
|
||||||
trail id* in `dssana.sup` `USER_INTERFACE` (Engineering Module = `LOC-ENG-MOD`).
|
trail id* in `dssana.sup` `USER_INTERFACE` (Engineering Module = `LOC-ENG-MOD`).
|
||||||
|
|
||||||
|
**R1.05 additions** (ISS-141; classifiers verified 2026-10-09, behaviour not re-tested):
|
||||||
|
- Source `REST-SERVER`: the RESTful API (`jrstsrv`, skill `data-access`). The R1.05 test
|
||||||
|
server's trail holds `REST-SERVER` `LOGIN` / `LOGOUT` pairs and `MODIFY` records.
|
||||||
|
- Source `PYTOOLS`: the pyTOOLS Python module (IM 36K10P40). Not seen in the trail.
|
||||||
|
- Source `PASSWORD-CHECK`: the Edit Module *Password Check* function (IM 36K10C50 §2.31). Not seen.
|
||||||
|
- Action `PENDING` on `ITEM` `VALUE` / `STATUS`: per the R1.05 C header comments, for item writes
|
||||||
|
with a Vnet *on send* / *on receive* update policy (CENTUM). Not seen; not tested (no Vnet).
|
||||||
|
|
||||||
|
Sources seen in the R1.05 test server's trail (2026-10-09, about 15 500 records): `ENT-ENG-MOD`
|
||||||
|
(most: `dssqld`), `LOC-ENG-MOD`, `OPER-INTERFACE`, `REST-SERVER`, `ENT-EDIT-MOD`,
|
||||||
|
`LOC-EDIT-MOD`, `HMI`, `DSS-CLIENT`, `VIA-OPC-UAS`.
|
||||||
|
|
||||||
## 3. Export
|
## 3. Export
|
||||||
|
|
||||||
`dssqld -e` skips `AUDIT_TRAIL` in a full export (`NO-EXPORT` in `dssqld.sup`); name it:
|
`dssqld -e` skips `AUDIT_TRAIL` in a full export (`NO-EXPORT` in `dssqld.sup`); name it:
|
||||||
|
|
@ -77,9 +120,14 @@ select action_time t, subject_group, subject_attribute, subject_action, subject_
|
||||||
```
|
```
|
||||||
|
|
||||||
Use aliases with `COLUMN … AS 'A12'` to keep lines short (the fields are 16–256 characters
|
Use aliases with `COLUMN … AS 'A12'` to keep lines short (the fields are 16–256 characters
|
||||||
wide). Try it in the interactive generator (skill `reporting`, `rql-interactive.md`). The sample
|
wide). Try it in the interactive generator (skill `reporting`, `rql-interactive.md`): put the
|
||||||
|
query in a file that starts with `set @next 0;` and `set @page_size 0;` and ends with `exit;`,
|
||||||
|
then `rptgen -s rptgen.rpt < q.rql > q.out` in `cmd` (verified on R1.05 2026-10-09: one
|
||||||
|
heading line, a `====` line, then one line per record; the echoed `RPT>` prompts appear in the
|
||||||
|
output file). The sample
|
||||||
report `CIENG_AUDIT` (`examples/CI-Eng-Sample/19_audit_df.qli`) lists the last hour of events on
|
report `CIENG_AUDIT` (`examples/CI-Eng-Sample/19_audit_df.qli`) lists the last hour of events on
|
||||||
`CI-Eng-Sample.*`; generate it like any ad-hoc report (`define-reports.md` §2). Generated from
|
`CI-Eng-Sample.*`; generate it like any ad-hoc report (`define-reports.md` §2). On R1.05 it
|
||||||
|
loaded with 0 errors (2026-10-08, reduced sample load); it was not generated there. Generated from
|
||||||
`dssqld` it is stored but not printed (`FSL-E-PRT_UNKUSER`, ISS-045).
|
`dssqld` it is stored but not printed (`FSL-E-PRT_UNKUSER`, ISS-045).
|
||||||
|
|
||||||
In the Engineering Module, *Configuration › Reporting › Reports* holds the system reports
|
In the Engineering Module, *Configuration › Reporting › Reports* holds the system reports
|
||||||
|
|
|
||||||
|
|
@ -1,33 +1,49 @@
|
||||||
---
|
---
|
||||||
name: authorization
|
name: authorization
|
||||||
description: >-
|
description: >-
|
||||||
CI Server R1.03 users, authorization groups, login and schemes. Use when the user wants to
|
CI Server R1.05 users, authorization groups, login and schemes. Use when the user wants to
|
||||||
create, list or remove CI Server users or authorization groups, choose authorization actions
|
create, list or remove CI Server users or authorization groups, choose authorization actions
|
||||||
(ITEM_READ, ITEM_MODIFY_VALUE, …), set process areas, logoff timeout or initial display for
|
(ITEM_READ, ITEM_MODIFY_VALUE, UA_MAPPER_PROJECT_*, …; up to 250 per group), set process
|
||||||
a user, change how users log in (dssana.sup login method: Automatic, Manual CI Server,
|
areas, logoff timeout or initial display for a user, give a user an API key for the RESTful
|
||||||
Manual OS, No, SSO, Deny; no-login profile CI_NO_LOGIN), hide Engineering Module features
|
API (API_KEYS_DF, Add API Key), change how users log in (dssana.sup login method: Automatic,
|
||||||
with a scheme, or connect CI Server to Active Directory (AD, domain users, security group or
|
Manual CI Server, Manual OS, No, SSO, Deny; no-login profile CI_NO_LOGIN; login methods for
|
||||||
OU mapping, directory group, profile priority, AD_INT_ON) and single sign-on for CI View
|
RESTful API Server, Python Interface (pyTOOLS) and the Password Check Function), hide
|
||||||
(SSO, SPNEGO, Kerberos, keytab, setspn, ktpass, kinit, krb5.ini). Sources IM 36K10C10-01EN §2,
|
Engineering Module features with a scheme, or connect CI Server to Active Directory (AD,
|
||||||
IM 36K10J40-01EN.
|
domain users, security group or OU mapping, directory group, profile priority, AD_INT_ON)
|
||||||
|
and single sign-on for CI View (SSO, SPNEGO, Kerberos, keytab, setspn, ktpass, kinit,
|
||||||
|
krb5.ini). Sources IM 36K10C10-01EN §2, IM 36K10J40-01EN.
|
||||||
---
|
---
|
||||||
|
|
||||||
# Authorization (R1.03)
|
# Authorization (R1.05)
|
||||||
|
|
||||||
|
Re-checked on R1.05 on 2026-10-09 (read-only, no user or group changes): `USER_DF`,
|
||||||
|
`USER_VAL`, `SCHEME_DF`, `AUTH_ACTION_DF` definitions and the SSO/Kerberos templates are as in
|
||||||
|
R1.03. New in R1.04/R1.05:
|
||||||
|
- `AUTH_GROUP_DF` holds up to **250** actions (`ACTION_NAME_1…250`, was 200); an upgrade
|
||||||
|
utility `dss_ath_grp_u0104` converts the dataset on the first start after an upgrade (ISS-147).
|
||||||
|
- `AUTH_ACTION_DF` has 203 actions (R1.03: 200); new `UA_MAPPER_PROJECT_INSERT/MODIFY/DELETE`
|
||||||
|
for the OPC UA Information Model Mapper. There is no separate action for API keys, the
|
||||||
|
RESTful API or pyTOOLS (ISS-146).
|
||||||
|
- `dssana.sup` has three new user interfaces with their own login lines: *RESTful API Server*,
|
||||||
|
*Python Interface* (pyTOOLS), *Password Check Function* (ISS-148; `login-methods.md`).
|
||||||
|
- API keys per user for the RESTful API (`API_KEYS_DF`, ISS-151; `users-groups.md`).
|
||||||
|
|
||||||
Background: `knowledge/manuals/IM36K10C10-01EN.md` §2 (login methods, actions, user tabs,
|
Background: `knowledge/manuals/IM36K10C10-01EN.md` §2 (login methods, actions, user tabs,
|
||||||
schemes), `IM36K10J40-01EN.md` (Active Directory, SSO). Login settings are in `dssana.sup` on CI Core (skill `portal-setup` for reading
|
schemes), `IM36K10J40-01EN.md` (Active Directory, SSO). Login settings are in `dssana.sup` on
|
||||||
and changing setup files).
|
CI Core (skill `portal-setup` for reading and changing setup files). RESTful API: skill
|
||||||
|
`data-access`; pyTOOLS: skill `pytools`; Password Check display function: skill `graphics`.
|
||||||
|
|
||||||
Rules:
|
Rules:
|
||||||
- Run the `system-check` skill first; follow the user's chosen way of working.
|
- Run the `system-check` skill first; follow the user's chosen way of working.
|
||||||
- Users are login accounts. Claude prepares user quick load files but the user loads them
|
- Users are login accounts. Claude prepares user quick load files but the user loads them
|
||||||
and sets any password; never put real passwords in repo files.
|
and sets any password; never put real passwords or API keys in repo files.
|
||||||
- Remove users before the authorization group they belong to.
|
- Remove users before the authorization group they belong to.
|
||||||
|
|
||||||
| Task | File | Status |
|
| Task | File | Status |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Create, check and remove authorization groups and users (quick load) | `tasks/users-groups.md` | verified |
|
| Create, check and remove authorization groups and users (quick load) | `tasks/users-groups.md` | verified on R1.03; R1.05 definitions checked (2026-10-09), not re-loaded on the shared server |
|
||||||
| Login methods per client and user interface (`dssana.sup`, tab *Login control*); *No* login = full authorization when the profile user is missing | `tasks/login-methods.md` | verified (read; changes from docs) |
|
| API key for a user (RESTful API) | `tasks/users-groups.md` § API key | from docs; dataset definition verified on R1.05 |
|
||||||
| Schemes (hide Engineering Module features) | C10 summary §2 | from docs |
|
| Login methods per client and user interface (`dssana.sup`, tab *Login control*); *No* login = full authorization when the profile user is missing | `tasks/login-methods.md` | verified (read, R1.03 and R1.05); changes from docs |
|
||||||
| Active Directory integration and single sign-on (SPNEGO) | `tasks/active-directory.md` | from docs (no domain) |
|
| Schemes (hide Engineering Module features) | C10 summary §2 | from docs (R1.05: same three schemes, definition unchanged) |
|
||||||
| Password rules (`dssana.sup` *Password rules*: length, digits, punctuation, mixed case) | L50 summary §3 | from docs |
|
| Active Directory integration and single sign-on (SPNEGO) | `tasks/active-directory.md` | from docs; not tested (no domain); R1.05 keywords and templates checked |
|
||||||
|
| Password rules (`dssana.sup` *Password rules*: length, digits, punctuation, mixed case) | L50 summary §3 | from docs (R1.05 help unchanged) |
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Active Directory integration and single sign-on (SPNEGO) for CI Server
|
task: Active Directory integration and single sign-on (SPNEGO) for CI Server
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10J40-01EN §1–§3, App. 1; dssana.sup AD/SSO keywords and auth\WEB-INF templates checked on the test system 2026-10-01
|
source: IM 36K10J40-01EN 4th ed. (Feb. 2026) §1–§3, App. 1 (unchanged from the 3rd ed. apart from contact information); dssana.sup AD/SSO keywords and auth\WEB-INF templates checked on R1.03 (2026-10-01) and on the R1.05 test server (2026-10-09)
|
||||||
status: from docs (no domain on the test system)
|
status: from docs; not tested (no Windows domain on either test system). R1.05: Active Directory and Single Sign On keywords, help texts and defaults identical to R1.03; auth\WEB-INF templates identical except web.xml.tpl (verified read-only 2026-10-09)
|
||||||
---
|
---
|
||||||
|
|
||||||
# Active Directory and single sign-on
|
# Active Directory and single sign-on
|
||||||
|
|
@ -59,9 +59,15 @@ Checklist (order matters):
|
||||||
authentication on.
|
authentication on.
|
||||||
6. Test: temporarily enable the `test` servlet in `web.xml`, open
|
6. Test: temporarily enable the `test` servlet in `web.xml`, open
|
||||||
`https://<portal FQDN>:8443/auth/test`, expect *Authorization scheme : SPNEGO*; restore
|
`https://<portal FQDN>:8443/auth/test`, expect *Authorization scheme : SPNEGO*; restore
|
||||||
`web.xml`.
|
`web.xml`. On R1.05 the template `web.xml.tpl` no longer has the old Servlet 2.3
|
||||||
|
`DOCTYPE` line (Servlet 3.1); the servlet entries are unchanged (ISS-153).
|
||||||
7. Start applications from the *Remote Connect* folder on CI View; the login methods `SSO` in
|
7. Start applications from the *Remote Connect* folder on CI View; the login methods `SSO` in
|
||||||
*Login control* (installed default for most UIs) then log the user in without a prompt.
|
*Login control* (installed default for most UIs) then log the user in without a prompt.
|
||||||
|
|
||||||
|
IM 36K10J40 does not mention the R1.04/R1.05 interfaces. Per IM 36K10J10 §2.9.1 the RESTful
|
||||||
|
API accepts *Manual CI Server* or *Manual OS* (the latter for domain users), and pyTOOLS only
|
||||||
|
*Manual CI Server*, so pyTOOLS scripts need a CI Server user with a password even when AD is on
|
||||||
|
(from docs; `login-methods.md`).
|
||||||
|
|
||||||
Common failures (manual): "realm not found" → fix `krb5.ini`; access by IP address or from the
|
Common failures (manual): "realm not found" → fix `krb5.ini`; access by IP address or from the
|
||||||
CI Portal machine itself → no SPNEGO; DNS reverse lookup missing → ticket errors.
|
CI Portal machine itself → no SPNEGO; DNS reverse lookup missing → ticket errors.
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Read and change login methods per client and user interface (dssana.sup Login control)
|
task: Read and change login methods per client and user interface (dssana.sup Login control)
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10C10-01EN §2.2; IM 36K10J40-01EN §1.1, §2.10.3; dssana.sup help and installed values checked on the test system 2026-10-01
|
source: IM 36K10C10-01EN 5th ed. (Feb. 2026) §2.2; IM 36K10J40-01EN 4th ed. (Feb. 2026) §1.1, §2.10.3; IM 36K10J10-01EN 5th ed. §2.9.1 (RESTful API, pyTOOLS); IM 36K10C50-01EN 5th ed. §2.31 (Password Check); dssana.sup help and installed values
|
||||||
status: verified (reading and the No-login behaviour; changing the file from docs — admin)
|
status: verified on R1.03 (2026-10-01: reading and the No-login behaviour); R1.05 dssana.sup compared read-only with R1.03 on the R1.05 test server (2026-10-09); changing the file from docs (admin)
|
||||||
---
|
---
|
||||||
|
|
||||||
# Login methods (`dssana.sup`, tab *Login control*)
|
# Login methods (`dssana.sup`, tab *Login control*)
|
||||||
|
|
@ -19,22 +19,48 @@ LOGIN_METHOD = <client>, "<user interface>", <method>, <no login when no users>,
|
||||||
(any other); lines are evaluated top-down, `<local>`/`<remote>` always last.
|
(any other); lines are evaluated top-down, `<local>`/`<remote>` always last.
|
||||||
- `<user interface>`: the full name from the *User Interfaces* tab (`USER_INTERFACE = …`), e.g.
|
- `<user interface>`: the full name from the *User Interfaces* tab (`USER_INTERFACE = …`), e.g.
|
||||||
`"Engineering Module"`, `"Edit Module"`, `"Operator Interface"`, `"Quickload Utility"`.
|
`"Engineering Module"`, `"Edit Module"`, `"Operator Interface"`, `"Quickload Utility"`.
|
||||||
|
A user interface that is not listed there cannot connect at all. Its last field can name an
|
||||||
|
action the user's group must have (installed: Edit Module and Display/Symbol Utility need
|
||||||
|
`DISPLAY_MODIFY`).
|
||||||
- `<method>`: `Automatic` (Windows name = CI Server user, no password), `Manual CI Server`,
|
- `<method>`: `Automatic` (Windows name = CI Server user, no password), `Manual CI Server`,
|
||||||
`Manual OS`, `No`, `SSO`, `Deny`.
|
`Manual OS`, `No`, `SSO`, `Deny`.
|
||||||
|
|
||||||
Installed (R1.03.00): local and remote Engineering Module, Edit Module, Operator Interface, Item
|
Installed (same on R1.03.00 and R1.05.00): local and remote Engineering Module, Edit Module,
|
||||||
Search, Mobile Operator, Excel Add-in → `SSO` (falls back to *Manual CI Server* while SSO is not
|
Operator Interface, Item Search, Mobile Operator, Excel Add-in → `SSO` (falls back to *Manual
|
||||||
set up); local Quickload / Display and Symbol Utility → `No`; remote Playback Viewer, Quickload,
|
CI Server* while SSO is not set up); local Quickload / Display and Symbol Utility → `No`;
|
||||||
Display/Symbol utilities → `Deny`; OPC UA server, ODBC, `dnetapi` → `Manual CI Server`;
|
remote Playback Viewer, Quickload, Display/Symbol utilities → `Deny`; OPC UA server, ODBC →
|
||||||
anonymous OPC UA (local) → `No` with profile `CI_NO_LOGIN_OPCUAS`.
|
`Manual CI Server`; anonymous OPC UA (local) → `No` with profile `CI_NO_LOGIN_OPCUAS`.
|
||||||
|
|
||||||
|
**New in R1.04/R1.05** (verified in the R1.05 file, 2026-10-09; ISS-148):
|
||||||
|
|
||||||
|
| User interface (abbreviation) | Used by | Installed method (local and remote) | Allowed methods (manual) |
|
||||||
|
|---|---|---|---|
|
||||||
|
| `RESTful API Server` (`JRSTSRV`) | RESTful API (skill `data-access`) | Manual CI Server | Manual CI Server or Manual OS (J10 §2.9.1) |
|
||||||
|
| `Python Interface` (`PYDSS`) | pyTOOLS (skill `pytools`) | Manual CI Server | Manual CI Server only (J10 §2.9.1) |
|
||||||
|
| `Password Check Function` (`JWUIPSWD`) | *Password Check* in display Generic Functions (skill `graphics`) | Manual CI Server | Manual CI Server or Manual OS (C50 §2.31) |
|
||||||
|
|
||||||
|
The .NET API line was renamed: R1.03 had `LOGIN_METHOD = "<local>", "dnetapi", …`, a name that
|
||||||
|
is not a defined user interface; R1.05 uses `"Application Interface"` (the `TLSVBCLIB` user
|
||||||
|
interface), still *Manual CI Server*. After an upgrade, check that these lines exist: a
|
||||||
|
`dssana.sup` carried over from R1.03 lacks them and the three new interfaces cannot log on
|
||||||
|
(ISS-149, not tested: no upgrade available).
|
||||||
|
|
||||||
|
The other tabs (*General*, *Clients System Trust*, *Active Directory*, *Single Sign On*,
|
||||||
|
*Password rules*, *Logging*) and all help texts are unchanged in R1.05. `MAX_UI_PER_CLIENT`
|
||||||
|
(user interfaces per remote CI View) has help/factory default 5; the R1.05 test server has a
|
||||||
|
different active value, probably a local change (ISS-150).
|
||||||
|
|
||||||
## 2. *No* login — check the profile
|
## 2. *No* login — check the profile
|
||||||
|
|
||||||
With `No` the user interface runs with the no-login profile (5th field). **If no CI Server user
|
With `No` the user interface runs with the no-login profile (5th field). **If no CI Server user
|
||||||
with that name exists, the session gets full authorization** (`dssana.sup` help; verified
|
with that name exists, the session gets full authorization** (`dssana.sup` help, unchanged in
|
||||||
indirectly: `Quickload Utility` uses `No` with an empty profile and every `dssqld` change is
|
R1.05; verified indirectly on R1.03: `Quickload Utility` uses `No` with an empty profile and
|
||||||
recorded in the audit trail as user `FULL AUTHORIZATION`). The installed lines name
|
every `dssqld` change is recorded in the audit trail as user `FULL AUTHORIZATION`). The
|
||||||
`CI_NO_LOGIN`, which does not exist by default (only `CI_NO_LOGIN_OPCUAS` does).
|
installed lines name `CI_NO_LOGIN`, which does not exist by default (only `CI_NO_LOGIN_OPCUAS`
|
||||||
|
does). Manual (C10 §2.2, R1.05): now also names `CI_NO_LOGIN` (R1.03 manual: `FT_NO_LOGIN`),
|
||||||
|
but still says *no* profile is applied when that user is missing — the installed help is the
|
||||||
|
reference (ISS-018, ISS-125). *No* is only allowed for user interfaces on the CI Portal itself,
|
||||||
|
not for remote CI View.
|
||||||
|
|
||||||
Before setting `No` for an operator UI: create user `CI_NO_LOGIN` with a restricted
|
Before setting `No` for an operator UI: create user `CI_NO_LOGIN` with a restricted
|
||||||
authorization group (`users-groups.md`) and a password, then change the method.
|
authorization group (`users-groups.md`) and a password, then change the method.
|
||||||
|
|
@ -45,3 +71,5 @@ Admin rights; hand to the user (skill `portal-setup`, `change-setup-file.md`). A
|
||||||
line above the `<local>`/`<remote>` lines (e.g. one HMI PC by host name), save, restart USER
|
line above the `<local>`/`<remote>` lines (e.g. one HMI PC by host name), save, restart USER
|
||||||
Service (or CI Server) for it to take effect. With **AD integration on** (`AD_INT_ON = YES`) the
|
Service (or CI Server) for it to take effect. With **AD integration on** (`AD_INT_ON = YES`) the
|
||||||
methods of the Edit and Engineering Modules are ignored: see `active-directory.md`.
|
methods of the Edit and Engineering Modules are ignored: see `active-directory.md`.
|
||||||
|
For the Password Check function the method must be *Manual CI Server* or *Manual OS* (installed
|
||||||
|
default is fine); for pyTOOLS only *Manual CI Server* works.
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Create, check and remove authorization groups and users with quick load
|
task: Create, check and remove authorization groups and users with quick load
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10C10-01EN §2.4, §2.5; data dictionary (`dssqld -f`); practiced on the test system 2026-09-30
|
source: IM 36K10C10-01EN 5th ed. (Feb. 2026) §2.4, §2.5; IM 36K10L45-01EN 5th ed. §4.2.2 (API key); data dictionary (`dssqld -f`); practiced on the test system 2026-09-30
|
||||||
status: verified
|
status: verified on R1.03 (2026-09-30, 2026-10-06); on R1.05 the USER_DF, USER_VAL, AUTH_ACTION_DF definitions were checked identical and AUTH_GROUP_DF extended to 250 actions, AUTH_ACTION_DF and SCHEME_DF exported read-only (R1.05 test server, 2026-10-09); loading users and groups not re-tested on R1.05 (shared server, no user or group changes)
|
||||||
---
|
---
|
||||||
|
|
||||||
# Authorization groups and users (quick load)
|
# Authorization groups and users (quick load)
|
||||||
|
|
@ -21,13 +21,19 @@ dssqld -e actions.qli -d AUTH_ACTION_DF -c -l actions.lst
|
||||||
```
|
```
|
||||||
|
|
||||||
Installed on R1.03: groups `SYSTEM_MANAGER`, `ENGINEER`, `OPERATOR`, `GUEST`; users `ADMIN`,
|
Installed on R1.03: groups `SYSTEM_MANAGER`, `ENGINEER`, `OPERATOR`, `GUEST`; users `ADMIN`,
|
||||||
`ADMINE`, `OPER`, `CI_NO_LOGIN_OPCUAS`. Passwords export as `****`.
|
`ADMINE`, `OPER`, `CI_NO_LOGIN_OPCUAS`. Passwords export as `****`. R1.05: the same four
|
||||||
|
factory groups (verified 2026-10-09); `AUTH_ACTION_DF` has 203 actions (R1.03: 200).
|
||||||
|
|
||||||
## Group
|
## Group
|
||||||
|
|
||||||
Required: `NAME`. Actions go in `ACTION_NAME_1`, `ACTION_NAME_2`, … and must be names from
|
Required: `NAME`. Actions go in `ACTION_NAME_1`, `ACTION_NAME_2`, … (up to `ACTION_NAME_250` on
|
||||||
`AUTH_ACTION_DF` (e.g. `ITEM_READ`, `ITEM_MODIFY_VALUE`, `SECTION_BLOCK_UNBLOCK`,
|
R1.04 and later, 200 on R1.03) and must be names from `AUTH_ACTION_DF` (e.g. `ITEM_READ`,
|
||||||
`ALARM_CURRENT_ACK`). Example (`examples/CI-Eng-Sample/08_auth_group_df.qli`):
|
`ITEM_MODIFY_VALUE`, `SECTION_BLOCK_UNBLOCK`, `ALARM_CURRENT_ACK`). New on R1.05:
|
||||||
|
`UA_MAPPER_PROJECT_INSERT`, `_MODIFY`, `_DELETE` (dataset `UASERVER_MAPPER_DF`, OPC UA
|
||||||
|
Information Model Mapper; no `_READ` action exists). The RESTful API, pyTOOLS and API keys
|
||||||
|
have no actions of their own: a REST or Python session has the rights of the user it logs on
|
||||||
|
as (ISS-146). A group with more than 200 actions cannot be moved back to R1.03, which has only
|
||||||
|
200 action fields. Example (`examples/CI-Eng-Sample/08_auth_group_df.qli`):
|
||||||
|
|
||||||
```
|
```
|
||||||
@FIELDS
|
@FIELDS
|
||||||
|
|
@ -59,6 +65,22 @@ Defaults filled in on import (seen): display authorization level 999, language *
|
||||||
playback *HMI Client dependent* / *No*, merge priority 1. Changes take effect at the user's
|
playback *HMI Client dependent* / *No*, merge priority 1. Changes take effect at the user's
|
||||||
next login.
|
next login.
|
||||||
|
|
||||||
|
## API key (RESTful API, R1.04 and later)
|
||||||
|
|
||||||
|
The RESTful API needs, besides the user's name and password (HTTP Basic), an API key of that
|
||||||
|
user in the `x-api-key` header (IM 36K10L45 §4.2; skill `data-access`). The key is made in the
|
||||||
|
Engineering Module: *Authorisation › Users*, right-click the user, *Add API Key*: key name
|
||||||
|
(user name plus a hint that it is a RESTful key), description (≤ 79 bytes), *API Type*
|
||||||
|
*RESTful API*, *Request API key*. One key per user; the manual says requesting it again gives
|
||||||
|
the **same** key, so deleting and re-requesting does not replace a leaked key — change or
|
||||||
|
remove the user instead (ISS-151, not tested).
|
||||||
|
|
||||||
|
Dataset `API_KEYS_DF` (verified definition, R1.05 2026-10-09): `NAME` = `<USER>:<KEY NAME>`
|
||||||
|
(≤ 64, upper case), `USER_NAME` (must exist in `USER_DF`), `API_KEY_NAME`, `DESCRIPTION`,
|
||||||
|
`API_TYPE` (only `RESTful API`). The key itself is **not** a field of the dataset, so it
|
||||||
|
cannot be exported or loaded with quick load; full exports skip `API_KEYS_DF` (ISS-118).
|
||||||
|
Create keys again on a new or restored system. Claude never reads, writes or stores API keys.
|
||||||
|
|
||||||
## Check and remove
|
## Check and remove
|
||||||
|
|
||||||
Filtered export (`@SELECT`, see `system-management` task `export-dataset.md`):
|
Filtered export (`@SELECT`, see `system-management` task `export-dataset.md`):
|
||||||
|
|
@ -82,13 +104,13 @@ NAME
|
||||||
"CIENG_VIEWER"
|
"CIENG_VIEWER"
|
||||||
```
|
```
|
||||||
|
|
||||||
## Test system (2026-09-30)
|
## Test system (R1.03, 2026-09-30)
|
||||||
|
|
||||||
Group `CIENG_VIEWER` and user `CIENG_TEST` (no `PASSWORD` field, logoff 15 min) loaded with 0
|
Group `CIENG_VIEWER` and user `CIENG_TEST` (no `PASSWORD` field, logoff 15 min) loaded with 0
|
||||||
errors, exported back as defined, then removed (1 + 1 removed, 0 errors). Logon was not tried;
|
errors, exported back as defined, then removed (1 + 1 removed, 0 errors). Logon was not tried;
|
||||||
such a user cannot log on (see *User*). The group is part of CI-Eng-Sample.
|
such a user cannot log on (see *User*). The group is part of CI-Eng-Sample.
|
||||||
|
|
||||||
## Sample user (2026-10-06)
|
## Sample user (R1.03, 2026-10-06)
|
||||||
|
|
||||||
`examples/CI-Eng-Sample/08b_user_df.qli`: user `CIENG`, `PASSWORD ""`, factory group `OPERATOR`,
|
`examples/CI-Eng-Sample/08b_user_df.qli`: user `CIENG`, `PASSWORD ""`, factory group `OPERATOR`,
|
||||||
`LAYOUT` `CIENG_Operator`, `INITIAL_DISPLAY` `CIENG_Overview`; logs on to that layout on the desktop
|
`LAYOUT` `CIENG_Operator`, `INITIAL_DISPLAY` `CIENG_Overview`; logs on to that layout on the desktop
|
||||||
|
|
@ -101,3 +123,8 @@ USER_VAL*; logging out did not free it at once, and a retry in that state stoppe
|
||||||
`DSSSDA03` (*DUR-F-BAD_SIZE, Negative size not allowed*; later requests failed with
|
`DSSSDA03` (*DUR-F-BAD_SIZE, Negative size not allowed*; later requests failed with
|
||||||
*DUR-F-UNKNOWN_ATT*) until CI Server was restarted (2026-10-06, ISS-073). After a restart the
|
*DUR-F-UNKNOWN_ATT*) until CI Server was restarted (2026-10-06, ISS-073). After a restart the
|
||||||
group was removed without error. `USER_VAL` exports only its header (no way to list sessions).
|
group was removed without error. `USER_VAL` exports only its header (no way to list sessions).
|
||||||
|
On R1.05 this was not repeated (it stops a DSS process; the server is shared). `USER_VAL`
|
||||||
|
and `AUTH_GROUP_DF` keep the same relation, but the DSS processes are arranged differently
|
||||||
|
(ISS-117), so treat ISS-073 as still valid until it is re-tested on a separate system (ISS-152).
|
||||||
|
The same applies to the password behaviour of ISS-072 (`USER_DF.PASSWORD` unchanged): keep
|
||||||
|
giving `PASSWORD ""` or setting the password in the Engineering Module.
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,39 @@
|
||||||
---
|
---
|
||||||
name: class-object-engineering
|
name: class-object-engineering
|
||||||
description: >-
|
description: >-
|
||||||
CI Server R1.03 PROCESS Service: trigger groups, classes and objects. Use when the user wants
|
CI Server R1.05 PROCESS Service: trigger groups, classes and objects. Use when the user wants
|
||||||
to create a trigger group, write, compile or change a class (Traditional PROCESS language or
|
to create a trigger group, write, compile or change a class (Traditional PROCESS language or
|
||||||
Java), use signals, attributes, prompts, timers or template items in a class, create objects
|
Java), use signals, attributes, prompts, timers or template items in a class, create objects
|
||||||
from a class (with prompt answers), let an object create its own items, reset a class after a
|
from a class (with prompt answers), let an object create its own items, reset a class after a
|
||||||
change, read or change object attribute values, see which item a signal uses, load or remove
|
change, read or change object attribute values, see which item a signal uses, load or remove
|
||||||
classes and objects with quick load files, or check PROCESS Service with opcdbg (database
|
classes and objects with quick load files, or check PROCESS Service with opcdbg (database
|
||||||
check, object status, executor statistics). Sources IM 36K10L10-01EN, IM 36K10P10-01EN,
|
check, object status, executor statistics), check the Java class API (fasttools.processfast,
|
||||||
IM 36K10P11-01EN, IM 36K10G10-01EN (Tutorial).
|
createSection, Java runtime version) or the preinstalled system classes (AOG_BASE, AOG_JBASE,
|
||||||
|
PRC_STATUS_BASE, OPC UA method sample classes UAC_MTD_JBASE / UAS_MTD_JBASE with MTD_KEY /
|
||||||
|
MTD_TRG). Sources IM 36K10L10-01EN, IM 36K10P10-01EN, IM 36K10P11-01EN, IM 36K10G10-01EN
|
||||||
|
(Tutorial).
|
||||||
---
|
---
|
||||||
|
|
||||||
# Class and object engineering (R1.03)
|
# Class and object engineering (R1.05)
|
||||||
|
|
||||||
|
Re-checked on R1.05 on 2026-10-09 (read-only): the three manuals only added contact
|
||||||
|
information (P11 §10.2 reworded, with one real fix: `createSection()` has no process-area
|
||||||
|
argument, ISS-154); dataset definitions (`CLASS_DF`, `OBJECT_DF`, `TRIGGER_DF`,
|
||||||
|
signal/attribute/reset datasets), `opc.sup`, `prc.sup`, the class source templates and the
|
||||||
|
Java logging files are identical to R1.03; the public Java API
|
||||||
|
(`fasttools.processfast`) is unchanged. The sample classes `CIENG_INCR`, `CIENG_TANK` and
|
||||||
|
`CIENG_JFLOW` loaded, compiled and ran on the R1.05 test server on 2026-10-08.
|
||||||
|
|
||||||
|
What is new on R1.05 (details in the L10 / P11 summaries):
|
||||||
|
- Java runtime Temurin 11.0.28 (R1.03: 11.0.18); the Java PROCESS processes also load jars
|
||||||
|
from `tls\exe\lib`.
|
||||||
|
- `process_start.cmd` / `process_stop.cmd` call every `?*_process_start.cmd` /
|
||||||
|
`?*_process_stop.cmd` in `tls\com` (extension hook, as for the other services).
|
||||||
|
- Two more preinstalled Java classes, `UAC_MTD_JBASE` and `UAS_MTD_JBASE`: samples for OPC UA
|
||||||
|
methods (`MTD_KEY` attribute, `MTD_TRG` / `MTD_RET` / `MTD_IN_ARG_n` / `MTD_OUT_ARG_n`
|
||||||
|
signals). How to use them: skill `data-access`, task `opcua-client.md` §7 and the L45
|
||||||
|
summary (§10.6, §11.4). Do not change or delete the preinstalled classes (also `AOG_BASE`,
|
||||||
|
`AOG_JBASE`, `PRC_STATUS_BASE`); derive or copy instead.
|
||||||
|
|
||||||
Background: `knowledge/manuals/IM36K10L10-01EN.md` (processes, `opc.sup`, `opcdbg`, data
|
Background: `knowledge/manuals/IM36K10L10-01EN.md` (processes, `opc.sup`, `opcdbg`, data
|
||||||
store), `IM36K10P10-01EN.md` (Traditional language), `IM36K10P11-01EN.md` (Java),
|
store), `IM36K10P10-01EN.md` (Traditional language), `IM36K10P11-01EN.md` (Java),
|
||||||
|
|
@ -28,11 +50,12 @@ Rules:
|
||||||
|
|
||||||
| Task | File | Status |
|
| Task | File | Status |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Trigger group, class (compiled on load) and object via quick load; compile errors; remove | `tasks/load-class-object.md` | verified |
|
| Trigger group, class (compiled on load) and object via quick load; compile errors; remove | `tasks/load-class-object.md` | verified (R1.03); load, compile, run and remove re-tested on R1.05 2026-10-08 |
|
||||||
| Traditional class with prompts/attributes, signals from the object's section, items created from a template, input check; change an attribute at runtime | `tasks/traditional-class.md` | verified |
|
| Traditional class with prompts/attributes, signals from the object's section, items created from a template, input check; change an attribute at runtime | `tasks/traditional-class.md` | verified (R1.03); class and created item re-tested on R1.05 2026-10-08, attribute change not re-tested |
|
||||||
| Java class: attach and create items, signal trigger, system log message | `tasks/java-class.md` | verified |
|
| Java class: attach and create items, signal trigger, system log message | `tasks/java-class.md` | verified (R1.03); re-tested on R1.05 2026-10-08, API checked identical 2026-10-09 |
|
||||||
| Change a class that has objects: compile, reset with `opcdbg` | `tasks/change-reset-class.md` | verified (`dssqld` reset does not work, ISS-028) |
|
| Change a class that has objects: compile, reset with `opcdbg` | `tasks/change-reset-class.md` | verified (R1.03; `dssqld` reset does not work, ISS-028); not re-tested on R1.05 (awaiting decision, ISS-158) |
|
||||||
| `opcdbg` checks: database check, class/object details, object status, executor statistics, dumps | `tasks/opcdbg-checks.md` | verified |
|
| `opcdbg` checks: database check, class/object details, object status, executor statistics, dumps | `tasks/opcdbg-checks.md` | verified (R1.03); database check and `OPCEXE1` statistics re-checked on R1.05 2026-10-09 |
|
||||||
|
| OPC UA method objects (`UAC_MTD_JBASE`, `UAS_MTD_JBASE`) | skill `data-access`, `opcua-client.md` §7; L45 summary | from docs; sample classes found installed on R1.05 (2026-10-09) |
|
||||||
| Language reference (statements, operators, built-ins, DSS routines; Java API) | P10 / P11 summaries | from docs, main parts verified |
|
| Language reference (statements, operators, built-ins, DSS routines; Java API) | P10 / P11 summaries | from docs, main parts verified |
|
||||||
| `opc.sup` settings (executors, priorities, statistics, PRINT) | L10 summary §2 | read-only check; changing not practiced |
|
| `opc.sup` settings (executors, priorities, statistics, PRINT) | L10 summary §2 | read-only check (R1.03; identical on R1.05); changing not practiced |
|
||||||
| Containment, inheritance, timers, alarms, STEP state machines, DSS routines | P10 / P11 summaries | from docs |
|
| Containment, inheritance, timers, alarms, STEP state machines, DSS routines | P10 / P11 summaries | from docs |
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Change a class that already has objects (compile and reset)
|
task: Change a class that already has objects (compile and reset)
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10L10-01EN §4 (Reset class); IM 36K10P11-01EN §2.3, §10.4; practiced with CI-Eng-Sample class CIENG_TANK 2026-09-30
|
source: IM 36K10L10-01EN 4th ed. (Feb. 2026) §4 (Reset class); IM 36K10P11-01EN 4th ed. §2.3, §10.4; practiced with CI-Eng-Sample class CIENG_TANK 2026-09-30
|
||||||
status: verified
|
status: verified on R1.03 (2026-09-30, Engineering Module reset 2026-10-01). Not re-tested on R1.05; it needs the sample loaded again on the shared test server (awaiting decision, ISS-158). Manuals unchanged and CLASS_DF / CLASS_RESET_COMMAND definitions identical on R1.05 (2026-10-09), so the R1.03 results are expected to hold
|
||||||
---
|
---
|
||||||
|
|
||||||
# Change a class that has objects
|
# Change a class that has objects
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Write and load a Java PROCESS Service class
|
task: Write and load a Java PROCESS Service class
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10P11-01EN §1–§5, §10; IM 36K10L10-01EN §1; practiced with CI-Eng-Sample class CIENG_JFLOW 2026-09-30
|
source: IM 36K10P11-01EN 4th ed. (Feb. 2026) §1–§5, §10; IM 36K10L10-01EN §1; practiced with CI-Eng-Sample class CIENG_JFLOW 2026-09-30
|
||||||
status: verified
|
status: verified on R1.03 (2026-09-30); re-tested on R1.05 2026-10-08 (CIENG_JFLOW compiled on load, sPerMin 2 for inflow 120, removed). Public API of fasttools.processfast compared with javap on 2026-10-09: identical to R1.03. systemMessage() output and the reset after a change were not re-tested on R1.05
|
||||||
---
|
---
|
||||||
|
|
||||||
# Java class
|
# Java class
|
||||||
|
|
@ -77,7 +77,34 @@ refuse bad answers with `cancel("text")` in `create()`.
|
||||||
(`change-reset-class.md`).
|
(`change-reset-class.md`).
|
||||||
- Deleting the object deleted `…JFLOW.sPerMin` and section `…TANK1.JFLOW`; `INFLOW` stayed.
|
- Deleting the object deleted `…JFLOW.sPerMin` and section `…TANK1.JFLOW`; `INFLOW` stayed.
|
||||||
|
|
||||||
## 4. Pitfalls (manual)
|
## 4. Java on R1.05 (checked 2026-10-09)
|
||||||
|
|
||||||
|
- Runtime: the JDK in `%TLS_ROOT_PATH%\tls\jre` is Eclipse Temurin **11.0.28** (R1.03:
|
||||||
|
11.0.18). Same Java 11 language level; write classes for Java 11.
|
||||||
|
- API: the public classes and methods of `fasttools.processfast` (in `tls\exe\jopcsrv.jar`)
|
||||||
|
are the same as on R1.03 (`javap -public`; the jar itself was rebuilt).
|
||||||
|
- `createSection(path, description, blocked, opcVisible)` takes **four** arguments on both
|
||||||
|
versions. The manual's examples pass a fifth (an empty process-area string) and would not
|
||||||
|
compile as printed; R1.05 §10.2 now describes it correctly (ISS-154; not compile-tested).
|
||||||
|
- The API has methods that P11 does not describe (ISS-159): `getHistory(...)` (item history
|
||||||
|
as `ValueSample[]`, several overloads), `defineIntegerAttributeForPrompt` /
|
||||||
|
`defineDoubleAttributeForPrompt` (P11 only names the String version),
|
||||||
|
`sendAndReceiveMessage(...)` (BUS request/reply) and `getDssSession()` (release notes).
|
||||||
|
Their behaviour is not documented here; test before relying on them.
|
||||||
|
- Extra jars: the Java PROCESS processes (`OPCJCOM`, `OPCJACT`, `OPCJEXE`) put `tls\exe\*`
|
||||||
|
and, on R1.05, also `tls\exe\lib\*` (bundled third-party jars) on the class path.
|
||||||
|
Your own library jar still goes in `tls\exe` (P11 §9).
|
||||||
|
- OPC UA methods (R1.04+): method objects are Java (or Traditional) objects with the
|
||||||
|
attribute `MTD_KEY` and signals `MTD_TRG`, `MTD_RET`, `MTD_IN_ARG_n`, `MTD_OUT_ARG_n`. The
|
||||||
|
installed sample classes are the starting point: `UAC_MTD_JBASE` (CI Server as OPC UA
|
||||||
|
client; prompts for the method key `<station>:<method>` and for the input and output
|
||||||
|
argument lists written as `/type/description`, type f, i, s or b, at most 10 each) and
|
||||||
|
`UAS_MTD_JBASE` (method offered by the CI Server OPC UA server; your logic runs when
|
||||||
|
`MTD_TRG` becomes 1 and must set the outputs, then `MTD_RET` if needed, then `MTD_TRG` 0 =
|
||||||
|
good or 2 = bad). Use one class with its own name per method object. Procedure: skill
|
||||||
|
`data-access`, `opcua-client.md` §7, and the L45 summary (§10.6, §11.4). Not practiced.
|
||||||
|
|
||||||
|
## 5. Pitfalls (manual)
|
||||||
|
|
||||||
- Definitions (`define…()`) only at class level, without `public`/`private`.
|
- Definitions (`define…()`) only at class level, without `public`/`private`.
|
||||||
- `create()`/`destroy()` run in a different process than the trigger methods: only attributes
|
- `create()`/`destroy()` run in a different process than the trigger methods: only attributes
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Create trigger groups, classes and objects with quick load files
|
task: Create trigger groups, classes and objects with quick load files
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10G10-01EN §5.1–5.3; IM 36K10L10-01EN §3; IM 36K10J10-01EN §5.6; practiced with CI-Eng-Sample 2026-09-30 (full remove/reload with three classes and objects)
|
source: IM 36K10G10-01EN §5.1–5.3; IM 36K10L10-01EN 4th ed. (Feb. 2026) §3; IM 36K10J10-01EN §5.6; practiced with CI-Eng-Sample 2026-09-30 (full remove/reload with three classes and objects)
|
||||||
status: verified
|
status: verified on R1.03 (2026-09-30); on R1.05 the dataset definitions CLASS_DF / OBJECT_DF / TRIGGER_DF are identical (checked 2026-10-09) and the sample trigger group, classes CIENG_INCR / CIENG_TANK / CIENG_JFLOW and objects loaded with 0 errors, compiled, ran and were removed with 0 errors on the R1.05 test server (2026-10-08, reduced sample load). The compile-error path (COMPILE 0 then update) was not re-tested on R1.05
|
||||||
---
|
---
|
||||||
|
|
||||||
# Trigger groups, classes and objects via quick load
|
# Trigger groups, classes and objects via quick load
|
||||||
|
|
@ -120,4 +120,11 @@ Then `CLASS_DF`, then `TRIGGER_DF`. Deleting an object also deletes the items an
|
||||||
created (verified); items it only attached stay.
|
created (verified); items it only attached stay.
|
||||||
|
|
||||||
Example files: `examples/CI-Eng-Sample/05_trigger_df.qli`, `06_class_df.qli`,
|
Example files: `examples/CI-Eng-Sample/05_trigger_df.qli`, `06_class_df.qli`,
|
||||||
`07_object_df.qli`, `86_` to `88_remove_*.qli`.
|
`07_object_df.qli`, `86_` to `88_remove_*.qli`. R1.05 accepts these `@VERSION 1.03.00` files
|
||||||
|
unchanged (2026-10-08).
|
||||||
|
|
||||||
|
**System classes**: every installation already holds a few classes that are not yours:
|
||||||
|
`AOG_BASE`, `AOG_JBASE` (Advanced Operating Graphics), `PRC_STATUS_BASE` and, from R1.04,
|
||||||
|
the OPC UA method samples `UAC_MTD_JBASE` and `UAS_MTD_JBASE` (found on the R1.05 test
|
||||||
|
server 2026-10-09; skill `data-access`). Leave them alone: do not remove or recompile them
|
||||||
|
with a quick load, and filter exports on your own class names.
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Check PROCESS Service with opcdbg (database check, classes, objects, performance)
|
task: Check PROCESS Service with opcdbg (database check, classes, objects, performance)
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10L10-01EN §4; practiced on the test system with CI-Eng-Sample 2026-09-30
|
source: IM 36K10L10-01EN 4th ed. (Feb. 2026) §4; practiced on the test system with CI-Eng-Sample 2026-09-30
|
||||||
status: verified (read-only actions and Reset class)
|
status: verified on R1.03 (read-only actions and Reset class). On R1.05 (2026-10-09, read-only) the database check and the OPCEXE1 performance main info gave the same prompts and output layout; the Java executor statistics did not answer to piped input (ISS-157, awaiting user verification); the other actions were not re-run
|
||||||
---
|
---
|
||||||
|
|
||||||
# PROCESS Service checks with `opcdbg`
|
# PROCESS Service checks with `opcdbg`
|
||||||
|
|
@ -24,8 +24,14 @@ Only the actions below are read-only. Do not use insert/modify/delete, *Database
|
||||||
| Object signals / attributes | `3` then `14` / `12`, object name | Signal → item id; attribute → type (LOCAL/GLOBAL) |
|
| Object signals / attributes | `3` then `14` / `12`, object name | Signal → item id; attribute → type (LOCAL/GLOBAL) |
|
||||||
| Executor statistics | `printf '0\nOPCEXE1\n1\n-1\n-1\n' \| timeout 20 opcdbg 0 4` | Active classes/objects/trigger groups/items, number of executions; times stay 0 unless `STATISTICS = YES` in `opc.sup` |
|
| Executor statistics | `printf '0\nOPCEXE1\n1\n-1\n-1\n' \| timeout 20 opcdbg 0 4` | Active classes/objects/trigger groups/items, number of executions; times stay 0 unless `STATISTICS = YES` in `opc.sup` |
|
||||||
|
|
||||||
Executor names on R1.03: `OPCEXE1`…`OPCEXE4` (Traditional, priority ranges 0–249 … 750–999)
|
Executor names on R1.03 and R1.05 (same `opc.sup`): `OPCEXE1`…`OPCEXE4` (Traditional,
|
||||||
and `OPCJEXE` (Java). The prompt's default `OPCEXE` does not exist.
|
priority ranges 0–249 … 750–999) and `OPCJEXE` (Java). The prompt's default `OPCEXE` does
|
||||||
|
not exist.
|
||||||
|
|
||||||
|
For `OPCJEXE` the piped command gave no output within 40 s on R1.05 (2026-10-09; the
|
||||||
|
debugger was stopped). Run it interactively: `opcdbg 0 4`, Enter (node 0), `OPCJEXE`, `1`,
|
||||||
|
then `-1` twice; expected: the same main-info block as for `OPCEXE1` (ISS-157). If it hangs,
|
||||||
|
close the window; nothing is changed.
|
||||||
|
|
||||||
Easier for names: the datasets `OBJECT_SIGNAL_DF` (object:signal → item name) and
|
Easier for names: the datasets `OBJECT_SIGNAL_DF` (object:signal → item name) and
|
||||||
`OBJECT_ATTR_VAL` / `CLASS_ATTR_VAL` (attribute values) via `dssqld -e` with a filter — see
|
`OBJECT_ATTR_VAL` / `CLASS_ATTR_VAL` (attribute values) via `dssqld -e` with a filter — see
|
||||||
|
|
@ -40,8 +46,12 @@ it** (`DSS-E-UNK_DS_NM`, ISS-027). To move classes and objects to another system
|
||||||
`CLASS_DF` and `OBJECT_DF` with `dssqld -e` instead (task `load-class-object.md`; migration in
|
`CLASS_DF` and `OBJECT_DF` with `dssqld -e` instead (task `load-class-object.md`; migration in
|
||||||
`knowledge/manuals/IM36K10J10-01EN.md` §5.6).
|
`knowledge/manuals/IM36K10J10-01EN.md` §5.6).
|
||||||
|
|
||||||
## Observed on the test system
|
## Observed on the test systems
|
||||||
|
|
||||||
The database check reported one warning for a class `SINUS` (not from this repo) that was
|
R1.05 test server (2026-10-09): the database check read every store and reported no
|
||||||
|
warning; `OPCEXE1` main info listed active classes, objects, trigger groups and items and the
|
||||||
|
execution count, with all times 0 (`STATISTICS = NO`, as on R1.03).
|
||||||
|
|
||||||
|
R1.03: the database check reported one warning for a class `SINUS` (not from this repo) that was
|
||||||
never compiled; everything else was consistent. A class like that is harmless but can be
|
never compiled; everything else was consistent. A class like that is harmless but can be
|
||||||
compiled or removed by its owner.
|
compiled or removed by its owner.
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Write a Traditional class with prompts, signals built from the object name, and items created from a template
|
task: Write a Traditional class with prompts, signals built from the object name, and items created from a template
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10P10-01EN §1–§5, §8, §10, §11.2.8; IM 36K10L10-01EN; practiced with CI-Eng-Sample class CIENG_TANK 2026-09-30
|
source: IM 36K10P10-01EN 4th ed. (Feb. 2026) §1–§5, §8, §10, §11.2.8 (only contact information changed since R1.03); IM 36K10L10-01EN; practiced with CI-Eng-Sample class CIENG_TANK 2026-09-30
|
||||||
status: verified
|
status: verified on R1.03 (2026-09-30); re-tested on R1.05 2026-10-08 (CIENG_TANK compiled on load, TANK1.CALC.VOLUME created, level 50 gave volume 100, object removed with its items). Refused object, PRINT with %%, and the runtime attribute change (§3) were not re-tested on R1.05
|
||||||
---
|
---
|
||||||
|
|
||||||
# Traditional class: prompts, signals, created items
|
# Traditional class: prompts, signals, created items
|
||||||
|
|
|
||||||
|
|
@ -1,35 +1,50 @@
|
||||||
---
|
---
|
||||||
name: high-availability
|
name: high-availability
|
||||||
description: >-
|
description: >-
|
||||||
CI Server R1.03 high availability with HAC (redundant servers). Use when the user asks about
|
CI Server R1.05 high availability with HAC (redundant servers). Use when the user asks about
|
||||||
redundant / dual / triple / quad servers, primary and secondary server, active and standby,
|
redundant / dual / triple / quad servers, primary and secondary server, active and standby,
|
||||||
switchover (automatic or manual), the HAC HMI (hacw_hmi), watchdog, recovery (restart a
|
switchover (automatic or manual), the HAC HMI (hacw_hmi), watchdog, recovery (restart a
|
||||||
process or tool, hacrec, -wdg_off), mirror / synchronization of the standby, journaling and
|
process or tool, hacrec, -wdg_off), mirror / synchronization of the standby, journaling and
|
||||||
key file repair (isfjrn, *.jrn), history merge after an island situation (hachmfcmd), hac.sup,
|
key file repair (isfjrn, *.jrn), history merge after an island situation (hachmfcmd), hac.sup,
|
||||||
CI_PRIM, hacw_standby / hacw_stop scripts, HAC status items (SYSTEM.HAC1), hacitmval, HAC
|
CI_PRIM, hacw_standby / hacw_stop scripts, extension scripts run on activate / deactivate
|
||||||
firewall ports (UDP 16000-16006), hardware watchdog or custom health checks, or applying a
|
(?*_hacw_activate.cmd), HAC status items (SYSTEM.HAC1), hacitmval, HAC firewall ports
|
||||||
|
(UDP 16000-16006, HMI 16010-16041), hardware watchdog or custom health checks, or applying a
|
||||||
patch to a redundant system. Source IM 36K10J20-01EN.
|
patch to a redundant system. Source IM 36K10J20-01EN.
|
||||||
---
|
---
|
||||||
|
|
||||||
# High availability — HAC (R1.03)
|
# High availability — HAC (R1.05)
|
||||||
|
|
||||||
|
Re-checked for R1.05 on 2026-10-09 (read-only, file and manual comparison only). The manual
|
||||||
|
(4th Edition, Feb. 2026) is unchanged apart from contact information; `hac.sup`, its template
|
||||||
|
and most HAC scripts are identical to R1.03. New on R1.05: `hacw_activate`/`hacw_deactivate`
|
||||||
|
call extension scripts `?*_hacw_activate.cmd`/`?*_hacw_deactivate.cmd` (ISS-160), and
|
||||||
|
`hacw_hmi` needs the `tls\exe\lib` folder (ISS-161). The R1.05 test server is a single,
|
||||||
|
non-redundant server without a HAC licence, so **all HAC behaviour is not tested on R1.05**.
|
||||||
|
|
||||||
Background: `knowledge/manuals/IM36K10J20-01EN.md` (concepts, processes, set-up steps,
|
Background: `knowledge/manuals/IM36K10J20-01EN.md` (concepts, processes, set-up steps,
|
||||||
installed `hac.sup` and the differences from the manual).
|
installed `hac.sup` and the differences from the manual).
|
||||||
|
|
||||||
Rules:
|
Rules:
|
||||||
- Run `system-check` first; follow the user's chosen way of working.
|
- Run `system-check` first; follow the user's chosen way of working. Use the `TLS_*`
|
||||||
|
variables for paths (the install root differs between systems).
|
||||||
- HAC needs its own licence and at least two servers with two separate networks between them.
|
- HAC needs its own licence and at least two servers with two separate networks between them.
|
||||||
Nothing here was practiced on a real redundant pair: say so when giving procedures.
|
Nothing here was practiced on a real redundant pair (R1.03 or R1.05): say so when giving
|
||||||
|
procedures.
|
||||||
- `hac.sup`, the `tls\com` scripts and system variables need admin rights and a restart; hand
|
- `hac.sup`, the `tls\com` scripts and system variables need admin rights and a restart; hand
|
||||||
them to the user (skill `portal-setup`, `change-setup-file.md`).
|
them to the user (skill `portal-setup`, `change-setup-file.md`).
|
||||||
- Never switch over, reboot or change a server's mode on a running plant without the user's
|
- Never switch over, reboot or change a server's mode on a running plant without the user's
|
||||||
explicit approval, and only when the mirror is consistent (see `redundant-setup.md` §3).
|
explicit approval, and only when the mirror is consistent (see `redundant-setup.md` §3).
|
||||||
- Do not start `hacrec` with `-wdg_off` on a server without reviewing its process list first:
|
- Do not start `hacrec` with `-wdg_off` on a server without reviewing its process list first:
|
||||||
stand-alone Recovery acts (default action for most processes is `TOOL` = restart services).
|
stand-alone Recovery acts (default action for most processes is `TOOL` = restart services).
|
||||||
|
- Do not run `hac*` tools on a system just to "look": even status commands talk to the HAC
|
||||||
|
processes. Read files and logs instead (`hac-checks.md`).
|
||||||
|
- Before recommending a design, check the release notes (IM 36K01A50): no mix of physical and
|
||||||
|
virtual machines in one HAC configuration (§1.19); after a HAC network-card switch, OPC UA
|
||||||
|
PubSub writers must be uploaded again (§1.15, R1.04 and later; ISS-162).
|
||||||
|
|
||||||
| Task | File | Status |
|
| Task | File | Status |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Check HAC on a system: licence, processes, `hac.sup`, scripts, HMI properties, logs | `tasks/hac-checks.md` | verified (read-only, single server) |
|
| Check HAC on a system: licence, processes, `hac.sup`, scripts, HMI properties, logs | `tasks/hac-checks.md` | verified read-only on R1.03 (2026-10-01) and on the R1.05 test server (2026-10-09; single server, HAC not used) |
|
||||||
| Set up and operate a redundant server pair: steps, `hac.sup` tabs, manual switchover, patching | `tasks/redundant-setup.md` | from docs |
|
| Set up and operate a redundant server pair: steps, `hac.sup` tabs, manual switchover, patching | `tasks/redundant-setup.md` | from docs; not tested on R1.03 or R1.05 (no redundant pair); installed files compared on R1.05 |
|
||||||
| Recovery, logger and journaling on a stand-alone node | `tasks/standalone-recovery.md` | from docs |
|
| Recovery, logger and journaling on a stand-alone node | `tasks/standalone-recovery.md` | from docs; not tested (starting Recovery would act on the shared R1.05 test server); installed files compared on R1.05 |
|
||||||
| Dual-redundant Platform for Computer | — | not covered (separate product) |
|
| Dual-redundant Platform for Computer | — | not covered (separate product; precautions in the A50 summary §1.1) |
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,15 @@
|
||||||
---
|
---
|
||||||
task: Check HAC on a system (licence, processes, hac.sup, scripts, HMI properties, logs)
|
task: Check HAC on a system (licence, processes, hac.sup, scripts, HMI properties, logs)
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10J20-01EN §1.3–§1.5, §2, §4.1.4, §6.1; checked read-only on the test system 2026-10-01
|
source: IM 36K10J20-01EN 4th Edition (Feb. 2026) §1.3–§1.5, §2, §4.1.4, §6.1 (unchanged since the 3rd Edition); checked read-only on the R1.03 test system 2026-10-01 and the R1.05 test server 2026-10-09
|
||||||
status: verified (read-only, single unlicensed server)
|
status: verified read-only on R1.03 (2026-10-01) and on the R1.05 test server (2026-10-09), both single servers without HAC; the checks on a running pair (§3) are not tested (no redundant pair)
|
||||||
---
|
---
|
||||||
|
|
||||||
# HAC checks
|
# HAC checks
|
||||||
|
|
||||||
All read-only.
|
All read-only. Only read files, variables and the process list: do not run `hac*` tools
|
||||||
|
(`hacwcmd`, `hacitmval`, `hachmfcmd`, `hacwdg -d` …) just to check, they talk to (or start)
|
||||||
|
HAC processes.
|
||||||
|
|
||||||
## 1. Is HAC in use?
|
## 1. Is HAC in use?
|
||||||
|
|
||||||
|
|
@ -18,8 +20,12 @@ All read-only.
|
||||||
| Server number | `echo %CI_PRIM%` | 0 primary, 1 secondary, 2, 3 |
|
| Server number | `echo %CI_PRIM%` | 0 primary, 1 secondary, 2, 3 |
|
||||||
| Processes | `tasklist /FI "IMAGENAME eq hac*"` | `hacwdg`, `hacrec`, `haclog`, `hacmir`, `hacwagt`, `hacwitm` run |
|
| Processes | `tasklist /FI "IMAGENAME eq hac*"` | `hacwdg`, `hacrec`, `haclog`, `hacmir`, `hacwagt`, `hacwitm` run |
|
||||||
|
|
||||||
Test system (R1.03.00): no `hacini.sup`, normal `ci_start.cmd`, `CI_PRIM` unset, no `hac*`
|
| Extension scripts (R1.05) | `dir %TLS_ROOT_PATH%\tls\com\*_hacw_*.cmd` | project scripts run on activate/deactivate (ISS-160) |
|
||||||
process — HAC not used.
|
|
||||||
|
R1.03.00 test system (2026-10-01) and R1.05.00 test server (2026-10-09): no `hacini.sup`,
|
||||||
|
normal `ci_start.cmd` (title *CI Server*), `CI_PRIM` and `TLS_BACKUP_PATH` unset, no `hac*`
|
||||||
|
process, no `*_hacw_*.cmd` — HAC not used. Note: `isfjrn` is started by `database_start.cmd`
|
||||||
|
on every node, so an `isfjrn` process alone does not mean HAC is used.
|
||||||
|
|
||||||
## 2. Configuration
|
## 2. Configuration
|
||||||
|
|
||||||
|
|
@ -29,13 +35,22 @@ process — HAC not used.
|
||||||
(a real router/switch with priority 1; **no `localhost`** in production), `START_MANUAL`
|
(a real router/switch with priority 1; **no `localhost`** in production), `START_MANUAL`
|
||||||
(`NO` once commissioned), `RECOVERY_ON`, `JOURNAL_ON`, `HMF_DAYS`.
|
(`NO` once commissioned), `RECOVERY_ON`, `JOURNAL_ON`, `HMF_DAYS`.
|
||||||
The installed file is a template (`SERVER_A`, `192.168.1.1`, `localhost`, `START_MANUAL =
|
The installed file is a template (`SERVER_A`, `192.168.1.1`, `localhost`, `START_MANUAL =
|
||||||
YES`): if these are still present the pair was never configured.
|
YES`): if these are still present the pair was never configured. The R1.05 `hac.sup`,
|
||||||
|
`hac_ees.sup`, `haccache.sup`, `hac.tpl` and `hac_ees.tpl` are identical to R1.03 (hash
|
||||||
|
comparison, 2026-10-08), so the template values and ISS-053 still apply.
|
||||||
- `hac.sup` must be identical on all servers (it is excluded from the mirror on purpose).
|
- `hac.sup` must be identical on all servers (it is excluded from the mirror on purpose).
|
||||||
- HAC HMI: `%TLS_WAP_PATH%\cfg\jhacProperties\application.properties` — `primary=`,
|
- HAC HMI: `%TLS_WAP_PATH%\cfg\jhacProperties\application.properties` — `primary=`,
|
||||||
`secondary=` (addresses of every network), `port1`/`port2` (16000), `logport` (16001).
|
`secondary=` (addresses of every network), `port1`/`port2` (16000), `logport` (16001),
|
||||||
- Firewall: UDP 16000–16006, TCP 34489 (history merge), ICMP between the servers.
|
`ownport`/`ownports` (16010, 32: the HMI's own UDP ports 16010–16041). Same file content
|
||||||
|
on R1.03 and R1.05 (2026-10-09). On R1.05 `hacw_hmi` also loads `tls\exe\lib\*`: the HMI
|
||||||
|
needs a complete CI Server installation on that machine (ISS-161).
|
||||||
|
- Firewall: UDP 16000–16006 between the servers, UDP 16010–16041 for HAC HMI stations,
|
||||||
|
TCP 34489 (history merge), ICMP between the servers.
|
||||||
|
- Extension scripts (R1.05): any `<prefix>_hacw_activate.cmd` / `<prefix>_hacw_deactivate.cmd`
|
||||||
|
in `tls\com` runs on every switchover; read them, they are part of the configuration and
|
||||||
|
must be the same on all servers (ISS-160).
|
||||||
|
|
||||||
## 3. State and logs (running pair)
|
## 3. State and logs (running pair; not tested — no redundant pair on R1.03 or R1.05)
|
||||||
|
|
||||||
- HAC HMI: `hacw_hmi` (not in the start menu). Per server: responsive, operational status
|
- HAC HMI: `hacw_hmi` (not in the start menu). Per server: responsive, operational status
|
||||||
(Standby / Activating / Active / Deactivating), mode (Automatic / Manual), CI Server / custom /
|
(Standby / Activating / Active / Deactivating), mode (Automatic / Manual), CI Server / custom /
|
||||||
|
|
@ -47,4 +62,5 @@ process — HAC not used.
|
||||||
page), `hacmir.log`/`hacmir_old.log` (mirror), `%TLS_LOG_PATH%\hacw_standby.log`,
|
page), `hacmir.log`/`hacmir_old.log` (mirror), `%TLS_LOG_PATH%\hacw_standby.log`,
|
||||||
`hacw_activate.log`, and `umhlog.log` (`HAC*`, `ISFJRN` messages; ISFJRN names the journal
|
`hacw_activate.log`, and `umhlog.log` (`HAC*`, `ISFJRN` messages; ISFJRN names the journal
|
||||||
report `<DSSSDA>_jrn.lst` after an unclean shutdown).
|
report `<DSSSDA>_jrn.lst` after an unclean shutdown).
|
||||||
- Watchdog start problems: `hacwdg -d` in a console shows initialization errors.
|
- Watchdog start problems: `hacwdg -d` in a console shows initialization errors (only on a
|
||||||
|
HAC server being commissioned, with the user's approval; it starts a Watchdog).
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Set up and operate a redundant HAC server pair (steps, hac.sup tabs, switchover, patching)
|
task: Set up and operate a redundant HAC server pair (steps, hac.sup tabs, switchover, patching)
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10J20-01EN §1.2–§1.5, §2.4–§2.6, §3, §4.3–§4.11, §6.4, §7; hac.sup and scripts checked on the test system 2026-10-01
|
source: IM 36K10J20-01EN 4th Edition (Feb. 2026) §1.2–§1.5, §2.4–§2.6, §3, §4.3–§4.11, §6.4, §7 (unchanged since the 3rd Edition); IM 36K01A50-01EN 5th Edition §1.15, §1.19; IM 36K01C10-01EN §3.4; hac.sup and scripts checked on the R1.03 test system 2026-10-01 and compared with the R1.05 test server 2026-10-08/09
|
||||||
status: from docs (needs two licensed servers; not practiced)
|
status: from docs; not tested on R1.03 or R1.05 (needs two licensed servers, the R1.05 test server is a single server); R1.05 installed files compared read-only (hac.sup and hacw_standby/stop identical, hacw_activate/deactivate extension hooks and hacw_hmi classpath new)
|
||||||
---
|
---
|
||||||
|
|
||||||
# Redundant server pair (HAC)
|
# Redundant server pair (HAC)
|
||||||
|
|
@ -21,6 +21,7 @@ the user applies them.
|
||||||
the pair: same node number).
|
the pair: same node number).
|
||||||
- At least one real IP device per server for the network check (router/switch, priority 1).
|
- At least one real IP device per server for the network check (router/switch, priority 1).
|
||||||
- CI Service start type *Automatic* (HAC reboots servers).
|
- CI Service start type *Automatic* (HAC reboots servers).
|
||||||
|
- All servers physical, or all virtual: never mix them in one HAC configuration (A50 §1.19).
|
||||||
- `TLS_BACKUP_PATH` on a partition at least as large as `TLS_HIS_PATH` (the standby zips its
|
- `TLS_BACKUP_PATH` on a partition at least as large as `TLS_HIS_PATH` (the standby zips its
|
||||||
runtime environment before each synchronization; without the variable the scripts use
|
runtime environment before each synchronization; without the variable the scripts use
|
||||||
`TLS_LST_PATH`).
|
`TLS_LST_PATH`).
|
||||||
|
|
@ -33,6 +34,19 @@ the user applies them.
|
||||||
`DATA1_STAT`, …, all Integer); stop CI Server.
|
`DATA1_STAT`, …, all Integer); stop CI Server.
|
||||||
3. `tls\com`: rename `ci_start.cmd`/`ci_stop.cmd` to e.g. `ci_start_old.cmd`/`ci_stop_old.cmd`,
|
3. `tls\com`: rename `ci_start.cmd`/`ci_stop.cmd` to e.g. `ci_start_old.cmd`/`ci_stop_old.cmd`,
|
||||||
copy `hacw_standby.cmd` → `ci_start.cmd`, `hacw_stop.cmd` → `ci_stop.cmd`.
|
copy `hacw_standby.cmd` → `ci_start.cmd`, `hacw_stop.cmd` → `ci_stop.cmd`.
|
||||||
|
R1.05: `hacw_standby`/`hacw_stop` have **no** extension-script hook, so `?*_ci_start.cmd` /
|
||||||
|
`?*_ci_stop.cmd` scripts (ISS-121) no longer run once `ci_start`/`ci_stop` are replaced. The
|
||||||
|
service scripts that `hacw_activate`/`hacw_deactivate` call (`integration_start` …) still run
|
||||||
|
their own `?*_<script>.cmd` hooks. For project processes that must run only on the active
|
||||||
|
server, use `<prefix>_hacw_activate.cmd` / `<prefix>_hacw_deactivate.cmd` (ISS-160, from
|
||||||
|
the installed scripts, not tested):
|
||||||
|
- `hacw_activate` calls them after all services (last USER) are started, before it loads the
|
||||||
|
HAC status items and reports ACTIVE to the Watchdog: keep them short (the server must be
|
||||||
|
active within 5 minutes, §5) and never wait for user input.
|
||||||
|
- `hacw_deactivate` calls them after the dynamic processes and `hacwitm` are stopped,
|
||||||
|
before DURM, INTEGRATION and the other services are stopped.
|
||||||
|
- Put the same scripts on every server (the template mirror set includes `tls\com`, so the
|
||||||
|
standby normally receives them; check after the first synchronization).
|
||||||
4. `hac.sup` on the primary (Setup File Editor), then copy to the others:
|
4. `hac.sup` on the primary (Setup File Editor), then copy to the others:
|
||||||
|
|
||||||
| Tab | Set |
|
| Tab | Set |
|
||||||
|
|
@ -49,10 +63,12 @@ the user applies them.
|
||||||
| Other | `JOURNAL_ON` (only small systems; needs write cache off), log size/pages/level, `PORTNUMS` (also change the `hacwsck` lines in the `hacw_*` scripts and the HMI properties) |
|
| Other | `JOURNAL_ON` (only small systems; needs write cache off), log size/pages/level, `PORTNUMS` (also change the `hacwsck` lines in the `hacw_*` scripts and the HMI properties) |
|
||||||
|
|
||||||
5. HAC HMI properties (`%TLS_WAP_PATH%\cfg\jhacProperties\application.properties`) on every
|
5. HAC HMI properties (`%TLS_WAP_PATH%\cfg\jhacProperties\application.properties`) on every
|
||||||
machine that runs the HMI: `primary=`, `secondary=` addresses.
|
machine that runs the HMI: `primary=`, `secondary=` addresses. On R1.05 `hacw_hmi` also
|
||||||
|
needs `tls\exe\lib` (complete CI Server installation on the HMI machine; ISS-161).
|
||||||
6. Firewall: UDP 16000 (GUI/commands), 16003 (recovery), 16004 (watchdog↔watchdog), 16005 (item
|
6. Firewall: UDP 16000 (GUI/commands), 16003 (recovery), 16004 (watchdog↔watchdog), 16005 (item
|
||||||
setter), 16006 (file copy slave) between servers/HMI stations; 16001/16002 local; TCP 34489;
|
setter), 16006 (file copy slave) between servers/HMI stations; 16001/16002 local; the HMI's
|
||||||
ICMP.
|
own UDP ports 16010–16041 (`ownport`/`ownports` in the HMI properties; IM 36K01C30); TCP
|
||||||
|
34489; ICMP.
|
||||||
7. Start both servers; both come up STANDBY, the primary goes ACTIVE (if not in manual mode).
|
7. Start both servers; both come up STANDBY, the primary goes ACTIVE (if not in manual mode).
|
||||||
Test switchovers, then set `START_MANUAL = NO` so they start in AUTOMATIC.
|
Test switchovers, then set `START_MANUAL = NO` so they start in AUTOMATIC.
|
||||||
|
|
||||||
|
|
@ -69,6 +85,9 @@ the user applies them.
|
||||||
(`hachmfcmd` on the active server) to recover event history from the other server.
|
(`hachmfcmd` on the active server) to recover event history from the other server.
|
||||||
- Monitoring the standby from the active side: `hacitmval -c <active host> -n <section>.<item>
|
- Monitoring the standby from the active side: `hacitmval -c <active host> -n <section>.<item>
|
||||||
-v <int>` on the standby (the section must be one of the status item sections).
|
-v <int>` on the standby (the section must be one of the status item sections).
|
||||||
|
- OPC UA PubSub (R1.04 and later, A50 §1.15): if a HAC network card breaks and the system
|
||||||
|
moves to another card, PubSub-connected items stay offline; upload the PubSub dataset writer
|
||||||
|
to the runtime again (skill `data-access`). A cable pulled and reconnected recovers by itself.
|
||||||
|
|
||||||
## 4. Patching a redundant pair (§6.4)
|
## 4. Patching a redundant pair (§6.4)
|
||||||
|
|
||||||
|
|
@ -77,7 +96,10 @@ the user applies them.
|
||||||
active / slave standby. 5. Manual switchover to it. 6. Stop and patch the old active server.
|
active / slave standby. 5. Manual switchover to it. 6. Stop and patch the old active server.
|
||||||
7. Start it in manual (it becomes standby). 8. Set both to AUTOMATIC and `START_MANUAL = NO`.
|
7. Start it in manual (it becomes standby). 8. Set both to AUTOMATIC and `START_MANUAL = NO`.
|
||||||
Patches change files outside the mirror (`exe`, common files), so they are never copied
|
Patches change files outside the mirror (`exe`, common files), so they are never copied
|
||||||
automatically.
|
automatically. For a version upgrade (e.g. to R1.05) follow IM 36K01C10 §3.4 (skill
|
||||||
|
`installation-security`): the standby is upgraded and tested off the network first. After an
|
||||||
|
upgrade, check that `ci_start`/`ci_stop` are still the HAC copies and that the new
|
||||||
|
`hacw_activate`/`hacw_deactivate`/`hacw_hmi` are in place.
|
||||||
|
|
||||||
## 5. Tips (§4.8, §6.5, §7)
|
## 5. Tips (§4.8, §6.5, §7)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Use HAC Recovery, logger and journaling on a stand-alone node
|
task: Use HAC Recovery, logger and journaling on a stand-alone node
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10J20-01EN §3.2, §3.3, §4.1, §4.9, §6.2; integration_start.cmd, database_start.cmd and hac.sup checked on the test system 2026-10-01
|
source: IM 36K10J20-01EN 4th Edition (Feb. 2026) §3.2, §3.3, §4.1, §4.9, §6.2 (unchanged since the 3rd Edition); integration_start.cmd, database_start.cmd and hac.sup checked on the R1.03 test system 2026-10-01 and the R1.05 test server 2026-10-08/09
|
||||||
status: from docs (not started on the test system)
|
status: from docs; not tested on R1.03 or R1.05 (starting Recovery acts on processes; the R1.05 test server is shared). R1.05 files compared read-only 2026-10-09: the commented HAC block in integration_start/stop, the ismflush example in database_start and hac.sup are unchanged
|
||||||
---
|
---
|
||||||
|
|
||||||
# HAC on a stand-alone node
|
# HAC on a stand-alone node
|
||||||
|
|
@ -20,7 +20,12 @@ Admin rights and a restart are needed; hand the changes to the user.
|
||||||
start /B /NORMAL /WAIT %TLS_ROOT_PATH%\tls\exe\durwfp -p hacrec -t 10
|
start /B /NORMAL /WAIT %TLS_ROOT_PATH%\tls\exe\durwfp -p hacrec -t 10
|
||||||
```
|
```
|
||||||
and the matching stop lines in `integration_stop.cmd`. `-wdg_off` = no Watchdog: Recovery
|
and the matching stop lines in `integration_stop.cmd`. `-wdg_off` = no Watchdog: Recovery
|
||||||
acts itself.
|
acts itself. R1.05 alternative that leaves the installed scripts untouched (not tested):
|
||||||
|
put the same lines in a `<prefix>_integration_start.cmd` (and the stop lines in
|
||||||
|
`<prefix>_integration_stop.cmd`) in `tls\com`; R1.05 calls these extension scripts (ISS-121).
|
||||||
|
`integration_start` calls them only on a host node (the call sits inside the block that
|
||||||
|
needs `itmini.sup`); on an HMI/portal node uncomment the block in `integration_start`
|
||||||
|
instead. `integration_stop` calls them on every node, first thing.
|
||||||
2. **Review `hac.sup` first** (tab *Recovery (General)*): the installed list has ~70 `PROCESS`
|
2. **Review `hac.sup` first** (tab *Recovery (General)*): the installed list has ~70 `PROCESS`
|
||||||
lines, most with action `TOOL` (restart the tool and everything that depends on it), for
|
lines, most with action `TOOL` (restart the tool and everything that depends on it), for
|
||||||
processes that may not run on your node (e.g. `HASEXE`, `ITHEEX`, `DSSSDA00`–`03`, PROCESS
|
processes that may not run on your node (e.g. `HASEXE`, `ITHEEX`, `DSSSDA00`–`03`, PROCESS
|
||||||
|
|
@ -43,6 +48,7 @@ wildcard (`EQP*`).
|
||||||
## 2. Journaling
|
## 2. Journaling
|
||||||
|
|
||||||
1. `hac.sup` tab *Other*: `JOURNAL_ON = YES` (heavy disk load — small systems only).
|
1. `hac.sup` tab *Other*: `JOURNAL_ON = YES` (heavy disk load — small systems only).
|
||||||
|
`isfjrn` itself is always started by `database_start.cmd` (R1.03 and R1.05, checked).
|
||||||
2. Disable the disk write cache for the `TLS_DAT_PATH`/`TLS_HIS_PATH` disks (Device Manager ›
|
2. Disable the disk write cache for the `TLS_DAT_PATH`/`TLS_HIS_PATH` disks (Device Manager ›
|
||||||
disk › *Policies*) or use a UPS; optionally enable `ismflush <disk> <s>` in
|
disk › *Policies*) or use a UPS; optionally enable `ismflush <disk> <s>` in
|
||||||
`tls\com\database_start.cmd` (commented example `ismflush.exe \\.\C: 60`).
|
`tls\com\database_start.cmd` (commented example `ismflush.exe \\.\C: 60`).
|
||||||
|
|
|
||||||
64
.claude/skills/pytools/SKILL.md
Normal file
64
.claude/skills/pytools/SKILL.md
Normal file
|
|
@ -0,0 +1,64 @@
|
||||||
|
---
|
||||||
|
name: pytools
|
||||||
|
description: >-
|
||||||
|
CI Server R1.05 pyTOOLS: Python scripts that use the `dss` module (dss.pyd) to read or change
|
||||||
|
CI Server data. Use when the user wants to install or set up Python for CI Server (64-bit
|
||||||
|
Python 3.12, PYTHONPATH, import dss), write a Python script that connects to DSS
|
||||||
|
(dss.connect, logon, logout, close), lists datasets or fields, opens a dataset and reads
|
||||||
|
records (readNext, readEqual, readRecords, ITEM_VAL, ITEM_DF, LOCAL_NODE_DF), reads item
|
||||||
|
history or aggregates from Python (getItemHistory, getHisGroupItems, interpolation, AGGR_MAX,
|
||||||
|
aggr_period), filters or sorts records (createFilter, activateFilter, filter expression,
|
||||||
|
setIndex, getIndex), waits for value or record changes (datasetEventNotify,
|
||||||
|
recordEventNotify, eventRead), inserts, updates or deletes records or locks them
|
||||||
|
(insertRecord, updateRecord, deleteRecord, lockRecords), sends or receives BUS Service
|
||||||
|
messages (busSetName, busSend, busReceive, busSnap, durstp a script), converts DSS times
|
||||||
|
(dateString, dateDSS, dateRelDSS, dateConvert), handles dss.error / DSS-E-EOS /
|
||||||
|
PY_DSS_* exceptions, or checks the server side (DSSSDAPY, PYDSS, dssana.sup Python Interface
|
||||||
|
login method). Source IM 36K10P40-01EN (new in R1.04).
|
||||||
|
---
|
||||||
|
|
||||||
|
# pyTOOLS (R1.05)
|
||||||
|
|
||||||
|
pyTOOLS is the Python module `dss` (`%TLS_ROOT_PATH%\tls\exe\dss.pyd`). A script attaches to the
|
||||||
|
BUS Service and DSS **of the local node** (CI Core or CI Portal; not CI View) and works with
|
||||||
|
datasets like any other DSS client. Item history has two fast functions that go straight to
|
||||||
|
ITEM Service.
|
||||||
|
|
||||||
|
Written 2026-10-09 for R1.05. **No Python is installed on the R1.05 test server**, so no script
|
||||||
|
was run there: all tasks are *from docs, not tested*. Checked read-only on the R1.05 test server:
|
||||||
|
`dss.pyd` (module 3.6.1), the dedicated DSS server `DSSSDAPY`, the `dss.sup` routing and the
|
||||||
|
*Python Interface* login lines in `dssana.sup`. On the development machine (R1.03) the R1.03
|
||||||
|
module imports under Python 3.12 (`version()`, `busGetDirs()`).
|
||||||
|
|
||||||
|
Background: `knowledge/manuals/IM36K10P40-01EN.md` (every function, filter syntax, exceptions).
|
||||||
|
Known issues: `knowledge/manuals/IM36K01A50-01EN.md`. Server side of DSS: skill
|
||||||
|
`system-management` (`tasks/dss-tools.md`). Login methods: skill `authorization`
|
||||||
|
(`tasks/login-methods.md`).
|
||||||
|
|
||||||
|
Rules for every task:
|
||||||
|
- Run the `system-check` skill first. pyTOOLS is a product function from R1.04; R1.03 ships an
|
||||||
|
older, undocumented `dss.pyd` without the dedicated server — do not rely on it.
|
||||||
|
- Installing Python, setting the system variable `PYTHONPATH` and changing `dssana.sup` need
|
||||||
|
administrator rights: hand them to the user (direct vs prepare only as agreed).
|
||||||
|
- Log on as a CI Server user with only the rights the script needs (pyTOOLS supports only the
|
||||||
|
*Manual CI Server* login method). Never hard-code a real password in a file in the repo; read
|
||||||
|
it from an environment variable or prompt (`getpass`).
|
||||||
|
- Scripts that write (insert / update / delete / lock) change the running system and are
|
||||||
|
recorded in the audit trail (source `PYTOOLS`): only on test systems or with the user's
|
||||||
|
approval. Prefer read-only modes (`'r'`).
|
||||||
|
- Always stop event notifications, close datasets and `dss.close(conn)` in a `finally:` block;
|
||||||
|
a script left running keeps a BUS process (`PYDSS_<n>`) and a DSS session.
|
||||||
|
- Run scripts from a scratch folder; examples use `CI-Eng-Sample` names
|
||||||
|
(`examples/CI-Eng-Sample/`), replace them with `<Section>.<Tag>` names of the user's system.
|
||||||
|
|
||||||
|
| Task | File | Status |
|
||||||
|
|---|---|---|
|
||||||
|
| Set up Python and pyTOOLS, check the server side, first read-only script (version, `LOCAL_NODE_DF`, one item value) | `tasks/setup-first-script.md` | from docs, not tested (no Python on the R1.05 test server); server-side files verified read-only 2026-10-09 |
|
||||||
|
| Read items (`ITEM_VAL`, `ITEM_DF`) and item history / aggregates (`getItemHistory`) | `tasks/read-items-history.md` | from docs, not tested (no Python on the R1.05 test server) |
|
||||||
|
| Filter and sort records (filter expressions, indexes) | `tasks/filter-index.md` | from docs, not tested (no Python on the R1.05 test server) |
|
||||||
|
| Wait for changes: event notification on records or datasets | `tasks/event-notification.md` | from docs, not tested (no Python on the R1.05 test server) |
|
||||||
|
| Insert, update, delete and lock records | `tasks/modify-datasets.md` | from docs, not tested (writes; no Python on the R1.05 test server) |
|
||||||
|
|
||||||
|
BUS Service messages (`busSend`, `busReceive`, `busReply`, `busSnap`, stopping a named script
|
||||||
|
with `durstp`), date/time helpers and setup-file reading are described in the manual summary
|
||||||
|
(§3.11, §3.12, §3.14); no task file yet.
|
||||||
85
.claude/skills/pytools/tasks/event-notification.md
Normal file
85
.claude/skills/pytools/tasks/event-notification.md
Normal file
|
|
@ -0,0 +1,85 @@
|
||||||
|
---
|
||||||
|
task: Wait for value or record changes with DSS event notification in a Python script
|
||||||
|
version: R1.05
|
||||||
|
source: IM 36K10P40-01EN §3.10, §3.11 (stop request), §4 (2nd ed., Feb. 2026); `EVENT_Q_SLOTS` in the installed `dss.sup` (R1.03 and R1.05)
|
||||||
|
status: from docs, not tested (no Python on the R1.05 test server)
|
||||||
|
---
|
||||||
|
|
||||||
|
# Event notification
|
||||||
|
|
||||||
|
Start from `setup-first-script.md`. The example only reads; it leaves nothing behind when it
|
||||||
|
ends (notifications stopped, dataset and connection closed).
|
||||||
|
|
||||||
|
## 1. How it works
|
||||||
|
|
||||||
|
- Request: per record `dss.recordEventNotify(conn, ds, <key>, 'u')` (`u` update, `d` delete),
|
||||||
|
or per dataset `dss.datasetEventNotify(conn, ds, 'iud')` (also `i` insert).
|
||||||
|
- DSS puts each change in **one queue per client**; the script must **poll** it with
|
||||||
|
`dss.eventRead(conn)` → list of dicts `{'ds_name', 'event', 'id', 'record', 'set_hnd'}`
|
||||||
|
(`record` = the record after the change, only the fields opened). Empty list = nothing new.
|
||||||
|
- If the queue overflows, DSS **empties it** (events lost). Size: `EVENT_Q_SLOTS` in
|
||||||
|
`dss.sup` (default 100); poll often and keep the number of watched records reasonable.
|
||||||
|
- One request per record; to change the mode, stop it first (`PY_DSS_EVT_NOTIFY_DEF`).
|
||||||
|
- Stop with `recordEventStop` / `datasetEventStop`, then close.
|
||||||
|
|
||||||
|
## 2. Example: print value changes of two items
|
||||||
|
|
||||||
|
```python
|
||||||
|
import os, sys, time, getpass
|
||||||
|
sys.path.insert(0, os.path.join(os.environ['TLS_ROOT_PATH'], 'tls', 'exe'))
|
||||||
|
import dss
|
||||||
|
|
||||||
|
ITEMS = ['CI-Eng-Sample.TANK1.LEVEL', 'CI-Eng-Sample.PUMP1.RUNNING'] # or <Section>.<Tag>
|
||||||
|
RUN_SECONDS = 60 # 0 = until Ctrl+C
|
||||||
|
|
||||||
|
conn = dss.connect(os.environ.get('CI_USER') or input('User: '),
|
||||||
|
os.environ.get('CI_PASSWORD') if 'CI_PASSWORD' in os.environ
|
||||||
|
else getpass.getpass('Password: '))
|
||||||
|
watched = []
|
||||||
|
try:
|
||||||
|
ds = dss.openDataset(conn, 'ITEM_VAL', ['NAME', 'ITEM_VALUE', 'STATUS', 'UPDATE_TIME'], 'r')
|
||||||
|
try:
|
||||||
|
for name in ITEMS:
|
||||||
|
dss.recordEventNotify(conn, ds, name, 'u')
|
||||||
|
watched.append(name)
|
||||||
|
t_end = time.time() + RUN_SECONDS
|
||||||
|
try:
|
||||||
|
while not RUN_SECONDS or time.time() < t_end:
|
||||||
|
time.sleep(1)
|
||||||
|
for ev in dss.eventRead(conn):
|
||||||
|
r = ev['record']
|
||||||
|
print(dss.dateString(conn, r['UPDATE_TIME'], 'GENERAL'),
|
||||||
|
r['NAME'], r['ITEM_VALUE'], r['STATUS'])
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
pass
|
||||||
|
finally:
|
||||||
|
for name in watched:
|
||||||
|
dss.recordEventStop(conn, ds, name)
|
||||||
|
dss.closeDataset(conn, ds)
|
||||||
|
finally:
|
||||||
|
dss.close(conn)
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected: one line per value update of the two items (with the sample's live-data feed
|
||||||
|
running, `TANK1.LEVEL` changes every few seconds); nothing for unchanged items. Ends after
|
||||||
|
60 s or Ctrl+C.
|
||||||
|
|
||||||
|
## 3. Long-running scripts
|
||||||
|
|
||||||
|
- Give the script a fixed BUS name **before** connecting: `dss.busSetName('PYWATCH')`. It can
|
||||||
|
then be stopped cleanly from a command prompt with `durstp -p PYWATCH`; inside the script
|
||||||
|
this raises `dss.error` with code `PY_DSS_STOP_REQUEST` — catch it, stop the notifications,
|
||||||
|
close and exit. Without a name the process is `PYDSS_<number>` (new each run). Check whether
|
||||||
|
it runs with `durwfp -p PYWATCH -t 0` (skill `system-management`, `bus-utilities.md`).
|
||||||
|
- Instead of `time.sleep` polling, a script that also serves BUS messages can block in
|
||||||
|
`dss.busReceive(conn, 'SYNC_WAIT')` (manual §3.11); then events are only read between
|
||||||
|
messages.
|
||||||
|
- Do not leave test watchers running on a shared or production server.
|
||||||
|
|
||||||
|
## 4. Not tested / to verify
|
||||||
|
|
||||||
|
On a test Core with Python and the sample feed (user): run §2 (expect changes of
|
||||||
|
`TANK1.LEVEL`); start it with a BUS name and stop it with `durstp` (expect a clean exit via
|
||||||
|
`PY_DSS_STOP_REQUEST`); check whether the R1.05 module still names unnamed scripts
|
||||||
|
`PYDSS_<n>` (the `dss.sup` routing `PYDSS*` → `DSSSDAPY` relies on it, while a script with
|
||||||
|
its own BUS name such as `PYWATCH` may be routed to a general `DSSSDA` instead, ISS-180).
|
||||||
91
.claude/skills/pytools/tasks/filter-index.md
Normal file
91
.claude/skills/pytools/tasks/filter-index.md
Normal file
|
|
@ -0,0 +1,91 @@
|
||||||
|
---
|
||||||
|
task: Filter records and change the read order (filter expressions, indexes) in a Python script
|
||||||
|
version: R1.05
|
||||||
|
source: IM 36K10P40-01EN §3.5, §3.7, §3.8, §4 (2nd ed., Feb. 2026); field names from the R1.05 data dictionary (copied from the R1.05 test server 2026-10-08)
|
||||||
|
status: from docs, not tested (no Python on the R1.05 test server)
|
||||||
|
---
|
||||||
|
|
||||||
|
# Filters and indexes
|
||||||
|
|
||||||
|
Start from `setup-first-script.md`. Read-only.
|
||||||
|
|
||||||
|
## 1. Filter expressions
|
||||||
|
|
||||||
|
| Form | Example (Python string) | Meaning |
|
||||||
|
|---|---|---|
|
||||||
|
| Wildcard on the active index field | `'"CI-Eng-Sample.TANK1.*"'` | `NAME` starts with `CI-Eng-Sample.TANK1.` (`*` any text, `?` one character) |
|
||||||
|
| Comparison | `'HIGH_LIMIT > 100.2'` | numeric compare |
|
||||||
|
| `LIKE` on any field | `'DESCRIPTION LIKE "*level*"'` | wildcard on another field |
|
||||||
|
| Combined | `'(ITEM_TYPE = "Output" OR ITEM_TYPE = "Input") AND HIGH_LIMIT > 100.2'` | brackets, `AND`, `OR` |
|
||||||
|
|
||||||
|
Rules: operators `= != < <= > >= LIKE`; **spaces around every operator**; string constants in
|
||||||
|
double quotes and **case-sensitive** (field names and operators are not); the whole expression
|
||||||
|
in single quotes in Python; at most 252 characters (`PY_DSS_FLT_TOO_LONG`); one filter per open
|
||||||
|
dataset (`PY_DSS_FLT_DEF` if you create a second — delete the first). Check field values with
|
||||||
|
`dss.getFieldProperties` or `dssqld -f <dataset>` (skill `system-management`) before comparing
|
||||||
|
list fields such as `ITEM_TYPE`.
|
||||||
|
|
||||||
|
## 2. Example: filtered, sorted read
|
||||||
|
|
||||||
|
```python
|
||||||
|
import os, sys, getpass
|
||||||
|
sys.path.insert(0, os.path.join(os.environ['TLS_ROOT_PATH'], 'tls', 'exe'))
|
||||||
|
import dss
|
||||||
|
|
||||||
|
def read_all(conn, ds):
|
||||||
|
"""readNext until DSS-E-EOS (the normal end of a dataset)."""
|
||||||
|
out = []
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
out.append(dss.readNext(conn, ds))
|
||||||
|
except dss.error as e:
|
||||||
|
if e.args[0] == 'DSS-E-EOS':
|
||||||
|
return out
|
||||||
|
raise
|
||||||
|
|
||||||
|
conn = dss.connect(os.environ.get('CI_USER') or input('User: '),
|
||||||
|
os.environ.get('CI_PASSWORD') if 'CI_PASSWORD' in os.environ
|
||||||
|
else getpass.getpass('Password: '))
|
||||||
|
try:
|
||||||
|
# a) items of one section in ITEM_VAL, value above 50
|
||||||
|
ds = dss.openDataset(conn, 'ITEM_VAL', ['NAME', 'ITEM_VALUE', 'STATUS'], 'r')
|
||||||
|
try:
|
||||||
|
dss.createFilter(conn, ds, 'NAME LIKE "CI-Eng-Sample.*" AND ITEM_VALUE > 50')
|
||||||
|
dss.activateFilter(conn, ds)
|
||||||
|
for r in read_all(conn, ds):
|
||||||
|
print(r['NAME'], r['ITEM_VALUE'], r['STATUS'])
|
||||||
|
dss.deactivateFilter(conn, ds) # an active filter cannot be deleted
|
||||||
|
dss.deleteFilter(conn, ds)
|
||||||
|
finally:
|
||||||
|
dss.closeDataset(conn, ds)
|
||||||
|
|
||||||
|
# b) STATUS_DF sorted by number instead of name
|
||||||
|
print(dss.getIndex(conn, 'STATUS_DF')) # e.g. ['NAME', 'STATUS_NUMBER']
|
||||||
|
ds = dss.openDataset(conn, 'STATUS_DF', ['NAME', 'STATUS_NUMBER', 'DESCRIPTION'], 'r')
|
||||||
|
try:
|
||||||
|
dss.setIndex(conn, ds, 'STATUS_NUMBER')
|
||||||
|
for r in read_all(conn, ds)[:10]:
|
||||||
|
print(r['STATUS_NUMBER'], r['NAME'], r['DESCRIPTION'])
|
||||||
|
print(dss.readEqual(conn, ds, 101)) # readEqual now searches the STATUS_NUMBER index
|
||||||
|
finally:
|
||||||
|
dss.closeDataset(conn, ds)
|
||||||
|
finally:
|
||||||
|
dss.close(conn)
|
||||||
|
```
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
- The index decides the read order and what `readEqual` and a wildcard-only filter compare
|
||||||
|
against. After `setIndex`, call `rewindDataset` if records were already read.
|
||||||
|
- `readEqual` ignores filters; with a composed index pass a dict
|
||||||
|
`{'<FIELD1>': v1, '<FIELD2>': v2}`.
|
||||||
|
- Filters run in the DSS server: use them instead of reading everything and filtering in Python
|
||||||
|
on large datasets (`ITEM_DF`, `ITEM_VAL`, `ALARM_CHRONO`).
|
||||||
|
- Whether a wildcard filter is accepted together with a comparison in one expression
|
||||||
|
(`NAME LIKE ... AND ...` above) follows the documented grammar but is not tested.
|
||||||
|
|
||||||
|
## 3. Not tested / to verify
|
||||||
|
|
||||||
|
On a test Core with Python (user): run a) and b); compare a) with `itmval -g` for the same
|
||||||
|
items and b) with a `STATUS_DF` export (skill `system-management`, `read-write-item.md`,
|
||||||
|
`export-dataset.md`); try a
|
||||||
|
filter without spaces around `=` and confirm it is rejected.
|
||||||
95
.claude/skills/pytools/tasks/modify-datasets.md
Normal file
95
.claude/skills/pytools/tasks/modify-datasets.md
Normal file
|
|
@ -0,0 +1,95 @@
|
||||||
|
---
|
||||||
|
task: Insert, update, delete and lock dataset records from a Python script
|
||||||
|
version: R1.05
|
||||||
|
source: IM 36K10P40-01EN §3.4, §3.6, §3.9, §3.14, §4 (2nd ed., Feb. 2026); sample names from `examples/CI-Eng-Sample/` (`02_item_df.qli`)
|
||||||
|
status: from docs, not tested (writes to the running system; no Python on the R1.05 test server)
|
||||||
|
---
|
||||||
|
|
||||||
|
# Modify datasets (insert, update, delete, lock)
|
||||||
|
|
||||||
|
Start from `setup-first-script.md`. **This task writes.** Only on a test system or with the
|
||||||
|
user's approval and in the agreed way of working (direct vs prepare only). Every change goes
|
||||||
|
through DSS like an Engineering Module change: field checks apply and the audit trail records
|
||||||
|
it with source `PYTOOLS` and the logged-on user, who needs the matching authorization actions
|
||||||
|
(e.g. item insert/modify/delete, item value write; skill `authorization`).
|
||||||
|
|
||||||
|
For one-off bulk loads use quick load files instead (`dssqld`, skill `system-management`,
|
||||||
|
`load-remove-records.md`); use pyTOOLS when the change depends on logic or on values read at
|
||||||
|
run time.
|
||||||
|
|
||||||
|
## 1. Rules
|
||||||
|
|
||||||
|
- Open with the needed mode letters: `i` insert, `u` update, `d` delete (plus `r` to read
|
||||||
|
back), e.g. `'riud'`.
|
||||||
|
- Only fields listed in `openDataset` can be set; other fields get their default on insert
|
||||||
|
and stay unchanged on update.
|
||||||
|
- Each record (dict) must contain the **current index field** (normally `NAME`).
|
||||||
|
- `insertRecords` / `updateRecords` take a list (one call for many records; pairs with
|
||||||
|
`readRecords`).
|
||||||
|
- Duplicate key on insert → `dss.error` `VIS-W-DUPLICATE`; call `dss.getErrorStack(conn)` for
|
||||||
|
the full message stack (e.g. `DSS-E-RECTHERE`).
|
||||||
|
- `lockRecords(conn, ds, [keys])` blocks changes by other CI Server processes until
|
||||||
|
`unlockRecords` (or disconnect); locking a record someone else holds raises `dss.error`.
|
||||||
|
|
||||||
|
## 2. Example: create, change, lock and remove a test item
|
||||||
|
|
||||||
|
Creates `CI-Eng-Sample.DEMO.PY_TEST` (internal real item in the sample's `DEMO` section),
|
||||||
|
writes a value, then removes the item again.
|
||||||
|
|
||||||
|
```python
|
||||||
|
import os, sys, getpass
|
||||||
|
sys.path.insert(0, os.path.join(os.environ['TLS_ROOT_PATH'], 'tls', 'exe'))
|
||||||
|
import dss
|
||||||
|
|
||||||
|
NAME = 'CI-Eng-Sample.DEMO.PY_TEST' # or <Section>.<Tag> of a test section
|
||||||
|
|
||||||
|
conn = dss.connect(os.environ.get('CI_USER') or input('User: '),
|
||||||
|
os.environ.get('CI_PASSWORD') if 'CI_PASSWORD' in os.environ
|
||||||
|
else getpass.getpass('Password: '))
|
||||||
|
try:
|
||||||
|
df = dss.openDataset(conn, 'ITEM_DF', ['NAME', 'DESCRIPTION', 'ITEM_REP'], 'riud')
|
||||||
|
try:
|
||||||
|
# insert
|
||||||
|
dss.insertRecord(conn, df, {'NAME': NAME, 'DESCRIPTION': 'pyTOOLS test item',
|
||||||
|
'ITEM_REP': 'Real'})
|
||||||
|
# update one field
|
||||||
|
rec = dss.readEqual(conn, df, NAME)
|
||||||
|
rec['DESCRIPTION'] = 'pyTOOLS test item (updated)'
|
||||||
|
dss.updateRecord(conn, df, rec)
|
||||||
|
|
||||||
|
# write a value through ITEM_VAL
|
||||||
|
iv = dss.openDataset(conn, 'ITEM_VAL', ['NAME', 'ITEM_VALUE'], 'ru')
|
||||||
|
try:
|
||||||
|
dss.updateRecord(conn, iv, {'NAME': NAME, 'ITEM_VALUE': 42.0})
|
||||||
|
print(dss.readEqual(conn, iv, NAME))
|
||||||
|
finally:
|
||||||
|
dss.closeDataset(conn, iv)
|
||||||
|
|
||||||
|
# lock / unlock (others cannot change the definition meanwhile)
|
||||||
|
dss.lockRecords(conn, df, [NAME])
|
||||||
|
dss.unlockRecords(conn, df, [NAME])
|
||||||
|
|
||||||
|
# undo: remove the test item
|
||||||
|
dss.deleteRecord(conn, df, NAME)
|
||||||
|
except dss.error as e:
|
||||||
|
print('Error:', e.args)
|
||||||
|
for code, text in dss.getErrorStack(conn):
|
||||||
|
print(' ', code, text)
|
||||||
|
raise
|
||||||
|
finally:
|
||||||
|
dss.closeDataset(conn, df)
|
||||||
|
finally:
|
||||||
|
dss.close(conn)
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected: no output except the `ITEM_VAL` record with value 42; afterwards the item no longer
|
||||||
|
exists (`itmval -g CI-Eng-Sample.DEMO.PY_TEST` fails) and the audit trail shows insert,
|
||||||
|
modify, value change and delete with source `PYTOOLS`. If the script stops halfway, remove the
|
||||||
|
item with the Engineering Module or a quick load remove file.
|
||||||
|
|
||||||
|
## 3. Not tested / to verify
|
||||||
|
|
||||||
|
On a test Core with Python (user, with approval): run §2 with a user that has the item
|
||||||
|
actions; check the audit trail entries; check that `ITEM_VAL` accepts the value update
|
||||||
|
(otherwise write values with `itmval -p`, skill `system-management`); test `lockRecords` by
|
||||||
|
trying to change the item description in the Engineering Module while it is locked.
|
||||||
103
.claude/skills/pytools/tasks/read-items-history.md
Normal file
103
.claude/skills/pytools/tasks/read-items-history.md
Normal file
|
|
@ -0,0 +1,103 @@
|
||||||
|
---
|
||||||
|
task: Read item values and definitions, and item history / aggregates, from a Python script
|
||||||
|
version: R1.05
|
||||||
|
source: IM 36K10P40-01EN §3.3, §3.5, §3.12, §3.13, §4 (2nd ed., Feb. 2026); field names from the R1.05 data dictionary (copied from the R1.05 test server 2026-10-08); `aggr_period` and its values checked in the installed R1.05 `dss.pyd` (2026-10-09)
|
||||||
|
status: from docs, not tested (no Python on the R1.05 test server)
|
||||||
|
---
|
||||||
|
|
||||||
|
# Read items and item history
|
||||||
|
|
||||||
|
Start from `setup-first-script.md` (setup, logon). Only read mode (`'r'`) is used here.
|
||||||
|
|
||||||
|
## 1. Read all items of a section (ITEM_VAL)
|
||||||
|
|
||||||
|
`ITEM_VAL` = current values (`NAME`, `ITEM_VALUE`, `ITEM_VALUE_STR`, `STATUS`, `QUALITY`,
|
||||||
|
`UPDATE_TIME`, limits, `IN_ALARM`, `ENG_UNIT`, `SCALE_HIGH_LIMIT`, `SCALE_LOW_LIMIT` …);
|
||||||
|
`ITEM_DF` = definitions (description, type, limits, history and alarm settings). See all
|
||||||
|
fields with `dss.getFieldNames(conn, 'ITEM_VAL')` and their type/length with
|
||||||
|
`dss.getFieldProperties(conn, 'ITEM_VAL', 'NAME')`.
|
||||||
|
|
||||||
|
```python
|
||||||
|
import os, sys, getpass
|
||||||
|
sys.path.insert(0, os.path.join(os.environ['TLS_ROOT_PATH'], 'tls', 'exe'))
|
||||||
|
import dss
|
||||||
|
|
||||||
|
conn = dss.connect(os.environ.get('CI_USER') or input('User: '),
|
||||||
|
os.environ.get('CI_PASSWORD') if 'CI_PASSWORD' in os.environ
|
||||||
|
else getpass.getpass('Password: '))
|
||||||
|
try:
|
||||||
|
ds = dss.openDataset(conn, 'ITEM_VAL',
|
||||||
|
['NAME', 'ITEM_VALUE', 'ITEM_VALUE_STR', 'STATUS', 'ENG_UNIT'], 'r')
|
||||||
|
try:
|
||||||
|
dss.createFilter(conn, ds, '"CI-Eng-Sample.*"') # or '"<Section>.*"'
|
||||||
|
dss.activateFilter(conn, ds)
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
r = dss.readNext(conn, ds)
|
||||||
|
except dss.error as e:
|
||||||
|
if e.args[0] == 'DSS-E-EOS': # end of the dataset
|
||||||
|
break
|
||||||
|
raise
|
||||||
|
print('%-40s %12s %-8s %s' % (r['NAME'], r['ITEM_VALUE_STR'] or r['ITEM_VALUE'],
|
||||||
|
r['ENG_UNIT'], r['STATUS']))
|
||||||
|
dss.deactivateFilter(conn, ds)
|
||||||
|
dss.deleteFilter(conn, ds)
|
||||||
|
finally:
|
||||||
|
dss.closeDataset(conn, ds)
|
||||||
|
finally:
|
||||||
|
dss.close(conn)
|
||||||
|
```
|
||||||
|
|
||||||
|
- One item: `dss.readEqual(conn, ds, 'CI-Eng-Sample.TANK1.LEVEL')` (no filter needed).
|
||||||
|
- Small result sets: `dss.readRecords(conn, ds)` returns a list at once (the filter applies).
|
||||||
|
- Time fields are floats (seconds since 1970, local time unless the dataset was opened with
|
||||||
|
`'rt'` = UTC); format with `dss.dateString(conn, t, 'GENERAL')`.
|
||||||
|
|
||||||
|
## 2. Item history (fast path)
|
||||||
|
|
||||||
|
`getItemHistory` asks ITEM Service directly (faster than `ITEM_HISTORY` through DSS). The item
|
||||||
|
must be in the storage group you name (CI-Eng-Sample: `CIENG_EVENT` and `CIENG_SCAN10S` hold
|
||||||
|
`TANK1.LEVEL` and `TANK1.INFLOW`; `CIENG_AGG` holds hourly and 30-minute max/min/average of
|
||||||
|
`TANK1.LEVEL`; skill `history-management`).
|
||||||
|
|
||||||
|
```python
|
||||||
|
# inside the try: after dss.connect(...)
|
||||||
|
print(dss.getHisGroupItems(conn, 'CIENG_EVENT')) # items in the group
|
||||||
|
|
||||||
|
start = dss.dateRelDSS(conn, '-02:00') # 2 hours ago
|
||||||
|
end = dss.dateRelDSS(conn, '-00:00') # now
|
||||||
|
item, group = 'CI-Eng-Sample.TANK1.LEVEL', 'CIENG_EVENT'
|
||||||
|
while True:
|
||||||
|
samples = dss.getItemHistory(conn, item, group, start, end, 500)
|
||||||
|
done = samples and samples[-1] is None
|
||||||
|
rows = [s for s in samples if s is not None]
|
||||||
|
for (t, value, status, option_bits, quality) in rows:
|
||||||
|
print(dss.dateString(conn, t, 'GENERAL'), value, status, quality)
|
||||||
|
if done or not rows:
|
||||||
|
break
|
||||||
|
start = rows[-1][0] # next block starts at the last time read (may repeat it once)
|
||||||
|
```
|
||||||
|
|
||||||
|
Optional named arguments:
|
||||||
|
- `interval=60000` — interpolated values every 60 s (milliseconds) instead of the stored samples.
|
||||||
|
- `attribute='HIGH_LIMIT'` (also `DEADBAND`, `LOW_LIMIT`, `LOW_LOW_LIMIT`, `HIGH_HIGH_LIMIT`,
|
||||||
|
`SCALE_LOW`, `SCALE_HIGH`) where the group type stores them.
|
||||||
|
- Aggregation group: `attribute='AGGR_MAX'` (`AGGR_MIN`, `AGGR_AVERAGE`, `AGGR_INTG`,
|
||||||
|
`AGGR_COUNT`, `AGGR_STDV`, `AGGR_DFMS`) with `aggr_period='HOUR'` (`30_MINUTES`, `SHIFT`,
|
||||||
|
`DAY`, `WEEK`, `MONTH`, `YEAR`; only periods configured for the group, and only aggregates
|
||||||
|
stored for the item), e.g.
|
||||||
|
`dss.getItemHistory(conn, item, 'CIENG_AGG', start, end, 100, attribute='AGGR_MAX', aggr_period='HOUR')`.
|
||||||
|
- `node=<number>` — group on another node of a distributed system.
|
||||||
|
|
||||||
|
The status and quality numbers are the same codes as in `ITEM_HISTORY` / `STATUS_DF` (read
|
||||||
|
`STATUS_DF` to translate status numbers, task `filter-index.md`).
|
||||||
|
|
||||||
|
Expected: a list of tuples per block; the last block ends with `None`. An item that is not in
|
||||||
|
the group, or a group that does not exist, raises `dss.error` (code from ITEM Service).
|
||||||
|
|
||||||
|
## 3. Not tested / to verify
|
||||||
|
|
||||||
|
On a test Core with Python (user): run §1 against the sample section and compare with
|
||||||
|
`itmval -g` (skill `system-management`, `read-write-item.md`); run §2 for `CIENG_EVENT` and
|
||||||
|
compare with an `ITEM_HISTORY` report or `rptgen` query for the same period (skill
|
||||||
|
`reporting`). Check whether the repeated boundary sample appears when a block is continued.
|
||||||
116
.claude/skills/pytools/tasks/setup-first-script.md
Normal file
116
.claude/skills/pytools/tasks/setup-first-script.md
Normal file
|
|
@ -0,0 +1,116 @@
|
||||||
|
---
|
||||||
|
task: Set up Python and pyTOOLS, check the server side, run a first read-only script
|
||||||
|
version: R1.05
|
||||||
|
source: IM 36K10P40-01EN §1, §2, §3.2, §3.4, §3.5, §3.12, §3.14, §4 (2nd ed., Feb. 2026); IM 36K01C10-01EN §1.3.3 (5th ed., Feb. 2026, Python 3.12); IM 36K10J10-01EN §2.9.1 (5th ed., Feb. 2026, login method); installed files on the R1.05 test server (2026-10-09)
|
||||||
|
status: from docs, not tested (no Python on the R1.05 test server). Verified read-only on the R1.05 test server 2026-10-09 - `tls\exe\dss.pyd` (module 3.6.1), `DSSSDAPY` started by `database_start.cmd`, `dss.sup` routing, `dssana.sup` Python Interface lines; no Python installed there (only the 0-byte Microsoft Store aliases). R1.03 (development machine 2026-10-09): R1.03 `dss.pyd` imports under Python 3.12.10, `version()` and `busGetDirs()` work without CI Server running
|
||||||
|
---
|
||||||
|
|
||||||
|
# Set up pyTOOLS and run a first script
|
||||||
|
|
||||||
|
## 1. Check the server side (read-only)
|
||||||
|
|
||||||
|
| Check | Command | Expected (R1.05) |
|
||||||
|
|---|---|---|
|
||||||
|
| Module present | `dir "%TLS_ROOT_PATH%\tls\exe\dss.pyd"` | 137,728 bytes, Jun. 2026 (R1.03: 124,928 bytes, Aug. 2023) |
|
||||||
|
| Dedicated DSS server running | `durwfp -p DSSSDAPY -t 0` then `echo %ERRORLEVEL%` (separate commands) | `0` |
|
||||||
|
| Started by | `findstr /i dsssdapy "%TLS_ROOT_PATH%\tls\com\database_start.cmd"` | `start /B /NORMAL ...\dsssda -n dsssdapy` |
|
||||||
|
| Client routing | `findstr /i PYDSS "%TLS_ROOT_PATH%\tls\sup\dss.sup"` | `DSSSDA_SRV = -1, "PYDSS*", "DSSSDAPY"` |
|
||||||
|
| Allowed as user interface + login method | `findstr /c:"Python Interface" "%TLS_ROOT_PATH%\tls\sup\dssana.sup"` | `USER_INTERFACE = "Python Interface", "PYDSS", 18, ...` and `LOGIN_METHOD = "<local>"` / `"<remote>"`, `"Python Interface", Manual CI Server, NO,` |
|
||||||
|
| Python | `where python` and `py -0p` | a real `python.exe` (a 0-byte file under `...\WindowsApps` is only the Store alias = **no Python**) |
|
||||||
|
|
||||||
|
If the *Python Interface* lines are missing (e.g. after a merge of an old `dssana.sup` during an
|
||||||
|
upgrade), pyTOOLS cannot log on: compare with `tls\sup\dssana.sup` of a clean R1.05 install
|
||||||
|
(skill `portal-setup`, setup-file merge).
|
||||||
|
|
||||||
|
## 2. Install Python and the environment (user, administrator)
|
||||||
|
|
||||||
|
> **Action needed (administrator, on the CI Core / CI Portal):**
|
||||||
|
> 1. Install **64-bit Python 3.12** from python.org (right-click the installer › *Run as
|
||||||
|
> administrator*; tick *Add python.exe to PATH* or use the `py` launcher). Python 3.12 is the
|
||||||
|
> version listed as allowed coexisting software in IM 36K01C10.
|
||||||
|
> 2. Add the **system** variable `PYTHONPATH` = `%TLS_ROOT_PATH%\tls\exe` with the real path
|
||||||
|
> (e.g. `C:\Yokogawa\CIServer\tls\exe`; the manual's `C:\Program Files (x86)\...` is only the
|
||||||
|
> default). PowerShell (admin):
|
||||||
|
> `[Environment]::SetEnvironmentVariable('PYTHONPATH', "$env:TLS_ROOT_PATH\tls\exe", 'Machine')`
|
||||||
|
> 3. Open a **new** command prompt and run `python -c "import dss; print(dss.version())"`.
|
||||||
|
> Expected on R1.05: `pyTOOLS DSSmodule 3.6.1 r11609M [Jun 10 2026, ...]`.
|
||||||
|
|
||||||
|
Without changing the system variable, a script can add the folder itself (used in the examples
|
||||||
|
below): `sys.path.insert(0, os.path.join(os.environ['TLS_ROOT_PATH'], 'tls', 'exe'))`.
|
||||||
|
`TLS_ROOT_PATH` is set by the CI Server installation. The module finds its CI Server DLLs
|
||||||
|
(`buslib64.dll`, `databaselib64.dll`) in the same folder.
|
||||||
|
|
||||||
|
## 3. First read-only script
|
||||||
|
|
||||||
|
Needs a CI Server user (any authorization group that may read items; e.g. the sample's `CIENG`
|
||||||
|
user, which has no password). Save as `first_read.py` in a scratch folder.
|
||||||
|
|
||||||
|
```python
|
||||||
|
import os, sys, getpass
|
||||||
|
sys.path.insert(0, os.path.join(os.environ['TLS_ROOT_PATH'], 'tls', 'exe'))
|
||||||
|
import dss
|
||||||
|
|
||||||
|
ITEM = 'CI-Eng-Sample.TANK1.LEVEL' # or <Section>.<Tag>
|
||||||
|
|
||||||
|
print(dss.version()) # works without a connection
|
||||||
|
user = os.environ.get('CI_USER') or input('CI Server user: ')
|
||||||
|
pwd = os.environ.get('CI_PASSWORD')
|
||||||
|
if pwd is None:
|
||||||
|
pwd = getpass.getpass('Password: ')
|
||||||
|
|
||||||
|
conn = dss.connect(user, pwd) # connect + logon (Manual CI Server)
|
||||||
|
try:
|
||||||
|
ds = dss.openDataset(conn, 'LOCAL_NODE_DF',
|
||||||
|
['NAME', 'NODE_NUMBER', 'VERSION_MAJOR', 'VERSION_MINOR',
|
||||||
|
'VERSION_PACK', 'STARTUP_TIME'], 'r')
|
||||||
|
try:
|
||||||
|
node = dss.readNext(conn, ds)
|
||||||
|
print('Node %s (%d), CI Server R%d.%02d.%02d, started %s' % (
|
||||||
|
node['NAME'], node['NODE_NUMBER'], node['VERSION_MAJOR'],
|
||||||
|
node['VERSION_MINOR'], node['VERSION_PACK'],
|
||||||
|
dss.dateString(conn, node['STARTUP_TIME'], 'GENERAL')))
|
||||||
|
finally:
|
||||||
|
dss.closeDataset(conn, ds)
|
||||||
|
|
||||||
|
ds = dss.openDataset(conn, 'ITEM_VAL',
|
||||||
|
['NAME', 'ITEM_VALUE', 'STATUS', 'UPDATE_TIME'], 'r')
|
||||||
|
try:
|
||||||
|
rec = dss.readEqual(conn, ds, ITEM)
|
||||||
|
print('%s = %s (%s) at %s' % (rec['NAME'], rec['ITEM_VALUE'], rec['STATUS'],
|
||||||
|
dss.dateString(conn, rec['UPDATE_TIME'], 'GENERAL')))
|
||||||
|
except dss.error as e:
|
||||||
|
code, text = e.args
|
||||||
|
print('Cannot read %s: %s %s' % (ITEM, code, text))
|
||||||
|
finally:
|
||||||
|
dss.closeDataset(conn, ds)
|
||||||
|
finally:
|
||||||
|
dss.close(conn) # also logs out
|
||||||
|
```
|
||||||
|
|
||||||
|
Run: `python first_read.py` (with `CI_USER=CIENG` and `CI_PASSWORD=` set, or answer the
|
||||||
|
prompts). Expected: the module version, one line for the local node (version matching the
|
||||||
|
`system-check` result) and the current value of the item. An unknown item gives a `dss.error`
|
||||||
|
from DSS (record not found) instead of a crash.
|
||||||
|
|
||||||
|
## 4. Typical first errors
|
||||||
|
|
||||||
|
| Symptom | Cause |
|
||||||
|
|---|---|
|
||||||
|
| `ModuleNotFoundError: No module named 'dss'` | `PYTHONPATH` / `sys.path` does not point to `tls\exe`, or an old prompt without the new variable |
|
||||||
|
| `ImportError: DLL load failed` / not a valid Win32 application | 32-bit Python, or CI Server DLLs missing (not a CI Core / Portal) |
|
||||||
|
| `PY_DSS_NOT_LOGGED_IN` | `dss.connect()` without user/password, then a dataset call: DSS gives no data without a logon |
|
||||||
|
| `PY_DSS_ALREADY_CONN` | a second `dss.connect()` in the same script |
|
||||||
|
| Logon refused | wrong password, user unknown, or the *Python Interface* login method is not *Manual CI Server* / missing (§1) |
|
||||||
|
| `DSS-E-EOS` | end of dataset in a `readNext` loop: normal, catch it (task `read-items-history.md`) |
|
||||||
|
|
||||||
|
Check afterwards: the audit trail shows the logon/logout with source `PYTOOLS` (skill
|
||||||
|
`audit-trail`).
|
||||||
|
|
||||||
|
## 5. User verification (R1.05, not yet done)
|
||||||
|
|
||||||
|
1. §1 checks (all read-only) → expected values as in the table.
|
||||||
|
2. §2 on a test Core with Python 3.12 64-bit → version string as above.
|
||||||
|
3. §3 with a read-only user → node line + item value; then confirm in the audit trail that the
|
||||||
|
logon and logout were recorded with source `PYTOOLS`.
|
||||||
|
4. Also try `dss.connect()` without user followed by `openDataset` → expect
|
||||||
|
`PY_DSS_NOT_LOGGED_IN` (ISS-178).
|
||||||
|
|
@ -1,11 +1,12 @@
|
||||||
---
|
---
|
||||||
name: reporting
|
name: reporting
|
||||||
description: >-
|
description: >-
|
||||||
CI Server R1.03 REPORT Service, report definitions and RQL. Use when the user wants to create,
|
CI Server R1.05 REPORT Service, report definitions and RQL. Use when the user wants to create,
|
||||||
change, schedule or delete a report (daily / shift / hourly report, report triggered by an
|
change, schedule or delete a report (daily / shift / hourly report, report triggered by an
|
||||||
item value or status, ad-hoc report with parameters such as an item, object, date or list),
|
item value or status, ad-hoc report with parameters such as an item, object, date or list),
|
||||||
write or debug an RQL query (SELECT from item_val, item_history, alarm_current, alarm_chrono,
|
write or debug an RQL query (SELECT from item_val, item_history, alarm_current, alarm_chrono,
|
||||||
audit_trail, unit_df …, COLUMN formats, HEADER/FOOTER, cursors DECLARE/FETCH, LOOP, GPV_VALUE,
|
audit_trail, unit_df …, item units and scale limits ENG_UNIT / SCALE_HIGH_LIMIT /
|
||||||
|
SCALE_LOW_LIMIT, COLUMN formats, HEADER/FOOTER, cursors DECLARE/FETCH, LOOP, GPV_VALUE,
|
||||||
@P0 parameters, @DATE), generate a report now (GENERATE), view, print or delete generated
|
@P0 parameters, @DATE), generate a report now (GENERATE), view, print or delete generated
|
||||||
reports (REPORT_VAL), output a report to a file, CSV (SPOOL, @EXPORT) or HTML, use a logbook,
|
reports (REPORT_VAL), output a report to a file, CSV (SPOOL, @EXPORT) or HTML, use a logbook,
|
||||||
set up report printers (printer device, destination, FILE / HARDCOPY output, PRINTER_DEV_DF,
|
set up report printers (printer device, destination, FILE / HARDCOPY output, PRINTER_DEV_DF,
|
||||||
|
|
@ -16,7 +17,17 @@ description: >-
|
||||||
IM 36K10C30-01EN, IM 36K10P20-01EN, IM 36K10R40-01EN, IM 36K10E10-01EN.
|
IM 36K10C30-01EN, IM 36K10P20-01EN, IM 36K10R40-01EN, IM 36K10E10-01EN.
|
||||||
---
|
---
|
||||||
|
|
||||||
# Reporting (R1.03)
|
# Reporting (R1.05)
|
||||||
|
|
||||||
|
Re-checked on R1.05 on 2026-10-09 (read-only): the four manuals changed only in wording; the
|
||||||
|
REPORT datasets (`REPORT_DF`, `REPORT_VAL`, `PRINTER_*`), `rptman.sup` and the generator set-up
|
||||||
|
files (`rptge1.rpt`, `rptgen.rpt`, `rptgsp.rpt`) are identical to R1.03; the 28 system reports
|
||||||
|
and the 6 factory destinations are the same. New on R1.05: `ITEM_VAL` fields `ENG_UNIT`,
|
||||||
|
`SCALE_HIGH_LIMIT`, `SCALE_LOW_LIMIT` (readable in RQL), new datasets (see below), and
|
||||||
|
`report_start.cmd` / `report_stop.cmd` call extension scripts `?*_report_start.cmd` /
|
||||||
|
`?*_report_stop.cmd` in `tls\com`. Report generation was **not** re-tested on R1.05 (shared
|
||||||
|
test server): the sample's file device, destination and three reports loaded with 0 errors
|
||||||
|
(2026-10-08) and were removed again.
|
||||||
|
|
||||||
Background: `knowledge/manuals/IM36K10C30-01EN.md` (report definition fields, scheduling and
|
Background: `knowledge/manuals/IM36K10C30-01EN.md` (report definition fields, scheduling and
|
||||||
trigger behaviour, devices, generated reports, system reports), `IM36K10P20-01EN.md` (RQL),
|
trigger behaviour, devices, generated reports, system reports), `IM36K10P20-01EN.md` (RQL),
|
||||||
|
|
@ -33,13 +44,20 @@ Rules:
|
||||||
and a restart: hand them to the user (skill `portal-setup`, `change-setup-file.md`).
|
and a restart: hand them to the user (skill `portal-setup`, `change-setup-file.md`).
|
||||||
- Example names come from `CI-Eng-Sample` (`CIENG_TANK1`, `CIENG_INFLOW_HI`, `CIENG_HTML`,
|
- Example names come from `CI-Eng-Sample` (`CIENG_TANK1`, `CIENG_INFLOW_HI`, `CIENG_HTML`,
|
||||||
destination `CIENG_FILE`).
|
destination `CIENG_FILE`).
|
||||||
|
- Paths: read `set TLS` first. R1.03 default data root `C:\Users\Public\Yokogawa\tls`; on the
|
||||||
|
R1.05 test server program and data share `C:\Yokogawa\CIServer\tls`. `SPOOL` and FILE device
|
||||||
|
paths must be literal, so write the real path of the system.
|
||||||
|
- RQL can read every dataset. **Never query `API_KEYS_DF`** (it holds users' API keys) and do
|
||||||
|
not put it in a report. Other datasets new since R1.03 (names only): `ALARM_ATTRIBUTE_TEMP_DF`,
|
||||||
|
`UASERVER_MAPPER_DF`, `IEC61850_RCB_DF`, `OPCUAC_METHOD_CALL2_DF` (replaces
|
||||||
|
`OPCUAC_METHOD_CALL_IN_DF` / `_OUT_DF`; old report queries on those names fail).
|
||||||
|
|
||||||
| Task | File | Status |
|
| Task | File | Status |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Check REPORT Service: processes, set-up files, system reports, stop a hanging report (`rptstp`) | `tasks/report-checks.md` | verified |
|
| Check REPORT Service: processes, set-up files, system reports, stop a hanging report (`rptstp`) | `tasks/report-checks.md` | verified (R1.03); on R1.05 processes, files and system reports checked read-only (2026-10-09); `rptstp` not re-tested |
|
||||||
| Try RQL in the interactive generator (`rptgen -s rptgen.rpt`), CSV with `SPOOL` | `tasks/rql-interactive.md` | verified |
|
| Try RQL in the interactive generator (`rptgen -s rptgen.rpt`), CSV with `SPOOL` | `tasks/rql-interactive.md` | verified (R1.03); queries re-run read-only on R1.05 (2026-10-09), `SPOOL` not re-tested |
|
||||||
| Define reports by quick load (ad hoc with parameters, schedule, item trigger, HTML, logbook); generate, read, print, delete; remove | `tasks/define-reports.md` | verified (command line and Engineering Module) |
|
| Define reports by quick load (ad hoc with parameters, schedule, item trigger, HTML, logbook); generate, read, print, delete; remove | `tasks/define-reports.md` | verified (R1.03, command line and Engineering Module); on R1.05 load and remove only (2026-10-08), generation not tested |
|
||||||
| Report output to a file: printer device and destination | `tasks/output-devices.md` | verified |
|
| Report output to a file: printer device and destination | `tasks/output-devices.md` | verified (R1.03); on R1.05 load and remove only (2026-10-08) |
|
||||||
| Report component on a display; Operator Interface generate/view | C30 summary §5 | from docs |
|
| Report component on a display; Operator Interface generate/view | C30 summary §5 | from docs |
|
||||||
| Hardcopy printers, application devices, more generators, separate RPI servers | C30 summary §3, R40 summary §1, §3 | from docs |
|
| Hardcopy printers, application devices, more generators, separate RPI servers | C30 summary §3, R40 summary §1, §3 | from docs |
|
||||||
| Excel Add-in (DART) | E10 summary | from docs (Excel not installed on the test system) |
|
| Excel Add-in (DART) | E10 summary | from docs (Excel not installed on either test system) |
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Define reports by quick load (ad hoc with parameters, schedule, item trigger, HTML, logbook); generate, read, print and delete generated reports; remove reports
|
task: Define reports by quick load (ad hoc with parameters, schedule, item trigger, HTML, logbook); generate, read, print and delete generated reports; remove reports
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10C30-01EN §2.1, §2.3.1, §3, App. 1; IM 36K10L50-01EN App. 1 (REPORT_DF, REPORT_VAL); IM 36K10P20-01EN; practiced on CI-Eng-Sample 2026-10-01
|
source: IM 36K10C30-01EN §2.1, §2.3.1, §3, App. 1 (4th Edition, Feb. 2026); IM 36K10L50-01EN App. 1 (REPORT_DF, REPORT_VAL); IM 36K10P20-01EN (4th Edition, Feb. 2026); practiced on CI-Eng-Sample 2026-10-01
|
||||||
status: verified
|
status: verified on R1.03 (2026-10-01, command line and Engineering Module); on R1.05 the REPORT_DF / REPORT_VAL definitions are identical to R1.03 (file hashes, 2026-10-08) and the sample's three reports loaded and were removed with 0 errors on the R1.05 test server (2026-10-08, load check only); generating, printing and deleting generated reports not tested on R1.05 (shared server)
|
||||||
---
|
---
|
||||||
|
|
||||||
# Define and run reports
|
# Define and run reports
|
||||||
|
|
@ -96,7 +96,7 @@ NAME,DEST_NAME,PRINT
|
||||||
|
|
||||||
`dssqld -m`; check `PRINTER_JOB_OVV` and `umhlog.log` (`output-devices.md` §4).
|
`dssqld -m`; check `PRINTER_JOB_OVV` and `umhlog.log` (`output-devices.md` §4).
|
||||||
|
|
||||||
## 5. Schedule and trigger behaviour (verified)
|
## 5. Schedule and trigger behaviour (verified on R1.03)
|
||||||
|
|
||||||
- After each run `ACTIVATION_TIME` moves to the next slot. A start time in the past is moved
|
- After each run `ACTIVATION_TIME` moves to the next slot. A start time in the past is moved
|
||||||
forward, not caught up.
|
forward, not caught up.
|
||||||
|
|
@ -123,7 +123,23 @@ NAME,ACTIVATION_TIME,GENERATION_INTERVAL
|
||||||
(`%TLS_DAT_PATH%\<report>.lbk`). Remove reports before the trigger items and the destinations
|
(`%TLS_DAT_PATH%\<report>.lbk`). Remove reports before the trigger items and the destinations
|
||||||
they use.
|
they use.
|
||||||
|
|
||||||
## Verified on CI-Eng-Sample (2026-10-01)
|
## R1.05 (2026-10-08/09)
|
||||||
|
|
||||||
|
- **Verified (R1.05 test server, 2026-10-08):** the reduced CI-Eng-Sample load created the file
|
||||||
|
device and destination and the three reports with 0 errors (the sample files still say
|
||||||
|
`@VERSION 1.03.00`; R1.05 accepts them) and the sample's remove files (schedule cleared
|
||||||
|
first by `83a_stop_report_df.qli`, as in §6) removed them with 0 errors. Generation was not run.
|
||||||
|
- **Awaiting user verification:** generate, read, print and delete on R1.05. On a non-shared
|
||||||
|
R1.05 system load the sample (`examples/CI-Eng-Sample/`), then run §2 for `CIENG_TANK1` with
|
||||||
|
`PARAM_VALUE_1` = `CI-Eng-Sample.TANK1.INFLOW`, §3, §4 to `CIENG_FILE`, write 450 to
|
||||||
|
`TANK1.INFLOW` (trigger), and remove. Expected as on R1.03: `GENERATE` back to 0, a
|
||||||
|
`REPORT_VAL` record per run, the `dssqld` run not printed (`FSL-E-PRT_UNKUSER`, ISS-045), the
|
||||||
|
trigger run printed by `RPTMAN`.
|
||||||
|
- Queries may now use `ITEM_VAL.ENG_UNIT`, `SCALE_HIGH_LIMIT`, `SCALE_LOW_LIMIT`
|
||||||
|
(`rql-interactive.md` §4). Report queries written for R1.03 on `OPCUAC_METHOD_CALL_IN_DF` /
|
||||||
|
`_OUT_DF` must move to `OPCUAC_METHOD_CALL2_DF`.
|
||||||
|
|
||||||
|
## Verified on CI-Eng-Sample (R1.03, 2026-10-01)
|
||||||
|
|
||||||
`CIENG_TANK1` (parameter `[ITEM:…]`, daily 06:00 with `CORRECT_DAYLIGHT` 1, ad-hoc destination),
|
`CIENG_TANK1` (parameter `[ITEM:…]`, daily 06:00 with `CORRECT_DAYLIGHT` 1, ad-hoc destination),
|
||||||
`CIENG_INFLOW_HI` (trigger `TANK1.INFLOW` > 400, delay 5 s) and `CIENG_HTML` (cursor loop, HTML,
|
`CIENG_INFLOW_HI` (trigger `TANK1.INFLOW` > 400, delay 5 s) and `CIENG_HTML` (cursor loop, HTML,
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Send reports to a file - printer device and destination
|
task: Send reports to a file - printer device and destination
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10C30-01EN §2.2; IM 36K10L50-01EN App. 1 (PRINTER_*); practiced on CI-Eng-Sample 2026-10-01
|
source: IM 36K10C30-01EN §2.2 (4th Edition, Feb. 2026); IM 36K10L50-01EN App. 1 (PRINTER_*); practiced on CI-Eng-Sample 2026-10-01
|
||||||
status: verified
|
status: verified on R1.03 (2026-10-01); on R1.05 the PRINTER_* definitions are identical to R1.03 (file hashes, 2026-10-08), the 6 factory destinations (no devices) are the same (2026-10-09, read-only), and the sample's file device and destination loaded and were removed with 0 errors (2026-10-08, load check only); printing to the file not tested on R1.05
|
||||||
---
|
---
|
||||||
|
|
||||||
# Report output devices and destinations
|
# Report output devices and destinations
|
||||||
|
|
@ -68,7 +68,18 @@ HTML source).
|
||||||
Remove (or repoint) the reports that use the destination, then the destination, then the device
|
Remove (or repoint) the reports that use the destination, then the destination, then the device
|
||||||
(`DSSP-E-NODEL … still in use` otherwise). The output file is not deleted.
|
(`DSSP-E-NODEL … still in use` otherwise). The output file is not deleted.
|
||||||
|
|
||||||
## Verified (2026-10-01)
|
## R1.05 (2026-10-08/09)
|
||||||
|
|
||||||
|
- `<folder>`: use the real `TLS_LST_PATH` of the system (`set TLS`); on the R1.05 test server
|
||||||
|
it is under `C:\Yokogawa\CIServer\tls`, not `C:\Users\Public\Yokogawa\tls`.
|
||||||
|
`17_printer_df.ps1` fills it in from the environment, so the sample works on both.
|
||||||
|
- **Verified (R1.05 test server):** factory destinations `ALARMS`, `AUDIT_TRAIL`, `DEFAULT`,
|
||||||
|
`MESSAGES`, `PRINTER_1`, `SCREEN_CAPTURE`, no devices (as on R1.03, 2026-10-09); the sample's
|
||||||
|
device and destination loaded and were removed with 0 errors (2026-10-08).
|
||||||
|
- **Awaiting user verification:** a print to the file device on R1.05 (see `define-reports.md`
|
||||||
|
R1.05 section); expected job *Finished*, device *Ready*, the report text in the file.
|
||||||
|
|
||||||
|
## Verified (R1.03, 2026-10-01)
|
||||||
|
|
||||||
`CIENG_FILE` (`UNLICENCED:FILE`, `C:\Users\Public\Yokogawa\tls\lst\cieng_report.txt`, overwrite):
|
`CIENG_FILE` (`UNLICENCED:FILE`, `C:\Users\Public\Yokogawa\tls\lst\cieng_report.txt`, overwrite):
|
||||||
printed generated reports, scheduled, triggered and ad-hoc runs wrote the file; jobs *Finished*,
|
printed generated reports, scheduled, triggered and ad-hoc runs wrote the file; jobs *Finished*,
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Check REPORT Service (processes, set-up files, system reports) and stop a hanging report
|
task: Check REPORT Service (processes, set-up files, system reports) and stop a hanging report
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10R40-01EN §1.3, §2.2, §2.3, §5; IM 36K10C30-01EN §4, App. 1.3; practiced on the test system 2026-10-01
|
source: IM 36K10R40-01EN §1.3, §2.2, §2.3, §5 (4th Edition, Feb. 2026); IM 36K10C30-01EN §4, App. 1.3 (4th Edition, Feb. 2026); practiced on the test system 2026-10-01
|
||||||
status: verified
|
status: verified on R1.03 (2026-10-01); on the R1.05 test server processes, set-up files, start/stop scripts, system reports and factory destinations checked read-only (2026-10-09); rptstp not re-tested on R1.05 (it cancels a running report on a shared server)
|
||||||
---
|
---
|
||||||
|
|
||||||
# REPORT Service checks
|
# REPORT Service checks
|
||||||
|
|
@ -21,6 +21,11 @@ are linked into the generator, so they do **not** run as processes unless `repor
|
||||||
changed. REPORT Service is started by `%TLS_ROOT_PATH%\tls\com\report_start.cmd` and only if
|
changed. REPORT Service is started by `%TLS_ROOT_PATH%\tls\com\report_start.cmd` and only if
|
||||||
HISTORY Service (`his`) runs.
|
HISTORY Service (`his`) runs.
|
||||||
|
|
||||||
|
**R1.05:** `report_start.cmd` ends by calling every `?*_report_start.cmd` in `tls\com`, and
|
||||||
|
`report_stop.cmd` calls every `?*_report_stop.cmd` before it stops `rpt*` / `rpi*` (change note
|
||||||
|
of Apr. 2025, not in the manual). Put site additions (e.g. an extra generator) in such a file
|
||||||
|
instead of editing the product script, which an upgrade may replace (ISS-121). Not tried.
|
||||||
|
|
||||||
## 2. Set-up files (`%TLS_ROOT_PATH%\tls\sup`)
|
## 2. Set-up files (`%TLS_ROOT_PATH%\tls\sup`)
|
||||||
|
|
||||||
| File | For | What to read |
|
| File | For | What to read |
|
||||||
|
|
@ -46,7 +51,7 @@ NAME,REPORT_NAME,GENERATION_TIME,DELETION_TIME,USER_NAME,ACTION_PROCESS
|
||||||
@REPORT_VAL
|
@REPORT_VAL
|
||||||
```
|
```
|
||||||
|
|
||||||
`dssqld -e reports.csv <file>.qli -c`. A fresh R1.03 system has 28 system reports (all ad hoc,
|
`dssqld -e reports.csv <file>.qli -c`. A fresh R1.03 or R1.05 system has 28 system reports (all ad hoc,
|
||||||
lifetime 1 week, priority 0), listed in `IM36K10C30-01EN.md` §8. Add `QUERY` to the field list
|
lifetime 1 week, priority 0), listed in `IM36K10C30-01EN.md` §8. Add `QUERY` to the field list
|
||||||
(without `-c`) to read their RQL — useful examples.
|
(without `-c`) to read their RQL — useful examples.
|
||||||
|
|
||||||
|
|
@ -62,7 +67,21 @@ Verified: the loop stopped at once, `GENERATE` went back to 0, the generator sta
|
||||||
next report. An empty generated report remains; delete it (`define-reports.md` §6). From the
|
next report. An empty generated report remains; delete it (`define-reports.md` §6). From the
|
||||||
user side the manual names the *Cancel* button and `REPORT_DF.CANCEL` = 1 (not tried).
|
user side the manual names the *Cancel* button and `REPORT_DF.CANCEL` = 1 (not tried).
|
||||||
|
|
||||||
## Verified (2026-10-01)
|
## Verified (R1.03, 2026-10-01)
|
||||||
|
|
||||||
`rptman` and `rptgen` running; `rpi*` lines commented out in `report_start.cmd`; set-up files as
|
`rptman` and `rptgen` running; `rpi*` lines commented out in `report_start.cmd`; set-up files as
|
||||||
above; 28 system reports; `rptstp rptge1` cancelled the test report `CIENG_LOOP`.
|
above; 28 system reports; `rptstp rptge1` cancelled the test report `CIENG_LOOP`.
|
||||||
|
|
||||||
|
## Verified (R1.05 test server, 2026-10-09, read-only)
|
||||||
|
|
||||||
|
- Processes `rptman` and one `rptgen` (`RPTGE1`), no `rpi*` processes.
|
||||||
|
- `rptman.sup`, `rptge1.rpt`, `rptgen.rpt`, `rptgsp.rpt` byte-identical to R1.03 (same file
|
||||||
|
hashes); `rptman.sup` content as in §2. `rptini.sup` holds only an instance header and one
|
||||||
|
licence-like value (differs per installation).
|
||||||
|
- `report_start.cmd`: same steps as R1.03 plus the extension-script call above; `rpi*`, `rptge2`
|
||||||
|
and `rptgsp` lines still commented out.
|
||||||
|
- 28 system reports, same names as R1.03, all ad hoc, priority 0, lifetime 1 week, no schedule
|
||||||
|
or destination; only `SYSTEM_LOG_HTML` has `CONTAINS_HTML` 1.
|
||||||
|
- Factory destinations as on R1.03, no devices (`output-devices.md`).
|
||||||
|
- Not re-tested: `rptstp` (awaiting user verification on a non-shared system: load a report with
|
||||||
|
an endless `LOOP`, generate it, run `rptstp rptge1`; expected as on R1.03).
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Try RQL queries in the interactive report generator; write CSV with SPOOL
|
task: Try RQL queries in the interactive report generator; write CSV with SPOOL
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10R40-01EN §4; IM 36K10P20-01EN §3–6, §9; IM 36K10C30-01EN §3.2.3; practiced on the test system and CI-Eng-Sample 2026-10-01
|
source: IM 36K10R40-01EN §4; IM 36K10P20-01EN §3–6, §9; IM 36K10C30-01EN §3.2.3 (all 4th Edition, Feb. 2026); R1.05 data dictionary (ITEM_VAL); practiced on the test system and CI-Eng-Sample 2026-10-01
|
||||||
status: verified
|
status: verified on R1.03 (2026-10-01); on the R1.05 test server piped query files, cursors (DECLARE/OPEN/FETCH), group functions, @VERSION and the new ITEM_VAL fields verified read-only (2026-10-09); SPOOL/CSV, history queries and the CI-Eng-Sample examples not re-run on R1.05 (sample not loaded on the shared server)
|
||||||
---
|
---
|
||||||
|
|
||||||
# RQL in the interactive generator
|
# RQL in the interactive generator
|
||||||
|
|
@ -45,6 +45,10 @@ rptgen -s rptgen.rpt < query.rql > query.out
|
||||||
- `LOOP` does not work here (`RPT-E-LPNOTAL`); test loops and cursors in a report definition
|
- `LOOP` does not work here (`RPT-E-LPNOTAL`); test loops and cursors in a report definition
|
||||||
(`define-reports.md`).
|
(`define-reports.md`).
|
||||||
- `@P0`…`@P7` and `@NAME` do not exist here; `SET` them to test a report query.
|
- `@P0`…`@P7` and `@NAME` do not exist here; `SET` them to test a report query.
|
||||||
|
- A literal next to a group function counts as a plain column: `select 'n', count(name) from …`
|
||||||
|
gives `RPT-E-MIXAGGFNC` (verified R1.05). Select the group function alone.
|
||||||
|
- `DECLARE` / `OPEN` / one `FETCH` / `CLOSE` work here without a loop (verified R1.05) — handy to
|
||||||
|
pick one record and reuse its fields in the next query (`where name = @n`).
|
||||||
|
|
||||||
## 2. Dates
|
## 2. Dates
|
||||||
|
|
||||||
|
|
@ -55,6 +59,9 @@ Unix time (10 h less on a UTC+10 system) — use it only when another program ne
|
||||||
|
|
||||||
## 3. CSV file with SPOOL
|
## 3. CSV file with SPOOL
|
||||||
|
|
||||||
|
Use the real `TLS_LST_PATH` (`set TLS`): R1.03 default `C:\Users\Public\Yokogawa\tls\lst`, on
|
||||||
|
the R1.05 test server under `C:\Yokogawa\CIServer\tls`.
|
||||||
|
|
||||||
```
|
```
|
||||||
spool 'C:\Users\Public\Yokogawa\tls\lst\cieng_levels.csv';
|
spool 'C:\Users\Public\Yokogawa\tls\lst\cieng_levels.csv';
|
||||||
set @export 1;
|
set @export 1;
|
||||||
|
|
@ -67,7 +74,32 @@ Result: one line per row, strings quoted (`"CI-Eng-Sample.TANK1.LEVEL",61,"NORMA
|
||||||
File name ≤ 79 characters, literal (no `%variables%`), overwritten each time, never cleaned up by
|
File name ≤ 79 characters, literal (no `%variables%`), overwritten each time, never cleaned up by
|
||||||
CI Server — delete it when done. The same statements work inside a report definition.
|
CI Server — delete it when done. The same statements work inside a report definition.
|
||||||
|
|
||||||
## Verified (2026-10-01)
|
## 4. New in R1.05: item units and scale limits in `ITEM_VAL`
|
||||||
|
|
||||||
|
`ITEM_VAL` has three new fields (not in any manual; ISS-126): `ENG_UNIT` (char 8, engineering
|
||||||
|
units), `SCALE_HIGH_LIMIT` and `SCALE_LOW_LIMIT` (double). Before R1.05 a report had to join
|
||||||
|
`ITEM_DF` for the unit; now one query on current values is enough:
|
||||||
|
|
||||||
|
```
|
||||||
|
column u heading 'Unit';
|
||||||
|
select name, item_value, eng_unit u, scale_low_limit, scale_high_limit
|
||||||
|
from item_val where name like '<Section>.%';
|
||||||
|
```
|
||||||
|
|
||||||
|
**Verified (R1.05 test server, 2026-10-09, read-only):** the fields are accepted by RQL. For an
|
||||||
|
item with a unit, `ITEM_VAL.ENG_UNIT` held the same unit text as `ITEM_DF.ENG_UNIT`. The scale
|
||||||
|
fields gave 0 / 0 where the item defines no scale; for one item without a unit `ITEM_VAL` gave
|
||||||
|
scale high 1 while `ITEM_DF` had 0, so how `ITEM_VAL` fills the scale limits is not clear yet
|
||||||
|
(ISS-167). Until then take scale limits from `ITEM_DF` when they matter. R1.03 `ITEM_VAL` has no such
|
||||||
|
fields, so a report using them fails there (unknown field).
|
||||||
|
|
||||||
|
Other datasets new since R1.03 can be queried like any other (checked read-only with
|
||||||
|
`count(name)` on R1.05: `ALARM_ATTRIBUTE_TEMP_DF`, `UASERVER_MAPPER_DF`, `IEC61850_RCB_DF`,
|
||||||
|
`OPCUAC_METHOD_CALL2_DF`). **Never query `API_KEYS_DF`** (it holds users' API keys; ISS-168).
|
||||||
|
|
||||||
|
`@VERSION` returns `1.05.00` on R1.05 (`1.03.00` on R1.03).
|
||||||
|
|
||||||
|
## Verified (R1.03, 2026-10-01)
|
||||||
|
|
||||||
Current values, history of `CIENG_EVENT` / `CIENG_SCAN10S` (count 299 in an hour at 10 s), group
|
Current values, history of `CIENG_EVENT` / `CIENG_SCAN10S` (count 299 in an hour at 10 s), group
|
||||||
functions, `GROUP BY` on `unit_df`, `GPV_VALUE`/`GPV_STATUS`/`GPV_QUALITY` (61, 9, 0), string and
|
functions, `GROUP BY` on `unit_df`, `GPV_VALUE`/`GPV_STATUS`/`GPV_QUALITY` (61, 9, 0), string and
|
||||||
|
|
|
||||||
|
|
@ -95,7 +95,7 @@
|
||||||
| [Class Description Language - Java](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10P11-01EN.pdf) | IM 36K10P11-01EN | 4th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
| [Class Description Language - Java](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10P11-01EN.pdf) | IM 36K10P11-01EN | 4th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
| [Report Generation Language](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10P20-01EN.pdf) | IM 36K10P20-01EN | 4th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
| [Report Generation Language](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10P20-01EN.pdf) | IM 36K10P20-01EN | 4th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
| [Data Set Service Language](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10P30-01EN.pdf) | IM 36K10P30-01EN | 4th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
| [Data Set Service Language](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10P30-01EN.pdf) | IM 36K10P30-01EN | 4th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
| [pyTOOLS Programmer's Guide](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10P40-01EN.pdf) | IM 36K10P40-01EN | 2nd Edition, Feb. 2026 | — (new in R1.04) |
|
| [pyTOOLS Programmer's Guide](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10P40-01EN.pdf) | IM 36K10P40-01EN | 2nd Edition, Feb. 2026 | — (new in R1.04; skill `pytools`) |
|
||||||
|
|
||||||
### Setup
|
### Setup
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,7 @@ development system (see "Test system" in `progress.md`); they do not exist on ot
|
||||||
| ISS-033 | 2026-10-01 | ACCESS (Engineering Module OPC UA point) | Tested by the user: the point form's *Browse path* stops at the item (`Objects/CI-Eng-Sample/TANK1/INFLOW`) and stores the item **object** `{"nsid":"548"}`; the point is not monitored (revised sampling interval 0, connected item status 13, *Last value*/*Data type* empty). Typing `{"0":"Value","itnm":"CI-Eng-Sample.TANK1.INFLOW"}` in *Node Id* fixed it (values followed at once). Browsing into an item that is OPC visible but not *Read* fails (`UncertainNotAllNodesAvailable`, `OPXC-E-BRW_NODE`). | closed | Answered 2026-10-01 by the user: the browse dialog can expand the item; picking `…/LEVEL/Value` stored `{"0":"Value","nsid":"713"}` with *Last value* 85, *Data type* Double. So: pick the `Value` node, not the item. The `itnm` form stays the choice for quick load (`nsid` changes on reload). Closed 2026-10-01 (confirmed by user). | `knowledge/manuals/IM36K10E20-01EN.md` §2 (done); `.claude/skills/data-access/tasks/opcua-client.md` §3 (done) |
|
| ISS-033 | 2026-10-01 | ACCESS (Engineering Module OPC UA point) | Tested by the user: the point form's *Browse path* stops at the item (`Objects/CI-Eng-Sample/TANK1/INFLOW`) and stores the item **object** `{"nsid":"548"}`; the point is not monitored (revised sampling interval 0, connected item status 13, *Last value*/*Data type* empty). Typing `{"0":"Value","itnm":"CI-Eng-Sample.TANK1.INFLOW"}` in *Node Id* fixed it (values followed at once). Browsing into an item that is OPC visible but not *Read* fails (`UncertainNotAllNodesAvailable`, `OPXC-E-BRW_NODE`). | closed | Answered 2026-10-01 by the user: the browse dialog can expand the item; picking `…/LEVEL/Value` stored `{"0":"Value","nsid":"713"}` with *Last value* 85, *Data type* Double. So: pick the `Value` node, not the item. The `itnm` form stays the choice for quick load (`nsid` changes on reload). Closed 2026-10-01 (confirmed by user). | `knowledge/manuals/IM36K10E20-01EN.md` §2 (done); `.claude/skills/data-access/tasks/opcua-client.md` §3 (done) |
|
||||||
| ISS-034 | 2026-10-01 | ACCESS (OPC UA server setup) | Installed vs IM 36K10L45 §10.5–10.6: `ServerConfig.xml` enables certificate user tokens (`EnableCertificate true`, manual false) and offers no `None` endpoint (only Basic256Sha256 / Aes128_Sha256_RsaOaep / Aes256_Sha256_RsaPss with Sign or SignAndEncrypt); the `rejected` folder is created only at the first rejection; `opxuas.sup` uses `OPXUAS_DYNAMIC_SCANRATE` (manual `OPXUAS_USE_DYNAMIC_SCANRATE`) and has `OPXUAS_SET_HIGH_PRIO_15` (not described); `opxsys.sup` has `OPXDAS_SET_LOG_LEVEL` (not described). Also `dur.sup` adaptive queue entry `OPCEXE` while the installed executors are `OPCEXE1`–`4`. | closed | R1.05 (2026-10-08): all points still hold on the R1.05 test server; manual sections are now IM 36K10L45 5th ed. §11.6–11.7. Closed 2026-10-01 (user decision: installed software is the reference). Installed software is the reference (standing user decision). Close when the user confirms. | `knowledge/manuals/IM36K10L45-01EN.md` §4, §7 (done); `knowledge/manuals/IM36K10L30-01EN.md` §8 (done) |
|
| ISS-034 | 2026-10-01 | ACCESS (OPC UA server setup) | Installed vs IM 36K10L45 §10.5–10.6: `ServerConfig.xml` enables certificate user tokens (`EnableCertificate true`, manual false) and offers no `None` endpoint (only Basic256Sha256 / Aes128_Sha256_RsaOaep / Aes256_Sha256_RsaPss with Sign or SignAndEncrypt); the `rejected` folder is created only at the first rejection; `opxuas.sup` uses `OPXUAS_DYNAMIC_SCANRATE` (manual `OPXUAS_USE_DYNAMIC_SCANRATE`) and has `OPXUAS_SET_HIGH_PRIO_15` (not described); `opxsys.sup` has `OPXDAS_SET_LOG_LEVEL` (not described). Also `dur.sup` adaptive queue entry `OPCEXE` while the installed executors are `OPCEXE1`–`4`. | closed | R1.05 (2026-10-08): all points still hold on the R1.05 test server; manual sections are now IM 36K10L45 5th ed. §11.6–11.7. Closed 2026-10-01 (user decision: installed software is the reference). Installed software is the reference (standing user decision). Close when the user confirms. | `knowledge/manuals/IM36K10L45-01EN.md` §4, §7 (done); `knowledge/manuals/IM36K10L30-01EN.md` §8 (done) |
|
||||||
| ISS-035 | 2026-10-01 | ALARM (`ALDPRT`) | `ALDPRT` is running and connected (`almdbg` 1 shows `Events-send-to` rising with each alarm), `aldprt.sup` sets no log destination (so per IM 36K10L15 §4.3 it should log via UMH) and `EVENTS` includes `alarm`/`ackn`, but no alarm line appears in `tls\log\umhlog.log` for the CI-Eng-Sample HIGH / HIGH HIGH / acknowledge events. No other log file changed. Cause unknown (UMH filtering? output only with `LOGUMH` set explicitly?). | open | Rechecked 2026-10-01 after a restart: `aldprt.exe` runs; `umhlog.log` still has no alarm lines for the new `TANK1.LEVEL` HIGH alarm (only `ALD-I-ALDPRT_EXIT` at each licence shutdown). `fmfprt.sup` assigns printer function `ALARMS` to `ALDPRT`; destination `ALARMS` (policy *Automatic*) has **no device**, and `PRINTER_JOB_OVV` has no `ALDPRT` jobs. The `aldprt.sup` help says UMH is used only when no destination is enabled — the printer function may count as one. Next: test `LOGUMH` in `aldprt.sup` (admin, restart). Low priority: history and overviews are not affected. | `.claude/skills/alarm-management/tasks/item-alarming.md` (last line); `knowledge/manuals/IM36K10L15-01EN.md` §8 |
|
| ISS-035 | 2026-10-01 | ALARM (`ALDPRT`) | `ALDPRT` is running and connected (`almdbg` 1 shows `Events-send-to` rising with each alarm), `aldprt.sup` sets no log destination (so per IM 36K10L15 §4.3 it should log via UMH) and `EVENTS` includes `alarm`/`ackn`, but no alarm line appears in `tls\log\umhlog.log` for the CI-Eng-Sample HIGH / HIGH HIGH / acknowledge events. No other log file changed. Cause unknown (UMH filtering? output only with `LOGUMH` set explicitly?). | open | Rechecked 2026-10-01 after a restart: `aldprt.exe` runs; `umhlog.log` still has no alarm lines for the new `TANK1.LEVEL` HIGH alarm (only `ALD-I-ALDPRT_EXIT` at each licence shutdown). `fmfprt.sup` assigns printer function `ALARMS` to `ALDPRT`; destination `ALARMS` (policy *Automatic*) has **no device**, and `PRINTER_JOB_OVV` has no `ALDPRT` jobs. The `aldprt.sup` help says UMH is used only when no destination is enabled — the printer function may count as one. Next: test `LOGUMH` in `aldprt.sup` (admin, restart). Low priority: history and overviews are not affected. | `.claude/skills/alarm-management/tasks/item-alarming.md` (last line); `knowledge/manuals/IM36K10L15-01EN.md` §8 |
|
||||||
| ISS-036 | 2026-10-01 | ALARM (setup) | Installed vs manuals: `alh.sup` has `DB-JRNL = WAL` and `DB-SYNC = OFF`, not described in IM 36K10L15 §3.4; storage group `ALH` has lifetime **52 weeks** while IM 36K10C20 §A7 says the default is 2 days (may have been changed on this system earlier — unknown); `aldprt.sup` uses `TIMEFMT` where the manual text also writes `TIMFMT`. | closed | Installed software is the reference (standing user decision). Close when the user confirms. Closed 2026-10-01 (confirmed by user). | `knowledge/manuals/IM36K10L15-01EN.md` §7, §8; `knowledge/manuals/IM36K10C20-01EN.md` §A7 |
|
| ISS-036 | 2026-10-01 | ALARM (setup) | Installed vs manuals: `alh.sup` has `DB-JRNL = WAL` and `DB-SYNC = OFF`, not described in IM 36K10L15 §3.4; storage group `ALH` has lifetime **52 weeks** while IM 36K10C20 §A7 says the default is 2 days (may have been changed on this system earlier — unknown); `aldprt.sup` uses `TIMEFMT` where the manual text also writes `TIMFMT`. | closed | 2026-10-09: settled by ISS-135 (52 weeks is the installed default on R1.03 and R1.05). Installed software is the reference (standing user decision). Close when the user confirms. Closed 2026-10-01 (confirmed by user). | `knowledge/manuals/IM36K10L15-01EN.md` §7, §8; `knowledge/manuals/IM36K10C20-01EN.md` §A7 |
|
||||||
| ISS-037 | 2026-10-01 | ALARM (history fields) | `ALARM_CHRONO` records contain leftover or unreadable text: INFO events generated with `almdbg` 16 carry `INSTALL`/`UNIT`/`TAG`/`SUB` values from earlier events and non-ASCII bytes in `SOURCE`, `CATEGORY`, `CONDITION`; item events of `CI-Eng-Sample.TANK1.LEVEL` show `SUB` = `RoC` although the item has only the sub-item `MAX`. | closed | Rechecked 2026-10-01 after a restart: a new HIGH alarm on `CI-Eng-Sample.TANK1.LEVEL` (raised with `itmval -p`) gave a clean `ALARM_CHRONO` record (`INSTALL`/`UNIT`/`TAG` correct, `SUB` empty, `SOURCE`/`CATEGORY`/`CONDITION` empty), and the user's Current Alarm Overview showed correct columns. The leftover/garbled values are limited to the older records (INFO events made with the `almdbg` 16 test function and events from that session). Documented: treat `SUB`/`SOURCE`/`CATEGORY`/`CONDITION` as reliable only for normal item and OPC events. Closed 2026-10-01 (confirmed by user). | `.claude/skills/alarm-management/tasks/alarm-checks.md` §4 |
|
| ISS-037 | 2026-10-01 | ALARM (history fields) | `ALARM_CHRONO` records contain leftover or unreadable text: INFO events generated with `almdbg` 16 carry `INSTALL`/`UNIT`/`TAG`/`SUB` values from earlier events and non-ASCII bytes in `SOURCE`, `CATEGORY`, `CONDITION`; item events of `CI-Eng-Sample.TANK1.LEVEL` show `SUB` = `RoC` although the item has only the sub-item `MAX`. | closed | Rechecked 2026-10-01 after a restart: a new HIGH alarm on `CI-Eng-Sample.TANK1.LEVEL` (raised with `itmval -p`) gave a clean `ALARM_CHRONO` record (`INSTALL`/`UNIT`/`TAG` correct, `SUB` empty, `SOURCE`/`CATEGORY`/`CONDITION` empty), and the user's Current Alarm Overview showed correct columns. The leftover/garbled values are limited to the older records (INFO events made with the `almdbg` 16 test function and events from that session). Documented: treat `SUB`/`SOURCE`/`CATEGORY`/`CONDITION` as reliable only for normal item and OPC events. Closed 2026-10-01 (confirmed by user). | `.claude/skills/alarm-management/tasks/alarm-checks.md` §4 |
|
||||||
| ISS-038 | 2026-10-01 | HISTORY (`ithloahis` + rollover) | An `ithloahis` sample that was dropped (dated 11:50, before the active unit) still became the **initial value** of the next unit: after a forced rollover at 12:05:26 `ITEM_HISTORY` shows `CI-Eng-Sample.TANK1.INFLOW` = 95 (`INITIAL_VALUE` 1) although the item's value was 112. History after loading old samples can therefore show a wrong value at the next rollover. | closed | Retested 2026-10-01 after a CI Server restart (first unit 18:05:46). (a) Sample dated one day earlier (95), live value 112, forced rollover: initial value 112 — correct. (b) Sample dated 18:00 (96, a few minutes before the first unit), live value 113, forced rollover: initial value **96** — wrong again; the live item value stayed 113. So a dropped sample dated shortly before the first unit (same day) becomes the next unit's initial value; a much older one did not. Also found: a forced rollover within 2 minutes of the previous one is refused (`DSI-E-ROLLDONE`). Documented as a caution; behaviour confirmed, ready to close. Closed 2026-10-01 (confirmed by user). | `.claude/skills/system-management/tasks/load-history.md`; `knowledge/manuals/IM36K10C40-01EN.md` §3 |
|
| ISS-038 | 2026-10-01 | HISTORY (`ithloahis` + rollover) | An `ithloahis` sample that was dropped (dated 11:50, before the active unit) still became the **initial value** of the next unit: after a forced rollover at 12:05:26 `ITEM_HISTORY` shows `CI-Eng-Sample.TANK1.INFLOW` = 95 (`INITIAL_VALUE` 1) although the item's value was 112. History after loading old samples can therefore show a wrong value at the next rollover. | closed | Retested 2026-10-01 after a CI Server restart (first unit 18:05:46). (a) Sample dated one day earlier (95), live value 112, forced rollover: initial value 112 — correct. (b) Sample dated 18:00 (96, a few minutes before the first unit), live value 113, forced rollover: initial value **96** — wrong again; the live item value stayed 113. So a dropped sample dated shortly before the first unit (same day) becomes the next unit's initial value; a much older one did not. Also found: a forced rollover within 2 minutes of the previous one is refused (`DSI-E-ROLLDONE`). Documented as a caution; behaviour confirmed, ready to close. Closed 2026-10-01 (confirmed by user). | `.claude/skills/system-management/tasks/load-history.md`; `knowledge/manuals/IM36K10C40-01EN.md` §3 |
|
||||||
| ISS-039 | 2026-10-01 | HISTORY (setup) | Installed vs manuals: `hisdbg` menu runs to option 22 (manual text: `-1 - 10`, list to 22) and lists history types 4 (`STATION_STAT`) and 36 (`SYS_LOG`) not in IM 36K10L20 §3.1; `ithsag.sup` keyword `run_interval` (manual: *Heartbeat*) and `queue_size` 500 KB (manual default 200); the option-type table in IM 36K10L20 §3.1 is garbled in the PDF (observed: Scan/Time `1 1`, Event/Item `2 2`, Aggregation `4 4`). | closed | Installed software is the reference (standing user decision). Close when the user confirms. Closed 2026-10-01 (confirmed by user). | `knowledge/manuals/IM36K10L20-01EN.md` §3; `knowledge/manuals/IM36K10C40-01EN.md` §2 |
|
| ISS-039 | 2026-10-01 | HISTORY (setup) | Installed vs manuals: `hisdbg` menu runs to option 22 (manual text: `-1 - 10`, list to 22) and lists history types 4 (`STATION_STAT`) and 36 (`SYS_LOG`) not in IM 36K10L20 §3.1; `ithsag.sup` keyword `run_interval` (manual: *Heartbeat*) and `queue_size` 500 KB (manual default 200); the option-type table in IM 36K10L20 §3.1 is garbled in the PDF (observed: Scan/Time `1 1`, Event/Item `2 2`, Aggregation `4 4`). | closed | Installed software is the reference (standing user decision). Close when the user confirms. Closed 2026-10-01 (confirmed by user). | `knowledge/manuals/IM36K10L20-01EN.md` §3; `knowledge/manuals/IM36K10C40-01EN.md` §2 |
|
||||||
|
|
@ -117,8 +117,8 @@ development system (see "Test system" in `progress.md`); they do not exist on ot
|
||||||
| ISS-095 | 2026-10-08 | GRAPHICS (HTML display login, corrects ISS-074) | IM 36K10R30 §4.4 Table 4.4-1 marks the profile *Layout* as supported on the HTML display in both R1.03 and R1.05; a table-aware extraction shows it clearly. ISS-074's "layout not" came from a garbled text extraction: manual and software agree. | closed | ISS-074 closed by this. Close when the user confirms. | `knowledge/manuals/IM36K10R30-01EN.md` (done); `.claude/skills/graphics/tasks/layouts.md` (done) |
|
| ISS-095 | 2026-10-08 | GRAPHICS (HTML display login, corrects ISS-074) | IM 36K10R30 §4.4 Table 4.4-1 marks the profile *Layout* as supported on the HTML display in both R1.03 and R1.05; a table-aware extraction shows it clearly. ISS-074's "layout not" came from a garbled text extraction: manual and software agree. | closed | ISS-074 closed by this. Close when the user confirms. | `knowledge/manuals/IM36K10R30-01EN.md` (done); `.claude/skills/graphics/tasks/layouts.md` (done) |
|
||||||
| ISS-096 | 2026-10-08 | GRAPHICS (web trend 50 pens, R1.05) | Not known whether the R1.05 web client still draws a trend only with 50 visible pens (ISS-041). | open | Check `PEN_COUNT_LIMIT` in the R1.05 mobileoperator chart code (V5) or test on a non-shared system. Workaround kept. | `.claude/skills/graphics/tasks/trend.md` (done) |
|
| ISS-096 | 2026-10-08 | GRAPHICS (web trend 50 pens, R1.05) | Not known whether the R1.05 web client still draws a trend only with 50 visible pens (ISS-041). | open | Check `PEN_COUNT_LIMIT` in the R1.05 mobileoperator chart code (V5) or test on a non-shared system. Workaround kept. | `.claude/skills/graphics/tasks/trend.md` (done) |
|
||||||
| ISS-097 | 2026-10-08 | GRAPHICS (AOG demo displays) | IM 36K10C60 R1.04 §1.2.2 names `AOG_UAC_Method_Demo`, `AOG_UAC_MethodArg_Call2`, `AOG_OPCUA_Methods`; the R1.03 machine has `AOG_UAC_Method_Demo`, `AOG_UAC_MethodArg_Call`, `AOG_UAC_Method_Call`. R1.05 names not listed yet (the data-access re-check saw `AOG_UAC_Method_Demo`, `…_Call`, `…_MethodArg_Call(2)`). | open | Part of V5. | `knowledge/manuals/IM36K10C60-01EN.md` (done) |
|
| ISS-097 | 2026-10-08 | GRAPHICS (AOG demo displays) | IM 36K10C60 R1.04 §1.2.2 names `AOG_UAC_Method_Demo`, `AOG_UAC_MethodArg_Call2`, `AOG_OPCUA_Methods`; the R1.03 machine has `AOG_UAC_Method_Demo`, `AOG_UAC_MethodArg_Call`, `AOG_UAC_Method_Call`. R1.05 names not listed yet (the data-access re-check saw `AOG_UAC_Method_Demo`, `…_Call`, `…_MethodArg_Call(2)`). | open | Part of V5. | `knowledge/manuals/IM36K10C60-01EN.md` (done) |
|
||||||
| ISS-098 | 2026-10-08 | GRAPHICS (Generic Functions) | IM 36K10C50: *Calculation/Function* renamed *Generic Functions*; new operations Password Check (R1.04; needs login method *Manual CI Server* / *Manual OS* for the Password Check function in `dssana.sup`) and RDP Connect (R1.05, `tls\com\connectrdp.cmd`). | open | Not tested (Edit Module and an RDP target needed). Cross-reference in skill `authorization` to be added in its re-check. | `.claude/skills/graphics/tasks/create-display.md` (done); `knowledge/manuals/IM36K10C50-01EN.md` (done); `.claude/skills/authorization` (open) |
|
| ISS-098 | 2026-10-08 | GRAPHICS (Generic Functions) | IM 36K10C50: *Calculation/Function* renamed *Generic Functions*; new operations Password Check (R1.04; needs login method *Manual CI Server* / *Manual OS* for the Password Check function in `dssana.sup`) and RDP Connect (R1.05, `tls\com\connectrdp.cmd`). | open | 2026-10-09: authorization part done (ISS-148: login lines and allowed methods documented in `login-methods.md`). Not tested (Edit Module and an RDP target needed). Cross-reference in skill `authorization` to be added in its re-check. | `.claude/skills/graphics/tasks/create-display.md` (done); `knowledge/manuals/IM36K10C50-01EN.md` (done); `.claude/skills/authorization` (open) |
|
||||||
| ISS-099 | 2026-10-08 | GRAPHICS / AUDIT (custom alarm acknowledgement) | IM 36K10C50 R1.04/R1.05 §2.22, §4.12: custom and external acknowledgement properties; reason and approver are written to `AUDIT_TRAIL` fields `APPROVAL_REASON` / `APPROVER`. | open | Not tested. Skill `audit-trail` to mention the fields in its re-check. | `.claude/skills/graphics/tasks/create-display.md` (done); `.claude/skills/audit-trail` (open) |
|
| ISS-099 | 2026-10-08 | GRAPHICS / AUDIT (custom alarm acknowledgement) | IM 36K10C50 R1.04/R1.05 §2.22, §4.12: custom and external acknowledgement properties; reason and approver are written to `AUDIT_TRAIL` fields `APPROVAL_REASON` / `APPROVER`. | open | 2026-10-09: audit part done (ISS-140), alarm task §4.1 added; behaviour still not tested. Not tested. Skill `audit-trail` to mention the fields in its re-check. | `.claude/skills/graphics/tasks/create-display.md` (done); `.claude/skills/audit-trail` (open) |
|
||||||
| ISS-100 | 2026-10-08 | HISTORY (start scripts) | On the R1.05 test server `history_start.cmd`, `history_stop.cmd`, `item_start.cmd`, `item_stop.cmd` differ from R1.03 (hash comparison). Content not read (remote read refused for this check); probably the extension-script hooks of ISS-121. The L20/L35 summaries still describe the R1.03 start lists. | open | Awaiting user verification (V6). | `knowledge/manuals/IM36K10L20-01EN.md` §1, `IM36K10L35-01EN.md` §1; `.claude/skills/history-management/SKILL.md` |
|
| ISS-100 | 2026-10-08 | HISTORY (start scripts) | On the R1.05 test server `history_start.cmd`, `history_stop.cmd`, `item_start.cmd`, `item_stop.cmd` differ from R1.03 (hash comparison). Content not read (remote read refused for this check); probably the extension-script hooks of ISS-121. The L20/L35 summaries still describe the R1.03 start lists. | open | Awaiting user verification (V6). | `knowledge/manuals/IM36K10L20-01EN.md` §1, `IM36K10L35-01EN.md` §1; `.claude/skills/history-management/SKILL.md` |
|
||||||
| ISS-101 | 2026-10-08 | HISTORY (`hisdbg`) | `hisdbg` read-only options (1, 20, 6) not run on the R1.05 test server (remote commands refused). | open | Awaiting user verification (V6). | `.claude/skills/history-management/tasks/history-checks.md` |
|
| ISS-101 | 2026-10-08 | HISTORY (`hisdbg`) | `hisdbg` read-only options (1, 20, 6) not run on the R1.05 test server (remote commands refused). | open | Awaiting user verification (V6). | `.claude/skills/history-management/tasks/history-checks.md` |
|
||||||
| ISS-102 | 2026-10-08 | HISTORY (dataset definitions) | `his_group_df`, `item_his_df`, `item_his2_df`, `item_history`, `his_units` definitions are identical in R1.03 and R1.05; only the DSS interface source `dsid_ihis_df.c` changed. No effect on quick-load fields expected. | closed | Information. | `.claude/skills/history-management/SKILL.md` (done) |
|
| ISS-102 | 2026-10-08 | HISTORY (dataset definitions) | `his_group_df`, `item_his_df`, `item_his2_df`, `item_history`, `his_units` definitions are identical in R1.03 and R1.05; only the DSS interface source `dsid_ihis_df.c` changed. No effect on quick-load fields expected. | closed | Information. | `.claude/skills/history-management/SKILL.md` (done) |
|
||||||
|
|
@ -134,12 +134,48 @@ development system (see "Test system" in `progress.md`); they do not exist on ot
|
||||||
| ISS-118 | 2026-10-08 | DATABASE (`dss_export.qli`, API keys) | The installed `dss_export.qli` (same in R1.03 and R1.05) does not cover the IEC 61850, MQTT, OPC UA client method/tag, `UASERVER_MAPPER_DF` or `API_KEYS_DF` datasets. R1.05 `dssqld.sup` excludes `API_KEYS_DF` from full exports (`-d API_KEYS_DF` still exports it). For backup/migration export the missing datasets explicitly and create new API keys on the target. | closed | Workaround documented. Close when the user confirms. | `.claude/skills/system-management/tasks/export-dataset.md`, `knowledge/manuals/IM36K10J10-01EN.md`, `IM36K10L50-01EN.md` (done) |
|
| ISS-118 | 2026-10-08 | DATABASE (`dss_export.qli`, API keys) | The installed `dss_export.qli` (same in R1.03 and R1.05) does not cover the IEC 61850, MQTT, OPC UA client method/tag, `UASERVER_MAPPER_DF` or `API_KEYS_DF` datasets. R1.05 `dssqld.sup` excludes `API_KEYS_DF` from full exports (`-d API_KEYS_DF` still exports it). For backup/migration export the missing datasets explicitly and create new API keys on the target. | closed | Workaround documented. Close when the user confirms. | `.claude/skills/system-management/tasks/export-dataset.md`, `knowledge/manuals/IM36K10J10-01EN.md`, `IM36K10L50-01EN.md` (done) |
|
||||||
| ISS-119 | 2026-10-08 | DATABASE (`dss_*.tmp`, corrects ISS-091) | Not every `dssqld` run leaves a `dss_*.tmp`: exports of LOCAL_NODE_DF, STATUS_DF, ITEM_DF, CLASS_DF, REPORT_DF, API_KEYS_DF, a filtered export and `-f` left none; exporting OBJECT_DF left 28 empty files for 29 objects (a second export none); loading classes left their source in one. Which load/remove steps create them was not checked. | open | Clean up after tests with `clean_dss_tmp.ps1`. | `.claude/skills/system-management/tasks/export-dataset.md`, `load-remove-records.md` (done); ISS-091 (done) |
|
| ISS-119 | 2026-10-08 | DATABASE (`dss_*.tmp`, corrects ISS-091) | Not every `dssqld` run leaves a `dss_*.tmp`: exports of LOCAL_NODE_DF, STATUS_DF, ITEM_DF, CLASS_DF, REPORT_DF, API_KEYS_DF, a filtered export and `-f` left none; exporting OBJECT_DF left 28 empty files for 29 objects (a second export none); loading classes left their source in one. Which load/remove steps create them was not checked. | open | Clean up after tests with `clean_dss_tmp.ps1`. | `.claude/skills/system-management/tasks/export-dataset.md`, `load-remove-records.md` (done); ISS-091 (done) |
|
||||||
| ISS-120 | 2026-10-08 | BUS (`durwfp` exit code) | IM 36K10L30 §10 (reworded in R1.04) says the return value is 1 when the process is attached, 0 otherwise. The exit code a script sees is the opposite: 0 = attached, 1 = not (R1.03 and R1.05). | closed | Documented: test the exit code. Close when the user confirms. | `.claude/skills/system-management/tasks/bus-utilities.md`, `knowledge/manuals/IM36K10L30-01EN.md` (done) |
|
| ISS-120 | 2026-10-08 | BUS (`durwfp` exit code) | IM 36K10L30 §10 (reworded in R1.04) says the return value is 1 when the process is attached, 0 otherwise. The exit code a script sees is the opposite: 0 = attached, 1 = not (R1.03 and R1.05). | closed | Documented: test the exit code. Close when the user confirms. | `.claude/skills/system-management/tasks/bus-utilities.md`, `knowledge/manuals/IM36K10L30-01EN.md` (done) |
|
||||||
| ISS-121 | 2026-10-08 | BUS / INTEGRATION (start-script hooks) | On R1.05 every service start/stop script in `tls\com` (also `ci_start`/`ci_stop`, `ci_clean_up`, `hacw_activate`/`hacw_deactivate`) calls `?*_<script name>.cmd` extension scripts, a clean way to start custom or monitoring processes without editing installed scripts. Not in J10 or L30. | open | Awaiting user verification (needs admin and a restart; V8). | `.claude/skills/system-management/tasks/monitoring-processes.md`, `knowledge/manuals/IM36K10J10-01EN.md`, `IM36K10L30-01EN.md`, `IM36K10L50-01EN.md` (done) |
|
| ISS-121 | 2026-10-08 | BUS / INTEGRATION (start-script hooks) | On R1.05 every service start/stop script in `tls\com` (also `ci_start`/`ci_stop`, `ci_clean_up`, `hacw_activate`/`hacw_deactivate`) calls `?*_<script name>.cmd` extension scripts, a clean way to start custom or monitoring processes without editing installed scripts. Not in J10 or L30. | open | 2026-10-09: same hooks in alarm, audit, process, report and HAC scripts (ISS-142, 156, 160). Awaiting user verification (needs admin and a restart; V8). | `.claude/skills/alarm-management`, `audit-trail`, `class-object-engineering`, `reporting/tasks/report-checks.md`, `high-availability`, R40 summary (done); `.claude/skills/system-management/tasks/monitoring-processes.md`, `knowledge/manuals/IM36K10J10-01EN.md`, `IM36K10L30-01EN.md`, `IM36K10L50-01EN.md` (done) |
|
||||||
| ISS-122 | 2026-10-08 | BUS / SYSTEM MONITOR (installed setup) | R1.05 `dur.sup` adds the adaptive queue set `ADTSTO, 1.00` (`OPCEXE` still without wildcard, ISS-026). `smdmon_config.csv` adds `netstat -anob` and web snapshots and logs umhlog with `l40` (`umhlog.old` about 40 MB). `smd_snapshotlow.cmd` uses PowerShell instead of `wmic`. | closed | Verified read-only. Close when the user confirms. | `.claude/skills/system-management/tasks/bus-utilities.md`, `tuning-checks.md`, `knowledge/manuals/IM36K10L30-01EN.md` (done) |
|
| ISS-122 | 2026-10-08 | BUS / SYSTEM MONITOR (installed setup) | R1.05 `dur.sup` adds the adaptive queue set `ADTSTO, 1.00` (`OPCEXE` still without wildcard, ISS-026). `smdmon_config.csv` adds `netstat -anob` and web snapshots and logs umhlog with `l40` (`umhlog.old` about 40 MB). `smd_snapshotlow.cmd` uses PowerShell instead of `wmic`. | closed | Verified read-only. Close when the user confirms. | `.claude/skills/system-management/tasks/bus-utilities.md`, `tuning-checks.md`, `knowledge/manuals/IM36K10L30-01EN.md` (done) |
|
||||||
| ISS-123 | 2026-10-08 | DATABASE (`dssqld` long path, R1.05) | Addition to ISS-020: on R1.05 `dssqld -e` with an output path of 83+ characters gave no error and wrote the file under a shortened name (cut after 79 characters, then `.qli`). | closed | Same limit as R1.03. Close when the user confirms. | `.claude/skills/system-management/tasks/export-dataset.md` (done) |
|
| ISS-123 | 2026-10-08 | DATABASE (`dssqld` long path, R1.05) | Addition to ISS-020: on R1.05 `dssqld -e` with an output path of 83+ characters gave no error and wrote the file under a shortened name (cut after 79 characters, then `.qli`). | closed | Same limit as R1.03. Close when the user confirms. | `.claude/skills/system-management/tasks/export-dataset.md` (done) |
|
||||||
| ISS-124 | 2026-10-08 | ITEM (string length) | IM 36K10C10 §3.3.4 and IM 36K10G10 §3.2.2 (changed in R1.04, not in the revision tables) give string item length default 80, maximum 200 bytes, matching the software (`ITEM_DF.STRING_LENGTH` 1–200, default 80). Settles the manual side of ISS-019. | closed | String writes not re-tested on R1.05 (ISS-129). Close when the user confirms. | `.claude/skills/item-engineering/tasks/string-items.md`, `SKILL.md`; C10, G10 summaries (done) |
|
| ISS-124 | 2026-10-08 | ITEM (string length) | IM 36K10C10 §3.3.4 and IM 36K10G10 §3.2.2 (changed in R1.04, not in the revision tables) give string item length default 80, maximum 200 bytes, matching the software (`ITEM_DF.STRING_LENGTH` 1–200, default 80). Settles the manual side of ISS-019. | closed | String writes not re-tested on R1.05 (ISS-129). Close when the user confirms. | `.claude/skills/item-engineering/tasks/string-items.md`, `SKILL.md`; C10, G10 summaries (done) |
|
||||||
| ISS-125 | 2026-10-08 | AUTH (`dssana.sup` no-login profile) | IM 36K10C10 §2.2 (R1.05) now names the no-login profile `CI_NO_LOGIN` (fixes the manual half of ISS-018). Still different: the manual says no profile is applied when that user is missing; the R1.05 `dssana.sup` help still says full authorization is used. | closed | Installed software stays the reference. Close when the user confirms. | `knowledge/manuals/IM36K10C10-01EN.md` (done) |
|
| ISS-125 | 2026-10-08 | AUTH (`dssana.sup` no-login profile) | IM 36K10C10 §2.2 (R1.05) now names the no-login profile `CI_NO_LOGIN` (fixes the manual half of ISS-018). Still different: the manual says no profile is applied when that user is missing; the R1.05 `dssana.sup` help still says full authorization is used. | closed | Installed software stays the reference. Close when the user confirms. | `knowledge/manuals/IM36K10C10-01EN.md` (done) |
|
||||||
| ISS-126 | 2026-10-08 | ITEM (`ITEM_VAL` fields) | R1.05 `ITEM_VAL` has three new fields: `ENG_UNIT`, `SCALE_HIGH_LIMIT`, `SCALE_LOW_LIMIT`, not in any manual. Values not read yet (probably the item's units and scale limits). | open | Next: export `ITEM_VAL` of a test item read-only and compare with `ITEM_DF`. Relevant to RQL (`reporting`). | `.claude/skills/item-engineering/SKILL.md`, C10 summary, `.claude/skills/system-management/tasks/read-write-item.md` (done); `.claude/skills/reporting` (open) |
|
| ISS-126 | 2026-10-08 | ITEM (`ITEM_VAL` fields) | R1.05 `ITEM_VAL` has three new fields: `ENG_UNIT`, `SCALE_HIGH_LIMIT`, `SCALE_LOW_LIMIT`, not in any manual. Values not read yet (probably the item's units and scale limits). | open | 2026-10-09: readable in RQL on R1.05; ENG_UNIT matches ITEM_DF for the item checked; scale limits unclear (ISS-167). Next: export `ITEM_VAL` of a test item read-only and compare with `ITEM_DF`. Relevant to RQL (`reporting`). | `.claude/skills/item-engineering/SKILL.md`, C10 summary, `.claude/skills/system-management/tasks/read-write-item.md` (done); `.claude/skills/reporting` (open) |
|
||||||
| ISS-127 | 2026-10-08 | TUTORIAL (CENTUM VP, HIS-TSE) | IM 36K10G10 ch. 14 (virtual test with the CENTUM VP FCS simulator, `tls\vagw\…\Controlbusemulation.exe`) and ch. 15 (HIS-TSE connection through RDP Connect, `.rdp` code signing, RD gateway) are new in R1.04/R1.05. | open | Not tested: no `tls\vagw`, no CENTUM VP or HIS-TSE on the R1.05 test server. | `knowledge/manuals/IM36K10G10-01EN.md`, `.claude/skills/item-engineering/SKILL.md` (done) |
|
| ISS-127 | 2026-10-08 | TUTORIAL (CENTUM VP, HIS-TSE) | IM 36K10G10 ch. 14 (virtual test with the CENTUM VP FCS simulator, `tls\vagw\…\Controlbusemulation.exe`) and ch. 15 (HIS-TSE connection through RDP Connect, `.rdp` code signing, RD gateway) are new in R1.04/R1.05. | open | Not tested: no `tls\vagw`, no CENTUM VP or HIS-TSE on the R1.05 test server. | `knowledge/manuals/IM36K10G10-01EN.md`, `.claude/skills/item-engineering/SKILL.md` (done) |
|
||||||
| ISS-128 | 2026-10-08 | ENGINEERING MODULE (Tools menu) | IM 36K10C10 §1.1 has a new *Tools* menu with *OPC UA Information Model Mapper*; not in the revision table. Same mapper as in skill `data-access`. | closed | Confirmed in the installed menu definition (V3). Close when the user confirms. | `knowledge/manuals/IM36K10C10-01EN.md` (done) |
|
| ISS-128 | 2026-10-08 | ENGINEERING MODULE (Tools menu) | IM 36K10C10 §1.1 has a new *Tools* menu with *OPC UA Information Model Mapper*; not in the revision table. Same mapper as in skill `data-access`. | closed | Confirmed in the installed menu definition (V3). Close when the user confirms. | `knowledge/manuals/IM36K10C10-01EN.md` (done) |
|
||||||
| ISS-129 | 2026-10-08 | ITEM (blocking, string writes on R1.05) | Blocking/unblocking (`ITEM_DF.BLOCKED`, `itmval -p` with and without `-o`) and string-item writes/truncation not re-tested on R1.05; definitions identical to R1.03. | open | Awaits the user's decision to test on the shared server with temporary sample items (V9). | `.claude/skills/item-engineering/tasks/block-item.md`, `string-items.md` (done) |
|
| ISS-129 | 2026-10-08 | ITEM (blocking, string writes on R1.05) | Blocking/unblocking (`ITEM_DF.BLOCKED`, `itmval -p` with and without `-o`) and string-item writes/truncation not re-tested on R1.05; definitions identical to R1.03. | open | Awaits the user's decision to test on the shared server with temporary sample items (V9). | `.claude/skills/item-engineering/tasks/block-item.md`, `string-items.md` (done) |
|
||||||
|
| ISS-132 | 2026-10-09 | ALARM (ASPA manual) | IM 36K10E30 4th ed. §3.2 KPI grid (R1.04): the count charts are labelled *In Time*, *Too Late*, *Not Ackn*, *Nuisance*, and the third chart is corrected to alarms **not** acknowledged within the analysed period (R1.03 said acknowledged). Not in the revision table. | closed | From docs; ASPA GUI not opened. Close when the user confirms. | `knowledge/manuals/IM36K10E30-01EN.md` (done); `knowledge/version-differences.md` (done) |
|
||||||
|
| ISS-133 | 2026-10-09 | ALARM (`ALARM_ATTRIBUTE_TEMP_DF`) | New in R1.05: same fields as `ALARM_ATTRIBUTE_DF`, described in its header as a temporary store for item-specific alarm attributes; no data file, no index; 0 records on the R1.05 test server; used by the RESTful API server. No manual mentions it. | closed | Treat as internal: do not load, export or back it up. Close when the user confirms. | `.claude/skills/alarm-management/tasks/alarm-checks.md`, `knowledge/manuals/IM36K10L15-01EN.md` (done) |
|
||||||
|
| ISS-134 | 2026-10-09 | ALARM (`alnsms.sup` defaults) | R1.05 `alnsms.sup`/`.tpl` add format units `SECTION` and `NAME` and change the active defaults (`BODY_FORMAT` with `SECTION,120`; `ALARM_PREFIX = PRIO`, R1.03 `<ALARM>`). The help still describes `ALARM_PREFIX` as a plain string, so the prefix may be the literal text "PRIO". Not in IM 36K10L15. | open | Not tested (`alnsms` not started; no GSM modem). | `knowledge/manuals/IM36K10L15-01EN.md`, `.claude/skills/alarm-management/tasks/alarm-checks.md` (done) |
|
||||||
|
| ISS-135 | 2026-10-09 | ALARM (ALH lifetime default) | The fresh R1.05 install has storage group `ALH` with rollover 1 day and lifetime 52 weeks, as on the R1.03 system: 52 weeks is the installed default. IM 36K10C20 §A7 (4th ed.) still says 2 days. Settles ISS-036. | closed | Installed software is the reference. Close when the user confirms. | `knowledge/manuals/IM36K10C20-01EN.md`, `IM36K10L15-01EN.md`, `.claude/skills/alarm-management/tasks/alarm-checks.md` (done) |
|
||||||
|
| ISS-136 | 2026-10-09 | ALARM (ALH load on a shared server) | On the shared R1.05 test server an alarm overview filtered by an ASA on `SECTION` or `UNIT` kept `ALH` at a full CPU core and made every client's alarm lists time out (earlier work, not reproduced on purpose). Heavy `ALARM_CHRONO` reads load the same process. Not in any manual. | open | Rule in the skill: filter overviews by item name or AOI; read `ALARM_CHRONO` only with an item filter and a time range. Cause unknown. | `.claude/skills/alarm-management/SKILL.md`, tasks; `knowledge/manuals/IM36K10C20-01EN.md`, `IM36K10L15-01EN.md` (done) |
|
||||||
|
| ISS-140 | 2026-10-09 | AUDIT (approval fields) | R1.05 `AUDIT_TRAIL` has fields `APPROVAL_REASON` (256) and `APPROVER` (128), select only; `adtsys.sup` adds E_LAYOUT units `APPRR` / `APPR`. IM 36K10L25 mentions neither (IM 36K10C50 §2.22/§4.12 does). Records with both fields filled exist on the R1.05 test server (item value writes from the Operator Interface). | open | Not tested: acknowledgement with reason/approver, ADTLOG with the new units, selection expressions on them. Answers the audit part of ISS-099. | `.claude/skills/audit-trail/**`, `knowledge/manuals/IM36K10L25-01EN.md` (done) |
|
||||||
|
| ISS-141 | 2026-10-09 | AUDIT (classifiers) | R1.05 has 499 event classifiers (R1.03: 463), 478 stored. New: action `PENDING` on item value/status for several sources; sources `REST-SERVER`, `PYTOOLS`, `PASSWORD-CHECK` for login/logout and dataset changes, and item value/status/quality writes via REST and pyTOOLS. Not in IM 36K10L25 App. 1. | open | Verified by read-only export; `REST-SERVER` records seen in the trail; PYTOOLS, PASSWORD-CHECK and PENDING not seen or tested. | `.claude/skills/audit-trail/tasks/*`, `knowledge/manuals/IM36K10L25-01EN.md` (done) |
|
||||||
|
| ISS-142 | 2026-10-09 | AUDIT (start scripts) | R1.05 `audit_start.cmd` / `audit_stop.cmd` call `?*_audit_start.cmd` / `?*_audit_stop.cmd` (same hook as ISS-121); the skill now recommends `<prefix>_audit_start.cmd` for a permanent ADTLOG. Not in IM 36K10L25. | open | Not tested (needs admin and a restart). | `.claude/skills/audit-trail/tasks/audit-checks.md`, `configure-audit.md`, L25 summary (done) |
|
||||||
|
| ISS-146 | 2026-10-09 | AUTH (authorization actions) | R1.05 has 203 authorization actions (R1.03: 200): new `UA_MAPPER_PROJECT_INSERT/MODIFY/DELETE` (no `_READ`). No actions for API keys, the RESTful API or pyTOOLS: those sessions have the rights of the user who logs on. IM 36K10C10 §2.4 lists none of this. | closed | Verified by read-only export. Close when the user confirms. | `.claude/skills/authorization/**` (done); `knowledge/manuals/IM36K10C10-01EN.md` §2 (done) |
|
||||||
|
| ISS-147 | 2026-10-09 | AUTH (250 actions, upgrade tool) | `AUTH_GROUP_DF` has `ACTION_NAME_1…250` (R1.03: 200). `dss_ath_grp_u0104` is a database upgrade tool that `database_start.cmd` runs once when `database.new` exists (R1.05 runs only the `_u0104`/`_u0105` tools and keeps `database.new` if one fails). A group with more than 200 actions cannot go back to R1.03. | closed | Upgrade not tested. Close when the user confirms. | `.claude/skills/authorization/**` (done); `knowledge/version-differences.md` (done) |
|
||||||
|
| ISS-148 | 2026-10-09 | AUTH (`dssana.sup` user interfaces) | R1.05 `dssana.sup` adds user interfaces *RESTful API Server* (`JRSTSRV`), *Python Interface* (`PYDSS`) and *Password Check Function* (`JWUIPSWD`), each with *Manual CI Server* login lines for local and remote; the .NET line `"dnetapi"` is renamed `"Application Interface"`. J10 §2.9.1 and C50 §2.31 give the allowed methods; C10 §2.2 and L50 do not list the interfaces. | closed | Verified read-only. Settles the authorization part of ISS-098. Close when the user confirms. | `.claude/skills/authorization/tasks/login-methods.md`, J40 summary (done) |
|
||||||
|
| ISS-149 | 2026-10-09 | AUTH (`dssana.sup` after upgrade) | A `dssana.sup` carried over from R1.03 lacks the three new user-interface lines (and has the stale `dnetapi` line); without them REST, pyTOOLS and Password Check cannot log on. Unknown whether the automatic merge adds them. | open | Not tested (no upgrade). After an upgrade compare with a clean R1.05 file. | `.claude/skills/authorization/tasks/login-methods.md` (done) |
|
||||||
|
| ISS-150 | 2026-10-09 | AUTH (`MAX_UI_PER_CLIENT`) | On the R1.05 test server the active `MAX_UI_PER_CLIENT` differs from the factory value 5 in the help and default block; probably a local change. | open | Awaiting user verification (V16). The repo states only the default. | `.claude/skills/authorization/tasks/login-methods.md` (done) |
|
||||||
|
| ISS-151 | 2026-10-09 | AUTH (API keys) | `API_KEYS_DF` (R1.04+): `NAME` = `<USER>:<KEY NAME>`, `USER_NAME`, `API_KEY_NAME`, `DESCRIPTION`, `API_TYPE`. The key value is not stored in the dataset, so keys cannot be exported or quick-loaded. One key per user; requesting it again gives the same key (IM 36K10L45 §4.2.2), so re-requesting does not replace a leaked key. No dedicated authorization action. | open | GUI and key rotation not tested (API keys must not be handled on the shared server). | `.claude/skills/authorization/tasks/users-groups.md`, `SKILL.md` (done) |
|
||||||
|
| ISS-152 | 2026-10-09 | AUTH (ISS-072/073 on R1.05) | ISS-072 and ISS-073 not re-tested on R1.05 (no user/group changes on the shared server; ISS-073 stops a process). `USER_DF`/`USER_VAL` identical to R1.03, but the DSS process layout changed (ISS-117). | open | Treat both as still valid; re-test on a separate R1.05 system. | `.claude/skills/authorization/tasks/users-groups.md` (done) |
|
||||||
|
| ISS-153 | 2026-10-09 | AD/SSO (R1.05 files) | IM 36K10J40 4th ed.: contact information only. AD/SSO keywords, `USER_DF` and `auth\WEB-INF` files identical to R1.03, except `web.xml.tpl` drops the Servlet 2.3 DOCTYPE. | closed | AD and SPNEGO not tested (no domain). Close when the user confirms. | `knowledge/manuals/IM36K10J40-01EN.md`, `.claude/skills/authorization/tasks/active-directory.md` (done) |
|
||||||
|
| ISS-154 | 2026-10-09 | PROCESS (Java `createSection`) | The installed API (R1.03 and R1.05) has `createSection(path, description, blocked, opcVisible)` with 4 arguments. IM 36K10P11 §8 examples (both editions) pass 5 (an extra process-area string); the R1.05 §10.2 text was corrected (unlisted change), the examples were not. | open | API verified with `javap`; a 5-argument call not compile-tested. | `knowledge/manuals/IM36K10P11-01EN.md`, `.claude/skills/class-object-engineering/tasks/java-class.md` (done); `knowledge/version-differences.md` (done) |
|
||||||
|
| ISS-155 | 2026-10-09 | PROCESS (OPC UA method system classes) | R1.05 installs Java classes `UAC_MTD_JBASE` and `UAS_MTD_JBASE` next to `AOG_BASE`, `AOG_JBASE`, `PRC_STATUS_BASE`. `UAC_MTD_JBASE` prompts for the method key as `Station:Method` and for argument lists `/type/description`; data-access `opcua-client.md` §7 says to set `MTD_KEY` to the method name. | open | Check which `MTD_KEY` form the client needs when §7 is practiced. | class-object skill, L10, P11 summaries (done); `.claude/skills/data-access/tasks/opcua-client.md` §7, `knowledge/manuals/IM36K10L45-01EN.md` (open) |
|
||||||
|
| ISS-156 | 2026-10-09 | PROCESS (installed files R1.05) | Java runtime 11.0.18 → 11.0.28; `jopcsrv.jar` rebuilt with the same classes and public `fasttools.processfast` API; Java process start scripts add `tls\exe\lib\*`; `process_start/stop.cmd` call `?*_process_start/stop.cmd` (ISS-121). `opc.sup`, `prc.sup`, PROCESS dataset definitions and templates identical. | closed | Verified read-only. Close when the user confirms. | L10, P11 summaries, class-object skill (done) |
|
||||||
|
| ISS-157 | 2026-10-09 | PROCESS (`opcdbg` Java executor) | On R1.05 `opcdbg 0 4` with piped answers for `OPCJEXE` gave no output within 40 s (stopped); `OPCEXE1` and the database check worked as on R1.03. | open | Awaiting user verification: run interactively (V14). | `.claude/skills/class-object-engineering/tasks/opcdbg-checks.md`, L10 summary (done) |
|
||||||
|
| ISS-158 | 2026-10-09 | PROCESS (change / reset class on R1.05) | Change class, reset class, extended reset, ISS-028/029, the refused object, PRINT `%%` and runtime attribute change not re-tested on R1.05 (needs the sample loaded again on the shared server). | open | Awaiting decision (V15). Definitions and manuals unchanged. | `.claude/skills/class-object-engineering/tasks/change-reset-class.md` (done) |
|
||||||
|
| ISS-159 | 2026-10-09 | PROCESS (Java API not in P11) | Installed `ProcessClass` public methods not in IM 36K10P11: `getHistory(...)` (5 overloads), `defineIntegerAttributeForPrompt` / `defineDoubleAttributeForPrompt`, `sendAndReceiveMessage(...)`, `getDssSession()` (release notes only). Same on R1.03 and R1.05. | open | Untested; documented as "test before relying on them". | P11 summary, `.claude/skills/class-object-engineering/tasks/java-class.md` (done) |
|
||||||
|
| ISS-160 | 2026-10-09 | HAC (extension hooks) | R1.05 `hacw_activate.cmd` calls `?*_hacw_activate.cmd` after all services start (before HAC status items and ACTIVE); `hacw_deactivate.cmd` calls `?*_hacw_deactivate.cmd` before DURM and services stop. `hacw_standby`/`hacw_stop` have no hook, so on a HAC server (`ci_start`/`ci_stop` replaced by these) `?*_ci_start`/`?*_ci_stop` hooks do not run. Not in J20. | open | Not tested (needs a licensed redundant pair). Part of ISS-121. | `.claude/skills/high-availability/**`, `knowledge/manuals/IM36K10J20-01EN.md` (done) |
|
||||||
|
| ISS-161 | 2026-10-09 | HAC (installed files R1.05) | `hacw_hmi.cmd` adds `tls\exe\lib\*` to the class path; HAC executables, `isfjrn`, `ismflush`, `jhacsrv.jar` rebuilt (same names). `hac.sup`, `hac_ees.sup`, `haccache.sup`, templates and the other HAC scripts identical to R1.03; ISS-053 still applies. | closed | Information. Close when the user confirms. | `knowledge/manuals/IM36K10J20-01EN.md`, `.claude/skills/high-availability/tasks/*` (done) |
|
||||||
|
| ISS-162 | 2026-10-09 | HAC / OPC UA (release notes) | IM 36K01A50 §1.15 (R1.04): after a HAC network-card failure and switch to another card, OPC UA PubSub items stay offline until the PubSub dataset writer is uploaded again; a reconnected cable recovers by itself. | open | From docs. Not yet in the A50 summary or the `data-access` PubSub text. | `.claude/skills/high-availability/**` (done); `knowledge/manuals/IM36K01A50-01EN.md`, `.claude/skills/data-access` (open) |
|
||||||
|
| ISS-166 | 2026-10-09 | REPORT (E10 manual diff, corrects version-differences) | The E10 item-filter/wildcard text and CI Portal SSL note listed as changed in `version-differences.md` are page-layout shifts only (identical text). The only real E10 change: §3 no longer says the Connection Manager shows `localhost` first and then the last server. | closed | `version-differences.md` corrected. Close when the user confirms. | `knowledge/manuals/IM36K10E10-01EN.md`, `knowledge/version-differences.md` (done) |
|
||||||
|
| ISS-167 | 2026-10-09 | ITEM (`ITEM_VAL` scale limits) | On R1.05 RQL accepts `ITEM_VAL.ENG_UNIT`, `SCALE_HIGH_LIMIT`, `SCALE_LOW_LIMIT`. `ENG_UNIT` matched `ITEM_DF` for the item checked; for another item `ITEM_VAL.SCALE_HIGH_LIMIT` was 1 while `ITEM_DF` had 0. How `ITEM_VAL` fills the scale limits is unknown. | open | Test on a non-shared system with items with and without scale limits; until then take scale limits from `ITEM_DF`. | `.claude/skills/reporting/tasks/rql-interactive.md`, P20 summary (done); `.claude/skills/item-engineering/SKILL.md`, C10 summary (open) |
|
||||||
|
| ISS-168 | 2026-10-09 | REPORT / SECURITY (`API_KEYS_DF` via RQL/ODBC) | RQL (any report author or `rptgen` user) and ODBC can read every dataset. Whether `API_KEYS_DF` exposes anything sensitive that way is not tested (deliberately not queried on the shared server; the key value itself is not stored there, ISS-151). | open | Test on a non-shared system with a dummy key; until then the skill forbids querying it. | `.claude/skills/reporting/**`, C30, P20 summaries (done) |
|
||||||
|
| ISS-174 | 2026-10-09 | PYTOOLS (module versions) | `tls\exe\dss.pyd` already ships with R1.03 (DSSmodule 3.6, undocumented; no DSSSDAPY, no `PYDSS` routing, no *Python Interface* login line). R1.05 module 3.6.1 adds session-based logon, `PY_DSS_NOT_LOGGED_IN`, `aggr_period`. The product function exists only from R1.04. | open | File compare. Close when the user confirms. | `knowledge/manuals/IM36K10P40-01EN.md`, `.claude/skills/pytools/SKILL.md` (done) |
|
||||||
|
| ISS-175 | 2026-10-09 | PYTOOLS (manual errata) | IM 36K10P40 errors: §3.5 `readRecords` "Returns: None" (returns a list); §3.13 `getItemHistory` parameter list omits `item`; §4 `PY_DSS_FLY_TOO_LONG` (module: `FLT_TOO_LONG`); several example mistakes; examples are Python 2 era. | open | From docs and module strings. | P40 summary, `.claude/skills/pytools/tasks/*` (done) |
|
||||||
|
| ISS-176 | 2026-10-09 | PYTOOLS (undocumented functions) | The module also has `getDatasetProperties`, `busSetMode`, `busReplyError`, `umhAddComment` and more exceptions; `busGetDirs()` also returns TLS_WAP and TLS_LOG. Not in P40. | open | Not used in the skill. | P40 summary (done) |
|
||||||
|
| ISS-177 | 2026-10-09 | PYTOOLS (PYTHONPATH) | IM 36K10P40 §2 gives `PYTHONPATH = C:\Program Files (x86)\Yokogawa\CIServer\tls\exe`; use `%TLS_ROOT_PATH%\tls\exe` or `sys.path.insert` in the script (install path differs per system). | closed | Documented. Close when the user confirms. | `.claude/skills/pytools/tasks/setup-first-script.md`, P40 summary (done) |
|
||||||
|
| ISS-178 | 2026-10-09 | PYTOOLS (not tested) | No Python on the R1.05 test server, so no pyTOOLS function ran on R1.05 (incl. `dss.connect()` without logon, expected `PY_DSS_NOT_LOGGED_IN`). | open | Awaiting user verification on a test CI Core with 64-bit Python 3.12 (V17). | `.claude/skills/pytools/**` (update after the test) |
|
||||||
|
| ISS-179 | 2026-10-09 | PYTOOLS (login method) | pyTOOLS supports only *Manual CI Server* (J10 §2.9.1); the installed R1.05 *Python Interface* lines are Manual CI Server. Behaviour with another method or with the lines missing after an upgrade (ISS-149) is not documented. | open | From docs plus the installed file. | P40 summary (done); `.claude/skills/authorization/tasks/login-methods.md` (done) |
|
||||||
|
| ISS-180 | 2026-10-09 | PYTOOLS (BUS name routing) | `dss.sup` routes only `PYDSS*` clients to DSSSDAPY; a script that sets its own BUS name with `busSetName` probably falls back to the general DSSSDA00–03 routing. Not in P40. | open | Untested (no Python). | `.claude/skills/pytools/tasks/event-notification.md`, P40 summary (done) |
|
||||||
|
| ISS-181 | 2026-10-09 | PYTOOLS (event queue) | IM 36K10P40 §3.10 says the event queue size is set in the DSS setup file without naming the keyword: it is `EVENT_Q_SLOTS` in `dss.sup` (default 100, no explicit line). | open | From docs and the `dss.sup` help. | P40 summary, `.claude/skills/pytools/tasks/event-notification.md` (done) |
|
||||||
|
|
|
||||||
|
|
@ -271,4 +271,7 @@ Logged in `knowledge/issues.md`; the installed software is taken as right:
|
||||||
- ISS-019 (closed): string item maximum length is 200 in the software (R1.03 manual: 100;
|
- ISS-019 (closed): string item maximum length is 200 in the software (R1.03 manual: 100;
|
||||||
Tutorial: 168); the R1.05 manuals say 200 bytes (ISS-124).
|
Tutorial: 168); the R1.05 manuals say 200 bytes (ISS-124).
|
||||||
- Installed authorization actions include `AGGREGATION_OVERWRITE_*`, not listed in §2.4.
|
- Installed authorization actions include `AGGREGATION_OVERWRITE_*`, not listed in §2.4.
|
||||||
|
- R1.05 (verified 2026-10-09): 203 actions; new `UA_MAPPER_PROJECT_INSERT` / `_MODIFY` / `_DELETE`
|
||||||
|
(OPC UA Information Model Mapper, no `_READ`); no actions for API keys, the RESTful API or pyTOOLS
|
||||||
|
(ISS-146). `AUTH_GROUP_DF` holds up to 250 actions (R1.03: 200; ISS-147).
|
||||||
- ISS-126: R1.05 `ITEM_VAL` has `ENG_UNIT`, `SCALE_HIGH_LIMIT`, `SCALE_LOW_LIMIT`, not described.
|
- ISS-126: R1.05 `ITEM_VAL` has `ENG_UNIT`, `SCALE_HIGH_LIMIT`, `SCALE_LOW_LIMIT`, not described.
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,20 @@
|
||||||
---
|
---
|
||||||
manual: IM 36K10C20-01EN
|
manual: IM 36K10C20-01EN
|
||||||
title: Engineering Module - Alarms
|
title: Engineering Module - Alarms
|
||||||
edition: 3rd Edition, Sep. 2023
|
edition: 4th Edition, Feb. 2026 (R1.05); content unchanged since the 3rd Edition, Sep. 2023 (R1.03): full text diff 2026-10-09 found only contact information and one grammar fix in §A12
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
status: item alarm settings, acknowledgement types, areas of interest, alarm selection areas, delay/repeat verified by quick load on CI-Eng-Sample 2026-10-01; Engineering Module forms, overviews, grouping, shelving, link display, notifications and external/Vnet alarms from docs
|
status: R1.05 - dataset definitions (ITEM_DF alarm fields, ALARM_ACK_DF, ALARM_AOI_DF, ALARM_ASA_DF, ALARM_FO_DF, ALARM_FU_DF, ALARM_PRIORITY_DF, STATUS_DF) identical to R1.03, ALH storage group checked and the sample's ack type, AOI, ASA and item alarm loaded with 0 errors on the R1.05 test server (2026-10-08/09; load check only); forms and alarm behaviour not re-tested on R1.05. R1.03 - item alarm settings, acknowledgement types, areas of interest, alarm selection areas, delay/repeat verified by quick load on CI-Eng-Sample 2026-10-01; Engineering Module forms, overviews, grouping, shelving, link display, notifications and external/Vnet alarms from docs
|
||||||
---
|
---
|
||||||
|
|
||||||
# Engineering Module - Alarms (R1.03)
|
# Engineering Module - Alarms (R1.05)
|
||||||
|
|
||||||
|
**R1.05 changes**: none in substance (revision table and full text diff, 2026-10-09; §A12
|
||||||
|
only "Output" → "Outputs" in the report table, which still names `ALM_ATTS_CUR` /
|
||||||
|
`ALM_ATRS_HIS`, ISS-043). Related R1.04+ functions documented elsewhere: acknowledgement with
|
||||||
|
reason and approver from a display (C50 §2.22, §4.12, ISS-099; skill `alarm-management`,
|
||||||
|
`tasks/item-alarming.md` §4.1). External alarm dataset `EXTERNAL_ALARM_DF` unchanged (its data
|
||||||
|
access server got an internal update fix). The `ALH` lifetime of 52 weeks is the installed
|
||||||
|
default (§A7, ISS-135).
|
||||||
|
|
||||||
How alarms are set up in the Engineering Module (*Configuration > Alarming* and the item
|
How alarms are set up in the Engineering Module (*Configuration > Alarming* and the item
|
||||||
form) and what the operator sees. Part A = item-based alarms, part B = external alarms (OPC UA
|
form) and what the operator sees. Part A = item-based alarms, part B = external alarms (OPC UA
|
||||||
|
|
@ -92,7 +100,8 @@ summary §5. Acknowledge from a program or script: `dssqld -m` on `ALARM_CURRENT
|
||||||
## A7. Alarm history (§A7)
|
## A7. Alarm history (§A7)
|
||||||
|
|
||||||
Storage group `ALH` (type Alarm): rollover 1 day; the manual says lifetime 2 days by default —
|
Storage group `ALH` (type Alarm): rollover 1 day; the manual says lifetime 2 days by default —
|
||||||
**the test system shows 52 weeks** (ISS-036). Set the lifetime to the required period; details
|
**the test system shows 52 weeks** (ISS-036), and so does the fresh install on the R1.05 test
|
||||||
|
server (2026-10-09): 52 weeks is the installed default (ISS-135). Set the lifetime to the required period; details
|
||||||
in the historical manual (phase 9).
|
in the historical manual (phase 9).
|
||||||
|
|
||||||
## A8. Alarm filters (§A8)
|
## A8. Alarm filters (§A8)
|
||||||
|
|
@ -113,6 +122,9 @@ in the historical manual (phase 9).
|
||||||
double quotes with `*` / `?` wildcards; `and` / `or` evaluated left to right (no precedence),
|
double quotes with `*` / `?` wildcards; `and` / `or` evaluated left to right (no precedence),
|
||||||
parentheses, `/* */` comments. `section = "A.B"` matches items directly in `A.B`, not in
|
parentheses, `/* */` comments. `section = "A.B"` matches items directly in `A.B`, not in
|
||||||
sub-sections. An invalid expression filters out every alarm.
|
sub-sections. An invalid expression filters out every alarm.
|
||||||
|
- **Load (R1.05 test server, ISS-136):** an alarm overview filtered by an ASA on `SECTION` or
|
||||||
|
`UNIT` kept the storage process `ALH` at a full CPU core and made every client's alarm lists
|
||||||
|
time out. On shared or production servers filter overviews by item name or AOI instead.
|
||||||
- **Verified**: `COMPILE` 1 on load compiles the expression; the export then shows `COMPILE` 0,
|
- **Verified**: `COMPILE` 1 on load compiles the expression; the export then shows `COMPILE` 0,
|
||||||
the numbered `LISTING` with `ALC-I-CMP_SUCC` and `VALID_EXPRESSION` 1. Without spaces
|
the numbered `LISTING` with `ALC-I-CMP_SUCC` and `VALID_EXPRESSION` 1. Without spaces
|
||||||
(`SECTION="…"`) the load reports an error but the record **is stored** with
|
(`SECTION="…"`) the load reports an error but the record **is stored** with
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
---
|
---
|
||||||
manual: IM 36K10C30-01EN
|
manual: IM 36K10C30-01EN
|
||||||
title: Engineering Module - Reporting
|
title: Engineering Module - Reporting
|
||||||
edition: 3rd Edition, Sep. 2023
|
edition: 4th Edition, Feb. 2026 (R1.05); content unchanged since the 3rd Edition, Sep. 2023 (R1.03): the revision table lists contact information only and a full text diff found only title spacing
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
status: report definitions (ad hoc with parameters, schedule, item trigger, HTML, logbook), generated reports, file device and destination verified by quick load on CI-Eng-Sample 2026-10-01; Engineering Module forms, generate and view checked by the user; report component in displays and hardcopy printers from docs
|
status: verified on R1.03 (2026-10-01): report definitions (ad hoc with parameters, schedule, item trigger, HTML, logbook), generated reports, file device and destination by quick load on CI-Eng-Sample; Engineering Module forms, generate and view checked by the user. R1.05 test server: REPORT_DF / REPORT_VAL / PRINTER_* definitions identical to R1.03 (2026-10-08), sample reports and file device loaded and removed with 0 errors (2026-10-08), system reports and factory destinations checked read-only (2026-10-09); generation not tested on R1.05. Report component in displays and hardcopy printers from docs
|
||||||
---
|
---
|
||||||
|
|
||||||
# Engineering Module - Reporting (R1.03)
|
# Engineering Module - Reporting (R1.05)
|
||||||
|
|
||||||
Defining, generating and viewing reports. Language: `IM36K10P20-01EN.md`; REPORT Service
|
Defining, generating and viewing reports. Language: `IM36K10P20-01EN.md`; REPORT Service
|
||||||
processes: `IM36K10R40-01EN.md`. Section numbers refer to the manual; dataset fields were read
|
processes: `IM36K10R40-01EN.md`. Section numbers refer to the manual; dataset fields were read
|
||||||
|
|
@ -134,7 +134,8 @@ NAME < (@obj || ';')` on `object_attr_val`) instead of other fields.
|
||||||
@WIDTH 512;`. The Engineering Module and displays render it; a destination receives the HTML
|
@WIDTH 512;`. The Engineering Module and displays render it; a destination receives the HTML
|
||||||
source.
|
source.
|
||||||
- CSV: `SPOOL '<file>'; SET @EXPORT 1; SELECT …; SPOOL;`.
|
- CSV: `SPOOL '<file>'; SET @EXPORT 1; SELECT …; SPOOL;`.
|
||||||
- System reports (installed, 28, all ad hoc, lifetime 1 week): `ALARM_COUNT`, `ALARM_CURRENT`,
|
- System reports (installed, 28, all ad hoc, lifetime 1 week; same list on R1.05, verified
|
||||||
|
2026-10-09): `ALARM_COUNT`, `ALARM_CURRENT`,
|
||||||
`ALARM_EXT_CURR`, `ALARM_HISTORY`, `ALARM_SHELVE`, `ALM_ATTRS_CUR`, `ALM_ATTRS_HIS` (manual:
|
`ALARM_EXT_CURR`, `ALARM_HISTORY`, `ALARM_SHELVE`, `ALM_ATTRS_CUR`, `ALM_ATTRS_HIS` (manual:
|
||||||
`ALM_ATTS_CUR`, `ALM_ATRS_HIS`, ISS-043), `AUDIT_TRAIL`, `AUTH_GROUP`, `ITEM_ACK`, `ITEM_ALM`,
|
`ALM_ATTS_CUR`, `ALM_ATRS_HIS`, ISS-043), `AUDIT_TRAIL`, `AUTH_GROUP`, `ITEM_ACK`, `ITEM_ALM`,
|
||||||
`ITEM_EQP`, `ITEM_FO`, `ITEM_HISTORY`, `ITEM_HISTORY_AG`, `ITEM_ID`, `ITEM_ITM`, `ITEM_OTH`,
|
`ITEM_EQP`, `ITEM_FO`, `ITEM_HISTORY`, `ITEM_HISTORY_AG`, `ITEM_ID`, `ITEM_ITM`, `ITEM_OTH`,
|
||||||
|
|
@ -142,6 +143,15 @@ NAME < (@obj || ';')` on `object_attr_val`) instead of other fields.
|
||||||
`SYSTEM_LOG_HTML`, `UA_SERVER_AUDIT`, `USER`, `USER_VAL`. Their queries are good RQL examples
|
`SYSTEM_LOG_HTML`, `UA_SERVER_AUDIT`, `USER`, `USER_VAL`. Their queries are good RQL examples
|
||||||
(`dssqld -e` on `REPORT_DF` with `QUERY`). Enterprise engineering servers add `EES_*` reports.
|
(`dssqld -e` on `REPORT_DF` with `QUERY`). Enterprise engineering servers add `EES_*` reports.
|
||||||
|
|
||||||
|
## 9. R1.05 notes (not in the manual)
|
||||||
|
|
||||||
|
- `ITEM_VAL` has `ENG_UNIT`, `SCALE_HIGH_LIMIT`, `SCALE_LOW_LIMIT` (ISS-126), usable in report
|
||||||
|
queries; see skill `reporting`, `rql-interactive.md` §4.
|
||||||
|
- New datasets since R1.03 are readable in report queries; `API_KEYS_DF` holds API keys and
|
||||||
|
must never be used in a report (ISS-168).
|
||||||
|
- `report_start.cmd` / `report_stop.cmd` call `?*_report_start.cmd` / `?*_report_stop.cmd`
|
||||||
|
extension scripts (ISS-121).
|
||||||
|
|
||||||
Known issues (IM 36K01A50): with Active Directory and printer management, generation can fail
|
Known issues (IM 36K01A50): with Active Directory and printer management, generation can fail
|
||||||
looking for the user's default printer (use a destination without device as the user's
|
looking for the user's default printer (use a destination without device as the user's
|
||||||
default); report features of schemes need an Engineering Module restart.
|
default); report features of schemes need an Engineering Module restart.
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
---
|
---
|
||||||
manual: IM 36K10E10-01EN
|
manual: IM 36K10E10-01EN
|
||||||
title: Excel Add-in Data Analysis and Reporting
|
title: Excel Add-in Data Analysis and Reporting
|
||||||
edition: 3rd Edition, Sep. 2023
|
edition: 4th Edition, Feb. 2026 (R1.05); content unchanged since the 3rd Edition, Sep. 2023 (R1.03) except one sentence removed in §3 (see §1 below): the revision table lists contact information only
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
status: from docs only — Microsoft Excel and the add-in are not installed on the test system (checked 2026-10-01)
|
status: from docs only — not tested: Microsoft Excel and the add-in are installed neither on the R1.03 test system (checked 2026-10-01) nor on the R1.05 test server (re-check 2026-10-09)
|
||||||
---
|
---
|
||||||
|
|
||||||
# Excel Add-in — DART (R1.03)
|
# Excel Add-in — DART (R1.05)
|
||||||
|
|
||||||
DART (Data Analysis and Reporting Tool) is a Microsoft Excel add-in that reads CI Server data into
|
DART (Data Analysis and Reporting Tool) is a Microsoft Excel add-in that reads CI Server data into
|
||||||
worksheets for reports and analysis. It connects through CI Portal (web ports 8080 local /
|
worksheets for reports and analysis. It connects through CI Portal (web ports 8080 local /
|
||||||
|
|
@ -24,7 +24,7 @@ Remote CI Portal on another machine needs SSL certificates.
|
||||||
|
|
||||||
| Group | Command | Gives |
|
| Group | Command | Gives |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Connections | Connection Manager | Connect (server name/IP, default `localhost`; login dialog depends on the `dssana.sup` login method) / disconnect |
|
| Connections | Connection Manager | Connect (server name/IP; login dialog depends on the `dssana.sup` login method) / disconnect. The R1.03 edition said the box shows `localhost` first and the last server used afterwards; the R1.05 edition dropped that sentence (ISS-166) |
|
||||||
| Item Search | Item Search | Items by name and description filters (`*`, `?`, both filters ANDed); paste vertically or horizontally |
|
| Item Search | Item Search | Items by name and description filters (`*`, `?`, both filters ANDed); paste vertically or horizontally |
|
||||||
| Current Data | Current Data / Item Attribute Value | Latest value (optional time stamp left or above); description, data type, engineering unit, status, quality, update time (one attribute per call) |
|
| Current Data | Current Data / Item Attribute Value | Latest value (optional time stamp left or above); description, data type, engineering unit, status, quality, update time (one attribute per call) |
|
||||||
| History Data | Single / Constant Interval / Timestamp Based / Fixed Duration–Fixed Count | Value at a time; values at an interval (optional slope interpolation); values at another item's sample times; all samples in a period or N samples |
|
| History Data | Single / Constant Interval / Timestamp Based / Fixed Duration–Fixed Count | Value at a time; values at an interval (optional slope interpolation); values at another item's sample times; all samples in a period or N samples |
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,19 @@
|
||||||
---
|
---
|
||||||
manual: IM 36K10E30-01EN
|
manual: IM 36K10E30-01EN
|
||||||
title: Alarm System Performance Analysis
|
title: Alarm System Performance Analysis
|
||||||
edition: 3rd Edition, Sep. 2023
|
edition: 4th Edition, Feb. 2026 (R1.05; first summarized from the 3rd Edition, Sep. 2023, R1.03)
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
status: from docs; launcher and fetch limits (jwuiaan.sup) checked read-only 2026-10-01; GUI not practiced
|
status: from docs; launcher and fetch limits (jwuiaan.sup) checked read-only on R1.03 (2026-10-01); R1.05 - full text diff against R1.03 (2026-10-09): only the KPI chart labels of §3.2 changed; launcher, debug launcher, template and jwuiaan.sup identical to R1.03 by file hash (2026-10-08); GUI not practiced on either version
|
||||||
---
|
---
|
||||||
|
|
||||||
# Alarm System Performance Analysis (R1.03)
|
# Alarm System Performance Analysis (R1.05)
|
||||||
|
|
||||||
|
**R1.05 changes** (full text diff against the R1.03 edition, 2026-10-09; the revision table
|
||||||
|
lists only contact information): §3.2 *Acknowledge* tab, *KPI Grid* sub tab — the four alarm
|
||||||
|
count charts now carry the labels *In Time*, *Too Late*, *Not Ackn* and *Nuisance*. The third
|
||||||
|
chart was described in R1.03 as alarms acknowledged within the analysed period; R1.05 corrects
|
||||||
|
it to alarms **not** acknowledged within the period. Nothing else changed. The ASPA GUI was not
|
||||||
|
opened on the R1.05 test server.
|
||||||
|
|
||||||
The **ASPA tool** fetches alarm events from a CI Core and analyses them with views based on
|
The **ASPA tool** fetches alarm events from a CI Core and analyses them with views based on
|
||||||
EEMUA 191 and ISA 18.2: operator load, acknowledgement times, floods, top offenders, long
|
EEMUA 191 and ISA 18.2: operator load, acknowledgement times, floods, top offenders, long
|
||||||
|
|
@ -44,7 +51,7 @@ Users, ASAs, AOIs and collections come from the Engineering Module (C20 summary
|
||||||
| Tab | Shows | Main settings |
|
| Tab | Shows | Main settings |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Load | Max/average alarm rate and % time above the acceptable rate per group (KPI, timelines, grid, distribution pie) | Acceptable *A* alarms per *B* minutes, interval (h) |
|
| Load | Max/average alarm rate and % time above the acceptable rate per group (KPI, timelines, grid, distribution pie) | Acceptable *A* alarms per *B* minutes, interval (h) |
|
||||||
| Acknowledge | Acknowledged in time / late / not acknowledged / nuisance (cleared before ack), average ack time; detail per alarm | Acceptable acknowledge time, interval |
|
| Acknowledge | KPI charts *In Time* / *Too Late* / *Not Ackn* (not acknowledged within the analysed period) / *Nuisance* (cleared before ack within the acceptable time; labels named in R1.04+), average ack time; detail per alarm | Acceptable acknowledge time, interval |
|
||||||
| Count | Alarms per interval per group | Interval, stacked, labels |
|
| Count | Alarms per interval per group | Interval, stacked, labels |
|
||||||
| Floods | Only intervals above a minimum count (trips, start-ups) | Measure period, min. alarms |
|
| Floods | Only intervals above a minimum count (trips, start-ups) | Measure period, min. alarms |
|
||||||
| Top Ten | Items with most alarms (Top 1–100), durations | Absolute / percent |
|
| Top Ten | Items with most alarms (Top 1–100), durations | Absolute / percent |
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,23 @@
|
||||||
---
|
---
|
||||||
manual: IM 36K10J20-01EN
|
manual: IM 36K10J20-01EN
|
||||||
title: High Availability Computing
|
title: High Availability Computing
|
||||||
edition: 3rd Edition, Sep. 2023
|
edition: 4th Edition, Feb. 2026 (R1.05; first summarized from the 3rd Edition, Sep. 2023)
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
status: installed hac.sup, hacw_*/hacm_* scripts, HAC executables, HAC HMI properties and integration_start checked read-only on the test system 2026-10-01; redundancy, mirror, journaling, recovery and history merge from docs only (single unlicensed server, HAC not licensed)
|
status: installed hac.sup, hacw_*/hacm_* scripts, HAC executables, HAC HMI properties and integration_start checked read-only on the R1.03 test system 2026-10-01 and compared with the R1.05 test server 2026-10-08/09 (§6); redundancy, mirror, journaling, recovery and history merge from docs only, not tested on R1.03 or R1.05 (single servers, HAC not licensed)
|
||||||
---
|
---
|
||||||
|
|
||||||
# High Availability Computing — HAC (R1.03)
|
# High Availability Computing — HAC (R1.05)
|
||||||
|
|
||||||
CI Server offers two high-availability options: **HAC** (active/standby servers, this manual)
|
CI Server offers two high-availability options: **HAC** (active/standby servers, this manual)
|
||||||
and the Dual-redundant Platform for Computer (not covered). HAC is part of DATABASE Service,
|
and the Dual-redundant Platform for Computer (not covered). HAC is part of DATABASE Service,
|
||||||
installed on every node, but needs its own licence. Configuration is in `tls\sup\hac.sup`.
|
installed on every node, but needs its own licence. Configuration is in `tls\sup\hac.sup`.
|
||||||
Section numbers refer to the manual; "installed" means checked on the R1.03.00 test system.
|
Section numbers refer to the manual (numbering unchanged in the 4th Edition); "installed"
|
||||||
|
means checked on the R1.03.00 test system (§5) or the R1.05.00 test server (§6).
|
||||||
|
|
||||||
|
**4th Edition (R1.05):** the revision table lists only contact information, and a full word
|
||||||
|
diff against the 3rd Edition (`tools/manual_diff.py`, 2026-10-09) found no other change. There
|
||||||
|
is no R1.04 edition. Everything below therefore applies to R1.05; the installed-software
|
||||||
|
changes are in §6.
|
||||||
|
|
||||||
## 1. Concepts (§1.1, §3.1)
|
## 1. Concepts (§1.1, §3.1)
|
||||||
|
|
||||||
|
|
@ -109,4 +115,33 @@ write cache off on the data/history disks, §4.9, and `ismflush` in `database_st
|
||||||
checks are pre-configured although §4.4 says the critical processes are listed; the backup
|
checks are pre-configured although §4.4 says the critical processes are listed; the backup
|
||||||
fallback path.
|
fallback path.
|
||||||
|
|
||||||
|
## 6. Installed on R1.05 (R1.05.00 test server, read-only, 2026-10-08/09)
|
||||||
|
|
||||||
|
Single non-redundant server without a HAC licence: no `hacini.sup`, normal `ci_start.cmd`,
|
||||||
|
`CI_PRIM` and `TLS_BACKUP_PATH` unset, no `hac*` process, no HAC logs. No `hac*` tool was run.
|
||||||
|
|
||||||
|
- **Unchanged** (hash or text comparison with R1.03): `hac.sup`, `hac_ees.sup`,
|
||||||
|
`haccache.sup`, `hac.tpl`, `hac_ees.tpl`, `hacerrs.umh`, `hacw_standby`, `hacw_stop`,
|
||||||
|
`hacw_shutdown`, `hacm_create/flush/restore_backup`, `hacm_mirror_start/stop`, `hachmfcpy`,
|
||||||
|
the HAC HMI `application.properties` (also `ownport = 16010`, `ownports = 32`), the commented
|
||||||
|
HAC block in `integration_start`/`integration_stop`, the `ismflush` example and the `isfjrn`
|
||||||
|
start in `database_start`. The ISS-053 differences therefore still apply.
|
||||||
|
- Same executables (`hacwdg` … `hachmfsrv`, `isfjrn`, `ismflush`, `jhacsrv.jar`), all rebuilt
|
||||||
|
(sizes and hashes differ); no new or removed HAC file. Behaviour changes, if any, are not
|
||||||
|
documented.
|
||||||
|
- **Extension hooks** (change i12719, Apr. 2025; ISS-160, part of ISS-121): `hacw_activate`
|
||||||
|
calls every `?*_hacw_activate.cmd` in `tls\com` after all services are started and before it
|
||||||
|
loads the HAC status items and signals ACTIVE to the Watchdog; `hacw_deactivate` calls every
|
||||||
|
`?*_hacw_deactivate.cmd` after the dynamic processes and `hacwitm` are stopped and before the
|
||||||
|
services are stopped. `hacw_standby`/`hacw_stop` have no hook, so on a HAC server (where
|
||||||
|
they replace `ci_start`/`ci_stop`) `?*_ci_start.cmd`/`?*_ci_stop.cmd` hooks are not called.
|
||||||
|
`integration_start` calls `?*_integration_start.cmd` only on a host node; `integration_stop`
|
||||||
|
calls `?*_integration_stop.cmd` always.
|
||||||
|
- **`hacw_hmi`** (change e12732, Aug. 2025; ISS-161): the Java classpath now also contains
|
||||||
|
`tls\exe\lib\*` (external libraries moved there; 116 files on the test server).
|
||||||
|
- Release notes (IM 36K01A50, 5th Edition): §1.19 do not mix physical and virtual machines in
|
||||||
|
one HAC configuration (already in R1.03); §1.15 (added in R1.04) OPC UA PubSub items stay
|
||||||
|
offline after a HAC network-card switch until the PubSub dataset writer is uploaded again
|
||||||
|
(ISS-162). §1.1 is about the Dual-redundant Platform only (unchanged since R1.03).
|
||||||
|
|
||||||
Task files: skill `high-availability`.
|
Task files: skill `high-availability`.
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,17 @@
|
||||||
---
|
---
|
||||||
manual: IM 36K10J40-01EN
|
manual: IM 36K10J40-01EN
|
||||||
title: Active Directory Integration
|
title: Active Directory Integration
|
||||||
edition: 3rd Edition, Sep. 2023
|
edition: 4th Edition, Feb. 2026 (first written from the 3rd Edition, Sep. 2023)
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
status: installed dssana.sup (Active Directory, Single Sign On and Login control tabs), USER_DF fields and the auth WEB-INF templates checked read-only on the test system 2026-10-01; AD and SPNEGO set-up from docs only (no domain)
|
status: installed dssana.sup (Active Directory, Single Sign On and Login control tabs), USER_DF fields and the auth WEB-INF templates checked read-only on R1.03 (2026-10-01) and compared with the R1.05 test server (2026-10-09); AD and SPNEGO set-up from docs only, not tested (no domain)
|
||||||
---
|
---
|
||||||
|
|
||||||
# Active Directory Integration (R1.03)
|
# Active Directory Integration (R1.05)
|
||||||
|
|
||||||
|
**R1.05 edition (Feb. 2026)**: the revision table lists only contact information, and the full
|
||||||
|
text diff against the 3rd edition (2026-10-09) found nothing else (spacing and the cover only).
|
||||||
|
No R1.04 edition change. Section numbers below are unchanged. The manual does not mention the
|
||||||
|
login methods of the R1.04/R1.05 interfaces (RESTful API, pyTOOLS, Password Check; see §5).
|
||||||
|
|
||||||
With AD integration CI Server takes users from a Windows domain (Kerberos/AD) instead of its own
|
With AD integration CI Server takes users from a Windows domain (Kerberos/AD) instead of its own
|
||||||
user list; with single sign-on (SPNEGO) remote CI View users start CI Portal applications without
|
user list; with single sign-on (SPNEGO) remote CI View users start CI Portal applications without
|
||||||
|
|
@ -78,7 +83,19 @@ Portal machine.
|
||||||
7. CI View: start applications from the *Remote Connect* start-menu folder; no login prompt,
|
7. CI View: start applications from the *Remote Connect* start-menu folder; no login prompt,
|
||||||
the loaded profile shows in the status bar.
|
the loaded profile shows in the status bar.
|
||||||
|
|
||||||
## 5. Installed (R1.03.00 test system)
|
## 5. Installed (R1.03.00 test system; R1.05.00 compared 2026-10-09)
|
||||||
|
|
||||||
|
**R1.05.00** (verified read-only on the R1.05 test server, 2026-10-09): the *Active Directory*
|
||||||
|
and *Single Sign On* keywords, their help texts and the installed values are identical to
|
||||||
|
R1.03; `USER_DF` is unchanged (`DIRECTORY_GROUP`, `MERGE_PRIORITY`); the `auth\WEB-INF` files
|
||||||
|
are the same six, and only `web.xml.tpl` changed (old Servlet 2.3 `DOCTYPE` removed, ISS-153).
|
||||||
|
*Login control* gains three user interfaces with *Manual CI Server* lines: `RESTful API
|
||||||
|
Server`, `Python Interface` (pyTOOLS), `Password Check Function`; the .NET API line is now
|
||||||
|
named `Application Interface` (R1.03: `dnetapi`, ISS-148). IM 36K10J10 5th ed. §2.9.1 allows
|
||||||
|
*Manual CI Server* or *Manual OS* for the RESTful API and only *Manual CI Server* for pyTOOLS,
|
||||||
|
so pyTOOLS cannot use AD/SSO logins.
|
||||||
|
|
||||||
|
R1.03.00:
|
||||||
|
|
||||||
- `dssana.sup` *Active Directory* tab keywords: `AD_INT_ON` (installed `NO`), `AD_SECURE`
|
- `dssana.sup` *Active Directory* tab keywords: `AD_INT_ON` (installed `NO`), `AD_SECURE`
|
||||||
(`NO`; help: "default is yes"), `AD_SERVER`, `AD_SERVER_BACKUP` (host or IP, optional
|
(`NO`; help: "default is yes"), `AD_SERVER`, `AD_SERVER_BACKUP` (host or IP, optional
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,15 @@
|
||||||
---
|
---
|
||||||
manual: IM 36K10L10-01EN
|
manual: IM 36K10L10-01EN
|
||||||
title: Class/Object Engineering
|
title: Class/Object Engineering
|
||||||
edition: 3rd Edition, Sep. 2023
|
edition: 4th Edition, Feb. 2026 (first summarized from the 3rd Edition, Sep. 2023)
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
status: from docs; opc.sup, process_start.cmd, the PROCESS data files and opcdbg (database check, get class/object, signals, attributes, reset class, dump, performance main info) checked on the test system 2026-09-30
|
status: from docs; opc.sup, process_start.cmd, the PROCESS data files and opcdbg (database check, get class/object, signals, attributes, reset class, dump, performance main info) checked on the R1.03 test system 2026-09-30. R1.05 re-check 2026-10-09 (read-only, R1.05 test server): manual text unchanged except contact information (full word diff); opc.sup, prc.sup, dataset definitions, class source templates and Java logging files identical; start scripts differ only as listed in §1; database check and OPCEXE1 performance main info re-run
|
||||||
---
|
---
|
||||||
|
|
||||||
# Class/Object Engineering (R1.03)
|
# Class/Object Engineering (R1.05)
|
||||||
|
|
||||||
|
**R1.05 (4th Edition, Feb. 2026):** the revision table lists only contact information, and a
|
||||||
|
word-by-word diff with the 3rd Edition found nothing else. Section numbers are unchanged.
|
||||||
|
|
||||||
PROCESS Service runs **objects**: instances of **classes** (programs written in the
|
PROCESS Service runs **objects**: instances of **classes** (programs written in the
|
||||||
Traditional or Java PROCESS Service language) that link a set of items through **signals** and
|
Traditional or Java PROCESS Service language) that link a set of items through **signals** and
|
||||||
|
|
@ -30,20 +33,34 @@ Rules for distributed systems: `OPCMAN`, the compilers and activators run togeth
|
||||||
node, one of each. Loader/executor pairs may run on other nodes; several executors per node
|
node, one of each. Loader/executor pairs may run on other nodes; several executors per node
|
||||||
are allowed, each serving its own **priority range** (0–999).
|
are allowed, each serving its own **priority range** (0–999).
|
||||||
|
|
||||||
**Installed (R1.03 test system)**: `process_start.cmd` starts `opcloa`; on the host node also
|
**Installed (R1.03 test system; same on R1.05)**: `process_start.cmd` starts `opcloa`; on
|
||||||
`opcman`, `opcact`, `opccom`; then **four** Traditional executors `opcexe1`…`opcexe4` and one
|
the host node also `opcman`, `opcact`, `opccom`; then **four** Traditional executors `opcexe1`…`opcexe4` and one
|
||||||
Java executor `opcjexe` (a `javaw` process). `OPCJCOM`/`OPCJACT` are not started by the script;
|
Java executor `opcjexe` (a `javaw` process). `OPCJCOM`/`OPCJACT` are not started by the script;
|
||||||
`OPCMAN` starts them on demand (`process_jcom_start.cmd`, `process_jact_start.cmd`) and they exit
|
`OPCMAN` starts them on demand (`process_jcom_start.cmd`, `process_jact_start.cmd`) and they exit
|
||||||
after an idle time. Java process logging is configured in
|
after an idle time. Java process logging is configured in
|
||||||
`%TLS_WAP_PATH%\cfg\properties\opcj{act,com,exe}logging.properties`.
|
`%TLS_WAP_PATH%\cfg\properties\opcj{act,com,exe}logging.properties`.
|
||||||
|
|
||||||
|
**R1.05 differences (verified 2026-10-09, R1.05 test server):**
|
||||||
|
- The Java processes run on the bundled JDK Eclipse Temurin 11.0.28 (`tls\jre`; R1.03:
|
||||||
|
11.0.18), and their class path adds `tls\exe\lib\*` (on R1.05 it holds about 100 bundled
|
||||||
|
third-party jars; on R1.03 the folder held only `installer.txt`).
|
||||||
|
- `process_start.cmd` ends by calling every `?*_process_start.cmd` in `tls\com`, and
|
||||||
|
`process_stop.cmd` first calls every `?*_process_stop.cmd`: a hook for application scripts,
|
||||||
|
as in the other service scripts (system-management ISS-121).
|
||||||
|
- Running processes seen: `opcloa`, `opcman`, `opcact`, `opccom`, four `opcexe` and one
|
||||||
|
`javaw` running the Java executor `opcjexe` (as on R1.03).
|
||||||
|
- Preinstalled classes: `AOG_BASE`, `AOG_JBASE`, `PRC_STATUS_BASE` (also on R1.03) and new
|
||||||
|
Java samples for OPC UA methods, `UAC_MTD_JBASE` and `UAS_MTD_JBASE` (R1.04; see
|
||||||
|
`IM36K10L45-01EN.md` §10.6 and §11.4 and skill `data-access`).
|
||||||
|
|
||||||
## 2. Setup files (§2)
|
## 2. Setup files (§2)
|
||||||
|
|
||||||
`opc.sup` holds settings for all PROCESS processes; a file named after one process's BUS queue
|
`opc.sup` holds settings for all PROCESS processes; a file named after one process's BUS queue
|
||||||
(e.g. `opcman.sup`) overrides it for that process only. The Java processes read only `opc.sup`.
|
(e.g. `opcman.sup`) overrides it for that process only. The Java processes read only `opc.sup`.
|
||||||
Change it with the Setup File Editor (skill `portal-setup`); a restart is needed.
|
Change it with the Setup File Editor (skill `portal-setup`); a restart is needed.
|
||||||
|
|
||||||
Main keywords and the **installed** values (differences from the manual: ISS-026):
|
Main keywords and the **installed** values (differences from the manual: ISS-026). `opc.sup`
|
||||||
|
and `prc.sup` are byte-identical on R1.03 and R1.05 (2026-10-09):
|
||||||
|
|
||||||
| Keyword | Meaning | Installed |
|
| Keyword | Meaning | Installed |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
|
|
@ -68,7 +85,7 @@ Main keywords and the **installed** values (differences from the manual: ISS-026
|
||||||
| `SYMTAB-SIZE`, `INCTAB-SIZE`, `ALARMTAB-SIZE`, `TIMERTAB-SIZE`, `ATTRIBTAB-SIZE`, `SIGTAB-SIZE`, `LABELTAB-SIZE`, `VARTAB-SIZE`, `FNCTAB-SIZE`, `STRPOOL-SIZE`, `CODE-SIZE` | Compiler table sizes (Traditional) | 4000, 100, 40, 40, 1000, 1000, 100, 4000, 200, 32 kB, 1000 kB |
|
| `SYMTAB-SIZE`, `INCTAB-SIZE`, `ALARMTAB-SIZE`, `TIMERTAB-SIZE`, `ATTRIBTAB-SIZE`, `SIGTAB-SIZE`, `LABELTAB-SIZE`, `VARTAB-SIZE`, `FNCTAB-SIZE`, `STRPOOL-SIZE`, `CODE-SIZE` | Compiler table sizes (Traditional) | 4000, 100, 40, 40, 1000, 1000, 100, 4000, 200, 32 kB, 1000 kB |
|
||||||
|
|
||||||
Also in the file: hidden keywords `FLDSEP = ","` and `IGNEXI = 1` (not described). `opcini.sup`
|
Also in the file: hidden keywords `FLDSEP = ","` and `IGNEXI = 1` (not described). `opcini.sup`
|
||||||
holds only a licence line; leave it alone.
|
holds only a licence line (differs per installation); leave it alone.
|
||||||
|
|
||||||
The object's priority decides which executor runs it: sample objects with priority 0 run in
|
The object's priority decides which executor runs it: sample objects with priority 0 run in
|
||||||
`OPCEXE1` (seen with `opcdbg`, "Running in : 1, OPCEXE1").
|
`OPCEXE1` (seen with `opcdbg`, "Running in : 1, OPCEXE1").
|
||||||
|
|
@ -96,7 +113,11 @@ forever.
|
||||||
| Performance (4) | Asks front-end node and **executor name** (default `OPCEXE`, installed names are `OPCEXE1`…`4`); 1 main info, 5 class info, 7 object info, 8 reset statistics, 9 statistics on/off, 10/11 top-10 classes/objects |
|
| Performance (4) | Asks front-end node and **executor name** (default `OPCEXE`, installed names are `OPCEXE1`…`4`); 1 main info, 5 class info, 7 object info, 8 reset statistics, 9 statistics on/off, 10/11 top-10 classes/objects |
|
||||||
| Utilities (5) | 1 reset host/front-end, 2 pending front-end updates, 3/4 dump classes/objects, **5 database check** (read-only), 6 database repair (deletes incomplete data; back up first), 7 disassemble class, 8 clean up "item used" marks, 9 memory dump |
|
| Utilities (5) | 1 reset host/front-end, 2 pending front-end updates, 3/4 dump classes/objects, **5 database check** (read-only), 6 database repair (deletes incomplete data; back up first), 7 disassemble class, 8 clean up "item used" marks, 9 memory dump |
|
||||||
|
|
||||||
Verified 2026-09-30: *Reset class* asks class name, node **and a file for a reset report**
|
Verified on R1.05 2026-10-09: the database check (utilities 5) and the performance main info
|
||||||
|
for `OPCEXE1` behave as on R1.03 (database check without warnings). The main info for
|
||||||
|
`OPCJEXE` gave no output to piped input within 40 s (ISS-157; try it interactively).
|
||||||
|
|
||||||
|
Verified 2026-09-30 (R1.03): *Reset class* asks class name, node **and a file for a reset report**
|
||||||
(not in the manual; empty line = none). Times are printed in GMT. The dump files (3/4) are
|
(not in the manual; empty line = none). Times are printed in GMT. The dump files (3/4) are
|
||||||
**not** in quick load format and `dssqld -i` rejects them (ISS-027); export `CLASS_DF` /
|
**not** in quick load format and `dssqld -i` rejects them (ISS-027); export `CLASS_DF` /
|
||||||
`OBJECT_DF` with `dssqld -e` instead. *Cleanup item used file* fixes items that cannot be
|
`OBJECT_DF` with `dssqld -e` instead. *Cleanup item used file* fixes items that cannot be
|
||||||
|
|
@ -112,7 +133,8 @@ storage info), `opc_trgdef`, `opc_trgact` (trigger group ↔ class/object links)
|
||||||
store; check with `opcdbg` utilities 5, repair with 6. Back them up together (they are part of
|
store; check with `opcdbg` utilities 5, repair with 6. Back them up together (they are part of
|
||||||
the `tls\dat` backup).
|
the `tls\dat` backup).
|
||||||
|
|
||||||
Related datasets (read with `dssqld -e`, see `IM36K10J10-01EN.md`): `CLASS_DF`, `OBJECT_DF`,
|
Related datasets (read with `dssqld -e`, see `IM36K10J10-01EN.md`; definitions in
|
||||||
|
`tls\src\*.dss` identical on R1.03 and R1.05, 2026-10-09): `CLASS_DF`, `OBJECT_DF`,
|
||||||
`TRIGGER_DF`, `CLASS_SIGNAL_DF`, `OBJECT_SIGNAL_DF` (object:signal → item), `CLASS_ATTR_VAL`,
|
`TRIGGER_DF`, `CLASS_SIGNAL_DF`, `OBJECT_SIGNAL_DF` (object:signal → item), `CLASS_ATTR_VAL`,
|
||||||
`OBJECT_ATTR_VAL` (attribute values, writable with `dssqld -m`), `CLASS_INCLUDED_DF`,
|
`OBJECT_ATTR_VAL` (attribute values, writable with `dssqld -m`), `CLASS_INCLUDED_DF`,
|
||||||
`CLASS_RESET_COMMAND` (system-wide reset command used by the Engineering Module; not practiced).
|
`CLASS_RESET_COMMAND` (system-wide reset command used by the Engineering Module; not practiced).
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,21 @@
|
||||||
---
|
---
|
||||||
manual: IM 36K10L15-01EN
|
manual: IM 36K10L15-01EN
|
||||||
title: Alarm Management Engineering
|
title: Alarm Management Engineering
|
||||||
edition: 3rd Edition, Sep. 2023
|
edition: 4th Edition, Feb. 2026 (R1.05); content unchanged since the 3rd Edition, Sep. 2023 (R1.03): full text diff 2026-10-09 found only contact information
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
status: verified for item-based alarms (acknowledgement type, AOI, ASA, ALARMING, alarm events, acknowledge, almdbg/alhdbg) on CI-Eng-Sample 2026-10-01; first-out, collections, notifications, shelving, acoustic/count destinations from docs; setup files checked read-only
|
status: R1.05 - processes, setup files, almdbg 1/9/12 and alhdbg 1 checked read-only on the R1.05 test server (2026-10-09); setup files and alarm dataset definitions identical to R1.03 except alarm_start/stop.cmd (extension scripts), alnsms.sup defaults and the new internal dataset ALARM_ATTRIBUTE_TEMP_DF; alarm behaviour not re-tested on R1.05 (shared server). R1.03 - verified for item-based alarms (acknowledgement type, AOI, ASA, ALARMING, alarm events, acknowledge, almdbg/alhdbg) on CI-Eng-Sample 2026-10-01; first-out, collections, notifications, shelving, acoustic/count destinations from docs; setup files checked read-only
|
||||||
---
|
---
|
||||||
|
|
||||||
# Alarm Management Engineering (R1.03)
|
# Alarm Management Engineering (R1.05)
|
||||||
|
|
||||||
|
**R1.05 changes**: the manual text is the same as in R1.03 (revision table and full text diff,
|
||||||
|
2026-10-09). Installed software (R1.05 test server, compared with R1.03 by file hash and line
|
||||||
|
by line): `alm.sup`, `alh.sup`, `aldprt.sup`, `aldaco.sup`, `aldcnt.sup`, `alnmgr.sup`,
|
||||||
|
`alnsmtp.sup`, `asbman.sup`, `wfladi.sup`, their templates and the alarm dataset definitions
|
||||||
|
are identical. Different: `alarm_start.cmd` / `alarm_stop.cmd` call extension scripts
|
||||||
|
`?*_alarm_start.cmd` / `?*_alarm_stop.cmd` (§1, ISS-121); `alnsms.sup` defaults (§10,
|
||||||
|
ISS-134); new internal dataset `ALARM_ATTRIBUTE_TEMP_DF` (§7, ISS-133). R1.04 added the
|
||||||
|
display-side acknowledgement with reason and approver (C50, ISS-099); the kernel is unchanged.
|
||||||
|
|
||||||
ALARM Service turns item status changes (and external alarms, informational events) into
|
ALARM Service turns item status changes (and external alarms, informational events) into
|
||||||
**alarm events**, distributes them to **destinations** and stores them. Section numbers refer to
|
**alarm events**, distributes them to **destinations** and stores them. Section numbers refer to
|
||||||
|
|
@ -27,10 +36,14 @@ the manual. Engineering Module forms for the same functions: `IM36K10C20-01EN.md
|
||||||
| `ALHCUR`, `ALHCHR` | Split current / history storage (ALH becomes a router) | no |
|
| `ALHCUR`, `ALHCHR` | Split current / history storage (ALH becomes a router) | no |
|
||||||
|
|
||||||
Blocks: ALM (kernel), ALH (storage), ALD (destinations), ALC (alarm selection areas).
|
Blocks: ALM (kernel), ALH (storage), ALD (destinations), ALC (alarm selection areas).
|
||||||
Installed `alarm_start.cmd` starts `alm`, `alh`, `aldprt`, `alnmgr`, `alnsmtp`, `asbman`.
|
Installed `alarm_start.cmd` starts `alm`, `alh`, `aldprt`, `alnmgr`, `alnsmtp`, `asbman`
|
||||||
|
(R1.03 and R1.05). On R1.05 it then calls every `?*_alarm_start.cmd` in `tls\com`, and
|
||||||
|
`alarm_stop.cmd` first calls every `?*_alarm_stop.cmd`: the place to start `aldcnt`, `alnsms`
|
||||||
|
or extra `aldaco` processes without editing the installed script (ISS-121; not tested).
|
||||||
|
|
||||||
**Verified:** `almdbg` option 1 lists the connected destinations `ALH`, `OPXUAS` (OPC UA server
|
**Verified:** `almdbg` option 1 lists the connected destinations `ALH`, `OPXUAS` (OPC UA server
|
||||||
A&C), `ALNMGR`, `ALDPRT`.
|
A&C), `ALNMGR`, `ALDPRT` (R1.03); on the R1.05 test server also `WFLADI` (an open alarm
|
||||||
|
overview), 2026-10-09.
|
||||||
|
|
||||||
## 2. Alarm sources and states (§2.1)
|
## 2. Alarm sources and states (§2.1)
|
||||||
|
|
||||||
|
|
@ -125,7 +138,17 @@ priority list), `SUPPR_ACK_CHG`, `SYNC_COMM` (async DUR to destinations), `SYNC_
|
||||||
exported unless named, filter with `@SELECT`). External alarm definitions are in
|
exported unless named, filter with `@SELECT`). External alarm definitions are in
|
||||||
`EXTERNAL_ALARM_DF`; `ALARM_EXT_CURR` is only a default report name, not a dataset.
|
`EXTERNAL_ALARM_DF`; `ALARM_EXT_CURR` is only a default report name, not a dataset.
|
||||||
- **Installed storage group `ALH`** (`HIS_GROUP_DF`): type Alarm, rollover 1 day, lifetime
|
- **Installed storage group `ALH`** (`HIS_GROUP_DF`): type Alarm, rollover 1 day, lifetime
|
||||||
**52 weeks** (the C20 manual gives 2 days as the default; ISS-036).
|
**52 weeks** (the C20 manual gives 2 days as the default; ISS-036). The fresh R1.05 install
|
||||||
|
on the test server has the same 52 weeks, so this is the installed default (ISS-135).
|
||||||
|
- **Alarm attributes** (CI attributes): definitions in `ALARM_ATTRIBUTE_DF`, current values in
|
||||||
|
`tls\dat\alarm_attribute_current.db` (R1.03 and R1.05). R1.05 adds `ALARM_ATTRIBUTE_TEMP_DF`
|
||||||
|
(same fields, no data file, concealed on an enterprise server, header: temporary store for
|
||||||
|
item-specific alarm attributes). On the R1.05 test server it is empty and used only by the
|
||||||
|
RESTful API server; not described in any manual — internal, leave it alone (ISS-133).
|
||||||
|
- **Heavy load (R1.05 test server, observed by earlier work):** an alarm overview filtered by
|
||||||
|
an ASA on `SECTION` or `UNIT` kept `ALH` at a full CPU core and timed out the alarm lists of
|
||||||
|
every client (ISS-136). Avoid such overviews and unfiltered `ALARM_CHRONO` reads on shared
|
||||||
|
servers.
|
||||||
|
|
||||||
## 8. Destination processes (§4)
|
## 8. Destination processes (§4)
|
||||||
|
|
||||||
|
|
@ -171,8 +194,10 @@ priority list), `SUPPR_ACK_CHG`, `SYNC_COMM` (async DUR to destinations), `SYNC_
|
||||||
| 22 | Diagnostic message for an item or EAL | |
|
| 22 | Diagnostic message for an item or EAL | |
|
||||||
| 23–26 | Collections: list, detail, reset, acknowledge | |
|
| 23–26 | Collections: list, detail, reset, acknowledge | |
|
||||||
|
|
||||||
`alhdbg`: 1 storage groups (verified: group 3, unit 80, current cell start), 2 units of a
|
`alhdbg`: 1 storage groups (verified: group 3, unit 80, current cell start; R1.05 test server
|
||||||
group, 3 force connect to kernel, 4 tidy stop (never without approval).
|
2026-10-09: group 3 as well), 2 units of a group, 3 force connect to kernel, 4 tidy stop (never
|
||||||
|
without approval). On R1.05, `almdbg` 1, 9 and 12 gave the same kind of output as on R1.03
|
||||||
|
(six ack types; statistics with start time and event counters).
|
||||||
|
|
||||||
Piping `-1` at the end makes DURTIM log `Process ALMDBG_<pid> exited unexpectedly` — harmless.
|
Piping `-1` at the end makes DURTIM log `Process ALMDBG_<pid> exited unexpectedly` — harmless.
|
||||||
|
|
||||||
|
|
@ -186,6 +211,11 @@ Piping `-1` at the end makes DURTIM log `Process ALMDBG_<pid> exited unexpectedl
|
||||||
`ALARM_PREFIX [ALARM]`, `CLEAR_PREFIX [CLEAR]`, `SUFFIX`. Only SMTP servers without
|
`ALARM_PREFIX [ALARM]`, `CLEAR_PREFIX [CLEAR]`, `SUFFIX`. Only SMTP servers without
|
||||||
authentication or encryption.
|
authentication or encryption.
|
||||||
- `alnsms.sup`: `SMS_PORT` (installed `COM1:`), AT-command modem, serial line settings.
|
- `alnsms.sup`: `SMS_PORT` (installed `COM1:`), AT-command modem, serial line settings.
|
||||||
|
R1.05 (installed file and template, ISS-134): the format help adds the units `SECTION` and
|
||||||
|
`NAME`; the active defaults are now `BODY_FORMAT = PRIO,2,SPAC,1,TYPE,6,TDEF,18,TEXT,6,
|
||||||
|
SECTION,120` (R1.03: `…,nam1,16,nam2,16,nam3,16,nam4,16,text,32`) and `ALARM_PREFIX = PRIO`
|
||||||
|
(R1.03 `<ALARM>`; the help still describes a plain prefix string). `CLEAR_PREFIX <CLEAR>`
|
||||||
|
unchanged. `alnsms` is still not started by default. Not tested (no GSM modem).
|
||||||
- `asbman.sup`: `QUE-SIZE` 500, `TICKER_INTERVAL` 2 s, `SYS_WIDE_SHELF` (installed `N`:
|
- `asbman.sup`: `QUE-SIZE` 500, `TICKER_INTERVAL` 2 s, `SYS_WIDE_SHELF` (installed `N`:
|
||||||
shelving kept per CI View) with optional count items, `DEBUG_ON`. Same setting on every node.
|
shelving kept per CI View) with optional count items, `DEBUG_ON`. Same setting on every node.
|
||||||
In enterprise mode use the alarm overview *Location* column.
|
In enterprise mode use the alarm overview *Location* column.
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,27 @@
|
||||||
---
|
---
|
||||||
manual: IM 36K10L25-01EN
|
manual: IM 36K10L25-01EN
|
||||||
title: Audit Trail Management Engineering
|
title: Audit Trail Management Engineering
|
||||||
edition: 3rd Edition, Sep. 2023
|
edition: 4th Edition, Feb. 2026 (R1.05; first summarized from the 3rd Edition, Sep. 2023, R1.03)
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
status: processes, scripts, adtsys.sup, classifiers, ADT group, AUDIT_TRAIL contents, selection groups and ADTLOG (default and filtered) verified on the test system 2026-10-01; distributor, extra collectors, classifier extension in C and operator-side ITEM.* events from docs
|
status: processes, scripts, adtsys.sup, classifiers, ADT group, AUDIT_TRAIL contents, selection groups and ADTLOG (default and filtered) verified on the R1.03 test system 2026-10-01; on the R1.05 test server processes, ADT group, classifier list, dataset definitions, setup files, start scripts and an RQL read of AUDIT_TRAIL verified 2026-10-09 (read-only); distributor, extra collectors, classifier extension in C from docs
|
||||||
---
|
---
|
||||||
|
|
||||||
# Audit Trail Management Engineering (R1.03)
|
# Audit Trail Management Engineering (R1.05)
|
||||||
|
|
||||||
|
**R1.05 re-check (2026-10-09).** The 4th edition (Feb. 2026) differs from the 3rd only in the
|
||||||
|
revision table and contact information (full text diff, `tools/manual_diff.py`); section
|
||||||
|
numbers are unchanged. The installed software changed without manual text:
|
||||||
|
- `AUDIT_TRAIL` fields `APPROVAL_REASON` (256) and `APPROVER` (128), added for FDA Part 11
|
||||||
|
(approval of changes to critical process parameters); `E_LAYOUT` units `APPRR` / `APPR`
|
||||||
|
(ISS-140). Filled by display writes with a reason and approver (IM 36K10C50 §2.22, §4.12;
|
||||||
|
ISS-099).
|
||||||
|
- 499 classifiers (R1.03: 463): action `PENDING`, sources `REST-SERVER`, `PYTOOLS`,
|
||||||
|
`PASSWORD-CHECK` (ISS-141).
|
||||||
|
- `audit_start.cmd` / `audit_stop.cmd` call `?*_audit_start.cmd` / `?*_audit_stop.cmd` (ISS-142).
|
||||||
|
- Unchanged: executables, `AUDIT_EVENT_CLAS_DF` and `AUDIT_SELGRP_DF` definitions, `fmfprt.sup`,
|
||||||
|
the rest of `adtsys.sup`; `adtini.sup` differs only in licence lines. `dur.sup` gives
|
||||||
|
`ADTSTO` an adaptive queue (ISS-109, ISS-122).
|
||||||
|
Details are in the sections below, marked "R1.05".
|
||||||
|
|
||||||
AUDIT Service records who changed what and when: value and limit changes, definition inserts /
|
AUDIT Service records who changed what and when: value and limit changes, definition inserts /
|
||||||
modifies / deletes, alarm acknowledgements, logins and logouts. Events are stored in the history
|
modifies / deletes, alarm acknowledgements, logins and logouts. Events are stored in the history
|
||||||
|
|
@ -46,6 +61,11 @@ when `his` is not running, then starts `adtsto -n adtsto` and `adtcol -n adtcol0
|
||||||
`durstp`. Executables in `tls\exe`: `adtsto`, `adtcol`, `adtdst`, `adtlog`, `adtimport`
|
`durstp`. Executables in `tls\exe`: `adtsto`, `adtcol`, `adtdst`, `adtlog`, `adtimport`
|
||||||
(undocumented), `adtxdb` (service debugger, not documented).
|
(undocumented), `adtxdb` (service debugger, not documented).
|
||||||
|
|
||||||
|
**R1.05 (verified 2026-10-09):** same executables and the same two processes running
|
||||||
|
(`ADTSTO`, `ADTCOL01`). At the end `audit_start.cmd` calls every
|
||||||
|
`tls\com\?*_audit_start.cmd`; `audit_stop.cmd` calls every `?*_audit_stop.cmd` before stopping
|
||||||
|
`adt*` (ISS-142).
|
||||||
|
|
||||||
## 3. Event classifiers (§3.1, Appendix 1)
|
## 3. Event classifiers (§3.1, Appendix 1)
|
||||||
|
|
||||||
An event classifier is four names `<SUBJECT>.<ATTRIBUTE>.<ACTION>.<SOURCE>`, e.g.
|
An event classifier is four names `<SUBJECT>.<ATTRIBUTE>.<ACTION>.<SOURCE>`, e.g.
|
||||||
|
|
@ -75,6 +95,17 @@ item/sub-item values, status, quality, limits, deadband, and `DATASET.NULL-ATTR.
|
||||||
the manual: subject `CI-SERVER` (logins; the manual's `F/T-SYSTEM` is the old name), subject/action
|
the manual: subject `CI-SERVER` (logins; the manual's `F/T-SYSTEM` is the old name), subject/action
|
||||||
`EAL OPERATION`, source `VIA-OPC-UAS` (ISS-051).
|
`EAL OPERATION`, source `VIA-OPC-UAS` (ISS-051).
|
||||||
|
|
||||||
|
**R1.05 (verified 2026-10-09):** 499 classifiers, all basic set, 478 stored. New (36, not in the
|
||||||
|
manual, ISS-141): action `PENDING` on `ITEM.VALUE` / `ITEM.STATUS` for sources `HMI`,
|
||||||
|
`LOC-ENG-MOD`, `OPER-INTERFACE`, `OTHERS`, `VIA-OPC-UAS`, `COMPUTE` (the `COMPUTE` pair off), tied
|
||||||
|
in the C header history to Vnet *on send* / *on receive* item update policies; sources
|
||||||
|
`REST-SERVER` (RESTful API), `PYTOOLS` (IM 36K10P40) and `PASSWORD-CHECK` (Edit Module Password
|
||||||
|
Check, IM 36K10C50 §2.31) for `CI-SERVER` login / logout / login attempt and `DATASET`
|
||||||
|
insert / modify / delete, plus `ITEM.VALUE` / `STATUS` / `QUALITY-CODE` `MODIFY` for the first
|
||||||
|
two. Defined in `tls\inc\adt_ece.h` (`ADT_SAC_PEND`, `ADT_SAS_JRST`, `ADT_SAS_PTLS`,
|
||||||
|
`ADT_SAS_PSWD`). Off by default: the 19 `COMPUTE` classifiers of R1.03 plus the two
|
||||||
|
`PENDING.COMPUTE`.
|
||||||
|
|
||||||
**What is actually recorded (verified):** configuration changes and DSS value writes are stored
|
**What is actually recorded (verified):** configuration changes and DSS value writes are stored
|
||||||
as *dataset* events — `SUBJECT_GROUP` = dataset name (`ITEM_DF`, `ITEM_VAL`, `SECTION_DF` …),
|
as *dataset* events — `SUBJECT_GROUP` = dataset name (`ITEM_DF`, `ITEM_VAL`, `SECTION_DF` …),
|
||||||
`SUBJECT_ATTRIBUTE` = field, old and new value, user and source: `ENT-ENG-MOD` for `dssqld`
|
`SUBJECT_ATTRIBUTE` = field, old and new value, user and source: `ENT-ENG-MOD` for `dssqld`
|
||||||
|
|
@ -116,6 +147,10 @@ manual says default and maximum 200 kB; the file sets `QUESIZE = 200`. The `TIME
|
||||||
milliseconds, so the manual is right (ISS-051). Also installed: `adtini.sup` (licence value only),
|
milliseconds, so the manual is right (ISS-051). Also installed: `adtini.sup` (licence value only),
|
||||||
and `fmfprt.sup` assigns the printer function `AUDIT_TRAIL` to `ADTLOG`.
|
and `fmfprt.sup` assigns the printer function `AUDIT_TRAIL` to `ADTLOG`.
|
||||||
|
|
||||||
|
**R1.05 (verified 2026-10-09):** `adtsys.sup` and `adtsys.tpl` add only the `E_LAYOUT` units
|
||||||
|
`APPRR` (approval reason) and `APPR` (approver) (ISS-140); the `QUESIZE` and `TIMEFMT` help texts
|
||||||
|
are unchanged (ISS-051 still applies). `ADTLOG` with the new units not tested.
|
||||||
|
|
||||||
**Verified:** `adtlog -n <name>` run from a console prints new events with the default layout;
|
**Verified:** `adtlog -n <name>` run from a console prints new events with the default layout;
|
||||||
with a setup file `<name>.sup` holding `SEL_GROUP`, `E_LAYOUT`, `TIMEFMT`, `HEADER`,
|
with a setup file `<name>.sup` holding `SEL_GROUP`, `E_LAYOUT`, `TIMEFMT`, `HEADER`,
|
||||||
`HEADER_AFTER` it printed only the selected events in the custom layout (sample
|
`HEADER_AFTER` it printed only the selected events in the custom layout (sample
|
||||||
|
|
@ -137,6 +172,11 @@ names it — the qli export returns 0 records unless `NAME` is in `@FIELDS`; `@S
|
||||||
`LIKE "X.*"`. RQL `select … from audit_trail` works in reports (sample `CIENG_AUDIT`). `ADT`
|
`LIKE "X.*"`. RQL `select … from audit_trail` works in reports (sample `CIENG_AUDIT`). `ADT`
|
||||||
group on the test system: lifetime 52 weeks, rollover 1 day. Task files: skill `audit-trail`.
|
group on the test system: lifetime 52 weeks, rollover 1 day. Task files: skill `audit-trail`.
|
||||||
|
|
||||||
|
**R1.05 (verified 2026-10-09):** `audit_trail.dss` adds `APPROVAL_REASON` (char 256) and
|
||||||
|
`APPROVER` (char 128), select only (ISS-140). An RQL read on the R1.05 test server found them
|
||||||
|
filled on operator item-value writes (`OPER-INTERFACE`), with `REASON` empty. `ADT` group there:
|
||||||
|
52 weeks, 1 day. `dssqld.sup` still has `NO-EXPORT=AUDIT_TRAIL`.
|
||||||
|
|
||||||
## 5. Extending classifiers (§4.3)
|
## 5. Extending classifiers (§4.3)
|
||||||
|
|
||||||
New subjects/attributes/actions/sources are added in C: `#define` codes ≥ `0x80000000` in
|
New subjects/attributes/actions/sources are added in C: `#define` codes ≥ `0x80000000` in
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,17 @@
|
||||||
---
|
---
|
||||||
manual: IM 36K10P10-01EN
|
manual: IM 36K10P10-01EN
|
||||||
title: Class Description Language - Traditional
|
title: Class Description Language - Traditional
|
||||||
edition: 3rd Edition, Sep. 2023
|
edition: 4th Edition, Feb. 2026 (first summarized from the 3rd Edition, Sep. 2023)
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
status: from docs; PROLOG/ATTRIBUTE/PROMPT/ERROR, SIGNAL to an existing item and SIGNAL … FROM … MAKE, TRIGGER VALUE, the SECTION constant, transitional >=:, PRINT and runtime attribute change verified with CI-Eng-Sample class CIENG_TANK on 2026-09-30; everything else from docs
|
status: R1.05 re-check 2026-10-09: manual text unchanged except contact information (full word diff); CIENG_TANK compiled and ran on the R1.05 test server 2026-10-08 (SIGNAL to an existing item, SIGNAL … FROM … MAKE, PROMPT, TRIGGER VALUE). From docs; PROLOG/ATTRIBUTE/PROMPT/ERROR, SIGNAL to an existing item and SIGNAL … FROM … MAKE, TRIGGER VALUE, the SECTION constant, transitional >=:, PRINT and runtime attribute change verified with CI-Eng-Sample class CIENG_TANK on 2026-09-30; everything else from docs
|
||||||
---
|
---
|
||||||
|
|
||||||
# Traditional PROCESS Service language (R1.03)
|
# Traditional PROCESS Service language (R1.05)
|
||||||
|
|
||||||
|
**R1.05 (4th Edition, Feb. 2026):** only contact information was added; a word-by-word diff
|
||||||
|
with the 3rd Edition found no other change. Section numbers are unchanged. The class source
|
||||||
|
template `%TLS_DAT_PATH%\opc_src_tpl.asc` and the user-function sources `tls\src\opc_usr*.c`
|
||||||
|
are identical on R1.03 and R1.05.
|
||||||
|
|
||||||
Summary in own words; section numbers refer to the manual. Engineering of classes and objects:
|
Summary in own words; section numbers refer to the manual. Engineering of classes and objects:
|
||||||
`IM36K10L10-01EN.md` and skill `class-object-engineering`.
|
`IM36K10L10-01EN.md` and skill `class-object-engineering`.
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,39 @@
|
||||||
---
|
---
|
||||||
manual: IM 36K10P11-01EN
|
manual: IM 36K10P11-01EN
|
||||||
title: Class Description Language - Java
|
title: Class Description Language - Java
|
||||||
edition: 3rd Edition, Sep. 2023
|
edition: 4th Edition, Feb. 2026 (first summarized from the 3rd Edition, Sep. 2023)
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
status: from docs; a Java class (attachItemToSignal, createItemForSignal with automatic name, Signal.Trigger.VALUE, signalEvent, systemMessage) compiled on quick load and run on the test system with CI-Eng-Sample class CIENG_JFLOW on 2026-09-30; everything else from docs
|
status: R1.05 re-check 2026-10-09: full word diff (only §10.2 reworded, see below); public API of fasttools.processfast compared with javap (identical to R1.03); JDK version read; CIENG_JFLOW compiled and ran on the R1.05 test server 2026-10-08. From docs; a Java class (attachItemToSignal, createItemForSignal with automatic name, Signal.Trigger.VALUE, signalEvent, systemMessage) compiled on quick load and run on the test system with CI-Eng-Sample class CIENG_JFLOW on 2026-09-30; everything else from docs
|
||||||
---
|
---
|
||||||
|
|
||||||
# Java PROCESS Service language (R1.03)
|
# Java PROCESS Service language (R1.05)
|
||||||
|
|
||||||
|
**R1.05 (4th Edition, Feb. 2026):** the revision table lists only contact information. The
|
||||||
|
word diff shows that §10.2 (*Methods*) was rewritten in plainer English with one real
|
||||||
|
correction: `createSection()` is now described with description, block setting and OPC
|
||||||
|
visibility, without the process areas of the R1.03 text. The examples in §8 (valve,
|
||||||
|
boiler, §8.6 *Create Names*) still pass five arguments (ISS-154). No other change; section numbers unchanged.
|
||||||
|
|
||||||
|
**Installed API (checked 2026-10-09, `javap -public` on `tls\exe\jopcsrv.jar`):** the
|
||||||
|
classes and public methods of `fasttools.processfast` are identical on R1.03 and R1.05.
|
||||||
|
Facts the manual does not state:
|
||||||
|
- `createSection(String path, String description, boolean blocked, boolean opcVisible)`:
|
||||||
|
four arguments on both versions, so the manual's five-argument calls do not match the API
|
||||||
|
(not compile-tested).
|
||||||
|
- Methods not described in P11 (ISS-159): `getHistory(item, from, to, …)` returning
|
||||||
|
`ValueSample[]` (five overloads), `defineIntegerAttributeForPrompt()` and
|
||||||
|
`defineDoubleAttributeForPrompt()` (the manual names only the String version),
|
||||||
|
`sendAndReceiveMessage(ServerAddress, Request, Reply, timeout)` (BUS messages,
|
||||||
|
package `fasttools.processfast.communication`), `getDssSession()` (named in the release
|
||||||
|
notes). Untested.
|
||||||
|
- Java runtime: Eclipse Temurin JDK 11.0.28 on R1.05 (11.0.18 on R1.03) in `tls\jre`; the
|
||||||
|
Java compiler `OPCJCOM` and the executor run on it (Java 11). Class path of the Java processes:
|
||||||
|
`jopcsrv.jar`, `jtoolsclt.jar`, `jtoolslibclt.jar`, `tls\exe\*` and, on R1.05,
|
||||||
|
`tls\exe\lib\*`.
|
||||||
|
- New preinstalled Java classes (R1.04+): `UAC_MTD_JBASE` and `UAS_MTD_JBASE`, samples for
|
||||||
|
OPC UA method objects (attribute `MTD_KEY`, signals `MTD_TRG`, `MTD_RET`,
|
||||||
|
`MTD_IN_ARG_n`, `MTD_OUT_ARG_n`). Described in IM 36K10L45 §10.6 and §11.4, not in P11:
|
||||||
|
see `IM36K10L45-01EN.md` and skill `class-object-engineering`, task `java-class.md` §4.
|
||||||
|
|
||||||
Summary in own words; section numbers refer to the manual. Engineering: `IM36K10L10-01EN.md`,
|
Summary in own words; section numbers refer to the manual. Engineering: `IM36K10L10-01EN.md`,
|
||||||
skill `class-object-engineering`. The full API reference is only in the Engineering Module
|
skill `class-object-engineering`. The full API reference is only in the Engineering Module
|
||||||
|
|
@ -67,8 +94,10 @@ between objects of different priorities. Share data through class-scope attribut
|
||||||
the sections; **the identifier's case is kept** (verified: `CI-Eng-Sample.TANK1.JFLOW.sPerMin`;
|
the sections; **the identifier's case is kept** (verified: `CI-Eng-Sample.TANK1.JFLOW.sPerMin`;
|
||||||
item names are case-sensitive for `itmval`). Framework-created items and sections are
|
item names are case-sensitive for `itmval`). Framework-created items and sections are
|
||||||
deleted with the object (verified) unless *Leave items* is set.
|
deleted with the object (verified) unless *Leave items* is set.
|
||||||
- `createSection(path, description, process areas, blocked, opcVisible)` creates sections
|
- `createSection(path, description, blocked, opcVisible)` creates sections you name
|
||||||
you name yourself; the framework cannot always undo these — prefer automatic names.
|
yourself (R1.03 manual text and the §8 examples add a process-area argument that the
|
||||||
|
installed API does not have, ISS-154); the framework cannot always undo these — prefer
|
||||||
|
automatic names.
|
||||||
- Name helpers: `getTag()`, `getSectionsPath()`, `getSections()`, `getFullIdentifierPath(x)`,
|
- Name helpers: `getTag()`, `getSectionsPath()`, `getSections()`, `getFullIdentifierPath(x)`,
|
||||||
`getContainerIdentifierName()`, `getContainerIdentifierPath()`, `getNode()`.
|
`getContainerIdentifierName()`, `getContainerIdentifierPath()`, `getNode()`.
|
||||||
- Unattached signals: `sig.isAttached()`; most methods throw on an unattached signal.
|
- Unattached signals: `sig.isAttached()`; most methods throw on an unattached signal.
|
||||||
|
|
@ -115,7 +144,8 @@ and for CLASS scope every runtime) — use them for settings, not process values
|
||||||
`super.signalEvent(signal)` etc.; prompts of the super class are kept. A shared base class
|
`super.signalEvent(signal)` etc.; prompts of the super class are kept. A shared base class
|
||||||
(e.g. `BASE_CLASS extends ProcessClass`) holds helper methods; each subclass loads its own
|
(e.g. `BASE_CLASS extends ProcessClass`) holds helper methods; each subclass loads its own
|
||||||
copy (no shared statics). Plain Java code can go in a jar in `%TLS_ROOT_PATH%\tls\exe`; its
|
copy (no shared statics). Plain Java code can go in a jar in `%TLS_ROOT_PATH%\tls\exe`; its
|
||||||
classes must have a package name.
|
classes must have a package name. R1.05 also puts `tls\exe\lib\*` on the class path of
|
||||||
|
the Java processes (bundled libraries).
|
||||||
|
|
||||||
## 7. Runtime behaviour (§10)
|
## 7. Runtime behaviour (§10)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
---
|
---
|
||||||
manual: IM 36K10P20-01EN
|
manual: IM 36K10P20-01EN
|
||||||
title: Report Generation Language
|
title: Report Generation Language
|
||||||
edition: 3rd Edition, Sep. 2023
|
edition: 4th Edition, Feb. 2026 (R1.05); content unchanged since the 3rd Edition, Sep. 2023 (R1.03): the revision table lists contact information only; the full text diff found only the HEADER/FOOTER <position> sentence split in two (§9.12, same meaning)
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
status: SELECT/WHERE/ORDER/GROUP BY, COLUMN, HEADER/FOOTER, SET, IF, LOOP, cursors, SPOOL with @EXPORT, functions (GPV_*, CHAR, DECODE, SUBSTR, NUMBER, DRAW, LINE, LOGBOOK_TEXT, TO_GMT …) and dates verified in the interactive generator and in loaded reports on the test system 2026-10-01; SEND/RECEIVE, BREAK, INCLUDE, FLAG PAGE, SPV_* from docs
|
status: verified on R1.03 (2026-10-01): SELECT/WHERE/ORDER/GROUP BY, COLUMN, HEADER/FOOTER, SET, IF, LOOP, cursors, SPOOL with @EXPORT, functions (GPV_*, CHAR, DECODE, SUBSTR, NUMBER, DRAW, LINE, LOGBOOK_TEXT, TO_GMT …) and dates in the interactive generator and in loaded reports. R1.05 test server (2026-10-09, read-only, interactive generator): SELECT with WHERE on a variable, group functions, DECLARE/OPEN/FETCH/CLOSE, @VERSION and the new ITEM_VAL fields. SEND/RECEIVE, BREAK, INCLUDE, FLAG PAGE, SPV_* from docs
|
||||||
---
|
---
|
||||||
|
|
||||||
# Report Generation Language — RQL (R1.03)
|
# Report Generation Language — RQL (R1.05)
|
||||||
|
|
||||||
RQL is the SQL-like language of REPORT Service. A report definition (`REPORT_DF.QUERY`) is a list
|
RQL is the SQL-like language of REPORT Service. A report definition (`REPORT_DF.QUERY`) is a list
|
||||||
of RQL statements, each ending with `;`. Data comes from datasets (`IM36K10L50-01EN.md`).
|
of RQL statements, each ending with `;`. Data comes from datasets (`IM36K10L50-01EN.md`).
|
||||||
|
|
@ -47,7 +47,8 @@ SELECT [DISTINCT] <expr> [<alias>], … [FROM <dataset> [<alias>], …]
|
||||||
allowed) cannot be mixed with plain columns without GROUP BY and cannot be used in WHERE; put
|
allowed) cannot be mixed with plain columns without GROUP BY and cannot be used in WHERE; put
|
||||||
their result into a variable first (`SELECT SET @max MAX(item_value) FROM …;`).
|
their result into a variable first (`SELECT SET @max MAX(item_value) FROM …;`).
|
||||||
- **Verified:** an alias may appear only once per SELECT (`RPT-E-ALIASSEL`); with no matching
|
- **Verified:** an alias may appear only once per SELECT (`RPT-E-ALIASSEL`); with no matching
|
||||||
rows a group function prints the count 0 and blanks.
|
rows a group function prints the count 0 and blanks. A string literal next to a group function
|
||||||
|
also counts as a plain column (`RPT-E-MIXAGGFNC`, verified R1.05).
|
||||||
- Reading history: `FROM item_history WHERE item_name = '<item>' AND sample_time > @date - 3600`;
|
- Reading history: `FROM item_history WHERE item_name = '<item>' AND sample_time > @date - 3600`;
|
||||||
add `group_name = '<group>'` to read one storage group (else rows of all groups the item is in);
|
add `group_name = '<group>'` to read one storage group (else rows of all groups the item is in);
|
||||||
aggregates with `interpolation = '30Minutes'|'Hour'|…` and `attribute = 'Maximum'|…`
|
aggregates with `interpolation = '30Minutes'|'Hour'|…` and `attribute = 'Maximum'|…`
|
||||||
|
|
@ -101,7 +102,7 @@ Also documented: `ABS`, `ADD_MONTHS`, `ASCII_FILE` (≤ 511 characters), `BAND/B
|
||||||
only with approval).
|
only with approval).
|
||||||
|
|
||||||
System variables: `@DATE`/`@TIME` (now), `@GEN_TIME` (scheduled time of this generation),
|
System variables: `@DATE`/`@TIME` (now), `@GEN_TIME` (scheduled time of this generation),
|
||||||
`@PAGE`, `@LINE`, `@CUSTOMER`, `@VERSION` (`'1.03.00'`), `@NAME`, `@DESCRIPTION`, `@P0`–`@P7`
|
`@PAGE`, `@LINE`, `@CUSTOMER`, `@VERSION` (`'1.03.00'` on R1.03, `'1.05.00'` on R1.05, verified), `@NAME`, `@DESCRIPTION`, `@P0`–`@P7`
|
||||||
(ad-hoc parameters, strings, not available in the interactive generator), `@NEXT` (1 = pause each
|
(ad-hoc parameters, strings, not available in the interactive generator), `@NEXT` (1 = pause each
|
||||||
page in interactive mode), `@WORKSPACE`, `@SORTSPACE`, `@FORMFEED`.
|
page in interactive mode), `@WORKSPACE`, `@SORTSPACE`, `@FORMFEED`.
|
||||||
|
|
||||||
|
|
@ -132,3 +133,12 @@ statement), `QUIT;`, `SHOW [FULL] VARS|COLUMN|CURSOR|HEADER|FOOTER|BREAKS|RESERV
|
||||||
Field names: `dssqld -f -d <DATASET>`, the `.dss` files in `tls\src`, or *Ctrl+Space* in the
|
Field names: `dssqld -f -d <DATASET>`, the `.dss` files in `tls\src`, or *Ctrl+Space* in the
|
||||||
Engineering Module query editor (keywords, datasets, fields). Example in the appendix: current
|
Engineering Module query editor (keywords, datasets, fields). Example in the appendix: current
|
||||||
alarms from `alarm_current` with a header.
|
alarms from `alarm_current` with a header.
|
||||||
|
|
||||||
|
## 9. R1.05 dataset changes that affect queries (installed, not in the manual)
|
||||||
|
|
||||||
|
- `ITEM_VAL` has new fields `ENG_UNIT` (char 8), `SCALE_HIGH_LIMIT`, `SCALE_LOW_LIMIT` (double);
|
||||||
|
accepted by RQL on R1.05 (ISS-126, ISS-167). `ENG_UNIT` matched `ITEM_DF.ENG_UNIT` for the
|
||||||
|
item checked.
|
||||||
|
- New datasets: `ALARM_ATTRIBUTE_TEMP_DF`, `API_KEYS_DF`, `IEC61850_RCB_DF`,
|
||||||
|
`UASERVER_MAPPER_DF`, `OPCUAC_METHOD_CALL2_DF` (the R1.03 `OPCUAC_METHOD_CALL_IN_DF` /
|
||||||
|
`_OUT_DF` are gone). Never query `API_KEYS_DF` (API keys, ISS-168).
|
||||||
|
|
|
||||||
203
knowledge/manuals/IM36K10P40-01EN.md
Normal file
203
knowledge/manuals/IM36K10P40-01EN.md
Normal file
|
|
@ -0,0 +1,203 @@
|
||||||
|
---
|
||||||
|
manual: IM 36K10P40-01EN
|
||||||
|
title: pyTOOLS Programmer's Guide
|
||||||
|
edition: 2nd Edition, Feb. 2026 (R1.05); new in R1.04 (1st Edition, Jan. 2025). Revision table: 2nd edition "layouts updated" only (manual new, no diff against R1.03)
|
||||||
|
version: R1.05
|
||||||
|
status: from docs, plus read-only file checks on the R1.05 test server (2026-10-09) - `dss.pyd`, `DSSSDAPY`, `dss.sup`, `dssana.sup` checked; no Python on the R1.05 test server, so no function was run there (not tested, ISS-178). R1.03 `dss.pyd` loaded on the development machine with Python 3.12 (`version()`, `busGetDirs()` only; CI Server not running)
|
||||||
|
---
|
||||||
|
|
||||||
|
# pyTOOLS Programmer's Guide (R1.05)
|
||||||
|
|
||||||
|
pyTOOLS is a **Python extension module (`dss`)** for scripts that read and change CI Server
|
||||||
|
data through DSS (Data Set Services), exchange BUS Service messages and read item history.
|
||||||
|
The module is the file `%TLS_ROOT_PATH%\tls\exe\dss.pyd`. Section numbers refer to the manual.
|
||||||
|
Practical use: skill `pytools`.
|
||||||
|
|
||||||
|
## 1. Overview and operating environment (§1)
|
||||||
|
|
||||||
|
- Runs on **CI Core and CI Portal**, not on CI View.
|
||||||
|
- Always uses the **local** DSS: a script cannot reach another CI Core by node number (only the
|
||||||
|
item history functions and BUS messages take an optional node number, §3.11, §3.13).
|
||||||
|
- Supported Python: **64-bit Python 3.12** (IM 36K01C10-01EN §1.3.3, coexisting software list;
|
||||||
|
summary `IM36K01C10-01EN.md`). Python is not part of the CI Server installation.
|
||||||
|
|
||||||
|
## 2. Setup (§2)
|
||||||
|
|
||||||
|
1. Install 64-bit Python from python.org on the Core / Portal (run the installer as
|
||||||
|
administrator).
|
||||||
|
2. Add the Windows environment variable `PYTHONPATH` = the `tls\exe` folder of CI Server. The
|
||||||
|
manual gives the default `C:\Program Files (x86)\Yokogawa\CIServer\tls\exe`; use
|
||||||
|
`%TLS_ROOT_PATH%\tls\exe` of the actual installation (on the R1.05 test server the install
|
||||||
|
root is `C:\Yokogawa\CIServer`, ISS-177).
|
||||||
|
3. In Python: `import dss`.
|
||||||
|
|
||||||
|
**Installed (checked 2026-10-09):** the module links `python3.dll` (stable ABI), `buslib64.dll`
|
||||||
|
and `databaselib64.dll` (both in `tls\exe` next to the module), so it is not tied to one Python
|
||||||
|
3.x minor version; Yokogawa only lists 3.12. `dss.pyd` already shipped with R1.03 (module 3.6,
|
||||||
|
r10200M, Aug. 2023, 124,928 bytes; no dedicated DSS server, no *Python Interface* entry in
|
||||||
|
`dssana.sup`); R1.05 has module **3.6.1** (r11609M, Jun. 2026, 137,728 bytes) with session-based
|
||||||
|
logon, the `PY_DSS_NOT_LOGGED_IN` exception and the `aggr_period` history argument (ISS-174).
|
||||||
|
|
||||||
|
## 3. DSS interface (§3)
|
||||||
|
|
||||||
|
### 3.1 Function groups (§3.1)
|
||||||
|
|
||||||
|
Connect/logon, DSS properties, open/close datasets, read, modify, indexing, filtering, locking,
|
||||||
|
event notification, BUS messages, date/time, item history, miscellaneous. All functions take the
|
||||||
|
**connection handle** first (except `version()`, `busGetDirs()`, `busSetName()`, `busSnap()`).
|
||||||
|
|
||||||
|
### 3.2 Connecting (§3.2)
|
||||||
|
|
||||||
|
| Function | Purpose |
|
||||||
|
|---|---|
|
||||||
|
| `dss.connect([user], [password])` | Attach to BUS Service and DSS; returns the connection handle (a dict with the DSS connection id and optionally user/password). With a user, a password is required and a logon is done at once |
|
||||||
|
| `dss.logon(conn, user, password)` | Log on (or switch to another user); a failed logon keeps the old rights |
|
||||||
|
| `dss.logout(conn)` | Log out |
|
||||||
|
| `dss.close(conn)` | Disconnect and free all DSS resources (also logs out) |
|
||||||
|
|
||||||
|
- One connection per script; a second `connect()` raises `PY_DSS_ALREADY_CONN`.
|
||||||
|
- Without a logon DSS gives **no data** (default); a logon without user/password is refused.
|
||||||
|
- The user name is used in the **audit trail**; pyTOOLS operations appear with source
|
||||||
|
`PYTOOLS`. Installed R1.05: `PYTOOLS` audit classifiers exist for login / logout / login
|
||||||
|
attempt, dataset insert / modify / delete and item value / status / quality changes (skill
|
||||||
|
`audit-trail`, `audit-checks.md`, ISS-141).
|
||||||
|
- Server side: pyTOOLS clients have their **own DSS data access server**, so they do not compete
|
||||||
|
with other DSS clients (§3.2 figure). Installed R1.05: `database_start.cmd` starts
|
||||||
|
`dsssda -n dsssdapy`; `dss.sup` routes `DSSSDA_SRV = -1, "PYDSS*", "DSSSDAPY"` (ISS-117).
|
||||||
|
- Login method: `dssana.sup` *User Interfaces* tab has `"Python Interface", "PYDSS"` (audit id 18);
|
||||||
|
*Login control* has `<local>` and `<remote>` → `Manual CI Server` (verified read-only on the
|
||||||
|
R1.05 test server 2026-10-09; R1.03 `dssana.sup` has neither line). J10 §2.9.1: pyTOOLS supports
|
||||||
|
only *Manual CI Server* (summary `IM36K10J10-01EN.md`); what happens with another method is not
|
||||||
|
documented (ISS-179). A pyTOOLS client that is not in the *User Interfaces* list cannot connect
|
||||||
|
(`dssana.sup` help).
|
||||||
|
|
||||||
|
### 3.3 DSS properties (§3.3)
|
||||||
|
|
||||||
|
`getAvailableDatasets(conn)` → list of dataset names; `getFieldNames(conn, dataset)` → list of
|
||||||
|
field names; `getFieldProperties(conn, dataset, field)` → dict `name`, `type`, `length`.
|
||||||
|
(Installed module also has `getDatasetProperties(conn, dataset)`, not in the manual, ISS-176.)
|
||||||
|
|
||||||
|
### 3.4 Open / close (§3.4)
|
||||||
|
|
||||||
|
`ds = dss.openDataset(conn, dataset, fields, mode)` — `fields` is the list of fields of interest
|
||||||
|
(only these are read and can be set); `mode` any of `r`, `u`, `d`, `i`, plus `t` = handle all
|
||||||
|
time fields as UTC (default local civil time). Open the same dataset several times if needed.
|
||||||
|
`dss.closeDataset(conn, ds)` frees it.
|
||||||
|
|
||||||
|
### 3.5 Reading (§3.5)
|
||||||
|
|
||||||
|
| Function | Returns |
|
||||||
|
|---|---|
|
||||||
|
| `readNext(conn, ds)` | Next record (dict field → value) in the order of the active index, honouring an active filter; raises `DSS-E-EOS` at the end |
|
||||||
|
| `readEqual(conn, ds, key)` | The record whose active index equals `key` (string, or dict for a composed index); first match on a non-unique index; filters ignored; the cursor moves past it |
|
||||||
|
| `readRecords(conn, ds)` | List of all records (the manual's "Returns: None" is wrong, ISS-175) |
|
||||||
|
| `rewindDataset(conn, ds)` | Cursor back to the first record |
|
||||||
|
|
||||||
|
### 3.6 Modifying (§3.6)
|
||||||
|
|
||||||
|
`insertRecord` / `insertRecords` (dict or list of dicts; fields not opened get defaults),
|
||||||
|
`updateRecord` / `updateRecords` (must contain the current index field), `deleteRecord(conn, ds,
|
||||||
|
key)`. The dataset must be opened with the matching mode letters (`i`, `u`, `d`). Changes go
|
||||||
|
through DSS like any other client (validation, audit trail).
|
||||||
|
|
||||||
|
### 3.7 Indexing (§3.7)
|
||||||
|
|
||||||
|
`getIndex(conn, dataset)` → index names (e.g. `STATUS_DF`: `NAME`, `STATUS_NUMBER`);
|
||||||
|
`setIndex(conn, ds, index_name)` changes the active index and thus the read order and the key
|
||||||
|
used by `readEqual`. Default: the primary index.
|
||||||
|
|
||||||
|
### 3.8 Filtering (§3.8)
|
||||||
|
|
||||||
|
`createFilter(conn, ds, expr)` → `activateFilter` → reads → `deactivateFilter` → `deleteFilter`
|
||||||
|
(an active filter cannot be deleted; one filter per open dataset). Expression: either a quoted
|
||||||
|
wildcard string (`"*.TANK1.*"`, applied to the current index field; `*` any string, `?` one
|
||||||
|
character), or comparisons `<field> <op> <constant>` with `= != < <= > >= LIKE`, joined by `AND` /
|
||||||
|
`OR`, brackets allowed. String constants are case-sensitive and in double quotes (so wrap the
|
||||||
|
whole expression in single quotes in Python); field names and operators are not; spaces around
|
||||||
|
operators are required; maximum 252 characters.
|
||||||
|
|
||||||
|
### 3.9 Locking (§3.9)
|
||||||
|
|
||||||
|
`lockRecords(conn, ds, [keys])` / `unlockRecords(...)` — other CI Server processes cannot change
|
||||||
|
or delete a locked record; locking an already locked record raises an exception.
|
||||||
|
|
||||||
|
### 3.10 Event notification (§3.10)
|
||||||
|
|
||||||
|
- Dataset level: `datasetEventNotify(conn, ds, mode)` with `i`, `u`, `d`; stop with
|
||||||
|
`datasetEventStop(conn, ds)`.
|
||||||
|
- Record level: `recordEventNotify(conn, ds, key, mode)` with `u`, `d`; stop with
|
||||||
|
`recordEventStop(conn, ds, key)`.
|
||||||
|
- Poll with `eventRead(conn)` → list of dicts `ds_name`, `event` (`i`/`u`/`d`), `id` (running
|
||||||
|
number), `record` (record after the change), `set_hnd`. Empty list when nothing happened.
|
||||||
|
- One queue per client; DSS **clears the queue when it overflows** (size from the DSS setup
|
||||||
|
file — `EVENT_Q_SLOTS` in `dss.sup`, default 100, ISS-181), so poll often enough.
|
||||||
|
- Overlapping requests give one event; a record can only have one request — stop it before
|
||||||
|
changing the mode (`PY_DSS_EVT_NOTIFY_DEF`).
|
||||||
|
|
||||||
|
### 3.11 BUS Service messages (§3.11)
|
||||||
|
|
||||||
|
- The script attaches to the BUS as `PYDSS_<number>` (new each run). To be addressable, call
|
||||||
|
`dss.busSetName('<NAME>')` **before** `connect()`, every time. (Installed `dss.sup` routes only
|
||||||
|
`PYDSS*` clients to `DSSSDAPY`; a script with its own name probably uses a general `DSSSDA`,
|
||||||
|
not checked, ISS-180.)
|
||||||
|
- `busSend(conn, {'process':…, 'node':…, 'code':…, 'message':…})` (node and code optional;
|
||||||
|
message always a string); `busSendReceive` waits up to 60 s for the reply (dict with
|
||||||
|
`message`); `busReceive(conn[, 'SYNC_WAIT'])` → dict (`process`, `node`, `reply`, `sys_type`,
|
||||||
|
`code`, `message`) or `None`; `busReply(conn, msg)` must answer within 60 s, passing `reply` and
|
||||||
|
`sys_type` back unchanged.
|
||||||
|
- `durstp -p <name>` stops a named pyTOOLS script: the script gets `dss.error` with code
|
||||||
|
`PY_DSS_STOP_REQUEST` and should close and exit.
|
||||||
|
- `busSnap('GENERAL'|'QUEUE'|'NODE'|'LOCK')` takes a snapshot, then `busSnap('FIRST')` /
|
||||||
|
`busSnap('NEXT')` return the entries (`None` at the end). Local node only (on a Portal you see
|
||||||
|
the Portal).
|
||||||
|
|
||||||
|
### 3.12 Date and time (§3.12)
|
||||||
|
|
||||||
|
- DSS time = seconds since 1970-01-01 as a float with milliseconds.
|
||||||
|
- `dateString(conn, t[, fmt])` → text; tokens `YYYY YY MMM MM M DDD DD D hh mm ss p…pppp`;
|
||||||
|
presets `ANSI`, `JULIAN`, `EUROPE`, `GENERAL`; default `DD-MMM-YY hh:mm:ss`.
|
||||||
|
- `dateDSS(conn, 'dd-mmm-yy hh:mm:ss.ppp')` → DSS time (missing date or time = now);
|
||||||
|
`dateRelDSS(conn, '[-]days,[+|-]hh:mm…')` → relative to now (e.g. `-1:00` one hour ago,
|
||||||
|
`-1,08:00` yesterday 08:00).
|
||||||
|
- `dateConvert(conn, t, 'GMT_TO_LCT' | 'GMT_TO_LST' | 'LCT_TO_GMT' | 'LST_TO_GMT' | 'LCT_TO_LST' |
|
||||||
|
'LST_TO_LCT')`. LST = standard time, LCT = with daylight saving.
|
||||||
|
- Interval fields (e.g. `REPORT_DF.LIFE_TIME`) are `<count>.<unit>`: `.0` s, `.1` min, `.2` h,
|
||||||
|
`.3` days, `.4` weeks, `.5` months, `.6` years (same as `dssutl`, skill `system-management`).
|
||||||
|
|
||||||
|
### 3.13 Item history (§3.13)
|
||||||
|
|
||||||
|
Two functions bypass DSS and ask ITEM Service directly (faster than reading `ITEM_HISTORY`):
|
||||||
|
|
||||||
|
- `getHisGroupItems(conn, group[, node])` → item names in a storage group.
|
||||||
|
- `getItemHistory(conn, item, group, start, end, max_sample[, node=, interval=, attribute=,
|
||||||
|
aggr_period=])` → list of tuples `(time, value, status, option_bits, quality)`; the list ends
|
||||||
|
with `None` when the period is complete, otherwise call again with the last time as start.
|
||||||
|
`interval` = interpolation step in **ms**; `attribute` = `VALUE` (default), `DEADBAND`,
|
||||||
|
limits, `SCALE_LOW/HIGH`, or for aggregation groups `AGGR_MAX`, `AGGR_MIN`, `AGGR_AVERAGE`,
|
||||||
|
`AGGR_INTG`, `AGGR_COUNT`, `AGGR_STDV`, `AGGR_DFMS`; `aggr_period` = `30_MINUTES`, `HOUR`,
|
||||||
|
`SHIFT`, `DAY`, `WEEK`, `MONTH`, `YEAR` (only periods configured in the group). The manual's
|
||||||
|
parameter list omits `item` (ISS-175).
|
||||||
|
|
||||||
|
### 3.14 Miscellaneous (§3.14)
|
||||||
|
|
||||||
|
`getErrorStack(conn)` (UMH stack as `[code, text]` pairs), `version()`, `busGetDirs()` (dict of
|
||||||
|
`TLS_*` folders; installed also returns `TLS_WAP`, `TLS_LOG`), `readSetup(conn, 'dur')` (setup
|
||||||
|
file without `.sup` as list of `[keyword, args…]`), `logMessage(conn, text)` (max 200 characters
|
||||||
|
to the CI Server message log), `umhLog(conn)`.
|
||||||
|
|
||||||
|
## 4. Exceptions (§4)
|
||||||
|
|
||||||
|
One exception class, `dss.error`, with `args = (code, message)`:
|
||||||
|
- **CI Server errors**: the last UMH message, e.g. `DSS-E-EOS` (end of dataset — the normal way
|
||||||
|
to end a `readNext` loop), `VIS-W-DUPLICATE` (insert of an existing key).
|
||||||
|
- **Module errors** `PY_DSS_*`: `ALREADY_CONN`, `DS_IS_CLOSED`, `EVT_NOTIFY_DEF`, `FLT_DEF`,
|
||||||
|
`FLT_NOT_ACTIV`, `FLT_NOT_FOUND`, `FLT_TOO_LONG` (manual misprints `FLY`), `MISG_IDX`,
|
||||||
|
`NO_CHAN_OPEN`, `NO_EVT_DEF`, `NOT_CONN`, `NOT_LOGGED_IN`, `UNK_ERR`, `UNK_FLD`, `UNK_FLD_TYPE`;
|
||||||
|
the installed module has more (ISS-176).
|
||||||
|
|
||||||
|
## Notes on the manual
|
||||||
|
|
||||||
|
The examples are carried over from an old Python 2 version (`101L` long integers, an old module
|
||||||
|
version string, a `FastTools` install path) and contain typos (e.g. `readEqual(con, dss, …)`
|
||||||
|
instead of the dataset handle, `msg`/`mesg` mixed up). They use `dss.connect('admin','')`; on a
|
||||||
|
real system use a CI Server user with only the rights the script needs. Details: ISS-175.
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
---
|
---
|
||||||
manual: IM 36K10R40-01EN
|
manual: IM 36K10R40-01EN
|
||||||
title: Report Server Setup
|
title: Report Server Setup
|
||||||
edition: 3rd Edition, Sep. 2023
|
edition: 4th Edition, Feb. 2026 (R1.05); content unchanged since the 3rd Edition, Sep. 2023 (R1.03): the revision table lists contact information only; the full text diff found only wording in §1 ("block", "REPORT Service" for "RPT")
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
status: processes, start/stop scripts, rptman.sup and the generator set-up files checked on the test system; interactive generator and rptstp verified 2026-10-01; separate server processes, extra generators and custom destinations from docs
|
status: R1.03: processes, start/stop scripts, rptman.sup and the generator set-up files checked; interactive generator and rptstp verified 2026-10-01. R1.05 test server (2026-10-09, read-only): processes, rptman.sup and .rpt files (identical to R1.03), start/stop scripts (new extension-script call) and the interactive generator verified; rptstp not re-tested. Separate server processes, extra generators and custom destinations from docs
|
||||||
---
|
---
|
||||||
|
|
||||||
# Report Server Setup (R1.03)
|
# Report Server Setup (R1.05)
|
||||||
|
|
||||||
How REPORT Service is built and configured. Writing reports: `IM36K10P20-01EN.md` (RQL) and
|
How REPORT Service is built and configured. Writing reports: `IM36K10P20-01EN.md` (RQL) and
|
||||||
`IM36K10C30-01EN.md` (Engineering Module). Section numbers refer to the manual.
|
`IM36K10C30-01EN.md` (Engineering Module). Section numbers refer to the manual.
|
||||||
|
|
@ -24,6 +24,10 @@ Default layout (installed): one node, servers linked into `rptgen`; `report_star
|
||||||
`tls\com`) refuses to start when HISTORY Service is not running, then starts `rptman` and
|
`tls\com`) refuses to start when HISTORY Service is not running, then starts `rptman` and
|
||||||
`rptgen -n rptge1`. The separate `rpi*` lines and a second generator (`rptge2`) and `rptgsp`
|
`rptgen -n rptge1`. The separate `rpi*` lines and a second generator (`rptge2`) and `rptgsp`
|
||||||
are present but commented out. `report_stop.cmd` stops `rpt*` and `rpi*` with `durstp`.
|
are present but commented out. `report_stop.cmd` stops `rpt*` and `rpi*` with `durstp`.
|
||||||
|
**R1.05 (installed, not in the manual):** `report_start.cmd` finally calls every
|
||||||
|
`tls\com\?*_report_start.cmd`, and `report_stop.cmd` first calls every `?*_report_stop.cmd`
|
||||||
|
(extension scripts, ISS-121); otherwise unchanged. `rptman.sup`, `rptge1.rpt`, `rptgen.rpt` and
|
||||||
|
`rptgsp.rpt` are byte-identical to R1.03 (verified 2026-10-08/09).
|
||||||
Full functionality needs BUS, DATABASE, HISTORY, ITEM, AUDIT, PROCESS Services and INTEGRATION.
|
Full functionality needs BUS, DATABASE, HISTORY, ITEM, AUDIT, PROCESS Services and INTEGRATION.
|
||||||
|
|
||||||
## 2. Setup files (§2.2)
|
## 2. Setup files (§2.2)
|
||||||
|
|
@ -75,3 +79,7 @@ report of `RPTGE1` (also the *Cancel* button / `REPORT_DF.CANCEL`).
|
||||||
`SET @NEXT 0;` first or every page waits for Enter. `rptstp rptge1` stopped an endless loop
|
`SET @NEXT 0;` first or every page waits for Enter. `rptstp rptge1` stopped an endless loop
|
||||||
report within seconds; `GENERATE` went back to 0, an empty generated report was stored, the
|
report within seconds; `GENERATE` went back to 0, an empty generated report was stored, the
|
||||||
generator stayed running and took the next report normally. Task: skill `reporting`.
|
generator stayed running and took the next report normally. Task: skill `reporting`.
|
||||||
|
|
||||||
|
**Verified on R1.05 (2026-10-09, read-only):** a piped query file starting with
|
||||||
|
`SET @NEXT 0; SET @PAGE_SIZE 0;` and ending with `QUIT;` ran and ended normally; `@VERSION` =
|
||||||
|
`1.05.00`. `rptstp` not re-tested (shared server).
|
||||||
|
|
|
||||||
|
|
@ -52,18 +52,18 @@ screenshot.
|
||||||
| `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 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. |
|
| `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. |
|
| `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 (R1.04; 2nd ed. layout only) | written (from docs) | 2026-10-09: SKILL.md + 5 tasks (setup and first script, items and history, filter/index, events, modify) and the P40 summary. Verified read-only on R1.05: `dss.pyd` 3.6.1, DSSSDAPY, `dss.sup` routing, *Python Interface* login lines. **Not tested:** every function (no Python on the R1.05 test server, ISS-178). **Awaiting user verification:** V17. ISS-174–181. |
|
||||||
| `graphics` | C50, C60, R30; unlisted: Generic Functions rename, enterprise on the HTML display, R30 §4.10 restrictions | re-checked (from docs) | 2026-10-08: full diff, skill and summaries moved to R1.05. No display or layout touched on the shared server. **Awaiting user verification:** installed-file comparison, `jwuiutl --help`, web trend pen limit (V5; ISS-092, 094, 096, 097). **Not tested:** enterprise HTML display, RDP Connect, Password Check, custom acknowledgement (ISS-093, 098, 099). |
|
| `graphics` | C50, C60, R30; unlisted: Generic Functions rename, enterprise on the HTML display, R30 §4.10 restrictions | re-checked (from docs) | 2026-10-08: full diff, skill and summaries moved to R1.05. No display or layout touched on the shared server. **Awaiting user verification:** installed-file comparison, `jwuiutl --help`, web trend pen limit (V5; ISS-092, 094, 096, 097). **Not tested:** enterprise HTML display, RDP Connect, Password Check, custom acknowledgement (ISS-093, 098, 099). |
|
||||||
| `history-management` | C40 §4.2 (REST API, pyTOOLS; C API dropped); L20, L35 wording only | re-checked (from docs and file hashes) | 2026-10-08: history setup files and dataset definitions identical to R1.03; REST/pyTOOLS cross-linked to `data-access` / P40. **Awaiting user verification:** `hisdbg` read-only options and the changed start scripts (V6; ISS-100, 101). **Not tested:** storage groups, aggregation, `ITEM_HISTORY` reads (restart needed, ISS-103); archive. Note: `tlsdnetapi.dll` (.NET API) is no longer in `tls\exe` on R1.05. |
|
| `history-management` | C40 §4.2 (REST API, pyTOOLS; C API dropped); L20, L35 wording only | re-checked (from docs and file hashes) | 2026-10-08: history setup files and dataset definitions identical to R1.03; REST/pyTOOLS cross-linked to `data-access` / P40. **Awaiting user verification:** `hisdbg` read-only options and the changed start scripts (V6; ISS-100, 101). **Not tested:** storage groups, aggregation, `ITEM_HISTORY` reads (restart needed, ISS-103); archive. Note: `tlsdnetapi.dll` (.NET API) is no longer in `tls\exe` on R1.05. |
|
||||||
| `portal-setup` | R10 §3.1 ISO, §3.3; R20 punctuation only | re-checked (read-only) | 2026-10-08: setup-file reads, web ports 8080/8443, Remote Connect page, security headers and CSP verified on R1.05; new `jwuiisg.sup` keywords and `dur.sup` gateway core documented (ISS-108–111). **Awaiting user verification:** Setup File Editor GUI (V7; ISS-112, 113). **Not tested:** separate CI Portal node, gateway core, setup-file changes (shared server), CSP effect on displays. |
|
| `portal-setup` | R10 §3.1 ISO, §3.3; R20 punctuation only | re-checked (read-only) | 2026-10-08: setup-file reads, web ports 8080/8443, Remote Connect page, security headers and CSP verified on R1.05; new `jwuiisg.sup` keywords and `dur.sup` gateway core documented (ISS-108–111). **Awaiting user verification:** Setup File Editor GUI (V7; ISS-112, 113). **Not tested:** separate CI Portal node, gateway core, setup-file changes (shared server), CSP effect on displays. |
|
||||||
| `system-management` | J10 §2.9.1, new §3.2.6 gateway (unlisted), §5.1; L30 wording; L50 dataset rename; P30 none | re-checked (read-only) | 2026-10-08: exports, filters, `-f`, `dsschk -e -v`, `durwfp`, `umhman`, `itmval -g`, `itmdbg`, DSS compiler check re-tested on R1.05; `dssqld -i/-r`, `itmval -p` from the sample test (V4). ISS-116–123. **Awaiting user verification:** `ithloahis` (needs the full sample with history), start-script hooks (V8; ISS-121). **Not tested:** monitoring processes, gateway core. |
|
| `system-management` | J10 §2.9.1, new §3.2.6 gateway (unlisted), §5.1; L30 wording; L50 dataset rename; P30 none | re-checked (read-only) | 2026-10-08: exports, filters, `-f`, `dsschk -e -v`, `durwfp`, `umhman`, `itmval -g`, `itmdbg`, DSS compiler check re-tested on R1.05; `dssqld -i/-r`, `itmval -p` from the sample test (V4). ISS-116–123. **Awaiting user verification:** `ithloahis` (needs the full sample with history), start-script hooks (V8; ISS-121). **Not tested:** monitoring processes, gateway core. |
|
||||||
| `item-engineering` | C10 §2.2; unlisted: C10 §1.1 Tools menu, string length 200 bytes (C10, G10); G10 §9.2, ch. 14–15 | re-checked (read-only) | 2026-10-08: item/section/sub-item definitions and `itm.sup` identical to R1.03; `ITEM_VAL` has 3 new fields (ISS-126); sample items and sub-items loaded and worked on R1.05 (V4). **Awaiting decision:** blocking and string writes on the shared server (V9; ISS-129). **Not tested:** G10 ch. 14–15 (no CENTUM VP, ISS-127). |
|
| `item-engineering` | C10 §2.2; unlisted: C10 §1.1 Tools menu, string length 200 bytes (C10, G10); G10 §9.2, ch. 14–15 | re-checked (read-only) | 2026-10-08: item/section/sub-item definitions and `itm.sup` identical to R1.03; `ITEM_VAL` has 3 new fields (ISS-126); sample items and sub-items loaded and worked on R1.05 (V4). **Awaiting decision:** blocking and string writes on the shared server (V9; ISS-129). **Not tested:** G10 ch. 14–15 (no CENTUM VP, ISS-127). |
|
||||||
| `alarm-management` | none | not started | |
|
| `alarm-management` | none listed; unlisted E30 KPI labels and corrected chart (ISS-132) | re-checked (read-only) | 2026-10-09: setup files, templates and definitions identical to R1.03 except the start-script hooks, `alnsms.sup` defaults (ISS-134) and internal `ALARM_ATTRIBUTE_TEMP_DF` (ISS-133); `almdbg`/`alhdbg` read-only, ALH 52 weeks default (ISS-135); load rule for the shared server (ISS-136). **Awaiting user verification:** alarm raise/ack/delay/repeat, INFO event (V10). **Not tested:** external alarms, notification, shelving, ASPA GUI, custom acknowledgement. |
|
||||||
| `audit-trail` | none | not started | To include: `AUDIT_TRAIL` `APPROVAL_REASON` / `APPROVER` from custom alarm acknowledgement (ISS-099). |
|
| `audit-trail` | none (full diff clean) | re-checked (read-only) | 2026-10-09: processes, ADT group, 499 classifiers (36 new, ISS-141), definitions, setup files and scripts compared; RQL read of `AUDIT_TRAIL`; `APPROVAL_REASON`/`APPROVER` present and filled (ISS-140); hooks (ISS-142). **Awaiting user verification:** ADTLOG with the new units, selection on approval fields, custom acknowledgement record (V11). **Not tested:** PENDING (no Vnet), classifier STORAGE change. |
|
||||||
| `authorization` | none (new `dss_ath_grp_u0104` loader) | not started | To include: `AUTH_GROUP_DF` now has `ACTION_NAME_1…250` (was 200); Password Check login method (ISS-098); `CI_NO_LOGIN` wording (ISS-125); RESTful API / pyTOOLS login methods (J10 §2.9.1). |
|
| `authorization` | none (J40 contact info only; C10 §2 `CI_NO_LOGIN`) | re-checked (read-only) | 2026-10-09: `dssana.sup` all tabs, USER/AUTH/SCHEME/API_KEYS definitions, 203 actions (ISS-146), 250 action fields and upgrade tool (ISS-147), new login interfaces (ISS-148), API keys (ISS-151), AD/SSO files (ISS-153). **Awaiting user verification:** `MAX_UI_PER_CLIENT` (V16), *Add API Key* GUI, users/groups and ISS-072/073 on a non-shared system (ISS-152). **Not tested:** AD, SPNEGO, upgrade merge (ISS-149). |
|
||||||
| `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). |
|
| `class-object-engineering` | none listed; unlisted P11 §10.2 `createSection` fix (ISS-154) | re-checked (read-only) | 2026-10-09: definitions, `opc.sup`, `prc.sup`, templates and public Java API identical; Java 11.0.28, `tls\exe\lib`, hooks (ISS-156); OPC UA method system classes preinstalled (ISS-155); undocumented Java methods (ISS-159); `opcdbg` database check and OPCEXE1 info OK. **Awaiting user verification:** `OPCJEXE` statistics (V14). **Awaiting decision:** change/reset class re-test (V15). 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 (J20 contact info only) | re-checked (read-only) | 2026-10-09: HAC files compared (ISS-161), activate/deactivate hooks (ISS-160), A50 PubSub precaution (ISS-162); `hac-checks` read-only on R1.05 (single server). **Not tested:** redundant pair, switchover, mirror, history merge, recovery, journaling (no licensed pair). |
|
||||||
| `reporting` | none (E10 item filter text unlisted) | not started | To include: new `ITEM_VAL` fields for RQL (ISS-126); E10 item search filters. |
|
| `reporting` | none listed (E10 one sentence removed, ISS-166) | re-checked (read-only) | 2026-10-09: report definitions, setup and `.rpt` files identical; hooks (ISS-121); 28 system reports, 6 factory destinations; interactive RQL re-run, new `ITEM_VAL` fields (ISS-126, 167); `API_KEYS_DF` not queried (ISS-168). **Awaiting user verification:** generate/print/delete, item trigger, `rptstp`, SPOOL (V12). **Not tested:** Excel Add-in (no Office), report component, hardcopy printers. |
|
||||||
| `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. |
|
| `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
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,12 @@ Close every form with *Cancel*.
|
||||||
| Separate CI Portal node, gateway core, setup-file changes, CSP effect on displays | Single node, no gateway licence, shared server | skills `portal-setup`, `system-management`, ISS-111, 116 |
|
| Separate CI Portal node, gateway core, setup-file changes, CSP effect on displays | Single node, no gateway licence, shared server | skills `portal-setup`, `system-management`, ISS-111, 116 |
|
||||||
| Monitoring processes (`int*mon`) | Starting processes on the shared server | skill `system-management` |
|
| Monitoring processes (`int*mon`) | Starting processes on the shared server | skill `system-management` |
|
||||||
| CENTUM VP virtual test, HIS-TSE connection (G10 ch. 14–15) | No CENTUM VP, no `tls\vagw` | G10 summary, ISS-127 |
|
| CENTUM VP virtual test, HIS-TSE connection (G10 ch. 14–15) | No CENTUM VP, no `tls\vagw` | G10 summary, ISS-127 |
|
||||||
|
| HAC: redundant pair, switchover, mirror, history merge, recovery, journaling | Single server, no HAC licence | skill `high-availability`, ISS-160 |
|
||||||
|
| External alarms (EAL, OPC UA, CENTUM VP), alarm e-mail/SMS, shelving, ASPA GUI | No external system, modem or ASPA use on the shared server | skill `alarm-management`, ISS-134 |
|
||||||
|
| Audit `PENDING` action | Needs Vnet update policies | skill `audit-trail`, ISS-141 |
|
||||||
|
| Active Directory, SPNEGO / SSO, upgrade merge of `dssana.sup` | No domain, no upgrade | skill `authorization`, ISS-149, 153 |
|
||||||
|
| Excel Add-in | No Office on the R1.05 test server | skill `reporting` |
|
||||||
|
| pyTOOLS (every function) | No Python on the R1.05 test server | skill `pytools`, ISS-178 |
|
||||||
|
|
||||||
## Awaiting user verification
|
## Awaiting user verification
|
||||||
|
|
||||||
|
|
@ -120,6 +126,22 @@ Needs a decision: temporary sample items on the shared server, block/unblock wit
|
||||||
`itmval -p` with and without `-o`, a 120-character write to a string item of length 100
|
`itmval -p` with and without `-o`, a 120-character write to a string item of length 100
|
||||||
(expected 99 characters, status 12); remove everything afterwards.
|
(expected 99 characters, status 12); remove everything afterwards.
|
||||||
|
|
||||||
|
### V10–V17 (batch 3, 2026-10-09)
|
||||||
|
|
||||||
|
Exact steps are in the task files named; all need a non-shared R1.05 system or the user's
|
||||||
|
approval on the shared one, unless marked read-only.
|
||||||
|
|
||||||
|
| # | Skill / task | What | Kind |
|
||||||
|
|---|---|---|---|
|
||||||
|
| V10 | `alarm-management` `item-alarming.md` §2–5, `alarm-checks.md` §4 | Alarm raise, acknowledge, delay/repeat on a temporary sample item; INFO event (`almdbg` 16) | writes, approval |
|
||||||
|
| V11 | `audit-trail` `configure-audit.md`, `read-audit-trail.md` §1a | ADTLOG with `APPRR`/`APPR`; selection expression on `appr`; custom acknowledgement record | admin / writes, approval |
|
||||||
|
| V12 | `reporting` `define-reports.md`, `report-checks.md`, `rql-interactive.md` §3 | Generate / print / delete with the sample, item trigger, `rptstp`, SPOOL to CSV; ISS-167 and ISS-168 tests | writes, approval |
|
||||||
|
| V13 | `authorization` `users-groups.md` | Users/groups load and remove, ISS-072/073 re-test; *Add API Key* GUI (look only) | non-shared system |
|
||||||
|
| V14 | `class-object-engineering` `opcdbg-checks.md` | `opcdbg 0 4`, Enter, `OPCJEXE`, `1`, `-1` twice, interactively (ISS-157) | read-only |
|
||||||
|
| V15 | `class-object-engineering` `change-reset-class.md` | Change/reset class re-test with the sample (ISS-158) | writes, approval |
|
||||||
|
| V16 | `authorization` `login-methods.md` | Was `MAX_UI_PER_CLIENT` in `dssana.sup` changed by hand on the test server? (ISS-150) | question |
|
||||||
|
| V17 | `pytools` `setup-first-script.md` §5 | Python 3.12 64-bit on a test Core, `import dss`, first read-only script, `PY_DSS_NOT_LOGGED_IN` check (ISS-178) | test Core with Python |
|
||||||
|
|
||||||
### V4. CI-Eng-Sample on the R1.05 test server: **reduced load tested 2026-10-08**
|
### V4. CI-Eng-Sample on the R1.05 test server: **reduced load tested 2026-10-08**
|
||||||
|
|
||||||
The user approved a reduced load (no history group, no user `CIENG`, no layouts/displays) that
|
The user approved a reduced load (no history group, no user `CIENG`, no layouts/displays) that
|
||||||
|
|
|
||||||
|
|
@ -74,17 +74,17 @@ every R1.04 edit, so each of these was also compared word by word with its R1.03
|
||||||
|
|
||||||
| Manual | Unlisted changes found by the text diff |
|
| Manual | Unlisted changes found by the text diff |
|
||||||
|---|---|
|
|---|---|
|
||||||
| E10 Excel Add-in | Item search: new description of the *Item Filter* / *Description Filter* boxes and wildcards (`*` default; both filters combine with AND); a CI Portal SSL note moved |
|
| E10 Excel Add-in | §3 no longer says the Connection Manager shows `localhost` first and then the last server used. (The item-filter text first listed here only moved between pages: corrected 2026-10-09, ISS-166.) |
|
||||||
| E30 Alarm System Performance Analysis | KPI grid: the KPI charts now have labels (*In Time*, *Too Late*, *Not Ackn*, *Nuisance*) |
|
| E30 Alarm System Performance Analysis | §3.2 KPI grid: the charts now have labels (*In Time*, *Too Late*, *Not Ackn*, *Nuisance*) and the third chart is corrected to alarms **not** acknowledged in the period (ISS-132) |
|
||||||
| L30 BUS Service | `durwfp` return value reworded (1 = process attached/running, 0 = otherwise); same meaning |
|
| L30 BUS Service | `durwfp` return value reworded (1 = process attached/running, 0 = otherwise); same meaning |
|
||||||
| P11 Java class language | §10.2 methods reworded; same meaning |
|
| P11 Java class language | §10.2 reworded, with one real fix: `createSection()` is described without the process-area argument; the §8 examples still pass it (ISS-154) |
|
||||||
| P20 RQL | Footer `<position>` sentence split in two; same meaning |
|
| P20 RQL | Footer `<position>` sentence split in two; same meaning |
|
||||||
| L40, R20, R40, C30, L35, J40 | Spacing, punctuation, titles only |
|
| L40, R20, R40, C30, L35, J40 | Spacing, punctuation, titles only |
|
||||||
| C20, J20, L10, L15, L20, L25, L36, P10, P30 | None |
|
| C20, J20, L10, L15, L20, L25, L36, P10, P30 | None |
|
||||||
|
|
||||||
Skills based only on these manuals still need a quick re-test on R1.05 (installed files may
|
Skills based only on these manuals still need a quick re-test on R1.05 (installed files may
|
||||||
differ), but their content is expected to hold. The E10 and E30 changes go into the
|
differ), but their content is expected to hold. All of them were re-checked in batches 2 and 3
|
||||||
`reporting` and `alarm-management` re-checks.
|
(2026-10-08/09).
|
||||||
|
|
||||||
**Unlisted changes found in the second re-check batch (2026-10-08):**
|
**Unlisted changes found in the second re-check batch (2026-10-08):**
|
||||||
|
|
||||||
|
|
@ -100,6 +100,8 @@ differ), but their content is expected to hold. The E10 and E30 changes go into
|
||||||
|
|
||||||
**Installed-software changes with no manual text** (see the issues): `dur.sup` `gateway_core` and `ADTSTO` adaptive queue (ISS-109, 122); `jwuiisg.sup` redirect, whitelisting, cache keywords, security headers and CSP (ISS-110, 111); DSS processes `DSSSDARST` / `DSSSDAPY` and `dss.sup` queue sizes (ISS-117); start-script extension hooks `?*_<script>.cmd` (ISS-121); `ITEM_VAL` fields `ENG_UNIT`, `SCALE_HIGH_LIMIT`, `SCALE_LOW_LIMIT` (ISS-126); `AUTH_GROUP_DF` up to 250 actions; `tlsdnetapi.dll` no longer installed.
|
**Installed-software changes with no manual text** (see the issues): `dur.sup` `gateway_core` and `ADTSTO` adaptive queue (ISS-109, 122); `jwuiisg.sup` redirect, whitelisting, cache keywords, security headers and CSP (ISS-110, 111); DSS processes `DSSSDARST` / `DSSSDAPY` and `dss.sup` queue sizes (ISS-117); start-script extension hooks `?*_<script>.cmd` (ISS-121); `ITEM_VAL` fields `ENG_UNIT`, `SCALE_HIGH_LIMIT`, `SCALE_LOW_LIMIT` (ISS-126); `AUTH_GROUP_DF` up to 250 actions; `tlsdnetapi.dll` no longer installed.
|
||||||
|
|
||||||
|
Batch 3 (2026-10-09): `AUDIT_TRAIL` `APPROVAL_REASON` / `APPROVER` and E_LAYOUT units (ISS-140); 36 new audit classifiers incl. `PENDING`, `REST-SERVER`, `PYTOOLS`, `PASSWORD-CHECK` (ISS-141); 3 new authorization actions `UA_MAPPER_PROJECT_*` (ISS-146); `dss_ath_grp_u0104` is a database upgrade tool run once by `database_start.cmd`, not a loader (ISS-147); `dssana.sup` user interfaces *RESTful API Server*, *Python Interface*, *Password Check Function* (ISS-148); `API_KEYS_DF` holds no key values (ISS-151); internal `ALARM_ATTRIBUTE_TEMP_DF` (ISS-133); `alnsms.sup` defaults (ISS-134); OPC UA method system classes `UAC_MTD_JBASE` / `UAS_MTD_JBASE` (ISS-155); Java runtime 11.0.28 (ISS-156); extension hooks also in alarm, audit, process, report and HAC scripts (ISS-121, 142, 160); `dss.pyd` pyTOOLS module 3.6.1 (ISS-174).
|
||||||
|
|
||||||
**Method for every manual re-check:** do not rely on the revision table or the release notes.
|
**Method for every manual re-check:** do not rely on the revision table or the release notes.
|
||||||
Run `python tools/manual_diff.py <R1.03 doc\EN> <R1.05 doc\EN> <IM>` and review every change,
|
Run `python tools/manual_diff.py <R1.03 doc\EN> <R1.05 doc\EN> <IM>` and review every change,
|
||||||
including those made in R1.04.
|
including those made in R1.04.
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue