Compare commits
33 commits
r1.03-fina
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 42240a86d0 | |||
| 516729ff24 | |||
| 5413d0195c | |||
| 16d154b145 | |||
| 73fbd58985 | |||
| 81194d7765 | |||
| d5d1da6f55 | |||
| 848702cc50 | |||
| a4eb5bad19 | |||
| 409ee4d110 | |||
| fd2666ddb1 | |||
| 732c6fb2da | |||
| 03bf567972 | |||
| 98035366a7 | |||
| 0b82c300d1 | |||
| 2fd32fbf22 | |||
| 01174b061a | |||
| 48426a0a14 | |||
| 698dfad0f0 | |||
| bf7d88a027 | |||
| ceb13315ad | |||
| 83af63ab53 | |||
| ed8955872d | |||
| 13dded2bd1 | |||
| 024c415061 | |||
| 9f300bd07b | |||
| 39e58af2ff | |||
| e26d610e89 | |||
| af9a1bbe29 | |||
| e90ad790a2 | |||
| b85a65250c | |||
| 0a910e1b50 | |||
| 5b306c1b16 |
142 changed files with 5219 additions and 1004 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). Re-tested on R1.05 2026-10-09 on the shared test server with the user's approval (temporary sample records, everything removed, before/after snapshot identical): INFO event with almdbg 16 (V10).
|
||||||
---
|
---
|
||||||
|
|
||||||
# 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,57 @@ 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. **R1.05 (2026-10-09, V10):** same
|
||||||
|
result (`EVENT_TYPE` INFO, text and description as given, priority 15, ack 1).
|
||||||
|
|
||||||
|
## 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). Re-tested on R1.05 2026-10-09 on the shared test server with the user's approval (temporary sample records, everything removed, before/after snapshot identical): raise, acknowledge via ALARM_CURRENT (two ACKNOW records), return to normal, DELAY 5 / REPEAT 10 (V10).
|
||||||
---
|
---
|
||||||
|
|
||||||
# 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,29 @@ 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-09 (V10, with approval, removed afterwards): same results as the R1.03 table. 50 → 85:
|
||||||
|
status 10, options without `ack`, one `ALARM_CURRENT` row; acknowledged with `dssqld -m`
|
||||||
|
(`NAME`,`ACK`) → `ack` back, two `ACKNOW` records (the second with the node name); back to 50 →
|
||||||
|
`NORMAL`, `ALARM_CURRENT` empty. With `DELAY` 5 / `REPEAT` 10 and 27 s above the limit:
|
||||||
|
`DIRECT`, `DELAY` +5 s, `REPEAT` +15 s and +25 s (`RPT_COUNT` 1, 2), `NORMAL` (unacknowledged),
|
||||||
|
then a `NORMAL` with ack 1 after resetting `DELAY`/`REPEAT`. Note: an `ALARM_CHRONO` export
|
||||||
|
with `@FIELDS` must include `NAME` (the primary index), otherwise `DSS-E-PIDX_FST` and nothing is
|
||||||
|
exported. Alarm history and audit records of a test cannot be removed afterwards.
|
||||||
|
|
||||||
|
- 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).
|
||||||
|
|
||||||
|
- 2026-10-12 (user project on the R1.05 test server, 2026-10-09 to 10-12): LOW/HIGH limit alarms on Real items loaded with the item (`LOW_LOW_LIMIT,LOW_LIMIT,
|
||||||
|
HIGH_LIMIT,HIGH_HIGH_LIMIT` = `-100,-5,5,100`, `ALARMING` 1, `ACKN_TYPE` `"MANUAL"`): a process class
|
||||||
|
writing the value raised status 8 (LOW) / 10 (HIGH) and one `ALARM_CURRENT` row each (priority 2
|
||||||
|
from `STATUS_DF`), cleared on return to normal.
|
||||||
|
|
|
||||||
|
|
@ -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,51 @@ 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 reference copies that R1.05
|
||||||
|
installs for the upgrade merge (`%TLS_SAV_PATH%\jmrg\ref-data\R1.01.00` … `R1.04.00\sup\dssana.sup`)
|
||||||
|
all have 5. On the R1.05 test server the active value is 500: a local change, saved with the
|
||||||
|
Setup File Editor on 2026-09-12 (the editor shows the field label in blue = differs from the
|
||||||
|
default; V16, ISS-150). The default is 5; check the active line before relying on it.
|
||||||
|
|
||||||
## 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 +74,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,16 @@ 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.
|
||||||
|
|
||||||
|
## R1.05 (2026-10-12, user project on the R1.05 test server, 2026-10-09 to 10-12)
|
||||||
|
|
||||||
|
A user with `PASSWORD ""`, factory group `OPERATOR`, `LAYOUT` and `INITIAL_DISPLAY` loaded with 0
|
||||||
|
errors and logged on to the web client without a password, landing on the display in the layout
|
||||||
|
(no `?l=` or `?d=` needed). `OPERATOR` includes `ITEM_MODIFY_VALUE` and `ITEM_MODIFY_STRING_VALUE`,
|
||||||
|
so display buttons that write items work for it. Removing the user (`dssqld -r`) after the user
|
||||||
|
had exited the web session gave 0 errors.
|
||||||
|
|
|
||||||
|
|
@ -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 Re-tested on R1.05 2026-10-09 on the shared test server with the user's approval (temporary sample records, everything removed, before/after snapshot identical): compile sets RESET_REQUIRED 1 and the object keeps the old code; dssqld RESET 1 still does nothing (ISS-028); opcdbg Classes action 8 resets (RESET_REQUIRED 0, new PRINT text at once); OBJECT_ATTR_VAL CAPACITY 400 → volume 200 at level 50 (V15). Compile and reset leave opc_t*.asc/.lst/.rst files in %TLS_LST_PATH%; delete them after a test.
|
||||||
---
|
---
|
||||||
|
|
||||||
# Change a class that has objects
|
# Change a class that has objects
|
||||||
|
|
@ -41,7 +41,10 @@ for a reset report (empty = none; this prompt is not in the manual):
|
||||||
```
|
```
|
||||||
printf '2\n8\n<CLASS>\n0\n\n-1\n-1\n' | timeout 30 opcdbg 0
|
printf '2\n8\n<CLASS>\n0\n\n-1\n-1\n' | timeout 30 opcdbg 0
|
||||||
```
|
```
|
||||||
(Bash. Interactively, type the same answers.) Keep the time-out: `opcdbg` repeats its last
|
(Bash. Interactively, type the same answers.) In Windows `cmd`, put the answers in a file
|
||||||
|
(`2`, `8`, `<CLASS>`, `0`, empty line, `-1`, `-1`, one per line, CRLF) and run
|
||||||
|
`opcdbg 0 < reset_class.txt` (verified on R1.05 2026-10-12). A `dssqld -m` with `NAME,TRIGGER_1,COMPILE,METHOD`
|
||||||
|
also changes the class's trigger group (verified on R1.05). Keep the time-out: `opcdbg` repeats its last
|
||||||
prompt forever when the input runs out.
|
prompt forever when the input runs out.
|
||||||
|
|
||||||
Afterwards `RESET_REQUIRED` = 0 and the object used the new code at once (verified).
|
Afterwards `RESET_REQUIRED` = 0 and the object used the new code at once (verified).
|
||||||
|
|
@ -63,8 +66,17 @@ and a reset report; click **Reset** (verified by the user 2026-10-01: 1 of 1 obj
|
||||||
|
|
||||||
## 3. Changing prompts or signals
|
## 3. Changing prompts or signals
|
||||||
|
|
||||||
Only a change in the method bodies was practiced. When the class **prolog** changes (new
|
Only a change in the method bodies was practiced on R1.03. When the class **prolog** changes (new
|
||||||
signals, prompts, attributes, created items), check `EXTENDED_RESET_REQUIRED` in `CLASS_DF`
|
signals, prompts, attributes, created items), check `EXTENDED_RESET_REQUIRED` in `CLASS_DF`
|
||||||
after compiling; what an extended reset does was not tested. The safe way is to recreate the
|
after compiling; what an extended reset does was not tested. The safe way is to recreate the
|
||||||
objects (remove, load) — note that removing an object deletes the items it created, with their
|
objects (remove, load) — note that removing an object deletes the items it created, with their
|
||||||
history links.
|
history links.
|
||||||
|
|
||||||
|
**R1.05, Java (verified 2026-10-12, user project on the R1.05 test server, 2026-10-09 to 10-12): new signals are refused while objects exist.** `dssqld -m` of
|
||||||
|
the class with extra `define…Signal` fields gives only `DSI-E-OPCCOMERR, Compilation failed with 1
|
||||||
|
error(s)` / `DSSP-E-UPDREC` in the `.qlo`; the reason is in the newest `%TLS_ROOT_PATH%\tls\lst\opc_t*.lst`:
|
||||||
|
`**** ERROR: Attribute or signal definitions cannot be changed while objects are derived from the
|
||||||
|
class`. The old class keeps running. Procedure that worked: remove the object (`@OBJECT_DF`, `-r`),
|
||||||
|
`dssqld -m` the class, wait for the compile, insert the object again. **The object's attributes are
|
||||||
|
lost** with it; the tested class rebuilt its data on the first run of the new object from items it
|
||||||
|
also writes (its log message confirmed the attributes were empty).
|
||||||
|
|
|
||||||
|
|
@ -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,58 @@ 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.
|
||||||
|
|
||||||
|
## 4a. Large classes on R1.05 (verified 2026-10-12, user project on the R1.05 test server, 2026-10-09 to 10-12)
|
||||||
|
|
||||||
|
A Java class with about 1,600 signals ran on R1.05 every second without problems:
|
||||||
|
|
||||||
|
- **Signal arrays**: `Signal[] t = defineDoubleSignalArray(400);` (also `defineIntegerSignalArray`,
|
||||||
|
`defineStringSignalArray`), attached in a loop in `create()`:
|
||||||
|
`for (int k = 0; k < 400; k++) attachItemToSignal(t[k], "<Section>.TEMP." + name(k));`.
|
||||||
|
Signals without a trigger, plus `TRIGGER_1` = a trigger group and `triggerGroupEvent(TriggerGroup tg)`,
|
||||||
|
give one run per second for all inputs.
|
||||||
|
- **Write only on change**: the class compared with `getValueAsDouble()` / `getValueAsString()`
|
||||||
|
before `setValue()` (and also wrote when `getStatusNumber() == Signal.Status.NOT_INIT`).
|
||||||
|
- **String signals**: `setValue(String)` on a String item works.
|
||||||
|
- **Attribute arrays** (`defineDoubleAttributeArray(Attribute.Scope.OBJECT, n)`) keep their values
|
||||||
|
over a class reset; Java fields do not (initialise them in the first trigger run, not in
|
||||||
|
`create()`). Attributes are **lost when the object is deleted** (verified: after remove and
|
||||||
|
insert the new object found them empty and logged that it rebuilt the data from items; see
|
||||||
|
`change-reset-class.md` §3).
|
||||||
|
- **Compile check before loading** (no CI Server change):
|
||||||
|
`"%TLS_ROOT_PATH%\tls\jre\bin\javac.exe" -Xlint:all -cp "%TLS_ROOT_PATH%\tls\exe\jopcsrv.jar" -d cls <Class>.java`.
|
||||||
|
The exact API: `javap -cp %TLS_ROOT_PATH%\tls\exe\jopcsrv.jar fasttools.processfast.ProcessClass`
|
||||||
|
(also `Signal`, `Attribute$Scope`, `Signal$Trigger`, `Signal$Status` constants, e.g. `NOT_INIT` 13).
|
||||||
|
- **Keep quick load lines short**: put long generated arrays (tables in the class source) on several
|
||||||
|
lines; the class loaded with lines up to 233 characters.
|
||||||
|
|
||||||
|
## 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,16 @@ 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.
|
||||||
|
|
||||||
|
**The Java executor `OPCJEXE` does not answer** the performance request (R1.05, re-checked
|
||||||
|
2026-10-09, V14): `opcdbg 0 4` with `OPCJEXE` waits forever, while the same input for `OPCEXE1`
|
||||||
|
returns at once (main info: active classes, objects, trigger groups, items, executions).
|
||||||
|
`OPCJEXE` was attached (`durwfp` 0) and nothing was logged in `umhlog.log`. The waiting debugger
|
||||||
|
stays as a process: stop it (`taskkill /pid <pid> /f`) — it changes nothing. For Java objects use
|
||||||
|
the object status (`3`, `18`) instead (ISS-157). Not checked on R1.03.
|
||||||
|
|
||||||
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 +48,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,24 +1,27 @@
|
||||||
---
|
---
|
||||||
name: data-access
|
name: data-access
|
||||||
description: >-
|
description: >-
|
||||||
CI Server R1.03 ACCESS Service: OPC UA, OPC DA, OPC A&E and ODBC. Use when the user wants to
|
CI Server R1.05 ACCESS Service: OPC UA, OPC DA, OPC A&E, ODBC and the RESTful API. Use when
|
||||||
connect CI Server to an OPC UA server (OPC UA client line, station, subscription, points,
|
the user wants to connect CI Server to an OPC UA server (OPC UA client line, station,
|
||||||
certificates, node IDs, browse), let another application read CI Server data over OPC UA, OPC
|
subscription, points, certificates, node IDs, browse, OPC UA methods MTD_KEY / MTD_TRG,
|
||||||
DA or OPC A&E (CI Server as OPC server, OPC visible / read / write, port 34493, endpoints,
|
OPCUAC_METHOD_CALL2_DF), let another application read CI Server data over OPC UA, OPC DA or
|
||||||
security policy, trusting client certificates, UaExpert), check why an OPC connection fails
|
OPC A&E (CI Server as OPC server, OPC visible / read / write, port 34493, endpoints, security
|
||||||
(BadCertificateUntrusted, BadSecurityChecksFailed, item stays NOT INIT), configure DCOM or DCOM
|
policy, trusting client certificates, UaExpert, extended OPC UA functions for alarms, history
|
||||||
tunnelling for OPC Classic, use ODBC / SimbaClient / SQL on datasets, or check the ODBC server
|
and PubSub, OPC UA Information Model Mapper, NodeSet / imported information model), check why
|
||||||
(odbsrv, port 1583, SSL certificate), or copy item values and timestamps into Microsoft SQL
|
an OPC connection fails (BadCertificateUntrusted, BadSecurityChecksFailed, item stays NOT INIT,
|
||||||
Server with RDBMS data exposure (dbc.sup, DEM_CONNECTION, DBCSND, DBCDEM, DATA_EXPOSURE_DF,
|
certificate expiry warning), configure DCOM or DCOM tunnelling for OPC Classic, use ODBC /
|
||||||
data exposure aggregation interval AGG_INTERVAL, ITEM_VALUES, SQL login, DSS-E-FLT_SYN_ERR).
|
SimbaClient / SQL on datasets, or check the ODBC server (odbsrv, port 1583, SSL certificate),
|
||||||
Sources IM 36K10L45-01EN, IM 36K10E20-01EN, IM 36K10G10-01EN ch. 10.
|
use the RESTful API (jrstsrv, port 34597, API key, x-api-key), or copy item values and
|
||||||
|
timestamps into Microsoft SQL Server with RDBMS data exposure (dbc.sup, DEM_CONNECTION, DBCSND,
|
||||||
|
DBCDEM, DATA_EXPOSURE_DF, data exposure aggregation interval AGG_INTERVAL, ITEM_VALUES, SQL
|
||||||
|
login, DSS-E-FLT_SYN_ERR). Sources IM 36K10L45-01EN, IM 36K10E20-01EN, IM 36K10G10-01EN ch. 10.
|
||||||
---
|
---
|
||||||
|
|
||||||
# Data access: OPC, ODBC and RDBMS data exposure (R1.03; RDBMS exposure tested in R1.05 only)
|
# Data access: OPC, ODBC, RESTful API and RDBMS data exposure (R1.05; first written for R1.03)
|
||||||
|
|
||||||
Background: `knowledge/manuals/IM36K10L45-01EN.md` (ODBC, OPC DA/A&E/UA client and server,
|
Background: `knowledge/manuals/IM36K10L45-01EN.md` (ODBC, RESTful API, OPC DA/A&E/UA client and
|
||||||
setup files), `IM36K10E20-01EN.md` (Engineering Module forms, certificates, PubSub). Equipment
|
server, setup files), `IM36K10E20-01EN.md` (Engineering Module forms, certificates, Information
|
||||||
lines/stations/points in general: skill `equipment`.
|
Model Mapper, PubSub). Equipment lines/stations/points in general: skill `equipment`.
|
||||||
|
|
||||||
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.
|
||||||
|
|
@ -26,20 +29,30 @@ Rules:
|
||||||
common name) and let the user trust it (Engineering Module or moving the file); do not move
|
common name) and let the user trust it (Engineering Module or moving the file); do not move
|
||||||
certificate files yourself.
|
certificate files yourself.
|
||||||
- Making items OPC visible / writable exposes them to every OPC client on the network: only
|
- Making items OPC visible / writable exposes them to every OPC client on the network: only
|
||||||
with the user's approval, and prefer read-only.
|
with the user's approval, and prefer read-only. The same applies to the RESTful API (keep its
|
||||||
|
read-only mode, the product default, unless the user decides otherwise).
|
||||||
- Never connect a CI Server OPC **DA or A&E** client to the same node's (or a DURM-connected
|
- Never connect a CI Server OPC **DA or A&E** client to the same node's (or a DURM-connected
|
||||||
node's) DA/A&E server: deadlock (manual §5.3). The OPC **UA** loopback is fine.
|
node's) DA/A&E server: deadlock (IM 36K10L45 5th ed. §6.3). The OPC **UA** loopback is fine.
|
||||||
- Changing `opxsys.sup`, `opxuas.sup`, `odbsrv.sup` or `ServerConfig.xml` needs admin rights and
|
- **Extended OPC UA functions are off by default since R1.04.** The OPC UA server offers only
|
||||||
a restart: hand it to the user (skill `portal-setup`, task `change-setup-file.md`).
|
Data Access and methods unless `OPXUAS_ENABLE_EXTENDED_FUNC = YES` in `opxuas.sup` (needed for
|
||||||
|
Alarms & Conditions, HistoryRead and PubSub); the OPC UA client receives no alarms unless
|
||||||
|
`OPXC_ENABLE_EXTENDED_FUNC = YES` in its `<process>.sup`. Both are `NO` on the R1.05 test
|
||||||
|
server (verified 2026-10-08). Source: IM 36K10L45 5th ed. ch. 11 intro, §10.4, §10.11,
|
||||||
|
§11.6.2, App. 1.3.
|
||||||
|
- Changing `opxsys.sup`, `opxuas.sup`, `<process>.sup`, `odbsrv.sup`, `jrstsrv.sup` or
|
||||||
|
`ServerConfig.xml` needs admin rights and a restart: hand it to the user (skill
|
||||||
|
`portal-setup`, task `change-setup-file.md`).
|
||||||
- The same applies to `dbc.sup` (RDBMS data exposure). SQL Server changes (mixed mode, logins,
|
- The same applies to `dbc.sup` (RDBMS data exposure). SQL Server changes (mixed mode, logins,
|
||||||
jobs) are on another system: only with the user's and the SQL Server owner's agreement.
|
jobs) are on another system: only with the user's and the SQL Server owner's agreement.
|
||||||
|
|
||||||
| Task | File | Status |
|
| Task | File | Status |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| OPC UA client to an OPC UA server (sample: loopback to CI Server's own server): line, station, subscription, points, certificate exchange, node IDs, browse via dataset | `tasks/opcua-client.md` | verified |
|
| OPC UA client to an OPC UA server (sample: loopback to CI Server's own server): line, station, subscription, points, certificate exchange, node IDs, browse via dataset | `tasks/opcua-client.md` | verified on R1.03 and R1.05 (loopback re-tested 2026-10-08) |
|
||||||
| Make CI Server data available to OPC clients (OPC visible / Read / Write); CI Server OPC UA server endpoints, node IDs, certificates | `tasks/opcua-client.md` §1, §5 | verified (UA); DA/A&E from docs |
|
| Make CI Server data available to OPC clients (OPC visible / Read / Write); CI Server OPC UA server endpoints, node IDs, certificates | `tasks/opcua-client.md` §1, §5 | verified on R1.03 (UA); DA/A&E from docs |
|
||||||
| Read-only checks: ACCESS processes, ports, OPC UA server config and PKI, ODBC server state | `tasks/access-checks.md` | verified |
|
| Read-only checks: ACCESS processes, ports (34493, 1583, 34597), OPC UA server config and PKI, extended functions, certificate validity, ODBC server state | `tasks/access-checks.md` | verified on R1.05 (2026-10-08) |
|
||||||
|
| OPC UA client methods (`MTD_*` object, method form, `CIX_UAC_MTD` point) and R1.03 → R1.04 method upgrade | `tasks/opcua-client.md` §7 | from docs |
|
||||||
| OPC DA / A&E client and server, DCOM, DCOM tunnelling | L45 summary §3–§5 | from docs (DA loopback not allowed) |
|
| OPC DA / A&E client and server, DCOM, DCOM tunnelling | L45 summary §3–§5 | from docs (DA loopback not allowed) |
|
||||||
| ODBC with SimbaClient | L45 summary §1 | from docs; ODBC server not running on the test system (ISS-008) |
|
| ODBC with SimbaClient | L45 summary §1 | from docs; ODBC server not running on the R1.03 and R1.05 test systems (ISS-008) |
|
||||||
| OPC UA alarms (external alarms), methods, PubSub | L45 §6, E20 §2–§4 | from docs |
|
| RESTful API (`jrstsrv`, port 34597, API key, functions) | L45 summary §9 | from docs; port and setup keywords verified on R1.05 |
|
||||||
|
| OPC UA alarms (external alarms), model change events, PubSub, imported information model / Information Model Mapper | L45 summary §6–§7, E20 summary §2–§5 | from docs |
|
||||||
| RDBMS data exposure to SQL Server: SQL login, `dbc.sup` `DEM_CONNECTION`, `DATA_EXPOSURE_DF` (filter syntax), item aggregation interval, checks, table behaviour, SQL-side retention | `tasks/rdbms-exposure.md` | tested in R1.05 only (`ITEM_VALUES`); `ITEM_HISTORY` / `ITEM_INPUTS` not tested |
|
| RDBMS data exposure to SQL Server: SQL login, `dbc.sup` `DEM_CONNECTION`, `DATA_EXPOSURE_DF` (filter syntax), item aggregation interval, checks, table behaviour, SQL-side retention | `tasks/rdbms-exposure.md` | tested in R1.05 only (`ITEM_VALUES`); `ITEM_HISTORY` / `ITEM_INPUTS` not tested |
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,26 @@
|
||||||
---
|
---
|
||||||
task: Read-only checks of ACCESS Service (OPC UA server, OPC clients, ODBC server)
|
task: Read-only checks of ACCESS Service (OPC UA server, OPC clients, ODBC server, RESTful API)
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10L45-01EN §1–§3, §6, §9, §10; practiced on the test system 2026-10-01
|
source: IM 36K10L45-01EN 5th ed. (Feb. 2026) §1–§3, §4.2, §7, §10, §11; IM 36K10E20-01EN 4th ed. §2.2; practiced on the R1.03 test system 2026-10-01; re-checked read-only on the R1.05 test server 2026-10-08
|
||||||
status: verified
|
status: verified on R1.05 (2026-10-08, read-only checks below); R1.03 results kept where marked
|
||||||
---
|
---
|
||||||
|
|
||||||
# ACCESS Service checks (read-only)
|
# ACCESS Service checks (read-only)
|
||||||
|
|
||||||
| Check | How | Test system result |
|
| Check | How | Result (R1.05 test server 2026-10-08 unless marked) |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Processes | `tasklist` → `opxuas.exe` (UA server), `opxuac.exe` (one per OPC UA line + `opxuac_mon`), `opxdas12.exe` / `opxaes.exe` (only while a client is connected), `opxdac.exe`/`opxaec.exe` (per line); `durwfp -p <name> -t 0` → 0 = attached | `opxuas`, `opxuac` (`OPXUAC_MON`) running |
|
| Processes | `tasklist` → `opxuas.exe` (UA server), `opxuac.exe` (one per OPC UA line + `opxuac_mon`), `opxdas12.exe` / `opxaes.exe` (only while a client is connected), `opxdac.exe`/`opxaec.exe` (per line), a `javaw.exe` for the RESTful API server; `durwfp -p <name> -t 0` → 0 = attached | `opxuas`, `opxuac` (`OPXUAC_MON`) running; no `odbsrv` (same on R1.03) |
|
||||||
| Ports | `netstat -ano` LISTENING: 34493 (OPC UA server), 1583 (ODBC), 135 (DCOM) | 34493 yes, 1583 **no** |
|
| Ports | `netstat -ano` LISTENING: 34493 (OPC UA server), 1583 (ODBC), 34597 (RESTful API, R1.04+), 135 (DCOM) | 34493 yes, 34597 yes, 135 yes, 1583 **no** (R1.03: same, no 34597) |
|
||||||
| Start log | `%TLS_LOG_PATH%\ci_start.log`, `umhlog.log` | `InitializeSslCtx(): SSL_CTX_use_certificate_chain_file() failed` + `Process ODBSRV exited unexpectedly` = ODBC server cannot load its certificate (ISS-008) |
|
| Start log | `%TLS_LOG_PATH%\ci_start.log`, `umhlog.log` | `InitializeSslCtx(): SSL_CTX_use_certificate_chain_file() failed` + `Process ODBSRV exited unexpectedly` = ODBC server cannot load its certificate (ISS-008; R1.03 and R1.05) |
|
||||||
| ODBC settings | `tls\sup\odbsrv.sup` (`PORT`, `USESSL`), certificate `%TLS_ROOT_PATH%\tls\pki\odbsrv\SampleServerCertificate.pem` + key | `USESSL YES`, folder missing |
|
| ODBC settings | `tls\sup\odbsrv.sup` (`PORT`, `USESSL`), certificate `%TLS_ROOT_PATH%\tls\pki\odbsrv\SampleServerCertificate.pem` + key | `odbsrv.sup` identical to R1.03, `USESSL YES`, folder missing |
|
||||||
| OPC UA server settings | `tls\sup\opxuas.sup`; endpoints and user tokens in `tls\exe\ServerConfig.xml` (ignore commented XML) | Endpoint `opc.tcp://[NodeName]:34493`; Basic256Sha256 / Aes128_Sha256_RsaOaep / Aes256_Sha256_RsaPss with Sign or SignAndEncrypt; anonymous, user/password, certificate tokens on |
|
| OPC UA server settings | `tls\sup\opxuas.sup`; endpoints and user tokens in `ServerConfig.xml` — R1.05: `%TLS_SAV_PATH%\ServerConfig.xml` (R1.03: `%TLS_ROOT_PATH%\tls\exe`; ISS-081); ignore commented XML | Endpoint `opc.tcp://[NodeName]:34493`; Basic256Sha256 / Aes128_Sha256_RsaOaep / Aes256_Sha256_RsaPss with Sign or SignAndEncrypt; anonymous, user/password, certificate tokens on (unchanged from R1.03; the R1.05 file only adds SDK sections) |
|
||||||
| OPC UA certificates | `%TLS_ALLUSERS_PATH%\pki\opxuas\pkiserver\{own,trusted,rejected,issuers}`; client `…\pki\opxuac\pkiclient\{own,trusted,rejected,deleted,issuers}`; dataset `OPCUAC_PKI_CERTIFICATES_DF` | Server own `ciserveruaserver.der` |
|
| Extended OPC UA functions | `findstr EXTENDED_FUNC` in `opxuas.sup` and in the client's `<process>.sup` (template `epauac_eqp.sup`) | `OPXUAS_ENABLE_EXTENDED_FUNC = NO`, `OPXC_ENABLE_EXTENDED_FUNC = NO` (product defaults): no OPC UA alarms, HistoryRead or PubSub until set to YES |
|
||||||
| OPC Classic settings | `tls\sup\opxsys.sup` (tabs Alarm and Event Client, Data Access Server, Alarm & Event Server) | Defaults; `OPXAEC_SAFE_CON NO` |
|
| OPC UA certificates | `%TLS_ALLUSERS_PATH%\pki\opxuas\pkiserver\{own,trusted,rejected,issuers}`; client `…\pki\opxuac\pkiclient\{own,trusted,rejected,deleted,issuers}`; dataset `OPCUAC_PKI_CERTIFICATES_DF` | Server own `ciserveruaserver.der`; client own `<host>_OPXUAC_MON.der`; server `rejected` absent until the first rejection |
|
||||||
| OPC UA client config | export `OPCUAC_LINE_DF`, `…_STATION_DF`, `…_SUBSCRIPTION_DF`, `…_POINT_DF` | Only the sample loopback |
|
| Certificate validity | `certutil -dump <file>.der` and look at `NotAfter` | Both own certificates valid 5 years from installation. The OPC UA client warns in the Historical Alarm Overview and the UMH message log before a client or server certificate expires (IM 36K10E20 4th ed. §2.2); lead time = hidden keyword `OPXC_CERT_EXP_PERIOD_WARN`, 2 months in `epauac_eqp.sup` |
|
||||||
| Logs | `%TLS_LOG_PATH%\OPXUAS.log`, `OpxUas_Sdk*.log`, `<UA client process>.log` | |
|
| OPC Classic settings | `tls\sup\opxsys.sup` (tabs Alarm and Event Client, Data Access Server, Alarm & Event Server) | Defaults; `OPXAEC_SAFE_CON NO`; new in R1.05: `OPXAES_DIR_ALM = YES` (A&E server, "Direct" alarm events; not in the manual, ISS-085) |
|
||||||
|
| OPC UA client config | export `OPCUAC_LINE_DF`, `…_STATION_DF`, `…_SUBSCRIPTION_DF`, `…_POINT_DF`, `OPCUAC_METHOD_CALL2_DF` | R1.03: only the sample loopback. R1.05: dataset structure of line, station, subscription and point unchanged |
|
||||||
|
| RESTful API settings | `tls\sup\jrstsrv.sup`: `JRST_NETWORK_PORT` (34597), `JRST_READ_ONLY_MODE` (product default YES), `JRST_MAX_RECORDS` (default 100), `JRST_USE_TWO_WAY_SSL` (NO), `JRST_USER_CACHE_TIME` (600 s), `JRST_CUSTOM_DATASETS`; API keys in dataset `API_KEYS_DF` (export without records in reports) | Keywords as in IM 36K10L45 5th ed. §4.2.1; compare the active values with the `!DEFAULT` block |
|
||||||
|
| Logs | `%TLS_LOG_PATH%\OPXUAS.log`, `OpxUas_Sdk*.log`, `<UA client process>.log` | `OPXUAS.log`, `OpxUas_Sdk*.log`, `OPXUAC_MON.log` present |
|
||||||
|
|
||||||
Fixing the ODBC server (only if ODBC is licensed and wanted; admin): place a certificate and key
|
Fixing the ODBC server (only if ODBC is licensed and wanted; admin): place a certificate and key
|
||||||
with the names above in `%TLS_ROOT_PATH%\tls\pki\odbsrv\`, or set `USESSL = NO` in `odbsrv.sup`
|
with the names above in `%TLS_ROOT_PATH%\tls\pki\odbsrv\`, or set `USESSL = NO` in `odbsrv.sup`
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: OPC UA client to an OPC UA server by quick load (loopback to CI Server's own OPC UA server)
|
task: OPC UA client to an OPC UA server by quick load (loopback to CI Server's own OPC UA server)
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10L45-01EN §9, §10; IM 36K10E20-01EN §2; practiced on CI-Eng-Sample 2026-10-01 (station CIENG_UA; full remove/reload; point also configured in the Engineering Module by the user and compared)
|
source: IM 36K10L45-01EN 5th ed. (Feb. 2026) §10, §11; IM 36K10E20-01EN 4th ed. (Feb. 2026) §2; practiced on CI-Eng-Sample 2026-10-01 on R1.03 (station CIENG_UA; full remove/reload; point also configured in the Engineering Module by the user and compared)
|
||||||
status: verified
|
status: verified on R1.03 (§1–§6). R1.05 (2026-10-08, read-only): line/station/subscription/point dataset definitions identical to R1.03, PKI folders and client setup files checked; loopback re-tested on R1.05 2026-10-08 with the reduced sample load (certificate exchange as in §4, done by the user; COMM_OK 1, SRV_STATE 0, LEVEL_COPY follows TANK1.LEVEL; removed afterwards), the new form fields were confirmed in the installed form definitions (point form `READ_NODE_INFO` / `REBROWSE`; method form node ID type, parent object node ID, manual arguments, no process-area field), the forms themselves not opened. §7 (methods) from docs.
|
||||||
---
|
---
|
||||||
|
|
||||||
# OPC UA client to an OPC UA server
|
# OPC UA client to an OPC UA server
|
||||||
|
|
@ -45,13 +45,25 @@ These flags also apply to the OPC DA and A&E servers.
|
||||||
```
|
```
|
||||||
"CIENG_UA_LINE","CI-Eng-Sample OPC UA loopback line","OPXCIENG"
|
"CIENG_UA_LINE","CI-Eng-Sample OPC UA loopback line","OPXCIENG"
|
||||||
```
|
```
|
||||||
|
The process reads `tls\sup\<process>.sup` (here `opxcieng.sup`), else the template
|
||||||
|
`epauac_eqp.sup` (IM 36K10L45 5th ed. §10.11; the R1.03 manual named a non-existent
|
||||||
|
`opxuac.sup`, ISS-084). On the R1.03 test system `opxcieng.sup` appeared as an exact copy of
|
||||||
|
the template. R1.05 template changes (verified 2026-10-08, ISS-083): new
|
||||||
|
`OPXC_ENABLE_EXTENDED_FUNC` (NO; YES needed for OPC UA alarms), `OPXC_BASE_MODEL_CHANGE_EVENT`
|
||||||
|
(NO), `OPXC_DISABLE_SAV_FILE` (NO), `OPXC_ALARM_TIME_ATTRIBUTE`, hidden
|
||||||
|
`OPXC_CERT_EXP_PERIOD_WARN` (2 months), and `OPXC_SERVICE_CALL_TIME_OUT` 60 s (manual: 10 s).
|
||||||
|
A per-process file copied from R1.03 lacks these keywords, so their defaults apply.
|
||||||
2. **Station** (`OPCUAC_STATION_DF`), **subscription** (`OPCUAC_SUBSCRIPTION_DF`, name
|
2. **Station** (`OPCUAC_STATION_DF`), **subscription** (`OPCUAC_SUBSCRIPTION_DF`, name
|
||||||
`<station>:<subscription>`), **points** (`OPCUAC_POINT_DF`, name `<station>:<point>`) —
|
`<station>:<subscription>`), **points** (`OPCUAC_POINT_DF`, name `<station>:<point>`) —
|
||||||
see `14_opcua_station_df.qli`:
|
see `14_opcua_station_df.qli`:
|
||||||
- Station: `LINE`, `USER_ANONYMOUS` 1 (or `USER_NAME`/`USER_PASSWORD`),
|
- Station: `LINE`, `USER_ANONYMOUS` 1 (or `USER_NAME`/`USER_PASSWORD`),
|
||||||
`MSG_SECURITY_01_MODE` `SignAndEncrypt`, `MSG_SECURITY_01_POLICY` `Basic256Sha256`,
|
`MSG_SECURITY_01_MODE` `SignAndEncrypt`, `MSG_SECURITY_01_POLICY` `Basic256Sha256`,
|
||||||
`SERVER_01_ENDPOINT` `opc.tcp://localhost:34493`, `STATUS_ITEM` (Boolean item, 1 =
|
`SERVER_01_ENDPOINT` `opc.tcp://localhost:34493`, `STATUS_ITEM` (1 = connected; a Boolean
|
||||||
connected). `SERVER_01_NAME`/`_URI` may stay empty.
|
item worked on R1.03). `SERVER_01_NAME`/`_URI` may stay empty. The R1.05 OPC Interface
|
||||||
|
manual (IM 36K10E20 4th ed. §2.1.2) lists states 0–5 for this item (0 preparing,
|
||||||
|
1 connected, 2 comm error/reconnecting, 3 connect failed, 4 server shutdown received,
|
||||||
|
5 connection recreated) while IM 36K10L45 §10.9.2 still calls it Boolean; not re-tested on
|
||||||
|
R1.05 (ISS-080). An Integer item shows all states.
|
||||||
- Subscription: `REQUESTED_PUBLISH_INTERVAL` 1000.
|
- Subscription: `REQUESTED_PUBLISH_INTERVAL` 1000.
|
||||||
- Point: `SUBSCRIPTION`, `EXTERNAL_RELATION` (`Input`, `Output`, `Input + Output`),
|
- Point: `SUBSCRIPTION`, `EXTERNAL_RELATION` (`Input`, `Output`, `Input + Output`),
|
||||||
`OPC_NAMESPACE` (namespace **URI**, not index), `OPC_NODE_ID_TYPE` (`STRING`, `NUMERIC`,
|
`OPC_NAMESPACE` (namespace **URI**, not index), `OPC_NODE_ID_TYPE` (`STRING`, `NUMERIC`,
|
||||||
|
|
@ -94,7 +106,26 @@ a filter; start with an empty path, then `Objects`:
|
||||||
```
|
```
|
||||||
|
|
||||||
Each record shows display name, namespace URI and node ID (inside `OPC_TAG_INFO`). Deeper
|
Each record shows display name, namespace URI and node ID (inside `OPC_TAG_INFO`). Deeper
|
||||||
paths were not found yet (`Objects.CI-Eng-Sample` returned nothing).
|
paths were not found yet on R1.03 (`Objects.CI-Eng-Sample` returned nothing).
|
||||||
|
|
||||||
|
R1.05: `OPCUAC_TAG_DF` (and `OPCUAC_TAG_CMPN_DF`) have two new Boolean fields, `REBROWSE`
|
||||||
|
(ask the server again) and `READ_NODE_INFO` (read node attributes while browsing; switching it
|
||||||
|
off is faster on slow links) (installed `opcuac_tag_df.dss`, verified 2026-10-08; not tried).
|
||||||
|
The point form has the matching *Read additional node information* check box, and F5 in the
|
||||||
|
expanded *Browse path* list rebrowses (IM 36K10E20 4th ed. §2.1.5).
|
||||||
|
|
||||||
|
**Data types (IM 36K10L45 5th ed. §10.3.4, from docs):** UInt32, Int64 and UInt64 map to Real
|
||||||
|
(no negatives for unsigned, no decimals), DateTime/UtcTime to String in the form
|
||||||
|
`YYYY-MM-DDThh:mm:ss.sssZ`, ExtensionObject only for EURange / EngineeringUnits, enumerations as
|
||||||
|
their Int32 value; one array element per point. A value that cannot be converted is logged and
|
||||||
|
the item gets status Bad.
|
||||||
|
|
||||||
|
**Model change events (IM 36K10L45 5th ed. §10.5, from docs):** the client reacts to the
|
||||||
|
server's `GeneralModelChangeEvent` (node or reference added: the point is recreated; deleted: the
|
||||||
|
item goes offline; external alarms are refreshed with ConditionRefresh). The coarse
|
||||||
|
`BaseModelChangeEvent` (recreate everything) is handled only with
|
||||||
|
`OPXC_BASE_MODEL_CHANGE_EVENT = YES`. Events within 10 s are handled once; the server must
|
||||||
|
support Read and Browse.
|
||||||
|
|
||||||
## 4. Certificate exchange (first connection; the user does it)
|
## 4. Certificate exchange (first connection; the user does it)
|
||||||
|
|
||||||
|
|
@ -116,6 +147,11 @@ again (verified: reload connected within 5 s without a new exchange). For an ext
|
||||||
its certificate arrives the same way; the client certificate
|
its certificate arrives the same way; the client certificate
|
||||||
(`…\pkiclient\own\certs\<host>_<PROCESS>.der`) must be trusted on that server.
|
(`…\pkiclient\own\certs\<host>_<PROCESS>.der`) must be trusted on that server.
|
||||||
|
|
||||||
|
From R1.05 the client warns in the Historical Alarm Overview and the UMH message log before its
|
||||||
|
own or the server's certificate expires (IM 36K10E20 4th ed. §2.2; lead time
|
||||||
|
`OPXC_CERT_EXP_PERIOD_WARN`, 2 months in the installed template). The own certificates made at
|
||||||
|
installation were valid for 5 years on the R1.05 test server (verified 2026-10-08).
|
||||||
|
|
||||||
## 5. Check
|
## 5. Check
|
||||||
|
|
||||||
- `itmval -g -n CI-Eng-Sample.UA.COMM_OK` → 1; `UA.SRV_STATE` → 0 status 9;
|
- `itmval -g -n CI-Eng-Sample.UA.COMM_OK` → 1; `UA.SRV_STATE` → 0 status 9;
|
||||||
|
|
@ -128,3 +164,31 @@ its certificate arrives the same way; the client certificate
|
||||||
|
|
||||||
Items (`76_`), then points, subscription, station (`77_`), then the line (`78_`, stops the
|
Items (`76_`), then points, subscription, station (`77_`), then the line (`78_`, stops the
|
||||||
client process). Reset the OPC flags only if they were not there before.
|
client process). Reset the OPC flags only if they were not there before.
|
||||||
|
|
||||||
|
## 7. Calling a method on an external OPC UA server (R1.04+, from docs)
|
||||||
|
|
||||||
|
Source: IM 36K10L45 5th ed. §10.6, App. 1.3–1.4; IM 36K10E20 4th ed. §2.1.6. Not practiced.
|
||||||
|
Installed on R1.05 (verified 2026-10-08): dataset `OPCUAC_METHOD_CALL2_DF`, loader
|
||||||
|
`opcuac_method_u0104`, AOG displays `AOG_UAC_Method_Demo`, `AOG_UAC_Method_Call`,
|
||||||
|
`AOG_UAC_MethodArg_Call(2)` with their symbols.
|
||||||
|
|
||||||
|
1. **Class** for the method object (sample Java class `UAC_MTD_JBASE`): attribute `MTD_KEY`
|
||||||
|
(holds the method name) and signals `MTD_TRG` (0 idle/done, 1 call, 2 failed), `MTD_RET`
|
||||||
|
(result code as text; its quality holds the numeric code), `MTD_IN_ARG_0…` and
|
||||||
|
`MTD_OUT_ARG_0…` (at most 10 each, same order and types as on the server). These names are
|
||||||
|
reserved in that class. Use a class with a unique name per method object (App. 1.4).
|
||||||
|
2. **Method** under the station (Engineering Module *Methods → Add method*, dataset
|
||||||
|
`OPCUAC_METHOD_CALL2_DF`, name `<station>:<method>`): `OPC_NAMESPACE`, `OPC_NODE_ID_TYPE`,
|
||||||
|
`OPC_NODE_ID`. If the server does not browse its method nodes: parent object node ID by hand
|
||||||
|
(`MANUAL_OBJ_OPC_NODE_ID`, `OBJ_OPC_NAMESPACE`, `OBJ_OPC_NODE_ID_TYPE`, `OBJ_OPC_NODE_ID`) and
|
||||||
|
argument types by hand (`MANUAL_ARGUMENT_CONFIGURATION`, `ARGUMENT_IN_n_TYPE` / `…OUT…`).
|
||||||
|
3. **Point**, one per method: *Input + Output*, namespace `CIX_UAC_MTD`, type STRING, node ID
|
||||||
|
`CIX_UAC_MTD`; connect it to the object's `MTD_TRG` signal (*Connected I/O point*). Set
|
||||||
|
`MTD_KEY` to the method name. The process area goes on `MTD_TRG` (the method form no longer
|
||||||
|
has one). `MTD_TRG` shows status UPD_OFFLINE.
|
||||||
|
4. **Symbol and display** for the class (see the AOG demo display), then trigger from there.
|
||||||
|
|
||||||
|
Upgrade from R1.03 (App. 1.3): R1.03 methods called through dataset fields
|
||||||
|
(`OPCUAC_METHOD_CALL_IN_DF` / `…_OUT_DF`, both gone in R1.05) stop working. Rebuild the class
|
||||||
|
with the `MTD_*` members (*Extended reset enabled*, then reset), rebuild symbols and displays,
|
||||||
|
and re-save (or copy and re-add) any method with String or Boolean input arguments.
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,9 @@ status: tested in R1.05 only
|
||||||
Edition on a separate domain-joined host). Not re-tested on R1.03 or on CI-Eng-Sample (user
|
Edition on a separate domain-joined host). Not re-tested on R1.03 or on CI-Eng-Sample (user
|
||||||
decision 2026-10-02). On the R1.03 development machine the files `dbc.sup`,
|
decision 2026-10-02). On the R1.03 development machine the files `dbc.sup`,
|
||||||
`data_exposure_df.dss` and `item_df.dss` were checked read-only and match what is described
|
`data_exposure_df.dss` and `item_df.dss` were checked read-only and match what is described
|
||||||
here (`dbc.sup` is identical in R1.03 and R1.05).
|
here (`dbc.sup` is identical in R1.03 and R1.05 apart from the site's `DEM_CONNECTION` line;
|
||||||
|
`data_exposure_df.dss` and `item_df.dss` identical; re-checked read-only on the R1.05 test
|
||||||
|
server 2026-10-08).
|
||||||
|
|
||||||
**Changes live configuration on two systems** (SQL Server and CI Server): follow the user's
|
**Changes live configuration on two systems** (SQL Server and CI Server): follow the user's
|
||||||
chosen way of working. SQL Server changes on a shared server need the owner's agreement.
|
chosen way of working. SQL Server changes on a shared server need the owner's agreement.
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,21 @@
|
||||||
---
|
---
|
||||||
name: equipment
|
name: equipment
|
||||||
description: >-
|
description: >-
|
||||||
CI Server R1.03 EQUIPMENT Service: lines, stations, scan types, I/O points and conversion
|
CI Server R1.05 EQUIPMENT Service: lines, stations, scan types, I/O points and conversion
|
||||||
types. Use when the user wants to connect CI Server to a PLC, RTU or other device (Modbus
|
types. Use when the user wants to connect CI Server to a PLC, RTU or other device (Modbus
|
||||||
TCP/RTU, STARDOM FCX, FA-M3, DNP3, IEC 60870-5-104, IEC 61850, MQTT, OPC …), define or
|
TCP/RTU, STARDOM FCX, FA-M3, DNP3, IEC 60870-5-104, IEC 61850, MQTT, OPC …), define or
|
||||||
remove a line, station, scan type or point, connect an item to an I/O address, set a station
|
remove a line, station, scan type or point, connect an item to an I/O address, set a station
|
||||||
off-scan or suppress outputs, add a station communication status item, run CI Server as a
|
off-scan or suppress outputs, add a station communication status item, run CI Server as a
|
||||||
Modbus slave, force a faster scan (eqpfrcscn), check equipment statistics or use the
|
Modbus slave, force a faster scan (eqpfrcscn), check equipment statistics or use the
|
||||||
equipment debugger (eqpdbg). Sources IM 36K10L40-01EN, IM 36K10L41-01EN, IM 36K10C10-01EN §4.1.
|
equipment debugger (eqpdbg), or work with the IEC 60870-5-104 / IEC 61850 EQT managers
|
||||||
|
(eqt104, eqt850, eqtdbg, eqtfrcscn, IEC 61850 report control blocks, upgrade from R1.03).
|
||||||
|
Sources IM 36K10L40-01EN, IM 36K10L41-01EN, IM 36K10C10-01EN §4.1.
|
||||||
---
|
---
|
||||||
|
|
||||||
# Equipment (R1.03)
|
# Equipment (R1.05)
|
||||||
|
|
||||||
|
Re-checked on R1.05 on 2026-10-08 (read-only): Modbus datasets, setup files and tools are
|
||||||
|
identical to R1.03. IEC 60870-5-104 and IEC 61850 now run as **EQT** managers (see below).
|
||||||
|
|
||||||
Background: `knowledge/manuals/IM36K10L41-01EN.md` (line types, station parameters,
|
Background: `knowledge/manuals/IM36K10L41-01EN.md` (line types, station parameters,
|
||||||
conversion types, Modbus, driver table), `IM36K10L40-01EN.md` (forced scan, statistics,
|
conversion types, Modbus, driver table), `IM36K10L40-01EN.md` (forced scan, statistics,
|
||||||
|
|
@ -24,12 +29,18 @@ Rules:
|
||||||
- Outputs write to real devices: never write to a production station's output points without
|
- Outputs write to real devices: never write to a production station's output points without
|
||||||
the user's explicit approval.
|
the user's explicit approval.
|
||||||
- `eqpdbg`: only the read-only actions (see L40 summary) unless the user approves.
|
- `eqpdbg`: only the read-only actions (see L40 summary) unless the user approves.
|
||||||
|
- IEC 104 and IEC 61850 lines (R1.04 and later) run under an `EQT<name>` manager (`eqt104`,
|
||||||
|
`eqt850`, started by `etaman`). `eqpdbg` and `eqpfrcscn` only reach `EQP*` managers; for EQT
|
||||||
|
managers use `eqtdbg` (default process `EQT`, same menu and same read-only actions) and
|
||||||
|
`eqtfrcscn` (template `tls\tpl\eqtfrcscn.tpl`). The manual does not describe these tools
|
||||||
|
(ISS-078).
|
||||||
|
|
||||||
| Task | File | Status |
|
| Task | File | Status |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Modbus TCP station by quick load: line, station, scan type, points, connected items; test, off-scan, remove | `tasks/modbus-station.md` | verified |
|
| Modbus TCP station by quick load: line, station, scan type, points, connected items; test, off-scan, remove | `tasks/modbus-station.md` | verified (R1.03; re-tested on R1.05 2026-10-08) |
|
||||||
| CI Server as Modbus slave (mirror `eqpmdcmem` + `eqpmdcslvtcp`) | `tasks/modbus-station.md` §1 | verified (by hand and via start file after a restart) |
|
| CI Server as Modbus slave (mirror `eqpmdcmem` + `eqpmdcslvtcp`) | `tasks/modbus-station.md` §1 | verified (by hand and via start file after a restart) |
|
||||||
| Read-only equipment manager status with `eqpdbg` | `system-management` task `tuning-checks.md` | verified |
|
| Read-only equipment manager status with `eqpdbg` | `system-management` task `tuning-checks.md` | verified |
|
||||||
| Forced scan (`eqpfrcscn`), hourly statistics (`eqpiostat`) | L40 summary | from docs (statistics empty, ISS-021) |
|
| Forced scan (`eqpfrcscn`), hourly statistics (`eqpiostat`) | L40 summary | from docs (statistics empty, ISS-021) |
|
||||||
| OPC UA client lines/stations/points (also OPC DA/A&E) | skill `data-access`, task `opcua-client.md` | verified (OPC UA loopback) |
|
| OPC UA client lines/stations/points (also OPC DA/A&E) | skill `data-access`, task `opcua-client.md` | verified (OPC UA loopback) |
|
||||||
| Other protocols | L41 summary §3.8–3.40 | from docs (no hardware) |
|
| Other protocols | L41 summary §3.8–3.40 | from docs (no hardware) |
|
||||||
|
| IEC 61850 / IEC 104 on R1.04 and later: EQT managers, report control blocks, upgrade from R1.03 | L41 summary §3.32 and App. 1 | from docs; installed files checked on R1.05 |
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Modbus TCP station by quick load (line, station, scan type, points, items)
|
task: Modbus TCP station by quick load (line, station, scan type, points, items)
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10L41-01EN §2, §3.1–3.2, §3.6–3.7; IM 36K10C10-01EN §4.1; practiced on CI-Eng-Sample 2026-09-30
|
source: IM 36K10L41-01EN §2, §3.1–3.2, §3.6–3.7; IM 36K10C10-01EN §4.1; practiced on CI-Eng-Sample 2026-09-30
|
||||||
status: verified
|
status: verified on R1.03 (2026-09-30); on R1.05 the datasets, setup files and start scripts were checked identical (2026-10-08, read-only), re-tested on R1.05 2026-10-08 with the reduced sample load on the shared test server (setpoint 1234 read back, COMM_OK 1, eqpdbg slave GOOD; mirror started for the test only; everything removed afterwards)
|
||||||
---
|
---
|
||||||
|
|
||||||
# Modbus TCP station by quick load
|
# Modbus TCP station by quick load
|
||||||
|
|
@ -24,7 +24,9 @@ CI Server ships a Modbus slave "mirror" that needs no hardware:
|
||||||
Started by hand from a normal prompt they run until logoff or CI Server restart. To start
|
Started by hand from a normal prompt they run until logoff or CI Server restart. To start
|
||||||
them with CI Server, an administrator copies `examples/CI-Eng-Sample/equipment/
|
them with CI Server, an administrator copies `examples/CI-Eng-Sample/equipment/
|
||||||
eqpciengslv_start.cmd` and `_stop.cmd` to `%TLS_ROOT_PATH%\tls\com`: `equipment_start.cmd`
|
eqpciengslv_start.cmd` and `_stop.cmd` to `%TLS_ROOT_PATH%\tls\com`: `equipment_start.cmd`
|
||||||
runs every `eqp*start.cmd` there.
|
runs every `eqp*start.cmd` there. On R1.05 (checked 2026-10-08) it also runs `eqt*start.cmd`
|
||||||
|
and, on the host node, every `?*_equipment_start.cmd` (with `?*_equipment_stop.cmd` called
|
||||||
|
from `equipment_stop.cmd`), which is a cleaner hook for such extensions.
|
||||||
|
|
||||||
## 2. Line (`MODBUS_LINE_DF`)
|
## 2. Line (`MODBUS_LINE_DF`)
|
||||||
|
|
||||||
|
|
@ -112,7 +114,7 @@ on-scan (output method *On change and connect*).
|
||||||
and `tls\sav` files.
|
and `tls\sav` files.
|
||||||
4. The status item and section with the other items.
|
4. The status item and section with the other items.
|
||||||
|
|
||||||
## Test system (2026-09-30)
|
## Test system (R1.03, 2026-09-30)
|
||||||
|
|
||||||
Full cycle on CI-Eng-Sample: loaded, `SETPOINT` 1234/4321/2468 and `CMD` 1/0 read back
|
Full cycle on CI-Eng-Sample: loaded, `SETPOINT` 1234/4321/2468 and `CMD` 1/0 read back
|
||||||
through Modbus on `READBACK`/`FEEDBACK`, off-scan/on-scan checked, removed (manager stopped,
|
through Modbus on `READBACK`/`FEEDBACK`, off-scan/on-scan checked, removed (manager stopped,
|
||||||
|
|
@ -120,3 +122,18 @@ files deleted), reloaded from the sample files and re-tested: all 0 errors. With
|
||||||
`eqpciengslv_start.cmd`/`_stop.cmd` copied to `tls\com` and CI Server restarted, the mirror and
|
`eqpciengslv_start.cmd`/`_stop.cmd` copied to `tls\com` and CI Server restarted, the mirror and
|
||||||
`EQPCIENG` started under the CI Service, `COMM_OK` = 1, and the saved setpoint (2468) was
|
`EQPCIENG` started under the CI Service, `COMM_OK` = 1, and the saved setpoint (2468) was
|
||||||
re-sent to the freshly zeroed slave memory on connect (output method *On change and connect*).
|
re-sent to the freshly zeroed slave memory on connect (output method *On change and connect*).
|
||||||
|
|
||||||
|
## R1.05: a 400-register device (2026-10-12, user project on the R1.05 test server, 2026-10-09 to 10-12)
|
||||||
|
|
||||||
|
- Own line and equipment manager (`EQUIPMENT_MAN` e.g. `EQP<NAME>`) next to another project's
|
||||||
|
line: loaded, removed and loaded again with 0 errors; removing the line stopped only its manager.
|
||||||
|
- 400 holding registers as points `RO:1`–`RO:400`, `CONV_TYPE` `Linear` with `HAS_SIGN` 1,
|
||||||
|
`ELEC_LOW,ELEC_HIGH` = `-32768,32767` and `PHYS_LOW,PHYS_HIGH` = `-327.68,327.67` (raw ÷ 100):
|
||||||
|
all 400 items read the expected signed values (test pattern from a simulator, quality 0,
|
||||||
|
status 9).
|
||||||
|
- Communication loss: status item 0 (status 4), inputs keep their last value with the `off` option;
|
||||||
|
values and status item recover on the next scan after the device answers again.
|
||||||
|
- Test without the device: `tools/ModbusSim.java` (Java, runs with CI Server's own JDK; holding
|
||||||
|
registers with read and write, scenarios through a mode file). A PowerShell script that opens a
|
||||||
|
TCP listener was blocked by Windows antivirus (AMSI) as malicious content on the engineering PC
|
||||||
|
(Windows 10).
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,12 @@
|
||||||
---
|
---
|
||||||
name: graphics
|
name: graphics
|
||||||
description: >-
|
description: >-
|
||||||
CI Server R1.03 operator graphics for the Operator Interface (desktop) and the HTML display
|
CI Server R1.05 operator graphics for the Operator Interface (desktop) and the HTML display
|
||||||
(web): displays, symbols, layouts. Use when the
|
(web): displays, symbols, layouts. Use when the
|
||||||
user wants to create or change a display or symbol in the Edit Module (number field, text,
|
user wants to create or change a display or symbol in the Edit Module (number field, text,
|
||||||
alarm overview, trend, buttons, actions, parameters, connecting a component to an item),
|
alarm overview, trend, buttons, actions, parameters, connecting a component to an item,
|
||||||
|
Generic Functions such as Password Check or RDP Connect, custom alarm acknowledgement with
|
||||||
|
reason and approver, web browser component),
|
||||||
deploy or remove display files, export displays to HTML / Mobile Operator, open a display in a
|
deploy or remove display files, export displays to HTML / Mobile Operator, open a display in a
|
||||||
web browser (localhost:8080/mobileoperator), validate, search or unlock displays (jwuiutl,
|
web browser (localhost:8080/mobileoperator), validate, search or unlock displays (jwuiutl,
|
||||||
.lck files), find where displays, symbols and layouts are stored (DEPLOY folder,
|
.lck files), find where displays, symbols and layouts are stored (DEPLOY folder,
|
||||||
|
|
@ -15,7 +17,23 @@ description: >-
|
||||||
IM 36K10C50-01EN, IM 36K10R30-01EN, IM 36K10C60-01EN and the installed Layouts.readme.
|
IM 36K10C50-01EN, IM 36K10R30-01EN, IM 36K10C60-01EN and the installed Layouts.readme.
|
||||||
---
|
---
|
||||||
|
|
||||||
# Graphics: displays, symbols, layouts (R1.03)
|
# Graphics: displays, symbols, layouts (R1.05)
|
||||||
|
|
||||||
|
Re-checked for R1.05 on 2026-10-08 against the R1.05 manuals (C50 5th ed., R30 4th ed., C60
|
||||||
|
5th ed., Feb. 2026; full text diff against R1.03). Everything practiced in the tasks was
|
||||||
|
practiced on **R1.03**; the read-only file comparison on the R1.05 test server could not be run
|
||||||
|
yet (awaiting user verification, see the C50/R30 summaries). What changed in R1.04/R1.05:
|
||||||
|
|
||||||
|
- *Calculation/Function* component renamed **Generic Functions** (C50 §2.31); new operations
|
||||||
|
**Password Check** (R1.04) and **RDP Connect** (R1.05, installed script `tls\com\connectrdp.cmd`).
|
||||||
|
- Alarm overview: **custom acknowledgement** with reason and approver in the audit trail
|
||||||
|
(C50 §2.22, §4.12); *Update item/parameter* actions can record reason and approver.
|
||||||
|
- Web browser component (§2.33) uses a different browser engine in R1.05 (other codecs, new
|
||||||
|
security properties): embedded media made for R1.04 or earlier may not play.
|
||||||
|
- HTML display: Enterprise displays are no longer excluded (R30 §4.7/4.8/4.10, C50 §1.7);
|
||||||
|
HIS-TSE connections are not supported on the web.
|
||||||
|
- Paths: on the R1.05 test server program and data share one root (`C:\Yokogawa\CIServer`);
|
||||||
|
always use `%TLS_WAP_PATH%` instead of the R1.03 path `C:\Users\Public\Yokogawa\tls\wap`.
|
||||||
|
|
||||||
Background: `knowledge/manuals/IM36K10C50-01EN.md` (Edit Module, components, sheets, symbols,
|
Background: `knowledge/manuals/IM36K10C50-01EN.md` (Edit Module, components, sheets, symbols,
|
||||||
`jwuiutl`, display file contents), `IM36K10R30-01EN.md` (folders, layouts, dataset forms, HTML
|
`jwuiutl`, display file contents), `IM36K10R30-01EN.md` (folders, layouts, dataset forms, HTML
|
||||||
|
|
@ -30,6 +48,7 @@ Rules:
|
||||||
Reloading the browser page logs out — use the display menu *View > Reload*, and the display
|
Reloading the browser page logs out — use the display menu *View > Reload*, and the display
|
||||||
box to open other displays.
|
box to open other displays.
|
||||||
- `jwuiutl -vf`, `-u`, `-c`, `-a` rewrite or unlock files of **all** displays: only with approval.
|
- `jwuiutl -vf`, `-u`, `-c`, `-a` rewrite or unlock files of **all** displays: only with approval.
|
||||||
|
`-v` also re-saves the displays it validates (`tasks/deploy-displays.md` §2).
|
||||||
- Ask the user to close the Edit Module before CI Server is stopped or restarted: otherwise the
|
- Ask the user to close the Edit Module before CI Server is stopped or restarted: otherwise the
|
||||||
next start fails (skill `system-check`, §3).
|
next start fails (skill `system-check`, §3).
|
||||||
- The Operator Interface (desktop) reads `Layouts.xml` only at start: after layout changes,
|
- The Operator Interface (desktop) reads `Layouts.xml` only at start: after layout changes,
|
||||||
|
|
@ -37,12 +56,13 @@ Rules:
|
||||||
|
|
||||||
| Task | File | Status |
|
| Task | File | Status |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Build a display in the Edit Module (text, number field, alarm overview, trend) and check the saved XML | `tasks/create-display.md` | verified |
|
| Build a display in the Edit Module (text, number field, alarm overview, trend) and check the saved XML | `tasks/create-display.md` | verified on R1.03; R1.05 from docs (component changes listed in §R1.05) |
|
||||||
| Write display XML directly / with the sample generator (text size, rounding, arc angles, item attributes for the web, server-side command, alarm overview columns) | `tasks/create-display.md` (*Writing display XML directly*), `examples/CI-Eng-Sample/displays/generator/` | verified 2026-10-06 |
|
| Write display XML directly / with the sample generator (text size, rounding, arc angles, item attributes for the web, server-side command, alarm overview columns) | `tasks/create-display.md` (*Writing display XML directly*), `examples/CI-Eng-Sample/displays/generator/` | verified on R1.03 2026-10-06; not re-tested on R1.05 (no displays may be deployed on the shared test server) |
|
||||||
| Deploy / remove display files, export HTML, validate and search with `jwuiutl` | `tasks/deploy-displays.md` | verified |
|
| Generic Functions (Password Check, RDP Connect), custom alarm acknowledgement with reason/approver, web browser component security properties | `tasks/create-display.md` §R1.05, C50 summary §3–4 | from docs (R1.05) |
|
||||||
| Trend: pen sources (history group, aggregates), every pen and chart setting, desktop vs HTML display, 50-pen web workaround (`add_trend_spares.ps1`), Micro Trend | `tasks/trend.md` | verified (desktop); web workaround verified; Micro Trend open (ISS-055) |
|
| Deploy / remove display files, export HTML, validate and search with `jwuiutl` | `tasks/deploy-displays.md` | verified on R1.03; R1.05 option list awaiting user verification |
|
||||||
| Open and check a display in the browser (HTML display / Mobile Operator) | `tasks/deploy-displays.md` §4 | verified |
|
| Trend: pen sources (history group, aggregates), every pen and chart setting, desktop vs HTML display, 50-pen web workaround (`add_trend_spares.ps1`), Micro Trend | `tasks/trend.md` | verified on R1.03 (desktop); web workaround verified on R1.03, not re-tested on R1.05; Micro Trend open (ISS-055) |
|
||||||
| Operator layouts (`Layouts.xml`): windows, menus, toolbars, frames, popups, kiosk screens; open displays in frames and layouts; every parameter and command, desktop vs web (§6) | `tasks/layouts.md` | verified (per-user layout 2026-10-06; dual screen from docs) |
|
| Open and check a display in the browser (HTML display / Mobile Operator) | `tasks/deploy-displays.md` §4 | verified on R1.03 |
|
||||||
| Dataset forms (`*Dia.xml`) and the form description language | R30 summary §3 | from docs |
|
| Operator layouts (`Layouts.xml`): windows, menus, toolbars, frames, popups, kiosk screens; open displays in frames and layouts; every parameter and command, desktop vs web (§6) | `tasks/layouts.md` | verified on R1.03 (per-user layout 2026-10-06; dual screen from docs); R30 ch. 1 unchanged in R1.05; installed `Layouts.readme` awaiting user verification |
|
||||||
|
| Dataset forms (`*Dia.xml`) and the form description language | R30 summary §3 | from docs (unchanged in R1.05) |
|
||||||
| Symbols, parameters, actions, localisation, record/playback | C50 summary §1, §4, §5 | from docs |
|
| Symbols, parameters, actions, localisation, record/playback | C50 summary §1, §4, §5 | from docs |
|
||||||
| AOG library (styles, symbols, faceplates, templates) | C60 summary | from docs |
|
| AOG library (styles, symbols, faceplates, templates, OPC UA method displays) | C60 summary | from docs |
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Build a display in the Edit Module and check the saved file
|
task: Build a display in the Edit Module and check the saved file
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10C50-01EN §1.2, §1.7, §2, §4.8.1; practiced on CI-Eng-Sample (display CIENG_Tank) 2026-10-01; display XML written by the sample generator and checked on desktop and web 2026-10-02 to 2026-10-06 (installed web client code, component definitions in DEPLOY\components)
|
source: IM 36K10C50-01EN (R1.03 3rd ed. Sep. 2023; R1.05 5th ed. Feb. 2026) §1.2, §1.7, §2, §2.22, §2.25, §2.31–2.33, §4.8.1, §4.12; practiced on CI-Eng-Sample (display CIENG_Tank) 2026-10-01; display XML written by the sample generator and checked on desktop and web 2026-10-02 to 2026-10-06 (installed web client code, component definitions in DEPLOY\components)
|
||||||
status: verified
|
status: verified on R1.03 (Edit Module steps, saved XML, generator rules). R1.05: manual re-checked 2026-10-08 (section R1.05 below, from docs); not re-tested on the R1.05 test server (shared server, no displays may be deployed; component list comparison awaiting user verification)
|
||||||
---
|
---
|
||||||
|
|
||||||
# Build a display (Edit Module)
|
# Build a display (Edit Module)
|
||||||
|
|
@ -71,6 +71,37 @@ Module, the Operator Interface and the HTML display, if these rules are kept (sa
|
||||||
| Server-side command | `<action type="actionExecuteCommand">` with `<command>` and `<onServer>true</onServer>` runs on the CI Server node as the service account `CIX_PROCESS`, also from the web; a user in the factory group `OPERATOR` may use it (tested 2026-10-06, sample live-data *Start*) |
|
| Server-side command | `<action type="actionExecuteCommand">` with `<command>` and `<onServer>true</onServer>` runs on the CI Server node as the service account `CIX_PROCESS`, also from the web; a user in the factory group `OPERATOR` may use it (tested 2026-10-06, sample live-data *Start*) |
|
||||||
| Alarm overview | `autoFit` true in a tab that is hidden while loading squeezes all columns to ~0 px on the web: set `autoFit` false and give `column<Name>Width`; `column…Visible` for `AlarmAttribute` is an array property (a plain value fails the HTML export with `ClassCastException`); the empty part of the list stays **white** on both clients (no property; web: `jquery.dataTables.css` forces it); web rows are 20 px at a 14 px font (2026-10-02/06) |
|
| Alarm overview | `autoFit` true in a tab that is hidden while loading squeezes all columns to ~0 px on the web: set `autoFit` false and give `column<Name>Width`; `column…Visible` for `AlarmAttribute` is an array property (a plain value fails the HTML export with `ClassCastException`); the empty part of the list stays **white** on both clients (no property; web: `jquery.dataTables.css` forces it); web rows are 20 px at a 14 px font (2026-10-02/06) |
|
||||||
|
|
||||||
|
## R1.05 web client: findings from a generated display (verified 2026-10-12, user project on the R1.05 test server, 2026-10-09 to 10-12)
|
||||||
|
|
||||||
|
A generated display with about 1,900 components (6 MB XML, 1 MB HTML) on the R1.05 web client:
|
||||||
|
|
||||||
|
| Topic | Finding |
|
||||||
|
|---|---|
|
||||||
|
| Text bound to a String item | `<text>` with `text.value` ← `ItemValue` works. `keepOriginalSize` false stretches it to the box (as on R1.03, unreadable for changing text); `true` draws it centred at natural size, good for centred values. For **left-aligned** changing text use a `<textField>`: `textField.value` ← `ItemValue`, `<editable>false`, `<borderType type="border" value="BorderEmpty"/>`, justification `TextJustificationLeft` (or `Right`). `<opaque>false` is ignored: set `backgroundColor` to the colour behind it, or connect `textField.backgroundColor` through a threshold with output type `ColorSet` when the background changes. |
|
||||||
|
| Fixed text that must align | A `<text>` is centred on its box at its natural width; on one viewer's client long lines started left of their box. A `<textField>` with a fixed `<value>` (no connection) is left-aligned (checked in the test browser). |
|
||||||
|
| Hidden at start | `<visible>false</visible>` plus a `*.visible` connection: rectangles, texts and numbers appear when the condition becomes true; **ellipses, textFields and numberFields stay hidden**. Leave those visible at start. Without a start value every conditional component is drawn until the first values arrive. |
|
||||||
|
| Two conditions | Two connections to the same `*.visible` property do not combine (numbers stayed visible after one of their two conditions became false). Encode the condition in one item (e.g. a state item the calculation writes). |
|
||||||
|
| Display actions on open | Actions placed directly in `coreObjectDefinition` (before the first layer, as in the factory `AOG_ItemFaceplate`) with `<event type="event" event="On entry"/>` run when the display opens **and** on *Reload*; e.g. `actionSetItemAttribute` to reset a selection item. |
|
||||||
|
| Blinking | `rectangle.blinking` ← item through a threshold (output Boolean) plus a `blinkingPaint` blinks (the component toggles visibility at the display's `blinkDelay`, 500 ms). |
|
||||||
|
| Also verified | `numberField` with `asDateTime` on `ItemValue` (epoch seconds); `text.fillPaint`, `rectangle.strokePaint`, `ellipse.strokePaint` through thresholds; `actionSetItemAttribute` with event `Clicked b1` on a rectangle and on a number (a number drawn on a clickable shape needs its own action, it catches the click). |
|
||||||
|
| Size and first load | Once the first values took about a minute on a display this size; later loads took 3–10 s. |
|
||||||
|
|
||||||
|
## R1.05: component changes since R1.03 (from docs, IM 36K10C50-01EN 5th ed.)
|
||||||
|
|
||||||
|
| Component / sheet | Change (version) |
|
||||||
|
|---|---|
|
||||||
|
| *Calculation/Function* → **Generic Functions** (§2.31) | Renamed (R1.05 manual). Timing now documented: *Date and Time* runs every 200 ms; other operations check their inputs every 100 ms and run on a change, and also when the display is loaded or reloaded. |
|
||||||
|
| Generic Functions: **Password Check** (R1.04) | Inputs T[I1] user name, T[I2] password; B[O] TRUE and T[O] = user name if the pair is valid, else FALSE and the DSS error text (e.g. `DSS-E-UNK_USER`). Needs the login method *Manual CI Server* or *Manual OS* for the Password Check function in `dssana.sup` (*Login control* tab; skill `authorization`). Not tested. |
|
||||||
|
| Generic Functions: **RDP Connect** (R1.05) | When triggered, writes an `.rdp` file and starts a Remote Desktop session to T[I1] (host or IP). Optional T[I2] RemoteApp alias/program, T[I3] RemoteApp command line, T[I4] RD Gateway (`host[:port]`, default 443). T[O] receives the generated file name. Installed helper: `%TLS_ROOT_PATH%\tls\com\connectrdp.cmd`. Not tested (needs a remote desktop target). |
|
||||||
|
| JavaScript Function (§2.32) | Wording: inputs checked every 100 ms, script runs on a change and also when the display is loaded/reloaded (R1.03 text implied no run at load). |
|
||||||
|
| Alarm overview (§2.22, R1.04/R1.05) | New *[Acknowledgement]* properties: **Use Custom Acknowledgement** (acknowledge from a user-made window instead of the overview) enables *Acknowledge Event*, *Acknowledged Alarm*, *Acknowledged Alarm Text*, *Acknowledged Alarm Time*; *Selected Alarm Key*; *[External Acknowledgement]* (*Alarm Key*, *Approver*, *Reason*, *Trigger*); *[Enterprise Alarm Locations]* for enterprise displays. |
|
||||||
|
| Actions sheet (§4.12, R1.04) | *Update item/parameter* on an item, object signal or parameter can carry **Reason** (≤ 256 chars) and **Approver** (≤ 128 chars); they land in `AUDIT_TRAIL` fields `APPROVAL_REASON` / `APPROVER` (skill `audit-trail`). Two documented recipes for alarm acknowledgement with reason/approver: via an item parameter (attribute *Acknowledged* = 1, item alarms only) or via the overview's *External Acknowledgement* properties (item and external alarms). Not tested. |
|
||||||
|
| Dataset tables (§2.25, R1.05) | Column **Icon**, *Icon filter* (`<v>`, `!<v>`, `&<v>` bit test), *Icon tooltip*; *Operator can use column sorters*; *Operator can select row(s)* / *multiple rows*; *[Enterprise Dataset Locations]*; enterprise location supported on the HTML display. |
|
||||||
|
| Report (§2.26, R1.05) | New *[Enterprise]* category (primary / secondary data location). |
|
||||||
|
| Web Browser (§2.33, R1.05) — **web client: external pages are blocked** by the R1.05 default Content-Security-Policy (verified 2026-10-09, ISS-111); only pages from the CI Server itself load, unless the host is added as `frame-src` in `jwuiisg.sup` (skill `portal-setup`, `check-web-access.md`; verified). Component type `extendedIExplorer` (class `WebBrowserChromium`), property `url` | New browser engine: protocols WebRTC, HTTPS, WebSocket, HTTP/2, HTTP/3; codecs VP8, VP9, WebM, Opus, Vorbis, PCM. Content that played on R1.04 or earlier may not play after the upgrade. Right-click menu; new properties *Go Home/Stop/Reload*, *[Printing]*, *[Status]*, *[Security]* (*Enable Microphone/Camera*, *Allow Insecure Certificates*, *Allow Local file access*). Local files for CI Mobile View must be placed under `%TLS_ALLUSERS_PATH%\wap` and opened by URL. |
|
||||||
|
| Display generator (§2.36) | The note "not supported on HTML displays" was removed in the R1.05 manual; R30 §4.8 does not list it. Treat web support as unconfirmed. |
|
||||||
|
| `jwuiutl -m` / `-M` (§1.5) | Output now described as space-separated (R1.03 manual: CSV). On R1.03 `-m` printed comma-separated lines (verified); R1.05 output not checked (ISS-094). |
|
||||||
|
|
||||||
## Verified (CIENG_Tank, 2026-10-01)
|
## Verified (CIENG_Tank, 2026-10-01)
|
||||||
|
|
||||||
Text `CI-Eng-Sample Tank 1`, number field on `TANK1.LEVEL` (live: 72 → 61), alarm overview
|
Text `CI-Eng-Sample Tank 1`, number field on `TANK1.LEVEL` (live: 72 → 61), alarm overview
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,18 @@
|
||||||
---
|
---
|
||||||
task: Deploy, remove, export, validate and search displays; open them in the browser
|
task: Deploy, remove, export, validate and search displays; open them in the browser
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10C50-01EN §1.5; IM 36K10R30-01EN §1.1, §4; practiced on CI-Eng-Sample 2026-10-01; sample operator HMI (8 displays) and validate test 2026-10-06
|
source: IM 36K10C50-01EN §1.5 (R1.05 5th ed. Feb. 2026); IM 36K10R30-01EN §1.1, §4 (R1.05 4th ed. Feb. 2026); practiced on CI-Eng-Sample 2026-10-01; sample operator HMI (8 displays) and validate test 2026-10-06
|
||||||
status: verified
|
status: verified on R1.03. R1.05: manuals re-checked 2026-10-08 (jwuiutl options and HTML export unchanged except the search output wording); not re-tested on the R1.05 test server (shared server: no deploy, validate or export allowed); `jwuiutl --help` and the deploy folder structure there awaiting user verification
|
||||||
---
|
---
|
||||||
|
|
||||||
# Deploy and check displays
|
# Deploy and check displays
|
||||||
|
|
||||||
No admin rights needed (`C:\Users\Public\Yokogawa\tls\wap`). `jwuiutl.cmd` is in `tls\com`
|
On R1.03 no admin rights were needed (`C:\Users\Public\Yokogawa\tls\wap`). On the R1.05 test
|
||||||
(on `PATH`); call it through `cmd` (`cmd /c "jwuiutl.cmd …"`).
|
server the data root is `C:\Yokogawa\CIServer\tls`: use `%TLS_WAP_PATH%` and check write access
|
||||||
|
before deploying. `jwuiutl.cmd` is in `tls\com` (on `PATH`); call it through `cmd`
|
||||||
|
(`cmd /c "jwuiutl.cmd …"`). `jwuiutl.cmd --help` prints the option list (read-only; R1.03 help
|
||||||
|
text matches the C50 summary §2, but says `-o` defaults to the current directory, whereas the
|
||||||
|
export without `-o` wrote into `mobileoperator\operatorInterfaces\<deployment>` — verified R1.03).
|
||||||
|
|
||||||
## 1. Deploy / remove (sample scripts)
|
## 1. Deploy / remove (sample scripts)
|
||||||
|
|
||||||
|
|
@ -48,7 +52,8 @@ attributes - same content). Run it on copies, or redeploy the source files after
|
||||||
cmd /c "jwuiutl.cmd -d -m <term> > <scratch>\match.txt 2>&1"
|
cmd /c "jwuiutl.cmd -d -m <term> > <scratch>\match.txt 2>&1"
|
||||||
```
|
```
|
||||||
|
|
||||||
CSV `Type, File, Component` per match; `-M` adds actions and properties. Use it before deleting
|
CSV `Type, File, Component` per match (R1.03; the R1.05 manual describes the output as
|
||||||
|
space-separated, not checked, ISS-094); `-M` adds actions and properties. Use it before deleting
|
||||||
or renaming items to find the displays that use them.
|
or renaming items to find the displays that use them.
|
||||||
|
|
||||||
## 4. Open in the browser (HTML display)
|
## 4. Open in the browser (HTML display)
|
||||||
|
|
@ -59,6 +64,12 @@ line). To switch displays type the name in the display box and press Enter. To r
|
||||||
display menu **View > Reload** (keeps the session) — **reloading the browser page ends the
|
display menu **View > Reload** (keeps the session) — **reloading the browser page ends the
|
||||||
session** and needs a new login. Check live values by writing a test value (`itmval -p`, test items only).
|
session** and needs a new login. Check live values by writing a test value (`itmval -p`, test items only).
|
||||||
|
|
||||||
|
R1.05 manual (IM 36K10R30-01EN §4.10, from docs): the restrictions "no automatic reconnect
|
||||||
|
after a disconnect" (reliable socket) and "no HTML export from CI View (Edit Module over Remote
|
||||||
|
Connect)" are no longer listed; enterprise displays and enterprise user-profile settings are no
|
||||||
|
longer excluded; new: HIS-TSE connections are not supported in the HTML display. Not tested on
|
||||||
|
R1.05 (ISS-093).
|
||||||
|
|
||||||
## Verified (2026-10-01)
|
## Verified (2026-10-01)
|
||||||
|
|
||||||
Remove → deploy recreated both files; `-e HTML` output identical to the Edit Module's HTML;
|
Remove → deploy recreated both files; `-e HTML` output identical to the Edit Module's HTML;
|
||||||
|
|
@ -66,3 +77,14 @@ validation of `CIENG_Tank` *No problems found* (also after a sample reload with
|
||||||
but a stale `<itemId>` then shows 0 at run time, ISS-052);
|
but a stale `<itemId>` then shows 0 at run time, ISS-052);
|
||||||
search worked; browser showed live values. HTML trend without line: ISS-041 (cause and
|
search worked; browser showed live values. HTML trend without line: ISS-041 (cause and
|
||||||
workaround in `trend.md` §6).
|
workaround in `trend.md` §6).
|
||||||
|
|
||||||
|
## R1.05 test server: installed files (V5, 2026-10-09, read-only)
|
||||||
|
|
||||||
|
- `jwuiutl --help` prints the same text as on R1.03 (so the help still says `-o` defaults to the
|
||||||
|
current directory, ISS-094). The `-m` / `-M` output format was not checked (a search is not run
|
||||||
|
on the shared server).
|
||||||
|
- `jwuiutl.cmd` and `jwuiged.cmd` now load the new web browser component based on JCEF (change
|
||||||
|
e12737) from `%TLS_ROOT_PATH%\tls\exe\lib\jcef` (R1.03: `%TLS_WAP_PATH%\webapps\jcef`) and add
|
||||||
|
`tls\exe\lib\*` to the class path. `connectrdp.cmd` (RDP Connect) is installed in `tls\com`.
|
||||||
|
- `DEPLOY` has the same sub-folders as R1.03 (`components`, `displays`, `layouts`, `locales`,
|
||||||
|
`symbols`, `thresholds`); the factory component list is identical.
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Configure operator layouts (Layouts.xml): windows, menus, toolbars, frames, popups; open displays in frames and layouts
|
task: Configure operator layouts (Layouts.xml): windows, menus, toolbars, frames, popups; open displays in frames and layouts
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: Layouts.readme (installed, %TLS_WAP_PATH%\cfg\operatorInterfaces\DEPLOY\layouts); IM 36K10R30-01EN §1, §4.7; IM 36K10C50-01EN §4.12; practiced with CI-Eng-Sample (layout CIENG_Operator) in the Operator Interface (desktop) and the HTML display 2026-10-01; parameter-by-parameter test (§6) on both clients 2026-10-02, web behaviour also read from the installed web client code (mobileoperator fasttools.min.js); sample operator HMI (layouts CIENG_Operator with a tab set and CIENG_Popup, user CIENG) and test layouts on both clients 2026-10-06
|
source: Layouts.readme (installed, %TLS_WAP_PATH%\cfg\operatorInterfaces\DEPLOY\layouts; R1.03 copy); IM 36K10R30-01EN §1, §4.4, §4.7 (R1.05 4th ed. Feb. 2026); IM 36K10C50-01EN §4.12; practiced with CI-Eng-Sample (layout CIENG_Operator) in the Operator Interface (desktop) and the HTML display 2026-10-01; parameter-by-parameter test (§6) on both clients 2026-10-02, web behaviour also read from the installed web client code (mobileoperator fasttools.min.js); sample operator HMI (layouts CIENG_Operator with a tab set and CIENG_Popup, user CIENG) and test layouts on both clients 2026-10-06
|
||||||
status: verified (parameters tested on desktop and web 2026-10-02 except print orientation/margins, playback, multi-screen positions and the maximumTabs limit for new tabs)
|
status: verified on R1.03 (parameters tested on desktop and web 2026-10-02 except print orientation/margins, playback, multi-screen positions and the maximumTabs limit for new tabs). R1.05: R30 ch. 1 (layouts) unchanged apart from wording (re-checked 2026-10-08, from docs); the installed R1.05 `Layouts.readme` / `Layouts-original.xml` and the web client were not compared yet (awaiting user verification, ISS-092); no layout may be changed on the shared R1.05 test server
|
||||||
---
|
---
|
||||||
|
|
||||||
# Operator layouts
|
# Operator layouts
|
||||||
|
|
@ -123,7 +123,10 @@ open as windows inside the page; print, look-and-feel and the debug key are not
|
||||||
the layout with `&l=`, or let the user profile choose it (§3). Verified 2026-10-06:
|
the layout with `&l=`, or let the user profile choose it (§3). Verified 2026-10-06:
|
||||||
`?l=CIENG_Operator` (and a plain logon as `CIENG`) showed the sample menu, navigation toolbar,
|
`?l=CIENG_Operator` (and a plain logon as `CIENG`) showed the sample menu, navigation toolbar,
|
||||||
header, tab set and banner. The web client does not zoom displays (§6.1), so size them for the
|
header, tab set and banner. The web client does not zoom displays (§6.1), so size them for the
|
||||||
browser window.
|
browser window. The manual agrees: IM 36K10R30-01EN §4.4 (R1.03 and R1.05) marks the profile's
|
||||||
|
*Layout* as supported on the HTML display; the earlier reading "layout not" came from a garbled
|
||||||
|
text extraction of that table (ISS-074, ISS-095). In R1.05 the *Enterprise* profile settings are
|
||||||
|
also marked supported on the web.
|
||||||
|
|
||||||
## 6. Parameter reference: desktop vs web (tested 2026-10-02)
|
## 6. Parameter reference: desktop vs web (tested 2026-10-02)
|
||||||
|
|
||||||
|
|
@ -190,12 +193,14 @@ browser and in the web client code. "n/a" = the browser window is the main layou
|
||||||
| `toolbar` (check) | hides/shows **all** toolbars; `toolbar false` behaves as a toggle too | no effect |
|
| `toolbar` (check) | hides/shows **all** toolbars; `toolbar false` behaves as a toggle too | no effect |
|
||||||
| `statusline` (check) | hides/shows (a piece of the date field stays painted) | no effect |
|
| `statusline` (check) | hides/shows (a piece of the date field stays painted) | no effect |
|
||||||
| `print …` | preview / setup dialogs open | disabled |
|
| `print …` | preview / setup dialogs open | disabled |
|
||||||
| `login` / `logout` / `exit` | — / — / closes | login disabled; logout, exit work |
|
| `login` / `logout` / `exit` | — / — / closes | login disabled; **`logout` disabled on R1.05** (greyed; see note); `exit` closes the window and ends the session |
|
||||||
| `shell client <cmd>` | runs on the client (Notepad opened) | sent to the server; `shell client ACTION <layout command>` runs a layout command |
|
| `shell client <cmd>` | runs on the client (Notepad opened) | sent to the server; `shell client ACTION <layout command>` runs a layout command |
|
||||||
| `lookfeel <class>` | — | no effect |
|
| `lookfeel <class>` | — | no effect |
|
||||||
| `playback record` (check) / `view` | — | not supported (view disabled) |
|
| `playback record` (check) / `view` | — | not supported (view disabled) |
|
||||||
| `help` | **error** *Unrecognized keyword* | — |
|
| `help` | **error** *Unrecognized keyword* | — |
|
||||||
|
|
||||||
|
**`logout` is a secondary logout (R1.05, verified 2026-10-12).** The factory layout labels it *Secondary logout* (pair of `login`). The R1.05 web client always disables it (`LayoutWindow.js`: `setEnabled(false)` for `logout`; the command calls `secondaryLogout()`), so a toolbar or menu item with `logout` is greyed out. To let a user leave on the web, use **`exit`**: it closes the layout window and, for the last window, ends the session; the browser then closes the tab (reopening the URL shows the login page). Label the item *Exit* rather than *Log out*. Tested on the web client; the desktop Operator Interface was not tried. The sample layout `CIENG_Operator` still has a *Log out* (`logout`) menu item.
|
||||||
|
|
||||||
"—" = not checked.
|
"—" = not checked.
|
||||||
|
|
||||||
### 6.5 Layouts opened from a display, translations, debug key
|
### 6.5 Layouts opened from a display, translations, debug key
|
||||||
|
|
@ -252,3 +257,9 @@ byte. User `CIENG` lands in `CIENG_Operator` on Overview on both clients; ADMIN
|
||||||
default layout. Test layouts (removed again): tab set first in its frame set (web broken),
|
default layout. Test layouts (removed again): tab set first in its frame set (web broken),
|
||||||
`maximumTabs` 8 with 2 tab frames (no extra tab on the web), status line with `connectionState`
|
`maximumTabs` 8 with 2 tab frames (no extra tab on the web), status line with `connectionState`
|
||||||
(web broken).
|
(web broken).
|
||||||
|
|
||||||
|
## R1.05 test server (V5, 2026-10-09, read-only)
|
||||||
|
|
||||||
|
`Layouts.readme` is identical to R1.03. No factory copy `Layouts-original.xml` was found in the
|
||||||
|
R1.05 `DEPLOY\layouts` folder (only the live `Layouts.xml` and backups made by projects): keep
|
||||||
|
your own backup before changing `Layouts.xml` (`layout.ps1` does this).
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Configure a trend (chart) component; what each setting does on the desktop and in the HTML display
|
task: Configure a trend (chart) component; what each setting does on the desktop and in the HTML display
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10C50-01EN §2.27 (Trend, Tables 2.27-10…28), §2.29 (Micro Trend); IM 36K10R30-01EN §4.8.7; installed web client code (`%TLS_WAP_PATH%\mobileoperator\src\fasttools\ui\components\implementation\charts\`); practiced on CI-Eng-Sample (display CIENG_TrendLab, removed 2026-10-06) 2026-10-02; sample trends CIENG_Trends / CIENG_TankFaceplate and a test display on both clients 2026-10-06
|
source: IM 36K10C50-01EN §2.27 (Trend, Tables 2.27-10…28), §2.29 (Micro Trend) (R1.05 5th ed. Feb. 2026); IM 36K10R30-01EN §4.8.7 (R1.05 4th ed. Feb. 2026); installed web client code (`%TLS_WAP_PATH%\mobileoperator\src\fasttools\ui\components\implementation\charts\`); practiced on CI-Eng-Sample (display CIENG_TrendLab, removed 2026-10-06) 2026-10-02; sample trends CIENG_Trends / CIENG_TankFaceplate and a test display on both clients 2026-10-06
|
||||||
status: verified (desktop Operator Interface: every row marked ✅/❌ below; HTML display: §6)
|
status: verified on R1.03 (desktop Operator Interface: every row marked ✅/❌ below; HTML display: §6). R1.05: manuals re-checked 2026-10-08 — §2.27/2.29 unchanged except the trend's *Enterprise* property, now marked supported on the HTML display (from docs). Not re-tested on R1.05; whether the 50-pen web problem (ISS-041) still exists in the R1.05 web client is awaiting user verification (ISS-096) R1.05 (V5, 2026-10-09): pen limit and DataSource.js change read from the installed code; 50-pen problem probably fixed, not tested.
|
||||||
---
|
---
|
||||||
|
|
||||||
# Trend settings (desktop and web)
|
# Trend settings (desktop and web)
|
||||||
|
|
@ -116,7 +116,8 @@ rotation, zoom. Outputs (⇨): *Hairline value[n]*, *Time range begin/end*, *Upd
|
||||||
- **A trend with fewer than 50 visible pens with an item draws no line** in R1.03 (ISS-041):
|
- **A trend with fewer than 50 visible pens with an item draws no line** in R1.03 (ISS-041):
|
||||||
the web code always builds 50 data columns (`PEN_COUNT_LIMIT`) but labels only the visible
|
the web code always builds 50 data columns (`PEN_COUNT_LIMIT`) but labels only the visible
|
||||||
pens with an item; console `Mismatch between number of labels (…) and number of columns in
|
pens with an item; console `Mismatch between number of labels (…) and number of columns in
|
||||||
array (51)`. The desktop is not affected.
|
array (51)`. The desktop is not affected. R1.05: not checked yet (ISS-096); the padding
|
||||||
|
workaround is harmless, so keep it until the R1.05 web client is checked.
|
||||||
- **Workaround** (verified 2026-10-02): pad the trend to 50 pens with
|
- **Workaround** (verified 2026-10-02): pad the trend to 50 pens with
|
||||||
`displays/add_trend_spares.ps1 -Path <display>.xml`. Spares copy the first pen's source,
|
`displays/add_trend_spares.ps1 -Path <display>.xml`. Spares copy the first pen's source,
|
||||||
are scaled to 1E30–2E30 (clipped), hidden from the legend and get blank unique legend texts
|
are scaled to 1E30–2E30 (clipped), hidden from the legend and get blank unique legend texts
|
||||||
|
|
@ -148,3 +149,19 @@ rotation, zoom. Outputs (⇨): *Hairline value[n]*, *Time range begin/end*, *Upd
|
||||||
ISS-055 open). `fillWithHistory` true on an item that is in **no** storage group (e.g.
|
ISS-055 open). `fillWithHistory` true on an item that is in **no** storage group (e.g.
|
||||||
`SYSTEM.CPU_LOAD`) gives the message *Record not found* when the display opens, on the desktop
|
`SYSTEM.CPU_LOAD`) gives the message *Record not found* when the display opens, on the desktop
|
||||||
and on the web (tested 2026-10-06): set it false for such items.
|
and on the web (tested 2026-10-06): set it false for such items.
|
||||||
|
|
||||||
|
## R1.05: the 50-pen problem is fixed (verified on the web 2026-10-09)
|
||||||
|
|
||||||
|
**Verified** with a temporary display on the R1.05 test server (copy of `CIENG_Trends`, 2 pens on
|
||||||
|
items that already store history; removed afterwards): the web client drew both pens, history
|
||||||
|
and live part, without spare pens. The padding workaround below is only needed on R1.03. The
|
||||||
|
desktop Operator Interface was not checked (ISS-096 closed).
|
||||||
|
|
||||||
|
### Cause (from the code)
|
||||||
|
|
||||||
|
`PEN_COUNT_LIMIT` is still 50 in the R1.05 web client, but `trend/datasources/DataSource.js`
|
||||||
|
changed (change e12620, Oct-24, "revert previous change to enable component to function
|
||||||
|
again"): the checks that skip empty and invisible pens, commented out in the R1.03 file, are
|
||||||
|
active again. That is the cause of ISS-041, so a trend with fewer than 50 pens should draw on
|
||||||
|
R1.05. Not tested (no display may be changed on the shared server): keep the padding workaround
|
||||||
|
until it is checked on a test system (ISS-096).
|
||||||
|
|
|
||||||
|
|
@ -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`).
|
||||||
|
|
|
||||||
|
|
@ -1,19 +1,29 @@
|
||||||
---
|
---
|
||||||
name: history-management
|
name: history-management
|
||||||
description: >-
|
description: >-
|
||||||
CI Server R1.03 HISTORY Service and item history. Use when the user wants to store item values
|
CI Server R1.05 HISTORY Service and item history. Use when the user wants to store item values
|
||||||
in history (item storage group, storage group item, Scan/Time, Event/Item, Event/Event,
|
in history (item storage group, storage group item, Scan/Time, Event/Item, Event/Event,
|
||||||
Direct, scan interval, averaging, quality codes, priority), set rollover interval, life time
|
Direct, scan interval, averaging, quality codes, priority), set rollover interval, life time
|
||||||
or retention of history, use aggregation (30 minutes, hourly, shift, daily, weekly, monthly,
|
or retention of history, use aggregation (30 minutes, hourly, shift, daily, weekly, monthly,
|
||||||
yearly maximum / minimum / average / integral / standard deviation / counter / differential
|
yearly maximum / minimum / average / integral / standard deviation / counter / differential
|
||||||
summation, ithsag.sup, completion notification), read history (ITEM_HISTORY, GROUP_NAME,
|
summation, ithsag.sup, completion notification), read history (ITEM_HISTORY, GROUP_NAME,
|
||||||
INTERPOLATION, ATTRIBUTE), load history from CSV (ithloahis), force a rollover, check storage
|
INTERPOLATION, ATTRIBUTE; from applications via ODBC, .NET API, RESTful API or pyTOOLS),
|
||||||
groups and units (hisdbg, his_units, history files h*.his), repair or recover history
|
load history from CSV (ithloahis), force a rollover, check storage groups and units (hisdbg, his_units, history files h*.his), repair or recover history
|
||||||
(hisrep, hisrecover), or archive and retrieve history (has.sup, hasman, hasdbg, tape, DVD,
|
(hisrep, hisrecover), or archive and retrieve history (has.sup, hasman, hasdbg, tape, DVD,
|
||||||
disk archive). Sources IM 36K10L20-01EN, IM 36K10C40-01EN, IM 36K10L35-01EN.
|
disk archive). Sources IM 36K10L20-01EN, IM 36K10C40-01EN, IM 36K10L35-01EN.
|
||||||
---
|
---
|
||||||
|
|
||||||
# History management (R1.03)
|
# History management (R1.05; first written for R1.03)
|
||||||
|
|
||||||
|
Re-checked for R1.05 on 2026-10-08 (read-only): the three manuals have no content change except
|
||||||
|
IM 36K10C40 §4.2 (R1.04), which now lists the RESTful API and pyTOOLS for reading history from
|
||||||
|
applications and drops the C API. The history setup files (`has.sup`, `his*.sup`, `ith*.sup`
|
||||||
|
incl. `ithsag.sup`) and the dataset definitions `HIS_GROUP_DF`, `ITEM_HIS_DF`, `ITEM_HISTORY`,
|
||||||
|
`HIS_UNITS` are the same as in R1.03 (compared with snapshots of the R1.05 test server; only
|
||||||
|
the C interface source `dsid_ihis_df.c` of `ITEM_HIS_DF` changed, ISS-102).
|
||||||
|
`history_start.cmd` and `item_start.cmd` (and their stop files) differ (ISS-100). Storage
|
||||||
|
groups were not re-tested on R1.05: the server is shared, and a new group needs a CI Server
|
||||||
|
restart (ISS-006).
|
||||||
|
|
||||||
Background: `knowledge/manuals/IM36K10C40-01EN.md` (storage group fields, types, aggregation,
|
Background: `knowledge/manuals/IM36K10C40-01EN.md` (storage group fields, types, aggregation,
|
||||||
archive, reading history), `IM36K10L20-01EN.md` (history manager, files, `hisdbg`, utilities,
|
archive, reading history), `IM36K10L20-01EN.md` (history manager, files, `hisdbg`, utilities,
|
||||||
|
|
@ -31,10 +41,11 @@ Rules:
|
||||||
|
|
||||||
| Task | File | Status |
|
| Task | File | Status |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Create item storage groups (Event/Item, Scan/Time, Aggregation) and add items by quick load; remove them | `tasks/storage-groups.md` | verified |
|
| Create item storage groups (Event/Item, Scan/Time, Aggregation) and add items by quick load; remove them | `tasks/storage-groups.md` | verified (R1.03); R1.05: dataset definitions and setup files identical, not re-tested (shared server, needs a restart) |
|
||||||
| Read history with `dssqld` (`ITEM_HISTORY`, per group); aggregates | `tasks/storage-groups.md` §4 | verified |
|
| Read history with `dssqld` (`ITEM_HISTORY`, per group); aggregates | `tasks/storage-groups.md` §4 | verified (R1.03); R1.05 not re-tested |
|
||||||
| Load history from CSV (`ithloahis`); which time stamps are accepted | skill `system-management`, task `load-history.md` | verified |
|
| Load history from CSV (`ithloahis`); which time stamps are accepted | skill `system-management`, task `load-history.md` | verified (R1.03) |
|
||||||
| Check groups, units, clients, rollover with `hisdbg` | `tasks/history-checks.md` | verified |
|
| Check groups, units, clients, rollover with `hisdbg` | `tasks/history-checks.md` | verified (R1.03); R1.05 read-only options awaiting user verification (ISS-101) |
|
||||||
| Archive / retrieve, `hasdbg` | C40 summary §4, L20 summary §5 | from docs (no archive device) |
|
| Archive / retrieve, `hasdbg` | C40 summary §4, L20 summary §5 | from docs (no archive device) |
|
||||||
| Repair and recovery (`hisrep`, `hisrecover`, `isfrename`, `hiswrn`) | L20 summary §4 | from docs |
|
| Repair and recovery (`hisrep`, `hisrecover`, `isfrename`, `hiswrn`) | L20 summary §4 | from docs |
|
||||||
| Reading history from classes and reports; ODBC | C40 summary §5; reports: skill `reporting` | verified for reports (`rql-interactive.md`); ODBC from docs |
|
| Reading history from classes and reports | C40 summary §5; reports: skill `reporting` | verified for reports (R1.03, `rql-interactive.md`) |
|
||||||
|
| Reading history from applications: ODBC, .NET API, RESTful API (`GetHistory`, `GetHistoryMultiTag`), pyTOOLS (`getItemHistory`) | C40 summary §5; ODBC and REST: skill `data-access` (L45 summary §1, §9); pyTOOLS: IM 36K10P40 §3.13 (no skill yet) | from docs |
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Check storage groups, units and history clients with hisdbg; force a rollover
|
task: Check storage groups, units and history clients with hisdbg; force a rollover
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10L20-01EN §2.1, §3.1; IM 36K10C40-01EN §5.1; practiced on the test system and CI-Eng-Sample 2026-10-01
|
source: IM 36K10L20-01EN §2.1, §3.1 (4th Edition, Feb. 2026); IM 36K10C40-01EN §5.1 (5th Edition, Feb. 2026); practiced on the test system and CI-Eng-Sample 2026-10-01
|
||||||
status: verified
|
status: verified on R1.03 (2026-10-01). R1.05 - the manual sections are unchanged and the hisdbg program is still installed (2026-10-08), but hisdbg was not run on the R1.05 test server (awaiting user verification, ISS-101; steps at the end) R1.05 (V6, 2026-10-09): hisdbg 1/20/6 and the start scripts verified read-only on the R1.05 test server.
|
||||||
---
|
---
|
||||||
|
|
||||||
# History checks (`hisdbg`)
|
# History checks (`hisdbg`)
|
||||||
|
|
@ -43,8 +43,31 @@ History files are in `%TLS_ALLUSERS_PATH%\tls\his\` (path shown by option 21):
|
||||||
- After a CI Server restart the unit sequence increases (the start script runs `hisrep`).
|
- After a CI Server restart the unit sequence increases (the start script runs `hisrep`).
|
||||||
- Delete times = stop time + life time.
|
- Delete times = stop time + life time.
|
||||||
|
|
||||||
## Verified (2026-10-01)
|
## Verified (R1.03, 2026-10-01)
|
||||||
|
|
||||||
45 groups, 30 clients; `CIENG_EVENT` group 1,54, opt_type `2 2`, daily GMT rollover, life 7
|
45 groups, 30 clients; `CIENG_EVENT` group 1,54, opt_type `2 2`, daily GMT rollover, life 7
|
||||||
days; units 1,1 (created at load) → 3,1 after restart → forced rollover closed 3,1 at 12:05:26
|
days; units 1,1 (created at load) → 3,1 after restart → forced rollover closed 3,1 at 12:05:26
|
||||||
and opened 3,2. `CIENG_SCAN10S` 1,55 `1 1`; `CIENG_AGG` 1,56 `4 4` with extra `h0101ozzz…` files.
|
and opened 3,2. `CIENG_SCAN10S` 1,55 `1 1`; `CIENG_AGG` 1,56 `4 4` with extra `h0101ozzz…` files.
|
||||||
|
|
||||||
|
## R1.05: awaiting user verification (ISS-101)
|
||||||
|
|
||||||
|
On the R1.05 test server, in a normal command prompt (read-only options only):
|
||||||
|
|
||||||
|
```
|
||||||
|
hisdbg
|
||||||
|
```
|
||||||
|
|
||||||
|
Answer the node prompt with Enter (local), then `1` (statistics), `20` (all groups), `6`
|
||||||
|
(clients), and `-1` to exit. Do not choose any other number. Expected: the same menu as R1.03
|
||||||
|
(`-1` … `22`), the system groups with history types 21, 6, 1058, 36, 4 (no item group unless
|
||||||
|
the server has one), and clients such as ITH*, ALH, ADTSTO, LGHUMH, RPTMAN. Send the output.
|
||||||
|
|
||||||
|
## R1.05 test server (V6, 2026-10-09, read-only)
|
||||||
|
|
||||||
|
- `hisdbg` options 1, 20 and 6 give the same prompts and layout as on R1.03 (menu −1…22):
|
||||||
|
statistics, the group list with the system groups of history types 21 (ALH), 6 (ADT), 1058
|
||||||
|
(report groups), 36 (SYS_LOG), 4 (STATION_STAT) plus type 24 item groups, and the logged-in
|
||||||
|
clients (DSSSDA*, RPTMAN, EQPIOSTAT, ALH, the ITH processes …). ISS-101 closed.
|
||||||
|
- `history_start/stop.cmd` and `item_start/stop.cmd` differ from R1.03 only by the call of
|
||||||
|
`?*_history_start.cmd` / `?*_item_start.cmd` (and the stop variants) extension scripts at the
|
||||||
|
end (change i12719, ISS-121). The processes started are unchanged. ISS-100 closed.
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Create item storage groups (Event/Item, Scan/Time, Aggregation), add items, read history
|
task: Create item storage groups (Event/Item, Scan/Time, Aggregation), add items, read history
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10C40-01EN §2.1, §3, App. 1; IM 36K10L20-01EN §2.1; practiced on CI-Eng-Sample 2026-10-01
|
source: IM 36K10C40-01EN §2.1, §3, §4.2, App. 1 (5th Edition, Feb. 2026); IM 36K10L20-01EN §2.1 (4th Edition, Feb. 2026); practiced on CI-Eng-Sample 2026-10-01
|
||||||
status: verified
|
status: verified on R1.03 (2026-10-01). R1.05 - dataset definitions (HIS_GROUP_DF, ITEM_HIS_DF, ITEM_HISTORY) and setup files (ithsag.sup, itheix.sup, itheex.sup, ithstx.sup) identical to R1.03 (compared 2026-10-08 with snapshots of the R1.05 test server); not re-tested on R1.05 (shared server; a new group needs a CI Server restart, and the reduced sample load left out the history groups)
|
||||||
---
|
---
|
||||||
|
|
||||||
# Item storage groups (quick load)
|
# Item storage groups (quick load)
|
||||||
|
|
@ -77,6 +77,10 @@ and 11:54 started storing only after the 12:00 restart). Ask the user to restart
|
||||||
```
|
```
|
||||||
|
|
||||||
`dssqld -e <out>.qli <filter>.qli -c`. Item name and a time range are required; times are local.
|
`dssqld -e <out>.qli <filter>.qli -c`. Item name and a time range are required; times are local.
|
||||||
|
From other applications (C40 §4.2, from docs): ODBC and the RESTful API (`GetHistory`,
|
||||||
|
`GetHistoryMultiTag`; both also from remote PCs) in skill `data-access`; .NET API; pyTOOLS
|
||||||
|
(`dss.getItemHistory`, IM 36K10P40 §3.13, no skill yet; uses its own attribute and period
|
||||||
|
names). Reports: skill `reporting`.
|
||||||
`GROUP_NAME` picks one group (otherwise every group with the item answers). Columns:
|
`GROUP_NAME` picks one group (otherwise every group with the item answers). Columns:
|
||||||
`SAMPLE_TIME`, `SAMPLE_END_TIME`, `INTERVAL_TIME`, `ITEM_VALUE`, `QUALITY`, `INITIAL_VALUE`
|
`SAMPLE_TIME`, `SAMPLE_END_TIME`, `INTERVAL_TIME`, `ITEM_VALUE`, `QUALITY`, `INITIAL_VALUE`
|
||||||
(1 = value at unit start), `STATUS`, `INTERPOLATION`, `ATTRIBUTE`, `GROUP_NAME`, …
|
(1 = value at unit start), `STATUS`, `INTERPOLATION`, `ATTRIBUTE`, `GROUP_NAME`, …
|
||||||
|
|
@ -105,7 +109,7 @@ Items first (`ITEM_HIS_DF` names), then give each group a `STOP_TIME` in the fut
|
||||||
delete: `HIS-E-GROUPHASUNT`, ISS-005). `remove.cmd` does this for all three sample groups.
|
delete: `HIS-E-GROUPHASUNT`, ISS-005). `remove.cmd` does this for all three sample groups.
|
||||||
Removing a group deletes its history.
|
Removing a group deletes its history.
|
||||||
|
|
||||||
## Verified (CI-Eng-Sample, 2026-10-01)
|
## Verified (R1.03, CI-Eng-Sample, 2026-10-01)
|
||||||
|
|
||||||
| Group | Type | Result |
|
| Group | Type | Result |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,20 @@
|
||||||
---
|
---
|
||||||
name: installation-security
|
name: installation-security
|
||||||
description: >-
|
description: >-
|
||||||
CI Server R1.03 installation, upgrade and Windows/IT security. Use when the user wants to
|
CI Server R1.05 installation, upgrade and Windows/IT security. Use when the user wants to
|
||||||
prepare Windows for CI Server, check whether a machine meets the setup requirements, install,
|
prepare Windows for CI Server, check whether a machine meets the setup requirements, install,
|
||||||
reinstall, upgrade or uninstall CI Server, apply or extend a licence, install CI Server Remote
|
reinstall, upgrade or uninstall CI Server, merge configuration files after an upgrade
|
||||||
Connect, set up Vnet/IP drivers or network addresses, apply the IT Security Tool, check or
|
(automatic merge, jupgutl, upgrade report), apply or extend a licence, install CI Server Remote
|
||||||
open firewall ports, manage the CIX_ groups and CIX_PROCESS account, or run CI Server on a
|
Connect, set up Vnet/IP drivers or network addresses, apply the IT Security Tool (IT security
|
||||||
virtual machine. Sources IM 36K01C10-01EN and IM 36K01C30-01EN.
|
version 2.0 or 3.0), set up LAPS, check or open firewall ports, manage the CIX_ groups and
|
||||||
|
CIX_PROCESS account, install CI Server next to PRM, or run CI Server on a virtual machine.
|
||||||
|
Sources IM 36K01C10-01EN and IM 36K01C30-01EN (5th editions).
|
||||||
---
|
---
|
||||||
|
|
||||||
# Installation and security (R1.03)
|
# Installation and security (R1.05)
|
||||||
|
|
||||||
|
First written for R1.03 (frozen on branch `r1.03`), re-checked against the R1.05 manuals
|
||||||
|
(5th editions, Feb. 2026) and the R1.05 test server on 2026-10-08.
|
||||||
|
|
||||||
Background: `knowledge/manuals/IM36K01C10-01EN.md` (Setup) and
|
Background: `knowledge/manuals/IM36K01C10-01EN.md` (Setup) and
|
||||||
`knowledge/manuals/IM36K01C30-01EN.md` (Security Guide). Known issues:
|
`knowledge/manuals/IM36K01C30-01EN.md` (Security Guide). Known issues:
|
||||||
|
|
@ -20,13 +25,25 @@ Rules:
|
||||||
- Installing, upgrading, changing Windows settings or IT security needs an elevated session,
|
- Installing, upgrading, changing Windows settings or IT security needs an elevated session,
|
||||||
changes the machine and often needs restarts: follow the user's chosen way of working and
|
changes the machine and often needs restarts: follow the user's chosen way of working and
|
||||||
confirm before each step. In *prepare only* mode, produce a checklist for the user.
|
confirm before each step. In *prepare only* mode, produce a checklist for the user.
|
||||||
- Never copy old setup files over new ones after an upgrade: compare and merge.
|
- Never copy old setup files over new ones after an upgrade: compare and merge. The R1.05
|
||||||
|
automatic merge does not cover every file (Setup summary §3).
|
||||||
|
- Before a reinstall or upgrade, set the startup type of *CI Service* and *VAGW Bossd* to
|
||||||
|
Manual. From R1.04 VAGW Bossd is stopped and started with `vagwstarter.exe` (Setup summary §3).
|
||||||
|
- Read paths from the `TLS_*` variables: the manuals print the default install paths, which
|
||||||
|
may not be where CI Server is installed (ISS-086).
|
||||||
|
- IT security (IT Security Tool, CIX_ groups, LAPS) is **not tested** on R1.05 (from docs): the
|
||||||
|
R1.05 test server runs Windows Server 2025, where the tool is not supported, and it is not
|
||||||
|
installed. Vnet/IP, the upgrade merge and PRM are not tested either (see
|
||||||
|
`knowledge/r105-verification.md`).
|
||||||
|
|
||||||
| Task | Where | Status |
|
| Task | Where | Status |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Check a machine against the setup and security requirements | `tasks/setup-check.md` | verified |
|
| Check a machine against the setup and security requirements | `tasks/setup-check.md` | verified (R1.03; R1.05 checks run one by one) |
|
||||||
| New installation (physical, VM, dual-redundant): order of work, Windows settings, Vnet/IP, install, IT security, licence | Setup summary §2 | from docs |
|
| New installation (physical, VM, dual-redundant): order of work, Windows settings, Vnet/IP, install, IT security, licence | Setup summary §2 | from docs |
|
||||||
| Start/stop, reinstall, upgrade (incl. HAC), extend licence, uninstall | Setup summary §3 | from docs |
|
| Start/stop CI Server and VAGW Bossd, reinstall, upgrade (incl. HAC), extend licence, uninstall | Setup summary §3 | from docs |
|
||||||
|
| Upgrade with automatic merge of configuration files (installer checkbox, `jupgutl`, merge report and conflict log) | Setup summary §3 | from docs (files and merge patterns checked on the R1.05 test server) |
|
||||||
| Install CI Server Remote Connect; web ports | Setup summary §2.4 | from docs |
|
| Install CI Server Remote Connect; web ports | Setup summary §2.4 | from docs |
|
||||||
| Firewall ports for CI Server and drivers | Security Guide summary §3 | from docs (web, DURM, SMDMON ports checked) |
|
| CI Server and PRM on one computer or connected | Setup summary §4 | from docs |
|
||||||
| IT Security Tool, user management types, CIX_ groups/accounts, change service account | Security Guide summary §2, §5 | from docs |
|
| Firewall ports for CI Server and drivers | Security Guide summary §3 | from docs (web, DURM, SMDMON, RESTful API ports checked on R1.03 / R1.05) |
|
||||||
|
| IT Security Tool (version 2.0 / 3.0), user management types, CIX_ groups/accounts, change service account | Security Guide summary §2, §5, §7 | from docs |
|
||||||
|
| LAPS (linked domain management with IT security 3.0) | Setup summary §2.1.6, Security Guide summary §7 | from docs |
|
||||||
|
|
|
||||||
|
|
@ -1,27 +1,43 @@
|
||||||
---
|
---
|
||||||
task: Check a machine against the CI Server setup and security requirements
|
task: Check a machine against the CI Server setup and security requirements
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K01C10-01EN §1, §2.1.2, §3.2.12; IM 36K01C30-01EN §2.2, §3.2; practiced on the test system 2026-09-30
|
source: IM 36K01C10-01EN 5th ed. §1.3.2, §1.3.3, §2.1.2, §2.1.3, §3.3.15; IM 36K01C30-01EN 5th ed. §2.2.1, §3.2, §3.5.4, §3.7; practiced on the R1.03 test system 2026-09-30 and checked read-only on the R1.05 test server 2026-10-08
|
||||||
status: verified (2026-09-30)
|
status: verified on R1.03 (2026-09-30); R1.05 checks verified one by one (R1.05 test server, 2026-10-08), script itself not yet run on R1.05
|
||||||
---
|
---
|
||||||
|
|
||||||
# Setup check (read-only)
|
# Setup check (read-only)
|
||||||
|
|
||||||
```
|
```
|
||||||
powershell -NoProfile -ExecutionPolicy Bypass -File tools\setup_check.ps1
|
powershell -NoProfile -ExecutionPolicy Bypass -File tools\setup_check.ps1
|
||||||
|
powershell -NoProfile -ExecutionPolicy Bypass -File tools\setup_check.ps1 -Version 1.03.00
|
||||||
```
|
```
|
||||||
|
|
||||||
Run from the repo root, preferably elevated. Changes nothing. One line per check:
|
Run from the repo root, preferably elevated. Changes nothing. The default target is R1.05
|
||||||
|
(`-Version 1.05.00`); use `-Version 1.03.00` for an R1.03 machine. One line per check:
|
||||||
`[OK]` matches the manual, `[DIFF]` differs, `[CHECK]` needs a human decision.
|
`[OK]` matches the manual, `[DIFF]` differs, `[CHECK]` needs a human decision.
|
||||||
|
|
||||||
|
The script must be on the machine being checked. On a server you reach only remotely, the
|
||||||
|
user copies it there (or runs the checks below by hand); it writes nothing.
|
||||||
|
|
||||||
## What it checks
|
## What it checks
|
||||||
|
|
||||||
| Area | Checks |
|
| Area | Checks |
|
||||||
|---|---|
|
|---|---|
|
||||||
| CI Server | Installed version (1.03.00), CI Service state, startup type and account (`.\CIX_PROCESS`), VAGW service |
|
| CI Server | Installed version (1.05.00 by default), CI Service (`StartCIServer`) state, startup type and account (`.\CIX_PROCESS`), VAGW service |
|
||||||
| Windows | Supported OS, visual effects, processor scheduling, virtual memory (custom, 1.5 × RAM), power plan, fast startup, Windows Defender policy, automatic updates policy, scheduled defrag and component cleanup, .NET 3.5, DCOM authentication level, display scale, 8dot3 names, regional settings |
|
| Windows | Supported OS for the target version, visual effects, processor scheduling, virtual memory (custom, 1.5 × RAM), power plan, fast startup, Windows Defender policy (with the R1.05 exceptions), automatic updates policy, scheduled defrag and component cleanup, .NET 3.5, DCOM authentication level, display scale, 8dot3 names, regional settings |
|
||||||
| IT security | `CIX_OPERATOR`, `CIX_ENGINEER`, `CIX_MAINTENANCE`, `CIX_OPC` groups, `CIX_PROCESS` / `CTM_PROCESS` users, IT Security Tool installed |
|
| IT security | `CIX_OPERATOR`, `CIX_ENGINEER`, `CIX_MAINTENANCE`, `CIX_OPC` groups, `CIX_PROCESS` / `CTM_PROCESS` users, IT Security Tool installed (program folder or the IT security 3.0 folder under ProgramData) |
|
||||||
| Firewall | Profiles enabled; inbound allowed for TCP 8080, 8443, UDP 17001, 17101, 18002 |
|
| Firewall | Profiles enabled; inbound allowed for TCP 8080, 8443, UDP 17001, 17101, 18002; on R1.05 also TCP 34597 (RESTful API) |
|
||||||
|
|
||||||
|
R1.05 supported OS (IM 36K01C10 5th ed. §1.3.2), all 64-bit: Windows 10 Enterprise / IoT
|
||||||
|
Enterprise LTSC 2019 and 2021, Windows 11 Pro and Enterprise, Windows 11 Enterprise / IoT
|
||||||
|
Enterprise LTSC 2024, Windows Server 2019 / IoT 2019, 2022 / IoT 2022 and 2025 / IoT 2025
|
||||||
|
(Standard). On Windows 11 Pro/Enterprise and Server 2025 the Vnet/IP drivers and the IT
|
||||||
|
Security Tool are not supported. Windows 10 Pro/Enterprise (non-LTSC), LTSB 2016 and Server
|
||||||
|
2016 are no longer listed.
|
||||||
|
|
||||||
|
Defender (IM 36K01C10 5th ed. §2.1.2, IM 36K01C30 5th ed. §3.5.4): normally turned off by
|
||||||
|
group policy, but it must stay on with Windows 11 Pro 24H2, and it cannot be turned off on
|
||||||
|
Windows 10 LTSC 2021 or Windows 11 LTSC 2024. The script reports `[CHECK]` for those.
|
||||||
|
|
||||||
## Reading the result
|
## Reading the result
|
||||||
|
|
||||||
|
|
@ -29,23 +45,58 @@ Run from the repo root, preferably elevated. Changes nothing. One line per check
|
||||||
Setup summary's Windows settings table (`knowledge/manuals/IM36K01C10-01EN.md` §2) or by
|
Setup summary's Windows settings table (`knowledge/manuals/IM36K01C10-01EN.md` §2) or by
|
||||||
running the IT Security Tool.
|
running the IT Security Tool.
|
||||||
- The script finds the firewall rules only as "some rule allows this port"; check the rule
|
- The script finds the firewall rules only as "some rule allows this port"; check the rule
|
||||||
scope separately for production.
|
scope separately for production. If the active profile is switched off, no rule is needed
|
||||||
|
and every port is open: check which profile is active (`Get-NetConnectionProfile`).
|
||||||
|
- Listening ports (useful when there are no rules): `Get-NetTCPConnection -State Listen` and
|
||||||
|
`Get-NetUDPEndpoint` with the owning process. On R1.05 the RESTful API server (`jrstsrv`,
|
||||||
|
a `javaw` process) also listens on TCP 7073, which no manual mentions (ISS-087): do not open
|
||||||
|
it in the firewall.
|
||||||
- Also read `%TLS_LOG_PATH%\ci_start.log` after a start: every service should report
|
- Also read `%TLS_LOG_PATH%\ci_start.log` after a start: every service should report
|
||||||
`… started` and the log ends with `CI Server started`; look for `-E-` and `failed` lines.
|
`… started` and there should be a `CI Server started` line; look for `-E-` and `failed`
|
||||||
The first lines show the version and build (e.g. `R1.03.00 … (r10200M)`).
|
lines. The log keeps growing after the start (equipment messages), so the `CI Server
|
||||||
|
started` line is not always last. The `UMHLOGTOO` line near the top shows the version and
|
||||||
|
build (R1.03: `R1.03.00 … (r10200M)`, R1.05: `R1.05.00 … (r11609M)`).
|
||||||
- The web ports actually used are `SECURE_PORT_NUMBER` / `NON_SECURE_PORT_NUMBER` in
|
- The web ports actually used are `SECURE_PORT_NUMBER` / `NON_SECURE_PORT_NUMBER` in
|
||||||
`%TLS_ROOT_PATH%\tls\sup\jwuiisg.sup` (8443 / 8080 by default).
|
`%TLS_ROOT_PATH%\tls\sup\jwuiisg.sup` (8443 / 8080 by default); the RESTful API port is
|
||||||
|
`JRST_NETWORK_PORT` in `jrstsrv.sup` (34597 by default, R1.05).
|
||||||
|
- Installed updates: `Get-HotFix`. `wmic qfe list full` (Setup App. 1.3) fails on Windows
|
||||||
|
Server 2025 / 24H2, where WMIC is no longer installed (ISS-088).
|
||||||
- Folder rights (not in the script): setup files can hold passwords (e.g. `dbc.sup`). Check
|
- Folder rights (not in the script): setup files can hold passwords (e.g. `dbc.sup`). Check
|
||||||
who can read and change them:
|
who can read and change them:
|
||||||
`foreach ($r in (Get-Acl "$env:TLS_ROOT_PATH\tls\sup").Access) { "{0} : {1}" -f $r.IdentityReference, $r.FileSystemRights }`.
|
`foreach ($r in (Get-Acl "$env:TLS_ROOT_PATH\tls\sup").Access) { "{0} : {1}" -f $r.IdentityReference, $r.FileSystemRights }`.
|
||||||
Under Program Files, Users can read; an install outside Program Files (e.g.
|
Under Program Files, Users can read; an install outside Program Files (e.g.
|
||||||
`C:\Yokogawa\CIServer`, seen on an R1.05 system) can inherit *Authenticated Users: Modify*,
|
`C:\Yokogawa\CIServer`, as on the R1.05 test server) can inherit *Authenticated Users:
|
||||||
so any signed-in user can change setup files (ISS-061). Fixing it is a site decision (IT
|
Modify*, so any signed-in user can change setup files (ISS-061). Fixing it is a site
|
||||||
Security Tool).
|
decision (IT Security Tool).
|
||||||
|
- A local group `RDC_GA_CLIENT` with member `CIX_PROCESS` can exist on a machine that is not
|
||||||
|
a dual-redundant platform and has no IT security applied (seen on R1.05). It needs no
|
||||||
|
action (ISS-089).
|
||||||
|
|
||||||
## Test system result (2026-09-30)
|
## R1.05 test server result (2026-10-08)
|
||||||
|
|
||||||
|
Checks run one by one, read-only, then the script itself (copied to a temporary folder,
|
||||||
|
run from an elevated session, deleted again): **12 OK, 5 CHECK, 20 DIFF**. The first run
|
||||||
|
showed the CI Server ports as allowed: the script counted program-limited Windows rules with
|
||||||
|
"any port" (e.g. Remote Desktop Shadow) as a match. Fixed 2026-10-08; such rules no longer count. Windows Server 2025
|
||||||
|
Datacenter (24H2) virtual machine, domain member, CI Server R1.05.00 (r11609M) installed in
|
||||||
|
`C:\Yokogawa\CIServer` without the IT Security Tool.
|
||||||
|
|
||||||
|
- Matched: CI Service running, automatic, account `.\CIX_PROCESS`; fast startup off; High
|
||||||
|
performance plan; processor scheduling Programs; 8dot3 names enabled; 100 % scale; web
|
||||||
|
ports 8443/8080; RESTful API on 34597; DURM UDP 17001/17101 and SMDMON UDP 18002 listening.
|
||||||
|
- Differed: Datacenter edition is not listed (only Standard); firewall profile for the
|
||||||
|
domain network off and no CI Server inbound rules; Defender on; automatic updates, defrag
|
||||||
|
and component cleanup not disabled; virtual memory not a custom size; .NET 3.5 not
|
||||||
|
installed; no `CIX_` groups, no `CTM_PROCESS`, no VAGW Bossd service (IT Security Tool not
|
||||||
|
installed and not supported on Server 2025, so IT security is **not tested** on this server).
|
||||||
|
- `ci_start.log`: all services started; the same odbsrv SSL certificate error as on R1.03
|
||||||
|
(ISS-008).
|
||||||
|
|
||||||
|
## R1.03 test system result (2026-09-30)
|
||||||
|
|
||||||
Windows 10 Pro 19045 development PC without the IT Security Tool: 16 OK, 5 CHECK, 15 DIFF.
|
Windows 10 Pro 19045 development PC without the IT Security Tool: 16 OK, 5 CHECK, 15 DIFF.
|
||||||
|
(Run before the firewall-check fix of 2026-10-08, so "inbound allowed" lines may have counted
|
||||||
|
program-limited "any port" rules; re-run to confirm.)
|
||||||
Differences: firewall domain/private profiles off; no `CIX_` groups or `CTM_PROCESS` (IT
|
Differences: firewall domain/private profiles off; no `CIX_` groups or `CTM_PROCESS` (IT
|
||||||
Security Tool not installed; not supported on Windows 10 Pro); fast startup on; Balanced power
|
Security Tool not installed; not supported on Windows 10 Pro); fast startup on; Balanced power
|
||||||
plan; automatic virtual memory; Defender on; automatic updates, defrag and cleanup not
|
plan; automatic virtual memory; Defender on; automatic updates, defrag and cleanup not
|
||||||
|
|
@ -53,4 +104,4 @@ disabled. Web ports 8443/8080. `ci_start.log`: all services started, one SSL cer
|
||||||
(`InitializeSslCtx(): SSL_CTX_use_certificate_chain_file() failed`): the ODBC server `odbsrv`
|
(`InitializeSslCtx(): SSL_CTX_use_certificate_chain_file() failed`): the ODBC server `odbsrv`
|
||||||
has `USESSL = YES` but no certificate in `%TLS_ROOT_PATH%\tls\pki\odbsrv`, so it exits at
|
has `USESSL = YES` but no certificate in `%TLS_ROOT_PATH%\tls\pki\odbsrv`, so it exits at
|
||||||
start (harmless unless ODBC is used; fix in skill `data-access`, task `access-checks.md`;
|
start (harmless unless ODBC is used; fix in skill `data-access`, task `access-checks.md`;
|
||||||
`knowledge/issues.md` ISS-008).
|
`knowledge/issues.md` ISS-008). Windows 10 Pro is no longer a supported OS for R1.05.
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,23 @@
|
||||||
---
|
---
|
||||||
name: item-engineering
|
name: item-engineering
|
||||||
description: >-
|
description: >-
|
||||||
CI Server R1.03 sections, items and sub-items. Use when the user wants to create or change
|
CI Server R1.05 sections, items and sub-items. Use when the user wants to create or change
|
||||||
sections, items or sub-items (integrator, min-max, pulse, rate-of-change), set limits,
|
sections, items or sub-items (integrator, min-max, pulse, rate-of-change), set limits,
|
||||||
scale or value format, string item length, integrator time unit (integration granule),
|
scale or value format, string item length, integrator time unit (integration granule),
|
||||||
PIT filter, block or unblock items or sections, or understand item status and option flags
|
PIT filter, block or unblock items or sections, or understand item status and option flags
|
||||||
(blk, off, uoff, ublk). Sources IM 36K10G10-01EN (Tutorial) and IM 36K10C10-01EN.
|
(blk, off, uoff, ublk). Sources IM 36K10G10-01EN (Tutorial) and IM 36K10C10-01EN.
|
||||||
|
version: R1.05 (first written for R1.03)
|
||||||
---
|
---
|
||||||
|
|
||||||
# Item engineering (R1.03)
|
# Item engineering (R1.05)
|
||||||
|
|
||||||
|
Re-checked on R1.05 on 2026-10-08: the dataset definitions `SECTION_DF`, `ITEM_DF`,
|
||||||
|
`SUB_ITEM_DF`, `STATUS_DF`, the item form (`JhmiItemDia.xml`) and `itm.sup` (integration
|
||||||
|
granule `itm_int_secs` = 1) are identical to R1.03. Only `ITEM_VAL` changed: it has three new
|
||||||
|
fields `ENG_UNIT`, `SCALE_HIGH_LIMIT`, `SCALE_LOW_LIMIT` (by their names the item's
|
||||||
|
engineering units and scale limits next to the value; not in any manual, values not yet read,
|
||||||
|
ISS-126). The R1.05 manuals now give the string
|
||||||
|
item maximum the software uses (200 bytes, ISS-124).
|
||||||
|
|
||||||
Background: `knowledge/manuals/IM36K10G10-01EN.md` (chapter 3). Bulk creation of sections and
|
Background: `knowledge/manuals/IM36K10G10-01EN.md` (chapter 3). Bulk creation of sections and
|
||||||
items uses quick load files: skill `system-management`, task `load-remove-records.md`.
|
items uses quick load files: skill `system-management`, task `load-remove-records.md`.
|
||||||
|
|
@ -20,8 +29,10 @@ Rules:
|
||||||
|
|
||||||
| Task | File | Status |
|
| Task | File | Status |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Sub-items (integrator, min-max) | `tasks/sub-items.md` | verified |
|
| Sections, items, sub-items (integrator, min-max) by quick load | `tasks/sub-items.md` | verified (R1.03; R1.05 test server 2026-10-08: sample sections, items and sub-items loaded with 0 errors, min-max followed the level) |
|
||||||
| Block / unblock an item; write to a blocked item | `tasks/block-item.md` | verified |
|
| Integrator time unit (`itm_int_secs`) | `tasks/sub-items.md` | verified (R1.03); R1.05 file identical, not re-tested (setup-file change on a shared server) |
|
||||||
| String items: length limit (1–200) and truncation | `tasks/string-items.md` | verified |
|
| Block / unblock an item; write to a blocked item | `tasks/block-item.md` | verified (R1.03); R1.05 re-test awaits a decision (ISS-129) |
|
||||||
| Item forms, limits, PIT filter, clamping, alarm tab, option bits, item statuses | `knowledge/manuals/IM36K10C10-01EN.md` §3–4 | from docs |
|
| String items: length limit (1–200) and truncation | `tasks/string-items.md` | verified (R1.03); R1.05 limit checked in the data dictionary, writes not re-tested (ISS-129) |
|
||||||
| Switch on alarming, ack type, delay/repeat, test and acknowledge alarms | skill `alarm-management`, task `item-alarming.md` | verified |
|
| Item forms, limits, PIT filter, clamping, alarm tab, option bits, item statuses | `knowledge/manuals/IM36K10C10-01EN.md` §3–4 | from docs (form definition identical on R1.05) |
|
||||||
|
| Switch on alarming, ack type, delay/repeat, test and acknowledge alarms | skill `alarm-management`, task `item-alarming.md` | verified (R1.03) |
|
||||||
|
| CENTUM VP virtual test and HIS-TSE connection (new Tutorial ch. 14–15) | `knowledge/manuals/IM36K10G10-01EN.md` | from docs; not tested (no CENTUM VP, ISS-127) |
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Block / unblock an item and write to a blocked item
|
task: Block / unblock an item and write to a blocked item
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10G10-01EN §3.3, §3.4; practiced with CI-Eng-Sample 2026-09-30
|
source: IM 36K10G10-01EN 5th ed. (Feb. 2026) §3.3, §3.4; IM 36K10C10-01EN 5th ed. (Feb. 2026) §3.4, §3.5; practiced with CI-Eng-Sample 2026-09-30 (R1.03)
|
||||||
status: verified
|
status: verified on R1.03 (2026-09-30); on R1.05 the BLOCKED fields of SECTION_DF, ITEM_DF and ITEM_VAL and the option bits are unchanged (checked 2026-10-08, read-only); blocking and writes to a blocked item not re-tested on the shared R1.05 test server, re-test awaits a decision (ISS-129) Re-tested on R1.05 2026-10-09 on the shared test server with the user's approval (temporary sample records, everything removed, before/after snapshot identical): block, silent ignore without -o, write with -o, unblock leaves ublk (V9).
|
||||||
---
|
---
|
||||||
|
|
||||||
# Block / unblock an item
|
# Block / unblock an item
|
||||||
|
|
@ -27,7 +27,7 @@ dssqld -m block.qli -l block.qlo
|
||||||
|
|
||||||
(Engineering Module: right-click the item or section › *Block/Unblock*.)
|
(Engineering Module: right-click the item or section › *Block/Unblock*.)
|
||||||
|
|
||||||
## Behaviour (verified on `CI-Eng-Sample.TANK1.INFLOW`)
|
## Behaviour (verified on R1.03 with `CI-Eng-Sample.TANK1.INFLOW`)
|
||||||
|
|
||||||
- Blocked: option flag `blk` appears in `itmval -g`; the status number is unchanged (stayed 9).
|
- Blocked: option flag `blk` appears in `itmval -g`; the status number is unchanged (stayed 9).
|
||||||
- `itmval -p -n <item> -v <value>` on a blocked item is **silently ignored** (exit code 0, no
|
- `itmval -p -n <item> -v <value>` on a blocked item is **silently ignored** (exit code 0, no
|
||||||
|
|
@ -37,3 +37,7 @@ dssqld -m block.qli -l block.qlo
|
||||||
- After unblocking, `blk` is gone but `ublk` (option bit 16, *updated blocked*) remains: the
|
- After unblocking, `blk` is gone but `ublk` (option bit 16, *updated blocked*) remains: the
|
||||||
item was written by an application (`itmval -o`) while it was blocked (IM 36K10C10 §3.5,
|
item was written by an application (`itmval -o`) while it was blocked (IM 36K10C10 §3.5,
|
||||||
ISS-001).
|
ISS-001).
|
||||||
|
|
||||||
|
R1.05 (re-tested 2026-10-09, V9): same behaviour. `CI-Eng-Sample.TANK1.INFLOW` blocked → option
|
||||||
|
`blk`, status 9; `itmval -p … -v 77` exit 0, value unchanged; `-o` wrote 88 and added `ublk`; after
|
||||||
|
unblocking `blk` was gone and `ublk` stayed.
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,15 @@
|
||||||
---
|
---
|
||||||
task: String items: length limit and truncation
|
task: String items: length limit and truncation
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10C10-01EN §3.3.4; data dictionary (`dssqld -f`); practiced on CI-Eng-Sample 2026-09-30
|
source: IM 36K10C10-01EN 5th ed. (Feb. 2026) §3.3.4; IM 36K10G10-01EN 5th ed. (Feb. 2026) §3.2.2; data dictionary (`dssqld -f`); practiced on CI-Eng-Sample 2026-09-30 (R1.03)
|
||||||
status: verified
|
status: verified on R1.03 (2026-09-30); on R1.05 the limit 1–200 / default 80 was checked in the data dictionary and ITEM_DF is identical (2026-10-08, read-only); string writes and truncation not re-tested on the shared R1.05 test server, re-test awaits a decision (ISS-129) Re-tested on R1.05 2026-10-09 on the shared test server with the user's approval (temporary sample records, everything removed, before/after snapshot identical): a 120-character write to a length-100 item stored 99 characters with status 12 (V9).
|
||||||
---
|
---
|
||||||
|
|
||||||
# String items
|
# String items
|
||||||
|
|
||||||
A string item has a maximum length set when it is created (`ITEM_DF.STRING_LENGTH`).
|
A string item has a maximum length set when it is created (`ITEM_DF.STRING_LENGTH`).
|
||||||
|
|
||||||
| Rule | Value (verified) |
|
| Rule | Value (verified R1.03) |
|
||||||
|---|---|
|
|---|---|
|
||||||
| Allowed `STRING_LENGTH` | 1–200 (default 80); 201 is rejected with `DSS-E-VAL_RANGE` |
|
| Allowed `STRING_LENGTH` | 1–200 (default 80); 201 is rejected with `DSS-E-VAL_RANGE` |
|
||||||
| Audit trailing (`AUDIT_INFO`) | no effect on the limit (200 loads with audit on) |
|
| Audit trailing (`AUDIT_INFO`) | no effect on the limit (200 loads with audit on) |
|
||||||
|
|
@ -17,8 +17,10 @@ A string item has a maximum length set when it is created (`ITEM_DF.STRING_LENGT
|
||||||
| Value that fits | stored, status 9 NORMAL |
|
| Value that fits | stored, status 9 NORMAL |
|
||||||
| Value too long | cut to length − 1, status **12 OVERRANGED**, no error from `itmval` |
|
| Value too long | cut to length − 1, status **12 OVERRANGED**, no error from `itmval` |
|
||||||
|
|
||||||
The manuals disagree (Engineering Module: max 100; Tutorial: 168); the installed software
|
The R1.03 manuals disagreed (Engineering Module: max 100; Tutorial: 168; ISS-019). The R1.05
|
||||||
allows 200 (`knowledge/issues.md` ISS-019). Multi-byte characters take more than one byte.
|
manuals (changed in R1.04, not listed in the revision tables) give default 80 and maximum
|
||||||
|
200 **bytes**, matching the software (ISS-124). Multi-byte characters take more than one byte.
|
||||||
|
That a value holds only length − 1 characters is not in any manual.
|
||||||
|
|
||||||
Quick load (the section must exist):
|
Quick load (the section must exist):
|
||||||
|
|
||||||
|
|
@ -35,3 +37,8 @@ After a write, check the status: 12 means the text was cut.
|
||||||
|
|
||||||
The representation (type) and length cannot be changed on an existing item: remove and
|
The representation (type) and length cannot be changed on an existing item: remove and
|
||||||
load it again.
|
load it again.
|
||||||
|
|
||||||
|
**Mixed item files (R1.05, 2026-10-12).** `STRING_LENGTH` is checked on every record of an `@FIELDS`
|
||||||
|
block: `0` (or empty) on a Real/Integer item is refused with `DSS-E-VAL_RANGE ... (Field:
|
||||||
|
STRING_LENGTH)`. Put String items in their own `@FIELDS` block with `STRING_LENGTH`, and the other
|
||||||
|
items in a block without it.
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Create sub-items (integrator, min-max)
|
task: Create sub-items (integrator, min-max)
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10G10-01EN §3.1.5, §3.2.3; IM 36K10C10-01EN §3.2; practiced with CI-Eng-Sample 2026-09-30
|
source: IM 36K10G10-01EN 5th ed. (Feb. 2026) §3.1.5, §3.2.3; IM 36K10C10-01EN 5th ed. (Feb. 2026) §3.2; practiced with CI-Eng-Sample 2026-09-30 (R1.03)
|
||||||
status: verified
|
status: verified on R1.03 (2026-09-30); verified (R1.05 test server, 2026-10-08) for loading — the reduced CI-Eng-Sample load created sections, items and both sub-items with 0 errors and LEVEL.MAX followed the level; SUB_ITEM_DF and itm.sup identical to R1.03; integrator rate and the itm_int_secs change not re-tested on R1.05
|
||||||
---
|
---
|
||||||
|
|
||||||
# Sub-items
|
# Sub-items
|
||||||
|
|
@ -23,19 +23,21 @@ NAME,DESCRIPTION,SUB_TYPE,TIME_UNIT,MIN_MAX
|
||||||
```
|
```
|
||||||
|
|
||||||
Load with `dssqld -i <file>.qli -l <file>.qlo`; remove with a `NAME`-only file and `dssqld -r`
|
Load with `dssqld -i <file>.qli -l <file>.qlo`; remove with a `NAME`-only file and `dssqld -r`
|
||||||
(before removing the main item).
|
(before removing the main item). R1.05 accepts these files unchanged (`@VERSION 1.03.00`).
|
||||||
|
|
||||||
## Behaviour (verified)
|
## Behaviour
|
||||||
|
|
||||||
- **Integrator** adds *value × time unit*: with the main item at 1 it grows by 1 per second
|
- **Integrator** (verified R1.03) adds *value × time unit*: with the main item at 1 it grows by
|
||||||
by default. The time unit is the **integration granule** `itm_int_secs` in `itm.sup`
|
1 per second by default. The time unit is the **integration granule** `itm_int_secs` in
|
||||||
(Setup File Editor label "Integration granule, sec."), **system-wide** for all integrators,
|
`itm.sup` (Setup File Editor label "Integration granule, sec."), **system-wide** for all
|
||||||
installed value 1. Setting 60 and restarting CI Server made it grow by 1 per minute
|
integrators, installed value 1 (same file on R1.05). Setting 60 and restarting CI Server
|
||||||
(verified 2026-09-30, ISS-010). Changing it is a setup-file change (skill `portal-setup`,
|
made it grow by 1 per minute (R1.03, 2026-09-30, ISS-010). Changing it is a setup-file change
|
||||||
task `change-setup-file.md`); existing integrator values are not converted, so reset or
|
(skill `portal-setup`, task `change-setup-file.md`); existing integrator values are not
|
||||||
note them. `TIME_UNIT` on the sub-item has no effect on integrators.
|
converted, so reset or note them. `TIME_UNIT` on the sub-item has no effect on integrators.
|
||||||
- **Min-Max** with `MIN_MAX` = `Maximum` (or `Minimum`) keeps the highest (lowest) value
|
- **Min-Max** with `MIN_MAX` = `Maximum` (or `Minimum`) keeps the highest (lowest) value
|
||||||
written to the main item: writing 30, 70, 50 gave 70.
|
written to the main item: writing 30, 70, 50 gave 70 (R1.03). On R1.05 `TANK1.LEVEL.MAX`
|
||||||
- `TIME_UNIT` (Second, Minute, Hour, Day) belongs to Rate-of-Change (from docs, not practiced).
|
followed the rising level (R1.05 test server, 2026-10-08).
|
||||||
|
- `TIME_UNIT` (Second, Minute, Hour, Day; default Day) belongs to Rate-of-Change (from docs,
|
||||||
|
not practiced).
|
||||||
|
|
||||||
Example files: `examples/CI-Eng-Sample/02b_sub_item_df.qli`, `90b_remove_sub_item_df.qli`.
|
Example files: `examples/CI-Eng-Sample/02b_sub_item_df.qli`, `90b_remove_sub_item_df.qli`.
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,24 @@
|
||||||
---
|
---
|
||||||
name: portal-setup
|
name: portal-setup
|
||||||
description: >-
|
description: >-
|
||||||
CI Server R1.03 CI Portal, CI View and setup files. Use when the user wants to read, check
|
CI Server R1.05 CI Portal, CI View and setup files. Use when the user wants to read, check
|
||||||
or change a setup file (.sup) or use the Setup File Editor, write setup file metadata
|
or change a setup file (.sup) or use the Setup File Editor, write setup file metadata
|
||||||
(!KEYWORD, !TAB, !ARG), choose between CI Portal and CI View, set up a CI Portal node
|
(!KEYWORD, !TAB, !ARG), choose between CI Portal and CI View, set up a CI Portal node
|
||||||
(dur.sup host node, copying displays), check the Remote Connect web page or web ports
|
(dur.sup host node, gateway core, copying displays), check the Remote Connect web page or
|
||||||
(8080/8443), or tune the operator interface, Engineering Module or Edit Module
|
web ports (8080/8443, HTTP to HTTPS redirect, hostname whitelisting, security headers and
|
||||||
|
CSP), or tune the operator interface, Engineering Module or Edit Module
|
||||||
(jwuiisg.sup, jhmiset.sup, jwuiged.sup) and the WFL processes (wflidi, wfladi, wflcdi,
|
(jwuiisg.sup, jhmiset.sup, jwuiged.sup) and the WFL processes (wflidi, wfladi, wflcdi,
|
||||||
wflgdi, wfla_display), e.g. display cache time, flow control, alarm overview event types.
|
wflgdi, wfla_display), e.g. display cache time, flow control, alarm overview event types.
|
||||||
Sources IM 36K10R10-01EN and IM 36K10R20-01EN.
|
Sources IM 36K10R10-01EN and IM 36K10R20-01EN.
|
||||||
---
|
---
|
||||||
|
|
||||||
# CI Portal and setup files (R1.03)
|
# CI Portal and setup files (R1.05)
|
||||||
|
|
||||||
|
Re-checked on R1.05 on 2026-10-08 (read-only, single-node test server). The manuals changed
|
||||||
|
only in R10 §3.1 (install from an ISO file) and §3.3 (link to BUS Service); the Setup File
|
||||||
|
Editor and the WFL setup files are unchanged. `jwuiisg.sup` has new keywords, a new
|
||||||
|
*Access Control* tab and stricter default security headers (R10 summary §4.3, ISS-110 to
|
||||||
|
ISS-112); `dur.sup` has a new *Gateway Core* switch (ISS-109).
|
||||||
|
|
||||||
Background: `knowledge/manuals/IM36K10R10-01EN.md` (CI Portal Setup: processes, CI Portal vs
|
Background: `knowledge/manuals/IM36K10R10-01EN.md` (CI Portal Setup: processes, CI Portal vs
|
||||||
CI View, every user-interface setup file and keyword) and
|
CI View, every user-interface setup file and keyword) and
|
||||||
|
|
@ -29,11 +36,12 @@ Rules:
|
||||||
|
|
||||||
| Task | File | Status |
|
| Task | File | Status |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Read a setup file: active settings and keyword help | `tasks/read-setup-file.md` | verified (read-only) |
|
| Read a setup file: active settings and keyword help | `tasks/read-setup-file.md` | verified (R1.03; re-run read-only on R1.05 2026-10-08) |
|
||||||
| Change a setup file safely (back up, edit, restart, verify, restore) | `tasks/change-setup-file.md` | verified |
|
| Change a setup file safely (back up, edit, restart, verify, restore) | `tasks/change-setup-file.md` | verified (R1.03); R1.05 not tested (shared server: no setup-file change or restart) |
|
||||||
| What the Setup File Editor shows for a file (tabs, fields, Changed status) | `tasks/read-setup-file.md`, R20 summary §2 | verified (compared in the GUI) |
|
| What the Setup File Editor shows for a file (tabs, fields, Changed status) | `tasks/read-setup-file.md`, R20 summary §2 | verified in the GUI (R1.03); R1.05 awaiting user verification (ISS-113) |
|
||||||
| Login method / login control (moved to `dssana.sup`) | not covered yet (ISS-017) | — |
|
| Login method / login control (moved to `dssana.sup`) | skill `authorization` (ISS-017) | — |
|
||||||
| Check web access for CI View (ports, Remote Connect page, `DEPLOY` folder) | `tasks/check-web-access.md` | verified (read-only) |
|
| Check web access for CI View (ports, Remote Connect page, security headers, `DEPLOY` folder) | `tasks/check-web-access.md` | verified (R1.03; R1.05 2026-10-08, read-only) |
|
||||||
| Choose CI Portal or CI View; set up a separate CI Portal node | R10 summary §2–3 | from docs (needs a second node) |
|
| Choose CI Portal or CI View; set up a separate CI Portal node | R10 summary §2–3 | from docs; not tested (R1.03 and R1.05 test systems are single nodes) |
|
||||||
|
| Gateway core (`dur.sup` *Gateway Core*; no operator interface) | R10 summary §3 | from docs; keyword checked in the installed file (R1.05) |
|
||||||
| Operator interface does not show a changed display/item (cache) | R10 summary §1 | from docs |
|
| Operator interface does not show a changed display/item (cache) | R10 summary §1 | from docs |
|
||||||
| Write metadata for a custom setup file | R20 summary §3 | from docs |
|
| Write metadata for a custom setup file | R20 summary §3 | from docs; keyword set checked identical R1.03/R1.05 |
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Change a setup file safely
|
task: Change a setup file safely
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10R20-01EN §1–2; IM 36K10R10-01EN §4
|
source: IM 36K10R20-01EN §1–2 (4th Edition, Feb. 2026); IM 36K10R10-01EN §4 (5th Edition, Feb. 2026)
|
||||||
status: verified on the test system 2026-09-30 (jwuiisg.sup HTTP port 8080 → 8081 and back; wfla_display.sup queue size via the editor and Reset Field)
|
status: verified on R1.03 2026-09-30 (jwuiisg.sup HTTP port 8080 → 8081 and back; wfla_display.sup queue size via the editor and Reset Field). R1.05 not tested (the R1.05 test server is shared: no setup-file change or restart); the editor launcher and metadata keywords are unchanged (checked 2026-10-08), editor GUI awaiting user verification (ISS-113)
|
||||||
---
|
---
|
||||||
|
|
||||||
# Change a setup file safely
|
# Change a setup file safely
|
||||||
|
|
@ -28,9 +28,9 @@ administrator rights.
|
||||||
Either way works:
|
Either way works:
|
||||||
|
|
||||||
- **Setup File Editor** (Start menu *CI Server → Setup File Editor*): double-click the file,
|
- **Setup File Editor** (Start menu *CI Server → Setup File Editor*): double-click the file,
|
||||||
change the field on its tab and click *OK*: **the file is written at once** (R1.03), so
|
change the field on its tab and click *OK*: **the file is written at once** (R1.03; R1.05
|
||||||
back up before clicking OK. The changed field's label turns blue and the file's Status
|
not yet re-checked, ISS-113), so back up before clicking OK. The changed field's label
|
||||||
becomes *Changed* (differs from its `!DEFAULT` block). Toggle Read Only must be off.
|
turns blue and the file's Status becomes *Changed* (differs from its `!DEFAULT` block). Toggle Read Only must be off.
|
||||||
Keywords placed before the file's first `!TAB` line are on the *General* tab. To go back
|
Keywords placed before the file's first `!TAB` line are on the *General* tab. To go back
|
||||||
to the default: cursor in the field, *Reset Field*, *OK*.
|
to the default: cursor in the field, *Reset Field*, *OK*.
|
||||||
- **Text edit**: change only the active line `KEYWORD = value`; keep the `!` lines, the
|
- **Text edit**: change only the active line `KEYWORD = value`; keep the `!` lines, the
|
||||||
|
|
@ -75,3 +75,11 @@ the backup (`Get-FileHash`) to confirm the file is exactly as before.
|
||||||
restarted in between, so never applied.
|
restarted in between, so never applied.
|
||||||
- `Stop-Service`/`Start-Service StartCIServer` from a non-elevated shell fails with
|
- `Stop-Service`/`Start-Service StartCIServer` from a non-elevated shell fails with
|
||||||
"Cannot open StartCIServer service".
|
"Cannot open StartCIServer service".
|
||||||
|
|
||||||
|
## R1.05
|
||||||
|
|
||||||
|
Not re-tested (shared test server). Same procedure expected: the editor is launched the same
|
||||||
|
way (`fsuedit.cmd` only adds `tls\exe\lib\*` to the class path) and the installed setup
|
||||||
|
files use the same metadata keywords and argument kinds as R1.03. On an upgraded system
|
||||||
|
the automatic configuration merge (skill `installation-security`) may already have changed
|
||||||
|
`.sup` files: compare with the `!DEFAULT` block before editing.
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Check web access for CI View (read-only)
|
task: Check web access for CI View (read-only)
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10R10-01EN §2.2, §3.4, §4.3; practiced on the test system 2026-09-30
|
source: IM 36K10R10-01EN §2.2, §3.4, §4.3 (5th Edition, Feb. 2026); installed jwuiisg.sup (R1.05); practiced on the test system 2026-09-30
|
||||||
status: verified (read-only)
|
status: verified (read-only) on R1.03 (2026-09-30) and on the R1.05 test server (2026-10-08); access from another PC through the R1.05 Access Control settings not tested
|
||||||
---
|
---
|
||||||
|
|
||||||
# Check web access for CI View
|
# Check web access for CI View
|
||||||
|
|
@ -36,7 +36,23 @@ ports were changed.
|
||||||
|
|
||||||
Expect `200`. This is the page CI View users open as `http://<node>:8080/` to download
|
Expect `200`. This is the page CI View users open as `http://<node>:8080/` to download
|
||||||
Remote Connect; Remote Connect then uses HTTPS on 8443. From another PC the firewall must
|
Remote Connect; Remote Connect then uses HTTPS on 8443. From another PC the firewall must
|
||||||
allow both ports (skill `installation-security`).
|
allow both ports (skill `installation-security`). With `HTTP_TO_HTTPS_REDIRECT = YES`
|
||||||
|
`Invoke-WebRequest` follows the redirect to HTTPS and may fail on the server certificate;
|
||||||
|
read the HTTP status alone with `curl.exe -s -o NUL -w "%{http_code}" http://localhost:8080/`
|
||||||
|
(not tested with YES). If the site has narrowed `HOSTNAME_WHITELISTING`, a CI View must use
|
||||||
|
one of the listed names (opening the page by IP address may then fail; not tested).
|
||||||
|
|
||||||
|
On R1.05 the page also returns the default security headers from the *Security* tab of
|
||||||
|
`jwuiisg.sup` (R10 summary §4.3, ISS-111). To see them (`curl.exe` is part of Windows):
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
curl.exe -k -s -I https://localhost:8443/
|
||||||
|
```
|
||||||
|
|
||||||
|
Expect `X-Content-Type-Options`, `X-Frame-Options`, `Strict-Transport-Security`,
|
||||||
|
`X-XSS-Protection`, `Cache-Control: no-store`, `Referrer-Policy`,
|
||||||
|
`X-Permitted-Cross-Domain-Policies` and a `Content-Security-Policy` line. The R1.03 file
|
||||||
|
set only `X-Frame-Options` and no CSP.
|
||||||
|
|
||||||
## 4. Displays deployed
|
## 4. Displays deployed
|
||||||
|
|
||||||
|
|
@ -52,3 +68,47 @@ Get-ChildItem -Name (Join-Path $env:TLS_WAP_PATH 'cfg\operatorInterfaces\DEPLOY'
|
||||||
## Test system (2026-09-30)
|
## Test system (2026-09-30)
|
||||||
|
|
||||||
8080 and 8443 listening (one process), page returned 200, the six `DEPLOY` folders present.
|
8080 and 8443 listening (one process), page returned 200, the six `DEPLOY` folders present.
|
||||||
|
|
||||||
|
## R1.05 test server (2026-10-08, read-only)
|
||||||
|
|
||||||
|
Steps 1–4 as above: 8080 and 8443 listening (one `javaw.exe` running as the CI Server
|
||||||
|
service account), `http://localhost:8080/` and `https://localhost:8443/` both 200, the page
|
||||||
|
offers `CI-rc-setup.exe` (Remote Connect), the six `DEPLOY` folders present, and the seven
|
||||||
|
headers plus CSP listed above on both ports. Install paths differ from R1.03 (here
|
||||||
|
`C:\Yokogawa\CIServer`), so always use the `TLS_*` variables.
|
||||||
|
|
||||||
|
## R1.05: the CSP blocks external pages in displays (verified 2026-10-09, ISS-111)
|
||||||
|
|
||||||
|
Tested with a temporary display holding two web browser components on the R1.05 test server
|
||||||
|
(removed afterwards). The web client received `Content-Security-Policy: script-src 'self'
|
||||||
|
'unsafe-eval' 'unsafe-inline'; img-src 'self' data:; default-src 'unsafe-inline' 'self';
|
||||||
|
font-src 'self' data:` and `X-Frame-Options: sameorigin`. With no `frame-src` rule,
|
||||||
|
`default-src` applies: the browser refused to frame `https://example.com/` (a
|
||||||
|
`securitypolicyviolation` event for `frame-src`), while a page from the CI Server itself
|
||||||
|
loaded. So on R1.05 a display with an external web page (a dashboard, a camera, a vendor page)
|
||||||
|
stays empty in the browser.
|
||||||
|
|
||||||
|
**Fix (verified 2026-10-09 on the R1.05 test server):** allow the external host for frames in
|
||||||
|
`jwuiisg.sup`, *Security* tab, one `CSP_ENTRY` line per value after the installed ones:
|
||||||
|
|
||||||
|
```
|
||||||
|
CSP_ENTRY = frame-src, "'self'"
|
||||||
|
CSP_ENTRY = frame-src, "https://<allowed host>"
|
||||||
|
```
|
||||||
|
|
||||||
|
Keep `'self'`, otherwise pages from the CI Server itself are blocked in frames too. The web
|
||||||
|
server `JWUIISG` (started by `user_start.cmd`) reads the file only at start: the change takes
|
||||||
|
effect after a CI Server restart (needs administrator rights and disconnects all operator
|
||||||
|
clients). Then the header contains `frame-src 'self' https://<allowed host>`, and the test page
|
||||||
|
showed inside the display with no CSP violation. List only the hosts you need; to undo, remove
|
||||||
|
the lines and restart again. The desktop Operator Interface (JCEF browser) is not affected by
|
||||||
|
these headers (not tested).
|
||||||
|
|
||||||
|
**Who loads the framed page.** In the web client the page in a web browser component is fetched
|
||||||
|
by the viewer's own browser, not by the CI Server. So besides the `frame-src` entry, the target
|
||||||
|
site must accept requests from every machine that opens the web client: a site that only admits
|
||||||
|
the CI Server's address (IP allowlist) answers 403 to the viewers and the frame stays blank or
|
||||||
|
shows an error, although the same display works in the Operator Interface on the CI Server
|
||||||
|
(there the browser runs on the server). Check from a viewer PC with `curl -I <url>`. The target
|
||||||
|
must also not forbid framing (`X-Frame-Options` or its own CSP `frame-ancestors`). Seen on the
|
||||||
|
R1.05 test server 2026-10-09: 200 from the server, 403 from another PC.
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Read a setup file (active settings and keyword help)
|
task: Read a setup file (active settings and keyword help)
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10R20-01EN §1, §3; IM 36K10R10-01EN §4; practiced on the test system 2026-09-30
|
source: IM 36K10R20-01EN §1, §3 (4th Edition, Feb. 2026); IM 36K10R10-01EN §4 (5th Edition, Feb. 2026); practiced on the test system 2026-09-30
|
||||||
status: verified (read-only)
|
status: verified (read-only) on R1.03 (2026-09-30, also compared in the Setup File Editor GUI); commands re-run read-only on the R1.05 test server 2026-10-08 with the same results; R1.05 editor GUI awaiting user verification (ISS-113)
|
||||||
---
|
---
|
||||||
|
|
||||||
# Read a setup file
|
# Read a setup file
|
||||||
|
|
@ -11,8 +11,10 @@ Shows what the Setup File Editor would show, without opening it. Nothing is chan
|
||||||
|
|
||||||
## Where
|
## Where
|
||||||
|
|
||||||
`%TLS_ROOT_PATH%\tls\sup\<name>.sup` (e.g. `C:\Program Files (x86)\Yokogawa\CIServer\tls\sup`).
|
`%TLS_ROOT_PATH%\tls\sup\<name>.sup` (R1.03 test system:
|
||||||
The file list with descriptions is what the Setup File Editor shows on start.
|
`C:\Program Files (x86)\Yokogawa\CIServer\tls\sup`; R1.05 test server:
|
||||||
|
`C:\Yokogawa\CIServer\tls\sup`; about 200 files on both). The file list with descriptions is
|
||||||
|
what the Setup File Editor shows on start.
|
||||||
|
|
||||||
## Active settings
|
## Active settings
|
||||||
|
|
||||||
|
|
@ -25,7 +27,7 @@ Select-String -Path $f -Pattern '^\s*[^!\s]'
|
||||||
|
|
||||||
Example result (`wflidi.sup`, installed defaults): `FLOW_CONTROL = 30`, `TIMER = 20`,
|
Example result (`wflidi.sup`, installed defaults): `FLOW_CONTROL = 30`, `TIMER = 20`,
|
||||||
`SCAN_TIME = 0`, `RETRY_COUNT = 3`, `QUEUE_BUSY_LEVEL = 10`, `DUR_QUEUE_SIZE = 500`,
|
`SCAN_TIME = 0`, `RETRY_COUNT = 3`, `QUEUE_BUSY_LEVEL = 10`, `DUR_QUEUE_SIZE = 500`,
|
||||||
`NODE = -1, 1000, 0.1, 30`, `LOCK_TIMEOUT = 60`.
|
`NODE = -1, 1000, 0.1, 30`, `LOCK_TIMEOUT = 60` (same file and values on R1.05).
|
||||||
|
|
||||||
A keyword that has no active line uses the program's built-in default (see its help).
|
A keyword that has no active line uses the program's built-in default (see its help).
|
||||||
|
|
||||||
|
|
@ -60,3 +62,8 @@ Keywords before the first `!TAB` appear on a *General* tab in the editor (checke
|
||||||
`wfla_display.sup` (the manual says `wfla_displays.sup`), and some installed values differ
|
`wfla_display.sup` (the manual says `wfla_displays.sup`), and some installed values differ
|
||||||
from the manual's defaults (see `knowledge/issues.md` ISS-012 to ISS-015).
|
from the manual's defaults (see `knowledge/issues.md` ISS-012 to ISS-015).
|
||||||
- Some files have no `!DESCRIPTION`.
|
- Some files have no `!DESCRIPTION`.
|
||||||
|
- R1.05 (2026-10-08): `jwuiisg.sup` and `dur.sup` gained keywords (R10 summary §3–4,
|
||||||
|
ISS-109 to ISS-112); `wfl*.sup`, `jwuiged.sup` and `jwuiaan.sup` are identical to R1.03,
|
||||||
|
`jhmiset.sup` differs only in spacing. Two new `jwuiisg.sup` blocks end with
|
||||||
|
`!ENDKEYWORD!` instead of `!ENDKEYWORD`; how the editor shows them is not yet checked
|
||||||
|
(ISS-112).
|
||||||
|
|
|
||||||
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) Re-tested on R1.05 2026-10-09 on the shared test server with the user's approval (temporary sample records, everything removed, before/after snapshot identical): generate with dssqld (stored, not printed: FSL-E-PRT_UNKUSER), print a generated report to the file destination, item trigger 0 → 450 generated by RPTMAN and printed (V12).
|
||||||
---
|
---
|
||||||
|
|
||||||
# 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,29 @@ 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)
|
||||||
|
|
||||||
|
- 2026-10-09 (V12, with approval, removed afterwards): same as R1.03. `GENERATE` 1 on
|
||||||
|
`CIENG_TANK1` → back to 0 within 5 s, one `REPORT_VAL` record (`ACTION_PROCESS` `DSSQLD<pid>`,
|
||||||
|
user `FULL AUTHORIZATION`), `FSL-E-PRT_UNKUSER` in `umhlog.log` and nothing printed (ISS-045);
|
||||||
|
`PRINT` 1 with `DEST_NAME` `CIENG_FILE` on that record wrote the report to the file; the item
|
||||||
|
trigger `CIENG_INFLOW_HI` (0 → 450) produced a record by `RPTMAN` and a line in the file.
|
||||||
|
|
||||||
|
- **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) Re-tested on R1.05 2026-10-09 on the shared test server with the user's approval (temporary sample records, everything removed, before/after snapshot identical): rptstp rptge1 stopped an endless LOOP report, GENERATE back to 0, RPTGE1 still attached (V12).
|
||||||
---
|
---
|
||||||
|
|
||||||
# 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`).
|
||||||
|
- `rptstp` re-tested 2026-10-09 (V12, with approval): an endless `LOOP` report kept `GENERATE` 1;
|
||||||
|
`rptstp rptge1` (exit 0) stopped it, `GENERATE` went to 0 and `RPTGE1` stayed attached.
|
||||||
|
|
|
||||||
|
|
@ -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) Re-tested on R1.05 2026-10-09 on the shared test server with the user's approval (temporary sample records, everything removed, before/after snapshot identical): SPOOL with @EXPORT wrote the quoted CSV lines to %TLS_LST_PATH% (file deleted) (V12).
|
||||||
---
|
---
|
||||||
|
|
||||||
# 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
|
||||||
|
|
|
||||||
|
|
@ -4,10 +4,10 @@ description: >-
|
||||||
Read-only check of a CI Server machine, run before any CI Server work. Use when
|
Read-only check of a CI Server machine, run before any CI Server work. Use when
|
||||||
the user asks which CI Server version is installed, whether CI Server is running, where it is
|
the user asks which CI Server version is installed, whether CI Server is running, where it is
|
||||||
installed, whether time is synchronized, or before starting any task in another skill.
|
installed, whether time is synchronized, or before starting any task in another skill.
|
||||||
Also covers starting CI Server (needs administrator rights). Target version R1.03.
|
Also covers starting CI Server (needs administrator rights). Target version R1.05 (R1.03 on branch r1.03).
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10J10-01EN §1.2, §1.4, §3.6, §3.7; practiced on the test system 2026-09-29/30
|
source: IM 36K10J10-01EN §1.2, §1.4, §3.6, §3.7; practiced on the R1.03 test system 2026-09-29/30 and the R1.05 test server 2026-10-08
|
||||||
status: verified (2026-09-30)
|
status: verified on R1.03 (2026-09-30); sections 1, 2 and 4 verified on R1.05 (2026-10-08)
|
||||||
---
|
---
|
||||||
|
|
||||||
# System check
|
# System check
|
||||||
|
|
@ -23,11 +23,13 @@ $keys = @('HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*','HKLM:\S
|
||||||
foreach ($k in $keys) { foreach ($i in (Get-ItemProperty $k -ErrorAction SilentlyContinue)) { if ($i.DisplayName -match 'CI Server') { "{0} | {1}" -f $i.DisplayName, $i.DisplayVersion } } }
|
foreach ($k in $keys) { foreach ($i in (Get-ItemProperty $k -ErrorAction SilentlyContinue)) { if ($i.DisplayName -match 'CI Server') { "{0} | {1}" -f $i.DisplayName, $i.DisplayVersion } } }
|
||||||
```
|
```
|
||||||
|
|
||||||
Expected for this repo: `CI Server R1.03.00 (r10200M) | 1.03.00`. Anything else: warn the
|
Expected for this branch: `CI Server R1.05.00 (r11609M)`. R1.03 (`CI Server R1.03.00 (r10200M)`):
|
||||||
user that the repo targets R1.03.
|
switch to the repo branch `r1.03`. Anything else: warn the user that the repo targets R1.05
|
||||||
|
(see `knowledge/version-differences.md`).
|
||||||
|
|
||||||
**From the running system** (preferred when CI Server is running): export the local node
|
**From the running system** (preferred when CI Server is running): export the local node
|
||||||
dataset and read `VERSION_MAJOR`, `VERSION_MINOR`, `VERSION_PACK` (1, 3, 0 = R1.03.00).
|
dataset and read `VERSION_MAJOR`, `VERSION_MINOR`, `VERSION_PACK` (1, 5, 0 = R1.05.00;
|
||||||
|
1, 3, 0 = R1.03.00).
|
||||||
|
|
||||||
```
|
```
|
||||||
dssqld -e local_node.qli -d LOCAL_NODE_DF -c -l local_node.lst
|
dssqld -e local_node.qli -d LOCAL_NODE_DF -c -l local_node.lst
|
||||||
|
|
@ -39,8 +41,9 @@ licence state (`NAME`/`NODE_NAME` = `UNLICENCED` means no licence is registered)
|
||||||
to find another dataset.
|
to find another dataset.
|
||||||
|
|
||||||
**Per-component versions** (rewritten at every start): `%TLS_ALLUSERS_PATH%\lst\tls_versions.lst`,
|
**Per-component versions** (rewritten at every start): `%TLS_ALLUSERS_PATH%\lst\tls_versions.lst`,
|
||||||
one line per component: `<file>,<version>,<size>,<build date>`. On the test system all 110
|
one line per component: `<file>,<version>,<size>,<build date>`. On the R1.03 test system all 110
|
||||||
lines read `R1.03.00`; a different version on some lines means a patch is installed.
|
lines read `R1.03.00`; on the R1.05 test server 112 lines read `R1.05.00` and `jython-full`
|
||||||
|
reads `R1.04.00` (as installed). Other different versions usually mean a patch is installed.
|
||||||
|
|
||||||
**Message log**: `%TLS_LOG_PATH%\umhlog.log` holds CI Server messages
|
**Message log**: `%TLS_LOG_PATH%\umhlog.log` holds CI Server messages
|
||||||
(`--> From: <PROCESS> (<node>) on <time>` then `<FAC>-<I|W|E>-<CODE>, <text>`). Read it after
|
(`--> From: <PROCESS> (<node>) on <time>` then `<FAC>-<I|W|E>-<CODE>, <text>`). Read it after
|
||||||
|
|
@ -49,22 +52,26 @@ station). It can contain connection strings with passwords; never copy those int
|
||||||
|
|
||||||
## 2. Install paths (environment variables)
|
## 2. Install paths (environment variables)
|
||||||
|
|
||||||
| Variable | Typical value | Holds |
|
The paths differ between installations, so read them with `set TLS` (cmd) or
|
||||||
|---|---|---|
|
`Get-ChildItem env:TLS*` (PowerShell) and never assume them.
|
||||||
| `TLS_ROOT_PATH` / `TLS_ITROOT_PATH` | `C:\Program Files (x86)\Yokogawa\CIServer` | Program: `tls\com` (start scripts), `tls\exe` (tools), `tls\sup` (setup files) |
|
|
||||||
| `TLS_ALLUSERS_PATH` | `C:\Users\Public\Yokogawa\tls` | Data root |
|
| Variable | R1.05 test server | R1.03 test system | Holds |
|
||||||
| `TLS_DAT_PATH` | `…\tls\dat` | Database |
|
|---|---|---|---|
|
||||||
| `TLS_HIS_PATH` | `…\tls\his` | History |
|
| `TLS_ROOT_PATH` / `TLS_ITROOT_PATH` | `C:\Yokogawa\CIServer` | `C:\Program Files (x86)\Yokogawa\CIServer` | Program: `tls\com` (start scripts), `tls\exe` (tools), `tls\sup` (setup files) |
|
||||||
| `TLS_SAV_PATH` | `…\tls\sav` | Saved data |
|
| `TLS_ALLUSERS_PATH` | `C:\Yokogawa\CIServer\tls` | `C:\Users\Public\Yokogawa\tls` | Data root (manuals in `doc\EN`) |
|
||||||
| `TLS_LOG_PATH`, `TLS_LST_PATH` | `…\tls\log`, `…\tls\lst` | Logs and listings |
|
| `TLS_DAT_PATH` | `…\tls\dat` | `…\tls\dat` | Database |
|
||||||
| `TLS_WAP_PATH` | `…\tls\wap` | Web application files |
|
| `TLS_HIS_PATH` | `…\tls\his` | `…\tls\his` | History |
|
||||||
|
| `TLS_SAV_PATH` | `…\tls\sav` | `…\tls\sav` | Saved data |
|
||||||
|
| `TLS_LOG_PATH`, `TLS_LST_PATH` | `…\tls\log`, `…\tls\lst` | `…\tls\log`, `…\tls\lst` | Logs and listings |
|
||||||
|
| `TLS_WAP_PATH` | `…\tls\wap` | `…\tls\wap` | Web application files |
|
||||||
|
|
||||||
`tls\com` and `tls\exe` are on `PATH`, so tools such as `dssqld` and `itmval` run from any
|
`tls\com` and `tls\exe` are on `PATH`, so tools such as `dssqld` and `itmval` run from any
|
||||||
prompt. Setup files (`*.sup`) are plain text (CRLF); edit them with the Setup File Editor.
|
prompt. Setup files (`*.sup`) are plain text (CRLF); edit them with the Setup File Editor.
|
||||||
|
|
||||||
## 3. Is CI Server running?
|
## 3. Is CI Server running?
|
||||||
|
|
||||||
- Windows service `StartCIServer` ("CI Service"), start type Manual on the test system.
|
- Windows service `StartCIServer` ("CI Service"), start type Manual on the R1.03 test system,
|
||||||
|
Automatic (Delayed Start) on the R1.05 test server.
|
||||||
- Running processes live under `…\Yokogawa\CIServer\tls\exe`. None running = CI Server stopped.
|
- Running processes live under `…\Yokogawa\CIServer\tls\exe`. None running = CI Server stopped.
|
||||||
- Most tools (`dssqld`, `itmval`, …) need CI Server running.
|
- Most tools (`dssqld`, `itmval`, …) need CI Server running.
|
||||||
- Starting it needs administrator rights (the service runs as `.\CIX_PROCESS`, binary
|
- Starting it needs administrator rights (the service runs as `.\CIX_PROCESS`, binary
|
||||||
|
|
@ -111,3 +118,18 @@ Check the source matches the design (domain controller, NTP server or `NOSYNC` o
|
||||||
`durm_udp`, `eqpmdc`, `eqpmqtt`, `wfl*`).
|
`durm_udp`, `eqpmdc`, `eqpmqtt`, `wfl*`).
|
||||||
- `LOCAL_NODE_DF`: version 1.3.0 (R1.03.00), node 1, **UNLICENCED**, router type Endpoint.
|
- `LOCAL_NODE_DF`: version 1.3.0 (R1.03.00), node 1, **UNLICENCED**, router type Endpoint.
|
||||||
- Windows Time running, source `time.windows.com`; synchronized on 2026-09-30 (stratum 5).
|
- Windows Time running, source `time.windows.com`; synchronized on 2026-09-30 (stratum 5).
|
||||||
|
|
||||||
|
## R1.05 test server results (2026-10-08)
|
||||||
|
|
||||||
|
Read-only check on the shared R1.05 test server (other projects run there).
|
||||||
|
|
||||||
|
- Version `CI Server R1.05.00 (r11609M)`; `LOCAL_NODE_DF` version 1.5.0, node 1, node name
|
||||||
|
`CORE_0001`, router type Endpoint, **licensed** (`NAME` = `THIS_NODE`, not `UNLICENCED`), so
|
||||||
|
the unlicensed 1-hour shutdown does not apply there.
|
||||||
|
- Paths as in the table (program and data both under `C:\Yokogawa\CIServer`).
|
||||||
|
- CI Service running, start type Automatic (Delayed Start), account `.\CIX_PROCESS`, binary
|
||||||
|
`C:\Yokogawa\CIServer\tls\exe\ciserv.exe`.
|
||||||
|
- Windows Time synchronized from the *VM IC Time Synchronization Provider* (virtual machine
|
||||||
|
host), stratum 4.
|
||||||
|
- Section 3 (starting and stopping) was not repeated: the server is shared and must not be
|
||||||
|
restarted for a test.
|
||||||
|
|
|
||||||
|
|
@ -1,40 +1,52 @@
|
||||||
---
|
---
|
||||||
name: system-management
|
name: system-management
|
||||||
description: >-
|
description: >-
|
||||||
CI Server R1.03 system management and command-line tools. Use when the user wants
|
CI Server R1.05 system management and command-line tools. Use when the user wants
|
||||||
to stop CI Server, export dataset contents, load or remove records with quick load files
|
to stop CI Server, export dataset contents, load or remove records with quick load files
|
||||||
(dssqld, .qli), create sections or items in bulk, read or write item values or limits (itmval), load or import history,
|
(dssqld, .qli), create sections or items in bulk, read or write item values or limits (itmval), load or import history,
|
||||||
check database consistency (dsschk), monitor processes/CPU/disk/network, back up or migrate
|
check database consistency (dsschk), monitor processes/CPU/disk/network, back up or migrate
|
||||||
a system, tune or debug CI Server, or plan a system layout (standalone, separate portal, HAC,
|
a system, tune or debug CI Server, or plan a system layout (standalone, separate portal, HAC,
|
||||||
host-to-host, enterprise) or time synchronization, check whether a CI Server process is
|
host-to-host, enterprise, gateway core) or time synchronization, check whether a CI Server process is
|
||||||
running (durwfp), stop a single process (durstp), read the message log (umhlog), or check
|
running (durwfp), stop a single process (durstp), read the message log (umhlog), or check
|
||||||
BUS Service queues (adaptive queues, dur.sup), or work with DSS / Data Set Services (dsssda,
|
BUS Service queues (adaptive queues, dur.sup), or work with DSS / Data Set Services (dsssda,
|
||||||
dssevt, dssman, dss.sup, quick load macros and includes, memo fields from a file, dssutl,
|
dssevt, dssman, dss.sup, DSSSDARST / DSSSDAPY, quick load macros and includes, memo fields from a file, dssutl,
|
||||||
DSS compiler dss, .dss files, data dictionary tlsdic_dss.dic). Sources IM 36K10J10-01EN,
|
DSS compiler dss, .dss files, data dictionary tlsdic_dss.dic, dss_*.tmp clean-up). Sources IM 36K10J10-01EN,
|
||||||
IM 36K10L30-01EN, IM 36K10L50-01EN, IM 36K10P30-01EN.
|
IM 36K10L30-01EN, IM 36K10L50-01EN, IM 36K10P30-01EN.
|
||||||
---
|
---
|
||||||
|
|
||||||
# System management (R1.03)
|
# System management (R1.05)
|
||||||
|
|
||||||
|
Re-checked on R1.05 on 2026-10-08 (read-only, on the R1.05 test server): all tools used here
|
||||||
|
are installed and behave as on R1.03; `dssqld` help text, the monitoring setup files
|
||||||
|
(`int*.sup`), `itm.sup` and `durm_1_udp.sup` are unchanged. Changed on R1.05: two extra DSS
|
||||||
|
data access servers (`DSSSDARST` for the RESTful API, `DSSSDAPY` for pyTOOLS), larger DSS queues,
|
||||||
|
a *Gateway Core* switch in `dur.sup`, new datasets, and start/stop scripts that call
|
||||||
|
`?*_<script name>.cmd` extension scripts (details in the task files).
|
||||||
|
|
||||||
Background for this area: `knowledge/manuals/IM36K10J10-01EN.md`. Known issues:
|
Background for this area: `knowledge/manuals/IM36K10J10-01EN.md`. Known issues:
|
||||||
`knowledge/manuals/IM36K01A50-01EN.md`.
|
`knowledge/manuals/IM36K01A50-01EN.md`.
|
||||||
|
|
||||||
Rules for every task:
|
Rules for every task:
|
||||||
- Run the `system-check` skill first (version must be R1.03).
|
- Run the `system-check` skill first (this skill is written for R1.05; R1.03 results are kept
|
||||||
|
and marked).
|
||||||
- CI Server tools live in `%TLS_ROOT_PATH%\tls\exe` (on `PATH`). Run them in a scratch folder,
|
- CI Server tools live in `%TLS_ROOT_PATH%\tls\exe` (on `PATH`). Run them in a scratch folder,
|
||||||
because they write output and listing files to the current directory.
|
because they write output and listing files to the current directory. Read the paths from
|
||||||
|
`set TLS` (on the R1.05 test server program and data are both under `C:\Yokogawa\CIServer`).
|
||||||
- Starting/stopping CI Server and anything that writes to the system needs an elevated
|
- Starting/stopping CI Server and anything that writes to the system needs an elevated
|
||||||
(administrator) session and, in this conversation, the user's chosen way of working
|
(administrator) session and, in this conversation, the user's chosen way of working
|
||||||
(direct vs prepare only).
|
(direct vs prepare only).
|
||||||
|
- Exporting `OBJECT_DF` leaves 0-byte `dss_*.tmp` files in `%TLS_LST_PATH%` (task
|
||||||
|
`export-dataset.md`); clean them up after a test session.
|
||||||
|
|
||||||
| Task | File | Status |
|
| Task | File | Status |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Export dataset contents (whole or filtered) / dump the data dictionary | `tasks/export-dataset.md` | verified |
|
| Package a project for another CI Server (quick load, display, layout, user, README, pre-check) and test the install | `tasks/package-project.md` | verified on R1.05 with a user project 2026-10-12 (not on CI-Eng-Sample) |
|
||||||
| Load or remove records with quick load files (`.qli`), e.g. sections and items | `tasks/load-remove-records.md` | verified |
|
| Export dataset contents (whole or filtered) / dump the data dictionary | `tasks/export-dataset.md` | verified (R1.03; re-tested on R1.05 2026-10-08) |
|
||||||
| Read / write item values and read limits | `tasks/read-write-item.md` | verified |
|
| Load or remove records with quick load files (`.qli`), e.g. sections and items | `tasks/load-remove-records.md` | verified (R1.03; load/remove used on R1.05 in the CI-Eng-Sample test 2026-10-08) |
|
||||||
| Load history from CSV (`ithloahis`) and read history back | `tasks/load-history.md` | verified |
|
| Read / write item values and read limits | `tasks/read-write-item.md` | verified (R1.03; `-g`/`-p` used on R1.05 in the CI-Eng-Sample test, read re-checked 2026-10-08) |
|
||||||
| Monitor CPU, disk, network, processes; run a command on an item change | `tasks/monitoring-processes.md` | verified |
|
| Load history from CSV (`ithloahis`) and read history back | `tasks/load-history.md` | verified (R1.03); on R1.05 awaiting user verification (writes history) |
|
||||||
| Database consistency check (`dsschk`) | `tasks/consistency-check.md` | verified (check only) |
|
| Monitor CPU, disk, network, processes; run a command on an item change | `tasks/monitoring-processes.md` | verified (R1.03); R1.05 setup files identical, not re-run |
|
||||||
| Tuning checks: limits and health snapshots | `tasks/tuning-checks.md` | verified (read-only) |
|
| Database consistency check (`dsschk`) | `tasks/consistency-check.md` | verified (check only, R1.03 and R1.05) |
|
||||||
| BUS Service utilities: is a process attached (`durwfp`), stop one process (`durstp`), message tools, adaptive queues | `tasks/bus-utilities.md` | verified (`durwfp`, read-only checks); message tools fail (ISS-030) |
|
| Tuning checks: limits and health snapshots | `tasks/tuning-checks.md` | verified (read-only, R1.03 and R1.05) |
|
||||||
| DSS checks and tools: DSS processes, `dss.sup`, quick load macros/includes/memo files, `dssutl`, DSS compiler syntax check | `tasks/dss-tools.md` | verified |
|
| BUS Service utilities: is a process attached (`durwfp`), stop one process (`durstp`), message tools, adaptive queues | `tasks/bus-utilities.md` | verified (`durwfp`, `umhman`, read-only checks on R1.03 and R1.05); `umhmsg`/`umhtestprog` R1.03 only (ISS-030) |
|
||||||
|
| DSS checks and tools: DSS processes, `dss.sup`, quick load macros/includes/memo files, `dssutl`, DSS compiler syntax check | `tasks/dss-tools.md` | verified (R1.03); processes, `dss.sup` and compiler check re-tested on R1.05 |
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: BUS Service utilities - process checks, stopping single processes, message tools, adaptive queues
|
task: BUS Service utilities - process checks, stopping single processes, message tools, adaptive queues
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10L30-01EN §1, §5, §6, §10, §14; checked on the test system 2026-10-01
|
source: IM 36K10L30-01EN §1, §5, §6, §10, §14 (4th ed., Feb. 2026); IM 36K10J10-01EN §3.2.6 (5th ed.); checked on the test system 2026-10-01 (R1.03)
|
||||||
status: verified (durwfp, setup file checks, umhman, umhmsg, umhtestprog)
|
status: verified on R1.03 (durwfp, setup file checks, umhman, umhmsg, umhtestprog); re-checked read-only on the R1.05 test server 2026-10-08 (durwfp exit codes, umhman, dur.sup, durm_1_udp.sup); umhmsg / umhtestprog not run on R1.05 (they write to the shared message log); durstp not run
|
||||||
---
|
---
|
||||||
|
|
||||||
# BUS Service utilities
|
# BUS Service utilities
|
||||||
|
|
@ -13,7 +13,11 @@ Background: `knowledge/manuals/IM36K10L30-01EN.md`.
|
||||||
|
|
||||||
`durwfp -p <DUR name> -t 0` → exit code **0** = attached (running), **1** = not. Without
|
`durwfp -p <DUR name> -t 0` → exit code **0** = attached (running), **1** = not. Without
|
||||||
`-t 0` it waits up to 60 s for the process to appear; `-e` waits for it to go away. Verified:
|
`-t 0` it waits up to 60 s for the process to appear; `-e` waits for it to go away. Verified:
|
||||||
`umh`, `opcman`, `durm_1` → 0; unknown name → 1. Bash: `durwfp -p opcman -t 0; echo $?`.
|
`umh`, `opcman`, `durm_1` → 0; unknown name → 1 (R1.03 and R1.05; on R1.05 also `dssman`,
|
||||||
|
`dsssda00`, `dsssdarst`, `dsssdapy`, `dssevt00` → 0). Bash: `durwfp -p opcman -t 0; echo $?`;
|
||||||
|
PowerShell: `durwfp -p opcman -t 0; $LASTEXITCODE`. The manual (L30 §10, reworded in the R1.04
|
||||||
|
edition) calls the result "1 if attached, else 0": that is the opposite of the exit code a
|
||||||
|
script sees, so test the exit code as above (ISS-120).
|
||||||
DUR names are those given with `-n` (e.g. `OPXCIENG`, `EQPCIENG`, `opxuas`).
|
DUR names are those given with `-n` (e.g. `OPXCIENG`, `EQPCIENG`, `opxuas`).
|
||||||
|
|
||||||
## Stop or kill one process (only with the user's approval)
|
## Stop or kill one process (only with the user's approval)
|
||||||
|
|
@ -28,10 +32,9 @@ then kills after 10 s. `*` wildcards stop many processes (`-p alm\*`). Never `du
|
||||||
- Message log: `%TLS_LOG_PATH%\umhlog.log` (`--> From: <PROCESS> (<node>) on <time>`, then
|
- Message log: `%TLS_LOG_PATH%\umhlog.log` (`--> From: <PROCESS> (<node>) on <time>`, then
|
||||||
`FAC-S-CODE, text` lines). `UMH Message Text Error: Message number <hex> (…)` = the text
|
`FAC-S-CODE, text` lines). `UMH Message Text Error: Message number <hex> (…)` = the text
|
||||||
could not be formatted (e.g. `%` in a PRINT text, ISS-025).
|
could not be formatted (e.g. `%` in a PRINT text, ISS-025).
|
||||||
- `umhman` (hex code → text): answers can be piped, e.g. `printf '8010008
|
- `umhman` (hex code → text): answers can be piped, e.g. `printf '8010008\n\n' | umhman` →
|
||||||
|
`DUR-W-NO_MSG_FND, No selected message found`; parameters in the text stay empty. Same
|
||||||
' | umhman` →
|
answer on R1.05 (piped from PowerShell, 2026-10-08).
|
||||||
`DUR-W-NO_MSG_FND, No selected message found`; parameters in the text stay empty.
|
|
||||||
- `umhmsg <hex> [<var> <value>]…` logs that message from a script: it prints nothing; the
|
- `umhmsg <hex> [<var> <value>]…` logs that message from a script: it prints nothing; the
|
||||||
message appears in `umhlog.log` from process `UMHMSG_<pid>`.
|
message appears in `umhlog.log` from process `UMHMSG_<pid>`.
|
||||||
- `umhtestprog` runs its self-test (`TESTING UMH MESSAGES`, `TESTING ILLEGAL CODES`).
|
- `umhtestprog` runs its self-test (`TESTING UMH MESSAGES`, `TESTING ILLEGAL CODES`).
|
||||||
|
|
@ -42,13 +45,23 @@ then kills after 10 s. `*` wildcards stop many processes (`-p alm\*`). Never `du
|
||||||
|
|
||||||
`tls\sup\dur.sup`, tab *Adaptive queues*: `ADAPTIVE_QUEUE_SETS = <process>, <percent>`
|
`tls\sup\dur.sup`, tab *Adaptive queues*: `ADAPTIVE_QUEUE_SETS = <process>, <percent>`
|
||||||
(wildcard `*` allowed, max 40 %). Installed: `ALM` 10, `ALH` 10, `WFLGDI` 20, `WFLCDI`,
|
(wildcard `*` allowed, max 40 %). Installed: `ALM` 10, `ALH` 10, `WFLGDI` 20, `WFLCDI`,
|
||||||
`WFLIDI`, `WFLADI`, `ITHEIX`, `ITHSER` 2, `DSSSDA*`, `DSSEVT*`, `OPCEXE` 1. Add entries for
|
`WFLIDI`, `WFLADI`, `ITHEIX`, `ITHSER` 2, `DSSSDA*`, `DSSEVT*`, `OPCEXE` 1; R1.05 adds
|
||||||
|
`ADTSTO` 1 (audit storage, added "for version upgrade" per the file's change log; ISS-122). Add entries for
|
||||||
new busy processes (extra executors, equipment managers, custom processes); `OPCEXE` without
|
new busy processes (extra executors, equipment managers, custom processes); `OPCEXE` without
|
||||||
`*` may not cover the installed `OPCEXE1`…`4` (ISS-026). Changing `dur.sup` needs admin and a
|
`*` may not cover the installed `OPCEXE1`…`4` (ISS-026; unchanged on R1.05). Changing `dur.sup` needs admin and a
|
||||||
restart (skill `portal-setup`). Queue use per process: health snapshots
|
restart (skill `portal-setup`). Queue use per process: health snapshots
|
||||||
(`tuning-checks.md`) or the performance monitor (*Minimum/Maximum/Current KB*, high queue
|
(`tuning-checks.md`) or the performance monitor (*Minimum/Maximum/Current KB*, high queue
|
||||||
100 % = the queue had to grow → raise its size).
|
100 % = the queue had to grow → raise its size).
|
||||||
|
|
||||||
|
## Gateway Core switch (R1.05)
|
||||||
|
|
||||||
|
R1.05 `dur.sup` has a new keyword `GATEWAY_CORE` (*General* tab, *Gateway Core* check box;
|
||||||
|
installed `gateway_core = No`). Tick it only on a CI Core with a **gateway licence**: such a
|
||||||
|
node collects and passes on data but has no operator interface, also not for Portals and CI View
|
||||||
|
clients connected to it. If the switch and the licence disagree, a message goes to the
|
||||||
|
message log (IM 36K10J10 §3.2.6). From docs and the installed file; not tested (no gateway
|
||||||
|
licence; changing `dur.sup` needs admin and a restart; ISS-116).
|
||||||
|
|
||||||
## Node links (MDUR)
|
## Node links (MDUR)
|
||||||
|
|
||||||
`tls\sup\durm_<line>_udp.sup` and `tls\com\durm_start.cmd`; single-node installs still run
|
`tls\sup\durm_<line>_udp.sup` and `tls\com\durm_start.cmd`; single-node installs still run
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Database consistency check (dsschk)
|
task: Database consistency check (dsschk)
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10J10-01EN §4.1.1; practiced on the test system 2026-09-30
|
source: IM 36K10J10-01EN §4.1.1 (5th ed., Feb. 2026); IM 36K10L50-01EN §5; practiced on the test system 2026-09-30 (R1.03)
|
||||||
status: verified (check only)
|
status: verified (check only) on R1.03 (2026-09-30) and on the R1.05 test server (2026-10-08, `dsschk -e -v`, usage text unchanged); repair not practiced
|
||||||
---
|
---
|
||||||
|
|
||||||
# Database consistency check (dsschk)
|
# Database consistency check (dsschk)
|
||||||
|
|
@ -20,12 +20,13 @@ dsschk -e -v > dsschk.out
|
||||||
definitions copied by ITEM and EQUIPMENT Services). This is the useful check on a
|
definitions copied by ITEM and EQUIPMENT Services). This is the useful check on a
|
||||||
**single-node** system.
|
**single-node** system.
|
||||||
- `-v` verbose. Output lists `DSSP-I-CDS_START` / `DSSP-I-CDS_END` per dataset (228 on the
|
- `-v` verbose. Output lists `DSSP-I-CDS_START` / `DSSP-I-CDS_END` per dataset (228 on the
|
||||||
test system) and any problems; the same messages go to `%TLS_LOG_PATH%\umhlog.log`.
|
R1.03 test system, 231 on the R1.05 test server) and any problems; the same messages go to `%TLS_LOG_PATH%\umhlog.log`.
|
||||||
- `-d <dataset>` checks one dataset; `-n <node>` one node.
|
- `-d <dataset>` checks one dataset; `-n <node>` one node.
|
||||||
- Plain `dsschk` (no `-e`) only compares copies **between nodes**, so on a single node it
|
- Plain `dsschk` (no `-e`) only compares copies **between nodes**, so on a single node it
|
||||||
prints nothing.
|
prints nothing.
|
||||||
|
|
||||||
Look for warnings or errors: search the output for `-W-`, `-E-` or `-F-`. None = consistent.
|
Look for warnings or errors: search the output for `-W-`, `-E-` or `-F-`. None = consistent
|
||||||
|
(R1.05 test server, 2026-10-08: none).
|
||||||
|
|
||||||
## Repair (not yet practiced)
|
## Repair (not yet practiced)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: DSS (Data Set Services) checks and tools - processes, dss.sup, quick load directives, dssutl, DSS compiler syntax check
|
task: DSS (Data Set Services) checks and tools - processes, dss.sup, quick load directives, dssutl, DSS compiler syntax check
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10L50-01EN §1, §2.1, §2.2, §3, §4; IM 36K10P30-01EN §2, §3; practiced on the test system 2026-10-01
|
source: IM 36K10L50-01EN §1, §2.1, §2.2, §3, §4 (5th ed., Feb. 2026); IM 36K10P30-01EN §2, §3 (4th ed., Feb. 2026); practiced on the test system 2026-10-01 (R1.03)
|
||||||
status: verified
|
status: verified on R1.03 (2026-10-01, all sections); on the R1.05 test server re-checked read-only 2026-10-08 - DSS processes and start script, `dss.sup`, `dssqld` directives (`@SELECT`) and help text, DSS compiler syntax check; macro/include loads, memo files and `dssutl` not re-run on R1.05
|
||||||
---
|
---
|
||||||
|
|
||||||
# DSS tools
|
# DSS tools
|
||||||
|
|
@ -13,15 +13,29 @@ Everything here is read-only except where marked. Background:
|
||||||
## 1. DSS processes and `dss.sup`
|
## 1. DSS processes and `dss.sup`
|
||||||
|
|
||||||
`tasklist /FI "IMAGENAME eq dss*"` — expect `dsswth`, `dssana`, `dssanc`, `dssadb`, `dsslck`,
|
`tasklist /FI "IMAGENAME eq dss*"` — expect `dsswth`, `dssana`, `dssanc`, `dssadb`, `dsslck`,
|
||||||
`dssman`, `dsschk` (server) and several `dsssda` / `dssevt` (10 and 7 on a default R1.03 node).
|
`dssman`, `dsschk` (server) and several `dsssda` / `dssevt` (10 and 7 on a default R1.03 node,
|
||||||
`durwfp -p dssman -t 0` tests one by its BUS Service name (`DSSSDA00`…, `DSSSDAOPC00`…,
|
**12 and 7 on R1.05**). `durwfp -p dssman -t 0` tests one by its BUS Service name (`DSSSDA00`…,
|
||||||
`DSSEVT00`…). Started by `tls\com\database_start.cmd`; the number of general `DSSSDA` comes from
|
`DSSSDAOPC00`…, `DSSEVT00`…). Started by `tls\com\database_start.cmd`.
|
||||||
`%TLS_MAX_SDA_ID%` (default 3 → `DSSSDA00`–`03`).
|
|
||||||
|
- R1.03: the number of general `DSSSDA` comes from `%TLS_MAX_SDA_ID%` (default 3 →
|
||||||
|
`DSSSDA00`–`03`).
|
||||||
|
- R1.05: the script starts `DSSSDA00`–`03` as fixed lines (`%TLS_MAX_SDA_ID%` is no longer
|
||||||
|
used) and two new dedicated servers, `DSSSDARST` (RESTful API server `JRSTSRV`) and
|
||||||
|
`DSSSDAPY` (pyTOOLS clients `PYDSS*`); it waits for `DSSSDARST` with `durwfp`. On the first
|
||||||
|
start after an upgrade it runs the R1.04/R1.05 dataset upgrade programs
|
||||||
|
(`opcaec_station_u0104`, `opcuac_station_u0104`, `opcuac_method_u0104`, `dss_ath_grp_u0104`,
|
||||||
|
`iec61850_*_u0104` / `_u0105`, `iec61850_rcb_u0105`) and keeps `database.new` if one fails, so
|
||||||
|
the upgrade is tried again at the next start (verified in the installed script 2026-10-08,
|
||||||
|
ISS-117).
|
||||||
|
|
||||||
`%TLS_ROOT_PATH%\tls\sup\dss.sup` (Setup File Editor or text): queue sizes, heartbeats, `FLOWC`,
|
`%TLS_ROOT_PATH%\tls\sup\dss.sup` (Setup File Editor or text): queue sizes, heartbeats, `FLOWC`,
|
||||||
and `DSSSDA_SRV` / `DSSEVT_SRV` lines `<node|-1>, "<client process>", "<server process>"` that tie
|
and `DSSSDA_SRV` / `DSSEVT_SRV` lines `<node|-1>, "<client process>", "<server process>"` that tie
|
||||||
clients to server instances (`*` = all others). Changing it needs admin rights and a restart.
|
clients to server instances (`*` = all others). Changing it needs admin rights and a restart.
|
||||||
|
|
||||||
|
R1.05 `dss.sup` (compared with R1.03, 2026-10-08): `DSSSDA_QUESZ` 252 → **1000**, new
|
||||||
|
`DSSMAN_QUESZ = 1000`, and two new routing lines `DSSSDA_SRV = -1, "JRSTSRV", "DSSSDARST"` and
|
||||||
|
`DSSSDA_SRV = -1, "PYDSS*", "DSSSDAPY"`. The manual (L50 §2.2) does not mention these.
|
||||||
|
|
||||||
## 2. Quick load directives (`dssqld`)
|
## 2. Quick load directives (`dssqld`)
|
||||||
|
|
||||||
Besides `@FIELDS`, `@SELECT`, `@LANGUAGE` and `@<DATASET>` (tasks `export-dataset.md`,
|
Besides `@FIELDS`, `@SELECT`, `@LANGUAGE` and `@<DATASET>` (tasks `export-dataset.md`,
|
||||||
|
|
@ -73,9 +87,19 @@ Without `-d` the compiler only checks; results are in `tlsdic_dss.lst` (`<file>
|
||||||
<message>` and `<n> errors found.`). **Never run `dss -d` without the user's approval**: it rewrites
|
<message>` and `<n> errors found.`). **Never run `dss -d` without the user's approval**: it rewrites
|
||||||
`%TLS_DAT_PATH%\tlsdic_dss.dic` (host node only) and needs a restart.
|
`%TLS_DAT_PATH%\tlsdic_dss.dic` (host node only) and needs a restart.
|
||||||
|
|
||||||
## Verified (2026-10-01)
|
## Verified (R1.03, 2026-10-01)
|
||||||
|
|
||||||
17 DSS processes as listed; installed `dss.sup` routing read; macro + include load of a report;
|
17 DSS processes as listed; installed `dss.sup` routing read; macro + include load of a report;
|
||||||
memo from file (relative fails, 125-character path fails, short absolute path works); `dssutl`
|
memo from file (relative fails, 125-character path fails, short absolute path works); `dssutl`
|
||||||
read of `REPORT_DF` record `CIENG_TANK1`; compiler check of all 253 installed files (0 errors,
|
read of `REPORT_DF` record `CIENG_TANK1`; compiler check of all 253 installed files (0 errors,
|
||||||
dictionary unchanged) and of a test file with a missing `>` (1 error, line/column shown).
|
dictionary unchanged) and of a test file with a missing `>` (1 error, line/column shown).
|
||||||
|
|
||||||
|
## Verified (R1.05 test server, 2026-10-08, read-only)
|
||||||
|
|
||||||
|
12 `dsssda` and 7 `dssevt` processes; `durwfp` → 0 for `DSSMAN`, `DSSSDA00`, `DSSSDA03`,
|
||||||
|
`DSSSDAOPC00`, `DSSSDARST`, `DSSSDAPY`, `DSSEVT00`; `dss.sup` and `database_start.cmd` as above;
|
||||||
|
`@SELECT` filter export of `STATUS_DF` (1 record); compiler check `dss -l -w` of a copy of all
|
||||||
|
256 installed `.dss` files (254 dataset files plus `dss_global.dss` and `opcuap_global.dss`): no
|
||||||
|
error lines in `tlsdic_dss.lst`, `tlsdic_dss.dic` date unchanged. New `.dss` files since R1.03:
|
||||||
|
`alarm_attribute_temp_df`, `api_keys_df`, `iec61850_rcb_df`, `uaserver_mapper_df`,
|
||||||
|
`opcuac_method_call2_df` (replaces `opcuac_method_call_in_df` / `_out_df`).
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Export dataset contents with dssqld
|
task: Export dataset contents with dssqld
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10J10-01EN §2.9.2, §5.6; practiced on the test system 2026-09-30
|
source: IM 36K10J10-01EN §2.9.2, §5.6; IM 36K10L50-01EN §3 (5th ed., Feb. 2026); practiced on the test system 2026-09-30 (R1.03)
|
||||||
status: verified
|
status: verified on R1.03 (2026-09-30); re-tested on R1.05 2026-10-08 (read-only, R1.05 test server) - whole and filtered exports, `-f`, `dssqld -h` text (identical to R1.03), long output path, `dss_*.tmp` leftovers
|
||||||
---
|
---
|
||||||
|
|
||||||
# Export dataset contents (dssqld)
|
# Export dataset contents (dssqld)
|
||||||
|
|
@ -19,7 +19,8 @@ dssqld -e <output>.qli -d <DATASET> -c -l <listing>.lst
|
||||||
- `-c` comma-separated output: first line is the field names, then one quoted row per record.
|
- `-c` comma-separated output: first line is the field names, then one quoted row per record.
|
||||||
- `-l` writes the result summary to a listing file.
|
- `-l` writes the result summary to a listing file.
|
||||||
- Output path **≤ 79 characters**: a longer `-e` path gives no error, but the file does not
|
- Output path **≤ 79 characters**: a longer `-e` path gives no error, but the file does not
|
||||||
appear under that name (verified, ISS-020).
|
appear under that name (verified, ISS-020). On R1.05 the file was written under a shortened
|
||||||
|
name: the path cut after 79 characters, then `.qli` (verified 2026-10-08).
|
||||||
- `-a` also exports hidden fields.
|
- `-a` also exports hidden fields.
|
||||||
|
|
||||||
The console (and listing) end with a summary; check `Errors` is 0:
|
The console (and listing) end with a summary; check `Errors` is 0:
|
||||||
|
|
@ -39,7 +40,7 @@ Dumps the data dictionary: every dataset with its description and fields (name,
|
||||||
description). Search it to find which dataset holds what, e.g. the version fields are in
|
description). Search it to find which dataset holds what, e.g. the version fields are in
|
||||||
`LOCAL_NODE_DF`, `HOST_NODE_DF` and `ENTERPRISE_SERVER_DF`.
|
`LOCAL_NODE_DF`, `HOST_NODE_DF` and `ENTERPRISE_SERVER_DF`.
|
||||||
|
|
||||||
## Useful datasets seen on R1.03
|
## Useful datasets (R1.03, still present on R1.05)
|
||||||
|
|
||||||
| Dataset | Contents |
|
| Dataset | Contents |
|
||||||
|---|---|
|
|---|---|
|
||||||
|
|
@ -47,6 +48,13 @@ description). Search it to find which dataset holds what, e.g. the version field
|
||||||
| `ITEM_DF` | Item definitions: full name, section path, description, limits, format, type, station, I/O address |
|
| `ITEM_DF` | Item definitions: full name, section path, description, limits, format, type, station, I/O address |
|
||||||
| `STATUS_DF` | Item status definitions: name, number, alarm state, priority, colour, mnemonic (e.g. 9 = NORMAL) |
|
| `STATUS_DF` | Item status definitions: name, number, alarm state, priority, colour, mnemonic (e.g. 9 = NORMAL) |
|
||||||
|
|
||||||
|
On R1.05 `LOCAL_NODE_DF` shows `VERSION_MAJOR` 1, `VERSION_MINOR` 5. New datasets since R1.03
|
||||||
|
(installed `tls\src`, verified 2026-10-08): `API_KEYS_DF` (REST API keys per user),
|
||||||
|
`UASERVER_MAPPER_DF` (OPC UA Information Model Mapper), `IEC61850_RCB_DF` (IEC 61850 report
|
||||||
|
control blocks), `OPCUAC_METHOD_CALL2_DF` (replaces `OPCUAC_METHOD_CALL_IN_DF` and
|
||||||
|
`…_CALL_OUT_DF`), `ALARM_ATTRIBUTE_TEMP_DF` (alarm attributes, not documented). `ITEM_VAL` has
|
||||||
|
three new fields: `ENG_UNIT`, `SCALE_HIGH_LIMIT`, `SCALE_LOW_LIMIT`.
|
||||||
|
|
||||||
## Filtered exports
|
## Filtered exports
|
||||||
|
|
||||||
Export only matching records with a filter file (IM 36K10L50 §3.6, verified 2026-09-30):
|
Export only matching records with a filter file (IM 36K10L50 §3.6, verified 2026-09-30):
|
||||||
|
|
@ -69,4 +77,25 @@ dssqld -e <output>.qli <filter>.qli [-c] -l <listing>.lst
|
||||||
- `ITEM_HISTORY` returns nothing unless the filter names `ITEM_NAME` and a `SAMPLE_TIME` range
|
- `ITEM_HISTORY` returns nothing unless the filter names `ITEM_NAME` and a `SAMPLE_TIME` range
|
||||||
(see `load-history.md`).
|
(see `load-history.md`).
|
||||||
- `%TLS_DAT_PATH%\dss_export.qli` is Yokogawa's own filter file for exporting all engineering
|
- `%TLS_DAT_PATH%\dss_export.qli` is Yokogawa's own filter file for exporting all engineering
|
||||||
definitions (`dssqld -e out.qli dss_export.qli`); it also shows `@MACRO` usage.
|
definitions (`dssqld -e out.qli dss_export.qli`); it also shows `@MACRO` usage. It is the
|
||||||
|
same file on R1.05 as on R1.03 and does **not** cover the IEC 61850, MQTT, OPC UA client
|
||||||
|
method/tag datasets, `UASERVER_MAPPER_DF` or `API_KEYS_DF`: export those with `-d` as well
|
||||||
|
when you back up or migrate a system (ISS-118).
|
||||||
|
- R1.05 `dssqld.sup` adds `API_KEYS_DF` to the `NO-EXPORT` list, so a full export leaves the
|
||||||
|
REST API keys out on purpose. `-d API_KEYS_DF` still exports it; treat that file as a secret,
|
||||||
|
or create new keys on the target system instead (skill `data-access`).
|
||||||
|
|
||||||
|
- **Range on `NAME`** (R1.05, 2026-10-12): `'NAME > "<Section>." and NAME < "<Next>"'` (`<Next>` = the section
|
||||||
|
name with its last character raised by one, e.g. `TANK1.` → `TANK2`) selects all items below a
|
||||||
|
section on `ITEM_DF` (tested with 1,751 items); a `NAME = "A*"` wildcard does not work.
|
||||||
|
The same works on `ALARM_CURRENT` with `ITEM_NAME`, to list the current alarms of one section.
|
||||||
|
|
||||||
|
## Clean up: `dss_*.tmp` files (R1.05)
|
||||||
|
|
||||||
|
Exporting `OBJECT_DF` leaves 0-byte `dss_<n>_<id>.tmp` files in `%TLS_LST_PATH%` (`tls\lst`),
|
||||||
|
about one per object (28 files for 29 objects on the R1.05 test server, 2026-10-08); a second
|
||||||
|
export of the same objects added none. Exports of `LOCAL_NODE_DF`, `STATUS_DF`, `ITEM_DF`,
|
||||||
|
`CLASS_DF`, `REPORT_DF`, a filtered export and `-f` left none. CI Server does not remove them
|
||||||
|
(ISS-091, ISS-119). After a test session, delete the 0-byte ones written since the session
|
||||||
|
started, e.g. with `examples/CI-Eng-Sample/shared/clean_dss_tmp.ps1 -Since <start time>`.
|
||||||
|
Not checked on R1.03.
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Load item history from CSV (ithloahis) and read history back (dssqld)
|
task: Load item history from CSV (ithloahis) and read history back (dssqld)
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10J10-01EN §2.9.2; IM 36K10L50-01EN §3.6; practiced with CI-Eng-Sample 2026-09-30
|
source: IM 36K10J10-01EN §2.9.2; IM 36K10L50-01EN §3.6 (5th ed., Feb. 2026); practiced with CI-Eng-Sample 2026-09-30 (R1.03)
|
||||||
status: verified
|
status: verified on R1.03 (2026-09-30); on R1.05 `ithloahis` is installed but loading was not re-run (it writes history and the reduced CI-Eng-Sample load on the shared R1.05 test server has no storage group) - awaiting user verification
|
||||||
---
|
---
|
||||||
|
|
||||||
# Load item history (ithloahis) and read it back
|
# Load item history (ithloahis) and read it back
|
||||||
|
|
@ -80,7 +80,14 @@ Result columns include `NAME` (`<group>:<item>/<time>/Value`), `SAMPLE_TIME`, `I
|
||||||
`QUALITY`. Values written live (e.g. with `itmval -p`) and the value at CI Server start also
|
`QUALITY`. Values written live (e.g. with `itmval -p`) and the value at CI Server start also
|
||||||
appear.
|
appear.
|
||||||
|
|
||||||
## Verified (CI-Eng-Sample, 2026-09-30)
|
## R1.05 check (awaiting user verification)
|
||||||
|
|
||||||
|
On a system where the CI-Eng-Sample storage group `CIENG_EVENT` exists (full sample load,
|
||||||
|
then a CI Server restart): load the SCAN example above with `ithloahis -f <file>.csv -v`, then
|
||||||
|
read it back with the `ITEM_HISTORY` filter. Expected as on R1.03: the three LEVEL / INFLOW
|
||||||
|
samples appear in `ITEM_HISTORY` a few seconds after the load. The manual text for `ithloahis` (J10 §2.9.2) is unchanged.
|
||||||
|
|
||||||
|
## Verified (CI-Eng-Sample, R1.03, 2026-09-30)
|
||||||
|
|
||||||
SCAN load of LEVEL 61–63 / INFLOW 101–103 and EVENT load of LEVEL 47, 48 were all read back
|
SCAN load of LEVEL 61–63 / INFLOW 101–103 and EVENT load of LEVEL 47, 48 were all read back
|
||||||
with the filter above.
|
with the filter above.
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Load and remove dataset records with dssqld (quick load)
|
task: Load and remove dataset records with dssqld (quick load)
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10J10-01EN §2.9.2, §5.6; IM 36K10L45-01EN §9.10–9.11; practiced with CI-Eng-Sample 2026-09-30
|
source: IM 36K10J10-01EN §2.9.2, §5.6; IM 36K10L50-01EN §3 (5th ed., Feb. 2026); IM 36K10L45-01EN §10.12–10.13 (5th ed.; §9.10–9.11 in the R1.03 edition); practiced with CI-Eng-Sample 2026-09-30
|
||||||
status: verified
|
status: verified on R1.03 (2026-09-30); on R1.05 `dssqld -i` / `-r` used in the reduced CI-Eng-Sample load on the R1.05 test server (2026-10-08, 0 errors, `@VERSION 1.03.00` files accepted); `dssqld` help text identical to R1.03; `-m` and the storage-group steps not re-run on R1.05
|
||||||
---
|
---
|
||||||
|
|
||||||
# Load and remove dataset records (dssqld quick load)
|
# Load and remove dataset records (dssqld quick load)
|
||||||
|
|
@ -29,6 +29,8 @@ NAME,SECTION_PATH,SECTION_NAME,DESCRIPTION
|
||||||
"CI-Eng-Sample.TANK1","CI-Eng-Sample","TANK1","Sample tank 1"
|
"CI-Eng-Sample.TANK1","CI-Eng-Sample","TANK1","Sample tank 1"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
- `@VERSION` names the release the file was written for; R1.05 loads files marked
|
||||||
|
`1.03.00` without complaint (CI-Eng-Sample test, 2026-10-08).
|
||||||
- `@FIELDS` lists the fields in the records that follow; the next `@<DATASET>` line names
|
- `@FIELDS` lists the fields in the records that follow; the next `@<DATASET>` line names
|
||||||
the dataset. A file can hold several `@FIELDS` / `@<DATASET>` blocks.
|
the dataset. A file can hold several `@FIELDS` / `@<DATASET>` blocks.
|
||||||
- One record per line, strings in double quotes, numbers bare, comma-separated. End a line
|
- One record per line, strings in double quotes, numbers bare, comma-separated. End a line
|
||||||
|
|
@ -86,6 +88,17 @@ has passed, then delete the group. Deleting a group deletes its history.
|
||||||
- Put each step in a `.cmd` script so the order is repeatable. Run scripts by full path
|
- Put each step in a `.cmd` script so the order is repeatable. Run scripts by full path
|
||||||
(`cmd /c "<path>\load.cmd"`); a bare name may not be found from the current folder.
|
(`cmd /c "<path>\load.cmd"`); a bare name may not be found from the current folder.
|
||||||
|
|
||||||
|
## Clean up after loading (R1.05)
|
||||||
|
|
||||||
|
`dssqld` leaves 0-byte `dss_<n>_<id>.tmp` files in `%TLS_LST_PATH%` (`tls\lst`), and loading a
|
||||||
|
class left one holding the class source (34 files after the CI-Eng-Sample load and remove on the
|
||||||
|
R1.05 test server, ISS-091). The read-only re-check of 2026-10-08 found that of the exports only
|
||||||
|
`OBJECT_DF` creates them (about one per object, ISS-119); which load/remove steps create them
|
||||||
|
was not narrowed down. CI Server does not delete them. After a test session, delete the files
|
||||||
|
written since it started that are empty or hold only your own test data:
|
||||||
|
`examples/CI-Eng-Sample/shared/clean_dss_tmp.ps1 -Since <start time>` (note the server time
|
||||||
|
before the first `dssqld` run). Not checked on R1.03.
|
||||||
|
|
||||||
## Verified example
|
## Verified example
|
||||||
|
|
||||||
`examples/CI-Eng-Sample/` (`01_section_df.qli`, `02_item_df.qli`, `load.cmd`, `remove.cmd`):
|
`examples/CI-Eng-Sample/` (`01_section_df.qli`, `02_item_df.qli`, `load.cmd`, `remove.cmd`):
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Monitoring processes (intcpumon, intdskmon, inttcpmon, intmon, intspawn)
|
task: Monitoring processes (intcpumon, intdskmon, inttcpmon, intmon, intspawn)
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10J10-01EN §4.1.6; practiced with CI-Eng-Sample 2026-09-30
|
source: IM 36K10J10-01EN §4.1.6 (5th ed., Feb. 2026); practiced with CI-Eng-Sample 2026-09-30 (R1.03)
|
||||||
status: verified
|
status: verified on R1.03 (2026-09-30); on R1.05 the setup files `intcpumon.sup`, `intdskmon.sup`, `inttcpmon.sup`, `intmon.sup`, `intspawn.sup` are identical to R1.03 and `integration_start.cmd` keeps the same commented start lines (checked read-only 2026-10-08); the processes were not started on the shared R1.05 test server
|
||||||
---
|
---
|
||||||
|
|
||||||
# Monitoring processes
|
# Monitoring processes
|
||||||
|
|
@ -49,13 +49,20 @@ These processes do not start by default.
|
||||||
(for `intmon`, uncomment its `start /b /normal …\intmon.exe -n intmon` line; for the others
|
(for `intmon`, uncomment its `start /b /normal …\intmon.exe -n intmon` line; for the others
|
||||||
add `start /B /NORMAL %TLS_ROOT_PATH%\tls\exe\<process> -n <process>` followed by
|
add `start /B /NORMAL %TLS_ROOT_PATH%\tls\exe\<process> -n <process>` followed by
|
||||||
`start /B /NORMAL /WAIT %TLS_ROOT_PATH%\tls\exe\durwfp -p <process> -t 10`). Not yet tested.
|
`start /B /NORMAL /WAIT %TLS_ROOT_PATH%\tls\exe\durwfp -p <process> -t 10`). Not yet tested.
|
||||||
|
- **R1.05 (cleaner):** `integration_start.cmd` ends by calling every
|
||||||
|
`%TLS_ROOT_PATH%\tls\com\?*_integration_start.cmd`, so the same two lines per process can go
|
||||||
|
into an own file such as `cieng_integration_start.cmd` and the installed script stays
|
||||||
|
untouched (survives upgrades). Every service start and stop script in `tls\com`
|
||||||
|
(`<service>_start.cmd` / `_stop.cmd`), `ci_start` / `ci_stop`, `ci_clean_up` and
|
||||||
|
`hacw_activate` / `hacw_deactivate` have the same kind of hook (`?*_<script name>.cmd`). Found in the installed scripts (2026-10-08), not
|
||||||
|
in the manuals and not yet tested (needs admin and a restart; ISS-121).
|
||||||
|
|
||||||
## Check
|
## Check
|
||||||
|
|
||||||
Read the target items with `itmval -g -n <item>` (status 9 once updated). With `logging`, the
|
Read the target items with `itmval -g -n <item>` (status 9 once updated). With `logging`, the
|
||||||
processes also write to `%TLS_LOG_PATH%\umhlog.log`.
|
processes also write to `%TLS_LOG_PATH%\umhlog.log`.
|
||||||
|
|
||||||
## Verified (CI-Eng-Sample, 2026-09-30)
|
## Verified (CI-Eng-Sample, R1.03, 2026-09-30)
|
||||||
|
|
||||||
CPU_LOAD 33.4, DISK_C 61.9, PING_LOCALHOST 1, PROC_ALM 1; `intspawn` wrote 0 and 1 to a file
|
CPU_LOAD 33.4, DISK_C 61.9, PING_LOCALHOST 1, PROC_ALM 1; `intspawn` wrote 0 and 1 to a file
|
||||||
when `PUMP1.MODE` changed. Setup files restored afterwards.
|
when `PUMP1.MODE` changed. Setup files restored afterwards.
|
||||||
|
|
|
||||||
38
.claude/skills/system-management/tasks/package-project.md
Normal file
38
.claude/skills/system-management/tasks/package-project.md
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
---
|
||||||
|
task: Package a project for another CI Server (quick load files, display, layout, user) and check the install
|
||||||
|
version: R1.05
|
||||||
|
source: IM 36K10J10-01EN §5.6 (moving engineering data); IM 36K10L50-01EN §3; practiced with a user project on the R1.05 test server 2026-10-12 (remove and reload from the package, twice)
|
||||||
|
status: verified on R1.05 with a user project (not on CI-Eng-Sample)
|
||||||
|
---
|
||||||
|
|
||||||
|
# Package a project for another CI Server
|
||||||
|
|
||||||
|
Goal: a folder (zip) a junior engineer can install from, step by step, on another server.
|
||||||
|
|
||||||
|
## 1. What goes in
|
||||||
|
|
||||||
|
| Part | Notes |
|
||||||
|
|---|---|
|
||||||
|
| Quick load files `01_…` to `nn_…` in load order + `load.cmd` | sections, status items, line, station/points, items, trigger, class, object, users. **No node names** (leave `EQUIPMENT_NODE`, `FRONT_END_NODE` out) and no `NSID` / `ID_NUMBER`: the target assigns them. Insert (`-i`) only. |
|
||||||
|
| Removal files in reverse order + `remove.cmd` | so the install can be undone |
|
||||||
|
| Displays + a deploy script | copy to `DEPLOY\displays`, `jwuiutl -d -v -i -l … <display>` (must say *No problems found*), copy again (validation re-saves), `jwuiutl -e HTML -i -f DEPLOY <display>`. Displays without `<itemId>` bind by name, so new item numbers on the target do not matter. |
|
||||||
|
| Layout block + script | only the project's layout(s) between `<!-- <P>-BEGIN` / `<!-- <P>-END -->`, inserted before the first `<translations>`; the script makes a timestamped backup and checks the XML (sample: `examples/CI-Eng-Sample/layouts/layout.ps1`). |
|
||||||
|
| README | numbered steps with the exact command, the expected output and what to do if it differs |
|
||||||
|
| Pre-check script (read-only) | CI Server version (`%TLS_ALLUSERS_PATH%\lst\tls_versions.lst`), `dssqld` answers, longest file path ≤ 79 (ISS-020), `tls\jre\bin\javac.exe` present (Java classes compile on load), device reachable (TCP connect), each name free (filtered export per dataset, e.g. `'NAME = "<LINE>"'` on `MODBUS_LINE_DF`, `'EQUIPMENT_MAN = "<EQPNAME>"'`), layout name not used outside the project block |
|
||||||
|
| Post-install check | `itmval -g` of the station status item, one value to compare with the device's own software, a value the calculation updates (read twice), learn/initial states |
|
||||||
|
|
||||||
|
## 2. Script rules (found by testing the README in one Command Prompt)
|
||||||
|
|
||||||
|
- **`pushd "%~dp0"` … `popd`**, not `cd /d "%~dp0"`: the engineer runs the scripts one after the other
|
||||||
|
in the same prompt; a script that leaves the prompt in its own folder breaks the next command.
|
||||||
|
- `load.cmd`: delete the old `0*.qlo` first and end with `findstr /c:"_DF " 0*.qlo` (one result
|
||||||
|
line per data set; the last column is *Errors*). Otherwise old results (e.g. of an undo) are listed too.
|
||||||
|
- Wait after the line (`powershell -NoProfile -Command "Start-Sleep -Seconds 15"`, the equipment
|
||||||
|
manager starts) and after a class (about 20 s, compile) before the next file.
|
||||||
|
|
||||||
|
## 3. Test the package
|
||||||
|
|
||||||
|
On a test server: run the README's undo, then every step exactly as written, in one Command Prompt,
|
||||||
|
from a fresh copy of the zip; point the device address at a simulator (`tools/ModbusSim.java`) if
|
||||||
|
the device is not reachable. Compare the server against the package afterwards (filtered `ITEM_DF`
|
||||||
|
export by name range, class source from a `CLASS_DF` export, display file hash).
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Read and write item values with itmval
|
task: Read and write item values with itmval
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10J10-01EN §2.9.2; practiced on the test system and CI-Eng-Sample 2026-09-30
|
source: IM 36K10J10-01EN §2.9.2 (5th ed., Feb. 2026); practiced on the test system and CI-Eng-Sample 2026-09-30 (R1.03)
|
||||||
status: verified
|
status: verified on R1.03 (2026-09-30, all examples below); itmval -p/-g used on R1.05 in the CI-Eng-Sample test, 2026-10-08; read output format, limit read and error messages re-checked read-only on the R1.05 test server 2026-10-08
|
||||||
---
|
---
|
||||||
|
|
||||||
# Read and write item values (itmval)
|
# Read and write item values (itmval)
|
||||||
|
|
@ -46,7 +46,12 @@ itmval -g -n <Section>.<Tag> -a <n>
|
||||||
```
|
```
|
||||||
|
|
||||||
`<n>`: 1 deadband, 2 low, 3 high, 4 low-low, 5 high-high. The limit is returned in `Value`.
|
`<n>`: 1 deadband, 2 low, 3 high, 4 low-low, 5 high-high. The limit is returned in `Value`.
|
||||||
Items with no limits configured return `ITM-E-WRONG_ATT, Wrong attribute number used`.
|
Items with no limits configured return `ITM-E-WRONG_ATT, Wrong attribute number used`
|
||||||
|
(same on R1.05). An item name that does not exist gives `VIS-W-NOTFOUND, Record not found`
|
||||||
|
followed by `ISF-E-NOREC` / `GIN-E-GET` lines (R1.05, 2026-10-08).
|
||||||
|
|
||||||
|
On R1.05 `ITEM_VAL` also has the fields `ENG_UNIT`, `SCALE_HIGH_LIMIT` and `SCALE_LOW_LIMIT`
|
||||||
|
(installed `item_val.dss`); `itmval` itself has no option for them.
|
||||||
|
|
||||||
## Write a value
|
## Write a value
|
||||||
|
|
||||||
|
|
@ -61,7 +66,10 @@ itmval -p -n <Section>.<Tag> -v <value> [-s <status>] [-q <quality>]
|
||||||
(default local civil time); `-e` writes to event history only, not the current value.
|
(default local civil time); `-e` writes to event history only, not the current value.
|
||||||
- Read it back to confirm.
|
- Read it back to confirm.
|
||||||
|
|
||||||
## Verified examples (CI-Eng-Sample)
|
## Verified examples (CI-Eng-Sample, R1.03)
|
||||||
|
|
||||||
|
On R1.05 the CI-Eng-Sample test (2026-10-08) used `itmval -p` and `-g` on the sample items in
|
||||||
|
the same way, with the same output format (`Value` / `Status` / `Options` / `Quality`).
|
||||||
|
|
||||||
| Command | Result |
|
| Command | Result |
|
||||||
|---|---|
|
|---|---|
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
task: Tuning checks (read-only)
|
task: Tuning checks (read-only)
|
||||||
version: R1.03
|
version: R1.05 (first written for R1.03)
|
||||||
source: IM 36K10J10-01EN §5.5.1; practiced on the test system 2026-09-30
|
source: IM 36K10J10-01EN §5.5.1 (5th ed., Feb. 2026); practiced on the test system 2026-09-30 (R1.03)
|
||||||
status: verified (read-only checks)
|
status: verified (read-only checks) on R1.03 (2026-09-30) and on the R1.05 test server (2026-10-08: setup-file limits, snapshot files, itmdbg code 2)
|
||||||
---
|
---
|
||||||
|
|
||||||
# Tuning checks (read-only)
|
# Tuning checks (read-only)
|
||||||
|
|
@ -14,11 +14,11 @@ means editing setup files and restarting CI Server: ask the user first.
|
||||||
|
|
||||||
Read the active (non-`!`) lines:
|
Read the active (non-`!`) lines:
|
||||||
|
|
||||||
| File | Keyword | Meaning | Test system |
|
| File | Keyword | Meaning | R1.03 and R1.05 test systems |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| `dur.sup` | `dur_max_proc` | Max processes (default 250) | 250 |
|
| `dur.sup` | `dur_max_proc` | Max processes (default 250) | 250 |
|
||||||
| `dur.sup` | `pool_kbytes` | DUR message pool | 250000 |
|
| `dur.sup` | `pool_kbytes` | DUR message pool | 250000 |
|
||||||
| `itm.sup` | `pool_kbytes` | Item common memory pool | 650000 |
|
| `itm.sup` | `pool_kbytes` | Item common memory pool | 650000 (`itm.sup` identical on R1.05) |
|
||||||
| `database_start.cmd` (`tls\com`) | `-u` / `-f` | Max database users (default 2K) / files (default 1,200) | not checked |
|
| `database_start.cmd` (`tls\com`) | `-u` / `-f` | Max database users (default 2K) / files (default 1,200) | not checked |
|
||||||
|
|
||||||
## Live values: automatic health snapshots
|
## Live values: automatic health snapshots
|
||||||
|
|
@ -34,9 +34,18 @@ Read the newest entries:
|
||||||
| `*_ismdbg_all.log` | `Total number of lock collisions`, users, files | Collisions not rising above 250/s; entries below 80 % of max users |
|
| `*_ismdbg_all.log` | `Total number of lock collisions`, users, files | Collisions not rising above 250/s; entries below 80 % of max users |
|
||||||
| `*_smdsnp_process.log` | Number of processes | Well below `dur_max_proc` |
|
| `*_smdsnp_process.log` | Number of processes | Well below `dur_max_proc` |
|
||||||
|
|
||||||
Test system (2026-09-30): common memory 665.6 MB, free 665.3 MB; queues empty; 3 lock
|
Test system (R1.03, 2026-09-30): common memory 665.6 MB, free 665.3 MB; queues empty; 3 lock
|
||||||
collisions in total.
|
collisions in total.
|
||||||
|
|
||||||
|
R1.05 (2026-10-08): same file naming with the node name (`smd_<node>_LOW_<debugger>_all.log`,
|
||||||
|
previous one kept as `.old`). New snapshots from the system monitor (`smdmon_config.csv`):
|
||||||
|
`*_netstat_anob.log` (open IP ports with their processes) and `*_curl_isgsnap.log` (a snapshot
|
||||||
|
from the web server at `http://localhost:8080/isgsnap`). The system monitor switches
|
||||||
|
`umhlog` logging on with size argument `l40` (R1.03: `l4`); on the R1.05 test server
|
||||||
|
`umhlog.old` was about 40 MB, so the message log now rolls over at about 40 MB (R1.03 size
|
||||||
|
limit not observed).
|
||||||
|
The low-level snapshot script writes `InstalledProducts.txt` with PowerShell instead of `wmic`.
|
||||||
|
|
||||||
## Live values from the interactive debuggers (read-only)
|
## Live values from the interactive debuggers (read-only)
|
||||||
|
|
||||||
The debuggers ask for a code; pipe the answers in and end with `-1` (exit). Use only the
|
The debuggers ask for a code; pipe the answers in and end with `-1` (exit). Use only the
|
||||||
|
|
@ -47,7 +56,8 @@ read-only codes listed in the manual summaries:
|
||||||
| `printf '2\n-1\n' \| itmdbg` | item common size/free, number of items, integration granule, update counters | `knowledge/manuals/IM36K10L36-01EN.md` §4 |
|
| `printf '2\n-1\n' \| itmdbg` | item common size/free, number of items, integration granule, update counters | `knowledge/manuals/IM36K10L36-01EN.md` §4 |
|
||||||
| `printf '1\n-1\n' \| eqpdbg 0 <EQP process>` | equipment manager: lines attached, scan tick, slave count, line load % | `knowledge/manuals/IM36K10L40-01EN.md` §3 |
|
| `printf '1\n-1\n' \| eqpdbg 0 <EQP process>` | equipment manager: lines attached, scan tick, slave count, line load % | `knowledge/manuals/IM36K10L40-01EN.md` §3 |
|
||||||
|
|
||||||
Verified 2026-09-30 (bash). Other codes change the running system (delete items, unlock,
|
Verified 2026-09-30 (bash, R1.03); `itmdbg` code 2 also on R1.05 (2026-10-08, piped from
|
||||||
|
PowerShell: common size 665.6 MB, free 665.1 MB). Other codes change the running system (delete items, unlock,
|
||||||
update scan status); do not use them without the user's approval.
|
update scan status); do not use them without the user's approval.
|
||||||
|
|
||||||
## Not yet practiced
|
## Not yet practiced
|
||||||
|
|
|
||||||
22
CLAUDE.md
22
CLAUDE.md
|
|
@ -5,9 +5,13 @@ in CI Server; you do it (or prepare it for them) using the knowledge in this rep
|
||||||
|
|
||||||
## Before any CI Server work
|
## Before any CI Server work
|
||||||
|
|
||||||
1. **Confirm the software version.** This repo covers CI Server **R1.03** (R1.03.00).
|
1. **Confirm the software version.** This branch (`main`) targets CI Server **R1.05**
|
||||||
Check the installed version first (skill `system-check`). If it is not R1.03,
|
(R1.05.00) and is being moved over from R1.03 one skill at a time: until a skill is marked
|
||||||
tell the user before doing anything and point out which content may not apply.
|
R1.05, it was verified on R1.03 only. Check the installed version first (skill
|
||||||
|
`system-check`) and read `knowledge/version-differences.md` for what changed.
|
||||||
|
- R1.03 system: use the frozen branch `r1.03` (tag `r1.03-final`) instead of `main`.
|
||||||
|
- Any other version: tell the user before doing anything and point out which content may
|
||||||
|
not apply.
|
||||||
2. **Ask how the user wants to work** — once per conversation, before the first action:
|
2. **Ask how the user wants to work** — once per conversation, before the first action:
|
||||||
- **Direct**: you make changes in CI Server yourself (run tools, edit setup files, load data).
|
- **Direct**: you make changes in CI Server yourself (run tools, edit setup files, load data).
|
||||||
- **Prepare only**: you only read the system's files, generate new files in a location the
|
- **Prepare only**: you only read the system's files, generate new files in a location the
|
||||||
|
|
@ -42,7 +46,8 @@ cover something, say so plainly instead of guessing CI Server behavior.
|
||||||
|
|
||||||
## Building the repo (development stage)
|
## Building the repo (development stage)
|
||||||
|
|
||||||
The manuals are at `C:\Users\Public\Yokogawa\tls\doc\EN\` on the development machine. Work
|
The R1.05 manuals are on the R1.05 test server in `C:\Yokogawa\CIServer\tls\doc\EN\` (the
|
||||||
|
R1.03 ones at `C:\Users\Public\Yokogawa\tls\doc\EN\` on the development machine). Work
|
||||||
proceeds manual by manual in the order in `knowledge/progress.md`: summarize the manual into
|
proceeds manual by manual in the order in `knowledge/progress.md`: summarize the manual into
|
||||||
`knowledge/manuals/`, practice each task on the test system, and record a task in a skill only
|
`knowledge/manuals/`, practice each task on the test system, and record a task in a skill only
|
||||||
after the user confirms it works. Tasks may be practiced first on the author's AID test
|
after the user confirms it works. Tasks may be practiced first on the author's AID test
|
||||||
|
|
@ -50,3 +55,12 @@ project, but whatever they need must then be added to `CI-Eng-Sample` and re-tes
|
||||||
a task is done only when it passes on the sample project (or needs no project data). Track
|
a task is done only when it passes on the sample project (or needs no project data). Track
|
||||||
status in `knowledge/progress.md`. Log open questions
|
status in `knowledge/progress.md`. Log open questions
|
||||||
and problems in `knowledge/issues.md`, each with the files to update once it is resolved.
|
and problems in `knowledge/issues.md`, each with the files to update once it is resolved.
|
||||||
|
|
||||||
|
The R1.05 test server is shared with other projects. Never disturb their work there: run only
|
||||||
|
read-only checks unless the user approves a change, never restart CI Server, never write to other
|
||||||
|
projects' records or to live plant values, and remove anything you put on the server.
|
||||||
|
Fixes that also apply to R1.03 can be cherry-picked onto branch `r1.03`.
|
||||||
|
|
||||||
|
When re-checking a manual for R1.05, compare its full text with the R1.03 edition
|
||||||
|
(`tools/manual_diff.py`), not just the revision table or release notes: R1.04 changes are
|
||||||
|
often not listed there.
|
||||||
|
|
|
||||||
17
README.md
17
README.md
|
|
@ -1,8 +1,18 @@
|
||||||
# ci-server-engineer
|
# ci-server-engineer
|
||||||
|
|
||||||
A knowledge base that lets Claude Code work as a Yokogawa CI Server (R1.03) engineer.
|
A knowledge base that lets Claude Code work as a Yokogawa CI Server engineer.
|
||||||
Open this repo in Claude Code and describe what you want to do in CI Server.
|
Open this repo in Claude Code and describe what you want to do in CI Server.
|
||||||
|
|
||||||
|
## Versions
|
||||||
|
|
||||||
|
| CI Server | Use | Status |
|
||||||
|
|---|---|---|
|
||||||
|
| **R1.05** | branch `main` | Being moved over from R1.03 one skill at a time; see `knowledge/version-differences.md` and `knowledge/progress.md` |
|
||||||
|
| **R1.03** | branch `r1.03` (tag `r1.03-final`) | Frozen; only fixes are added |
|
||||||
|
|
||||||
|
For an R1.03 system, check out the `r1.03` branch, or keep it next to `main` as a separate
|
||||||
|
folder: `git worktree add ../ci-server-engineer-r1.03 r1.03`.
|
||||||
|
|
||||||
## Layout
|
## Layout
|
||||||
|
|
||||||
| Path | Contents |
|
| Path | Contents |
|
||||||
|
|
@ -17,8 +27,9 @@ Open this repo in Claude Code and describe what you want to do in CI Server.
|
||||||
|
|
||||||
Using the repo needs no manuals: the knowledge is in `knowledge/` and `.claude/skills/`.
|
Using the repo needs no manuals: the knowledge is in `knowledge/` and `.claude/skills/`.
|
||||||
Only to **extend** the repo (summarize a manual, check a citation) you need the CI Server EN
|
Only to **extend** the repo (summarize a manual, check a citation) you need the CI Server EN
|
||||||
manuals locally. They are not stored in this repo. The default location is
|
manuals locally. They are not stored in this repo. They are installed in `tls\doc\EN\` under
|
||||||
`C:\Users\Public\Yokogawa\tls\doc\EN\`; see `knowledge/document-map.md` if yours is different.
|
the CI Server data folder (`%TLS_ALLUSERS_PATH%`): `C:\Yokogawa\CIServer\tls\doc\EN\` on the
|
||||||
|
R1.05 test server, `C:\Users\Public\Yokogawa\tls\doc\EN\` on the R1.03 machine.
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,15 @@
|
||||||
# CI-Eng-Sample
|
# CI-Eng-Sample
|
||||||
|
|
||||||
A small, invented sample project that anyone with this repo can load into a CI Server
|
A small, invented sample project that anyone with this repo can load into a CI Server
|
||||||
**R1.03** test system. Skills use its names in their examples, and every skill task is
|
test system (R1.03 or R1.05). Skills use its names in their examples, and every skill task is
|
||||||
re-tested against it so that no other project is needed.
|
re-tested against it so that no other project is needed.
|
||||||
|
|
||||||
Built and tested on CI Server R1.03.00 (unlicensed test system), 2026-09-30; operator HMI, demo
|
Built and tested on CI Server R1.03.00 (unlicensed test system), 2026-09-30; operator HMI, demo
|
||||||
user and live-data feed added 2026-10-06.
|
user and live-data feed added 2026-10-06. Reduced load (below) tested on R1.05.00 on a shared
|
||||||
|
server, 2026-10-08: loads with 0 errors (the `@VERSION 1.03.00` headers are accepted).
|
||||||
|
|
||||||
|
**Every test ends with the system back in its original state:** remove what was loaded, stop
|
||||||
|
processes started for the test, undo certificate trust, delete scratch and temporary files.
|
||||||
|
|
||||||
## Load and remove
|
## Load and remove
|
||||||
|
|
||||||
|
|
@ -30,6 +34,26 @@ cmd /c "<repo>\examples\CI-Eng-Sample\remove.cmd"
|
||||||
has passed, so the script sets a stop time one minute ahead and waits. Removing the group
|
has passed, so the script sets a stop time one minute ahead and waits. Removing the group
|
||||||
also deletes its history.
|
also deletes its history.
|
||||||
|
|
||||||
|
### Testing on a shared server (`shared\`)
|
||||||
|
|
||||||
|
For a server that other projects use, where CI Server must not be restarted:
|
||||||
|
|
||||||
|
| Script | Does |
|
||||||
|
|---|---|
|
||||||
|
| `shared\snapshot.ps1 -Out <file>` | Read-only snapshot: record names (count, hash, `CIENG*` names) of every dataset the sample touches, file lists of `tls\com`, `sup`, `sav`, `lst`, the `pki` folders, running CI Server processes. Run before and after; compare the two files. |
|
||||||
|
| `shared\reduced_load.cmd` | `load.cmd` without the storage groups and history bindings (`03`, `04`: need a restart), the authorization group and user `CIENG` (`08`, `08b`: a password-less user on a shared server) and the layouts/displays (shared `Layouts.xml`) |
|
||||||
|
| `shared\test_r105.ps1` | Starts the Modbus slave mirror only for the test, checks classes, sub-items, Modbus loopback and OPC UA loopback with `itmval`, stops the mirror again |
|
||||||
|
| `shared\reduced_remove.cmd` | Removes exactly what `reduced_load.cmd` loaded |
|
||||||
|
| `shared\clean_dss_tmp.ps1 -Since <time>` | Deletes the `dss_*.tmp` files the test left in `%TLS_LST_PATH%` (ISS-091, ISS-119) |
|
||||||
|
| `shared\write_test\*` + `shared\test_r105_writes.ps1 [-Part v9\|v10\|v12\|v15]` | Write tests (blocking and string items, alarms, reports with `rptstp` and SPOOL, class change/reset and attribute change). Copy all files into the copied sample folder; `load_write_test.cmd`, run the parts, `remove_write_test.cmd`. Needs approval on a shared server (run 2026-10-09, `knowledge/r105-verification.md`). Afterwards delete the `opc_t*.asc/.lst/.rst` files the class compile and reset wrote to `%TLS_LST_PATH%` (they contain sample text). Alarm history, audit-trail and `umhlog` records of the test cannot be removed. |
|
||||||
|
|
||||||
|
Copy the whole sample folder to a temporary folder on the server, run from there, and delete
|
||||||
|
it afterwards. Also delete `%TLS_LOG_PATH%\OPXCIENG.log`. The OPC UA certificate exchange and
|
||||||
|
its undo are user steps (see below); the client's own certificate `<host>_OPXCIENG.der/.pem`
|
||||||
|
and the trusted copies stay in the `pki` folders (and in `OPCUAC_PKI_CERTIFICATES_DF`, which
|
||||||
|
follows the files) until they are deleted; the server-side `pkiserver\rejected` folder is also
|
||||||
|
created by the test; delete it when it is empty.
|
||||||
|
|
||||||
## Current contents
|
## Current contents
|
||||||
|
|
||||||
| Name | Kind | Details |
|
| Name | Kind | Details |
|
||||||
|
|
@ -201,7 +225,7 @@ fill any monitor (slightly stretched where the ratio differs); maximise the wind
|
||||||
the taskbar. The web client does not zoom displays: use full screen (F11) and the browser zoom
|
the taskbar. The web client does not zoom displays: use full screen (F11) and the browser zoom
|
||||||
(estimates, not tested: about 100 % at 1920 x 1080, 80 % at 1536 x 864, 70 % at 1366 x 768).
|
(estimates, not tested: about 100 % at 1920 x 1080, 80 % at 1536 x 864, 70 % at 1366 x 768).
|
||||||
|
|
||||||
Known limits (R1.03.00): the trend draws no line in the browser (a web trend needs 50 pens,
|
Known limits (R1.03.00; on R1.05 the web trend draws with 2 pens, verified 2026-10-09): the trend draws no line in the browser (a web trend needs 50 pens,
|
||||||
ISS-041; the 2-pen trend keeps the desktop hairline box readable); the empty part of the alarm
|
ISS-041; the 2-pen trend keeps the desktop hairline box readable); the empty part of the alarm
|
||||||
lists stays white; a tab opened by clicking the tab strip itself keeps its zoom until it is opened
|
lists stays white; a tab opened by clicking the tab strip itself keeps its zoom until it is opened
|
||||||
once from the toolbar, menu or F1–F6.
|
once from the toolbar, menu or F1–F6.
|
||||||
|
|
|
||||||
15
examples/CI-Eng-Sample/shared/clean_dss_tmp.ps1
Normal file
15
examples/CI-Eng-Sample/shared/clean_dss_tmp.ps1
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
# Remove the DSS temporary files that a test session left in %TLS_LST_PATH%.
|
||||||
|
# Each dssqld run can leave a 0-byte dss_<n>_<id>.tmp there, and loading a class leaves its source
|
||||||
|
# text in one (verified on R1.05, 2026-10-08). Only files written since -Since are touched: 0-byte
|
||||||
|
# files, and non-empty files that contain sample text (CIENG / CI-Eng-Sample). Files in use are skipped.
|
||||||
|
# Usage: powershell -NoProfile -ExecutionPolicy Bypass -File clean_dss_tmp.ps1 -Since "2026-10-08T07:00:00"
|
||||||
|
param([Parameter(Mandatory = $true)][datetime]$Since)
|
||||||
|
$lst = $env:TLS_LST_PATH
|
||||||
|
$f = Get-ChildItem -Path $lst -Filter 'dss_*.tmp' | Where-Object { $_.LastWriteTime -ge $Since }
|
||||||
|
$ok = 0; $skip = 0
|
||||||
|
foreach ($i in $f) {
|
||||||
|
$mine = ($i.Length -eq 0) -or (Select-String -LiteralPath $i.FullName -Pattern 'CIENG|CI-Eng-Sample' -Quiet)
|
||||||
|
if (-not $mine) { $skip++; continue }
|
||||||
|
try { Remove-Item -LiteralPath $i.FullName -ErrorAction Stop; $ok++ } catch { $skip++ }
|
||||||
|
}
|
||||||
|
"deleted $ok, left $skip (other content or in use)"
|
||||||
27
examples/CI-Eng-Sample/shared/reduced_load.cmd
Normal file
27
examples/CI-Eng-Sample/shared/reduced_load.cmd
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
@echo off
|
||||||
|
REM Reduced CI-Eng-Sample load for the shared R1.05 test server (2026-10-08).
|
||||||
|
REM Skips: history group/bindings (03, 04: need a CI Server restart), auth group and user (08, 08b),
|
||||||
|
REM layouts/displays. Run from the copied sample folder (this script lives in its shared subfolder).
|
||||||
|
cd /d "%~dp0.."
|
||||||
|
dssqld -i 01_section_df.qli -l 01_section_df.qlo
|
||||||
|
dssqld -i 01b_alarm_df.qli -l 01b_alarm_df.qlo
|
||||||
|
dssqld -i 02_item_df.qli -l 02_item_df.qlo
|
||||||
|
dssqld -i 02b_sub_item_df.qli -l 02b_sub_item_df.qlo
|
||||||
|
dssqld -i 05_trigger_df.qli -l 05_trigger_df.qlo
|
||||||
|
dssqld -i 06_class_df.qli -l 06_class_df.qlo
|
||||||
|
dssqld -i 07_object_df.qli -l 07_object_df.qlo
|
||||||
|
dssqld -i 09_modbus_line_df.qli -l 09_modbus_line_df.qlo
|
||||||
|
powershell -NoProfile -Command "Start-Sleep -Seconds 15"
|
||||||
|
dssqld -i 10_modbus_station_df.qli -l 10_modbus_station_df.qlo
|
||||||
|
dssqld -i 11_item_eqp_df.qli -l 11_item_eqp_df.qlo
|
||||||
|
dssqld -m 12_opc_visible_df.qli -l 12_opc_visible_df.qlo
|
||||||
|
dssqld -i 13_opcua_line_df.qli -l 13_opcua_line_df.qlo
|
||||||
|
powershell -NoProfile -Command "Start-Sleep -Seconds 10"
|
||||||
|
dssqld -i 14_opcua_station_df.qli -l 14_opcua_station_df.qlo
|
||||||
|
dssqld -i 15_item_opcua_df.qli -l 15_item_opcua_df.qlo
|
||||||
|
dssqld -m 16_item_alarm_df.qli -l 16_item_alarm_df.qlo
|
||||||
|
powershell -NoProfile -ExecutionPolicy Bypass -File 17_printer_df.ps1
|
||||||
|
dssqld -i 17_printer_df.qli -l 17_printer_df.qlo
|
||||||
|
dssqld -i 18_report_df.qli -l 18_report_df.qlo
|
||||||
|
dssqld -i 19_audit_df.qli -l 19_audit_df.qlo
|
||||||
|
dssqld -m 19b_audit_item_df.qli -l 19b_audit_item_df.qlo
|
||||||
21
examples/CI-Eng-Sample/shared/reduced_remove.cmd
Normal file
21
examples/CI-Eng-Sample/shared/reduced_remove.cmd
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
@echo off
|
||||||
|
REM Removes the reduced CI-Eng-Sample load (reverse of reduced_load.cmd).
|
||||||
|
cd /d "%~dp0.."
|
||||||
|
dssqld -r 79_remove_audit_df.qli -l 79_remove_audit_df.qlo
|
||||||
|
dssqld -m 83a_stop_report_df.qli -l 83a_stop_report_df.qlo
|
||||||
|
dssqld -r 83_remove_report_df.qli -l 83_remove_report_df.qlo
|
||||||
|
dssqld -r 84_remove_printer_df.qli -l 84_remove_printer_df.qlo
|
||||||
|
if exist "%TLS_LST_PATH%\cieng_report.txt" del "%TLS_LST_PATH%\cieng_report.txt"
|
||||||
|
dssqld -r 76_remove_item_opcua_df.qli -l 76_remove_item_opcua_df.qlo
|
||||||
|
dssqld -r 77_remove_opcua_station_df.qli -l 77_remove_opcua_station_df.qlo
|
||||||
|
dssqld -r 78_remove_opcua_line_df.qli -l 78_remove_opcua_line_df.qlo
|
||||||
|
dssqld -r 80_remove_item_eqp_df.qli -l 80_remove_item_eqp_df.qlo
|
||||||
|
dssqld -r 81_remove_modbus_station_df.qli -l 81_remove_modbus_station_df.qlo
|
||||||
|
dssqld -r 82_remove_modbus_line_df.qli -l 82_remove_modbus_line_df.qlo
|
||||||
|
dssqld -r 86_remove_object_df.qli -l 86_remove_object_df.qlo
|
||||||
|
dssqld -r 87_remove_class_df.qli -l 87_remove_class_df.qlo
|
||||||
|
dssqld -r 88_remove_trigger_df.qli -l 88_remove_trigger_df.qlo
|
||||||
|
dssqld -r 90b_remove_sub_item_df.qli -l 90b_remove_sub_item_df.qlo
|
||||||
|
dssqld -r 91_remove_item_df.qli -l 91_remove_item_df.qlo
|
||||||
|
dssqld -r 92_remove_section_df.qli -l 92_remove_section_df.qlo
|
||||||
|
dssqld -r 93_remove_alarm_df.qli -l 93_remove_alarm_df.qlo
|
||||||
43
examples/CI-Eng-Sample/shared/snapshot.ps1
Normal file
43
examples/CI-Eng-Sample/shared/snapshot.ps1
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
# Read-only snapshot of everything the reduced CI-Eng-Sample test can touch.
|
||||||
|
param([string]$Out)
|
||||||
|
$ErrorActionPreference = 'Continue'
|
||||||
|
$started = Get-Date
|
||||||
|
$w = New-Object System.Collections.Generic.List[string]
|
||||||
|
$tmp = Join-Path $PSScriptRoot 'snapx'
|
||||||
|
New-Item -ItemType Directory -Force -Path $tmp | Out-Null
|
||||||
|
$ds = 'SECTION_DF','ITEM_DF','SUB_ITEM_DF','ALARM_ACK_DF','ALARM_AOI_DF','ALARM_ASA_DF','TRIGGER_DF',
|
||||||
|
'CLASS_DF','OBJECT_DF','LINE_DF','STATION_DF','POINT_DF','MODBUS_LINE_DF','MODBUS_STATION_DF',
|
||||||
|
'MODBUS_SCAN_TYPE_DF','MODBUS_POINT_DF','OPCUAC_LINE_DF','OPCUAC_STATION_DF',
|
||||||
|
'OPCUAC_SUBSCRIPTION_DF','OPCUAC_POINT_DF','PRINTER_DEV_DF','PRINTER_DEST_DF','REPORT_DF',
|
||||||
|
'AUDIT_SELGRP_DF','OPCUAC_PKI_CERTIFICATES_DF'
|
||||||
|
foreach ($d in $ds) {
|
||||||
|
$f = Join-Path $tmp "$d.qlo"
|
||||||
|
$null = & dssqld -e $f -d $d -c 2>&1
|
||||||
|
$names = @()
|
||||||
|
if (Test-Path $f) { $names = @(Import-Csv $f | ForEach-Object { $_.NAME }) | Sort-Object }
|
||||||
|
$sha = [BitConverter]::ToString((New-Object Security.Cryptography.SHA256Managed).ComputeHash([Text.Encoding]::UTF8.GetBytes(($names -join "`n")))).Replace('-','').Substring(0,16)
|
||||||
|
$mine = @($names | Where-Object { $_ -match 'CIENG|CI-Eng' })
|
||||||
|
$w.Add("DS $d count=$($names.Count) hash=$sha cieng=$($mine.Count) $($mine -join ';')")
|
||||||
|
}
|
||||||
|
Remove-Item -Recurse -Force $tmp
|
||||||
|
# The exports above (OBJECT_DF) leave empty dss_*.tmp files in tls\lst (ISS-119): remove the ones
|
||||||
|
# this run wrote, so the snapshot does not change the system it describes.
|
||||||
|
Get-ChildItem -Path $env:TLS_LST_PATH -Filter 'dss_*.tmp' -ErrorAction SilentlyContinue |
|
||||||
|
Where-Object { $_.Length -eq 0 -and $_.LastWriteTime -ge $started } |
|
||||||
|
Remove-Item -ErrorAction SilentlyContinue
|
||||||
|
$root = $env:TLS_ALLUSERS_PATH
|
||||||
|
foreach ($sub in 'com','sup','sav','lst') {
|
||||||
|
foreach ($i in (Get-ChildItem -Path (Join-Path $env:TLS_ROOT_PATH "tls\$sub") -File | Sort-Object Name)) {
|
||||||
|
if ($sub -eq 'lst' -or $sub -eq 'sav') { $w.Add("FILE $sub\$($i.Name)") }
|
||||||
|
else { $w.Add("FILE $sub\$($i.Name) $($i.Length) $($i.LastWriteTime.ToString('s'))") }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach ($i in (Get-ChildItem -Path (Join-Path $root 'pki') -Recurse -File | Sort-Object FullName)) {
|
||||||
|
$w.Add("PKI $($i.FullName.Substring($root.Length)) $($i.Length)")
|
||||||
|
}
|
||||||
|
$exe = Join-Path $env:TLS_ROOT_PATH 'tls\exe'
|
||||||
|
foreach ($g in (Get-Process | Where-Object { $_.Path -like "$exe*" } | Group-Object Name | Sort-Object Name)) {
|
||||||
|
$w.Add("PROC $($g.Name) x$($g.Count)")
|
||||||
|
}
|
||||||
|
$w | Set-Content -Encoding utf8 $Out
|
||||||
|
"snapshot: $($w.Count) lines -> $Out"
|
||||||
36
examples/CI-Eng-Sample/shared/test_r105.ps1
Normal file
36
examples/CI-Eng-Sample/shared/test_r105.ps1
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
# Functional test of the reduced CI-Eng-Sample load on R1.05. Starts the Modbus slave mirror only
|
||||||
|
# for the duration of the test and stops it again.
|
||||||
|
$P = 'CI-Eng-Sample'
|
||||||
|
function V($n) { (& itmval -g -n "$P.$n" 2>&1 | Out-String).Trim() -replace '\s+', ' ' }
|
||||||
|
function W($n, $v) { $null = & itmval -p -n "$P.$n" -v $v 2>&1 }
|
||||||
|
|
||||||
|
"--- start Modbus slave mirror"
|
||||||
|
$mem = Start-Process -FilePath eqpmdcmem -ArgumentList '-n','EQPMDCMEM' -WindowStyle Hidden -PassThru
|
||||||
|
Start-Sleep 3
|
||||||
|
$slv = Start-Process -FilePath eqpmdcslvtcp -ArgumentList '-n','EQPMDCSLVTCP','-p','5020' -WindowStyle Hidden -PassThru
|
||||||
|
"mirror pids $($mem.Id) $($slv.Id)"
|
||||||
|
"--- classes and sub-items"
|
||||||
|
"COUNTER t0: $(V 'DEMO.COUNTER')"; Start-Sleep 3; "COUNTER t3: $(V 'DEMO.COUNTER')"
|
||||||
|
W 'TANK1.LEVEL' 50; W 'TANK1.INFLOW' 120; Start-Sleep 3
|
||||||
|
"TANK1.CALC.VOLUME (expect 100): $(V 'TANK1.CALC.VOLUME')"
|
||||||
|
"TANK1.JFLOW.sPerMin (expect 2): $(V 'TANK1.JFLOW.sPerMin')"
|
||||||
|
"TANK1.LEVEL.MAX: $(V 'TANK1.LEVEL.MAX')"
|
||||||
|
"--- wait 45 s for Modbus station and OPC UA client"
|
||||||
|
Start-Sleep 45
|
||||||
|
W 'PLC1.SETPOINT' 1234; Start-Sleep 4
|
||||||
|
"PLC1.READBACK (expect 1234): $(V 'PLC1.READBACK')"
|
||||||
|
"PLC1.COMM_OK (expect 1): $(V 'PLC1.COMM_OK')"
|
||||||
|
"--- eqpdbg slave info"
|
||||||
|
('3', '1', '-1') -join "`n" | & eqpdbg 0 EQPCIENG 2>&1 | Select-String -Pattern 'scan status|Slave name|name|Line status|Good|requests' | Select-Object -First 12 | ForEach-Object { $_.Line.Trim() }
|
||||||
|
"--- OPC UA loopback"
|
||||||
|
"UA.COMM_OK: $(V 'UA.COMM_OK')"
|
||||||
|
"UA.SRV_STATE: $(V 'UA.SRV_STATE')"
|
||||||
|
"UA.LEVEL_COPY: $(V 'UA.LEVEL_COPY')"
|
||||||
|
$pki = $env:TLS_ALLUSERS_PATH + '\pki'
|
||||||
|
"client rejected: " + ((Get-ChildItem "$pki\opxuac\pkiclient\rejected" -File -ErrorAction SilentlyContinue | ForEach-Object Name) -join '; ')
|
||||||
|
"server rejected: " + ((Get-ChildItem "$pki\opxuas\pkiserver\rejected" -File -ErrorAction SilentlyContinue | ForEach-Object Name) -join '; ')
|
||||||
|
"--- stop mirror"
|
||||||
|
& durstp -msk -t 10 -p EQPMDCSLVTCP 2>&1 | Out-Null
|
||||||
|
& durstp -msk -t 10 -p EQPMDCMEM 2>&1 | Out-Null
|
||||||
|
Start-Sleep 2
|
||||||
|
"mirror still running: " + ((Get-Process -Id $mem.Id, $slv.Id -ErrorAction SilentlyContinue | ForEach-Object Id) -join ' ')
|
||||||
139
examples/CI-Eng-Sample/shared/test_r105_writes.ps1
Normal file
139
examples/CI-Eng-Sample/shared/test_r105_writes.ps1
Normal file
|
|
@ -0,0 +1,139 @@
|
||||||
|
# V9, V10, V12, V15 on the R1.05 test server, after write_test\load_write_test.cmd (all files copied into the sample folder). Prints results only.
|
||||||
|
param([string]$Part = 'all')
|
||||||
|
Set-Location -LiteralPath $PSScriptRoot
|
||||||
|
$P = 'CI-Eng-Sample'
|
||||||
|
function V($n) { (& itmval -g -n "$P.$n" 2>&1 | Out-String).Trim() -replace '\s+', ' ' }
|
||||||
|
function W($n, $v, [switch]$o) { if ($o) { $r = & itmval -p -n "$P.$n" -v $v -o 2>&1 } else { $r = & itmval -p -n "$P.$n" -v $v 2>&1 }; " write $n=$v$(if($o){' -o'}) exit=$LASTEXITCODE $r" }
|
||||||
|
function Q($mode, $file) { $r = & dssqld $mode $file -l ($file -replace '\.qli$', '.qlo') 2>&1 | Out-String; ($r -split "`n" | Where-Object { $_ -match '^[A-Z_]+_(DF|VAL|CURRENT)\s+\d' }) -join ' / ' }
|
||||||
|
function E($filter, $out) { $null = & dssqld -e $out $filter -c 2>&1; if (Test-Path $out) { Get-Content $out } }
|
||||||
|
function Umh($pat) { Select-String -Path "$env:TLS_LOG_PATH\umhlog.log" -Pattern $pat -SimpleMatch | Select-Object -Last 3 | ForEach-Object { ' umh: ' + $_.Line.Trim() } }
|
||||||
|
|
||||||
|
if ($Part -in 'all','v9') {
|
||||||
|
"=== V9 block / unblock (TANK1.INFLOW)"
|
||||||
|
W 'TANK1.INFLOW' 10
|
||||||
|
" before: $(V 'TANK1.INFLOW')"
|
||||||
|
" block: $(Q '-m' 't_block.qli')"
|
||||||
|
" blocked: $(V 'TANK1.INFLOW')"
|
||||||
|
W 'TANK1.INFLOW' 77
|
||||||
|
" after write without -o: $(V 'TANK1.INFLOW')"
|
||||||
|
W 'TANK1.INFLOW' 88 -o
|
||||||
|
" after write with -o: $(V 'TANK1.INFLOW')"
|
||||||
|
" unblock: $(Q '-m' 't_unblock.qli')"
|
||||||
|
" unblocked: $(V 'TANK1.INFLOW')"
|
||||||
|
"=== V9 string item (length 100, write 120 characters)"
|
||||||
|
$s = ('0123456789' * 12)
|
||||||
|
W 'DEMO.STR100' $s
|
||||||
|
$g = (& itmval -g -n "$P.DEMO.STR100" 2>&1 | Out-String)
|
||||||
|
$val = ([regex]::Match($g, 'Value\s*=\s*(.*)')).Groups[1].Value.Trim()
|
||||||
|
" stored length: $($val.Length) status: $(([regex]::Match($g, 'Status\s*=\s*(\d+)')).Groups[1].Value)"
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($Part -in 'all','v10') {
|
||||||
|
"=== V10 alarm raise / acknowledge (TANK1.LEVEL, limits 10/20/80/90)"
|
||||||
|
W 'TANK1.LEVEL' 50; Start-Sleep 2
|
||||||
|
" start: $(V 'TANK1.LEVEL')"
|
||||||
|
$t0 = (Get-Date).ToString('dd-MM-yyyy HH:mm:ss')
|
||||||
|
W 'TANK1.LEVEL' 85; Start-Sleep 3
|
||||||
|
" high: $(V 'TANK1.LEVEL')"
|
||||||
|
$cur = E 'f_almcur.qli' 'almcur.qlo'
|
||||||
|
" ALARM_CURRENT rows: $(@($cur).Count - 1)"
|
||||||
|
$hdr = ($cur | Select-Object -First 1) -split ','
|
||||||
|
$row = $cur | Select-Object -Skip 1 | Select-Object -Last 1
|
||||||
|
if ($row) {
|
||||||
|
$name = ($row -split '","')[0].Trim('"')
|
||||||
|
" alarm NAME: $name"
|
||||||
|
"@LANGUAGE`r`nENGLISH`r`n`r`n@VERSION`r`n1.03.00`r`n`r`n@FIELDS`r`nNAME,ACK`r`n`r`n@ALARM_CURRENT`r`n""$name"",1`r`n" | Set-Content -Encoding ascii t_ack.qli
|
||||||
|
" acknowledge: $(Q '-m' 't_ack.qli')"
|
||||||
|
Start-Sleep 2
|
||||||
|
" after ack: $(V 'TANK1.LEVEL')"
|
||||||
|
}
|
||||||
|
W 'TANK1.LEVEL' 50; Start-Sleep 3
|
||||||
|
" back to 50: $(V 'TANK1.LEVEL'); ALARM_CURRENT rows: $(@(E 'f_almcur.qli' 'almcur.qlo').Count - 1)"
|
||||||
|
"=== V10 delay 5 s / repeat 10 s"
|
||||||
|
" set: $(Q '-m' 't_dr.qli')"
|
||||||
|
Start-Sleep 2
|
||||||
|
W 'TANK1.LEVEL' 85; Start-Sleep 27
|
||||||
|
W 'TANK1.LEVEL' 50; Start-Sleep 3
|
||||||
|
"@LANGUAGE`r`nENGLISH`r`n`r`n@VERSION`r`n1.03.00`r`n`r`n@FIELDS`r`nNAME,ALARM_TIME,EVENT_TYPE,NEW_STATE,RPT_COUNT,ACK`r`n`r`n@SELECT`r`n'ITEM_NAME = ""CI-Eng-Sample.TANK1.LEVEL"" and ALARM_TIME > ""$t0""'`r`n@ALARM_CHRONO`r`n" | Set-Content -Encoding ascii f_chrono.qli
|
||||||
|
E 'f_chrono.qli' 'chrono.qlo' | ForEach-Object { " chrono: $_" }
|
||||||
|
" reset delay/repeat: $(Q '-m' 't_dr0.qli')"
|
||||||
|
Start-Sleep 2
|
||||||
|
" ALARM_CURRENT rows after reset: $(@(E 'f_almcur.qli' 'almcur.qlo').Count - 1)"
|
||||||
|
"=== V10 INFO event (almdbg 16)"
|
||||||
|
$t1 = (Get-Date).ToString('dd-MM-yyyy HH:mm:ss')
|
||||||
|
$null = ("16`n`n0`n15`n$P.TANK1.LEVEL`nV10 test`nCI-Eng-Sample INFO test event`n-1`n" | & almdbg 2>&1)
|
||||||
|
Start-Sleep 2
|
||||||
|
"@LANGUAGE`r`nENGLISH`r`n`r`n@VERSION`r`n1.03.00`r`n`r`n@FIELDS`r`nNAME,ALARM_TIME,EVENT_TYPE,ITEM_NAME,ALARM_TEXT,DESCRIPTION,PRIORITY,ACK`r`n`r`n@SELECT`r`n'EVENT_TYPE = ""INFO"" and ALARM_TIME > ""$t1""'`r`n@ALARM_CHRONO`r`n" | Set-Content -Encoding ascii f_info.qli
|
||||||
|
E 'f_info.qli' 'info.qlo' | ForEach-Object { " info: $_" }
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($Part -in 'all','v12') {
|
||||||
|
"=== V12 generate CIENG_TANK1 (dssqld)"
|
||||||
|
" generate: $(Q '-m' 't_gen.qli')"
|
||||||
|
Start-Sleep 5
|
||||||
|
E 'f_repdf.qli' 'repdf.qlo' | ForEach-Object { " report_df: $_" }
|
||||||
|
$rv = E 'f_repval.qli' 'repval.qlo'
|
||||||
|
$rv | ForEach-Object { " report_val: $_" }
|
||||||
|
$gen = $rv | Select-Object -Skip 1 | Where-Object { $_ -like '"CIENG_TANK1.*' } | Select-Object -Last 1
|
||||||
|
Umh 'PRT_UNKUSER'
|
||||||
|
if ($gen) {
|
||||||
|
$gname = ($gen -split '","')[0].Trim('"')
|
||||||
|
"@LANGUAGE`r`nENGLISH`r`n`r`n@VERSION`r`n1.03.00`r`n`r`n@FIELDS`r`nNAME,DEST_NAME,PRINT`r`n`r`n@REPORT_VAL`r`n""$gname"",""CIENG_FILE"",1`r`n" | Set-Content -Encoding ascii t_print.qli
|
||||||
|
" print $gname to CIENG_FILE: $(Q '-m' 't_print.qli')"
|
||||||
|
Start-Sleep 5
|
||||||
|
$f = "$env:TLS_LST_PATH\cieng_report.txt"
|
||||||
|
" output file: $(if (Test-Path $f) { (Get-Item $f).Length.ToString() + ' bytes, first line: ' + (Get-Content $f -TotalCount 1) } else { 'missing' })"
|
||||||
|
}
|
||||||
|
"=== V12 item trigger CIENG_INFLOW_HI (0 -> 450)"
|
||||||
|
W 'TANK1.INFLOW' 0; Start-Sleep 3
|
||||||
|
W 'TANK1.INFLOW' 450; Start-Sleep 12
|
||||||
|
E 'f_repval.qli' 'repval.qlo' | Where-Object { $_ -like '*INFLOW_HI*' } | ForEach-Object { " report_val: $_" }
|
||||||
|
$f = "$env:TLS_LST_PATH\cieng_report.txt"
|
||||||
|
if (Test-Path $f) { " file now: " + ((Get-Content $f) -match 'inflow high' | Select-Object -Last 1) }
|
||||||
|
W 'TANK1.INFLOW' 0
|
||||||
|
"=== V12 rptstp on an endless report"
|
||||||
|
" generate CIENG_LOOP: $(Q '-m' 't_loop_gen.qli')"
|
||||||
|
Start-Sleep 5
|
||||||
|
E 'f_repdf.qli' 'repdf.qlo' | Where-Object { $_ -like '*CIENG_LOOP*' } | ForEach-Object { " while running: $_" }
|
||||||
|
$r = & rptstp rptge1 2>&1 | Out-String
|
||||||
|
" rptstp: exit=$LASTEXITCODE $($r.Trim())"
|
||||||
|
Start-Sleep 4
|
||||||
|
E 'f_repdf.qli' 'repdf.qlo' | Where-Object { $_ -like '*CIENG_LOOP*' } | ForEach-Object { " after rptstp: $_" }
|
||||||
|
" RPTGE1 attached (0 = yes): " + $(& durwfp -p RPTGE1 -t 0 2>&1 | Out-Null; $LASTEXITCODE)
|
||||||
|
"=== V12 SPOOL to CSV"
|
||||||
|
$csv = "$env:TLS_LST_PATH\cieng_levels.csv"
|
||||||
|
"set @next 0;`nset @page_size 0;`nspool '$csv';`nset @export 1;`nselect name, item_value, status from item_val where name like 'CI-Eng-Sample.TANK1.%';`nspool;`nset @export 0;`nquit;`n" | Set-Content -Encoding ascii q_spool.rql
|
||||||
|
$null = Get-Content q_spool.rql | & rptgen -s rptgen.rpt 2>&1
|
||||||
|
if (Test-Path $csv) { Get-Content $csv | ForEach-Object { " csv: $_" }; Remove-Item $csv } else { ' csv: file not written' }
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($Part -in 'all','v15') {
|
||||||
|
"=== V15 change and reset class CIENG_TANK"
|
||||||
|
W 'TANK1.LEVEL' 50; Start-Sleep 2
|
||||||
|
E 'f_class.qli' 'cls.qlo' | ForEach-Object { " before: $_" }
|
||||||
|
" compile changed source: $(Q '-m' 't_cls.qli')"
|
||||||
|
Start-Sleep 3
|
||||||
|
E 'f_class.qli' 'cls.qlo' | ForEach-Object { " after compile: $_" }
|
||||||
|
W 'TANK1.LEVEL' 85; Start-Sleep 3
|
||||||
|
Umh 'CIENG_TANK CI-Eng-Sample.TANK1'
|
||||||
|
W 'TANK1.LEVEL' 50
|
||||||
|
"@LANGUAGE`r`nENGLISH`r`n`r`n@VERSION`r`n1.03.00`r`n`r`n@FIELDS`r`nNAME,RESET`r`n`r`n@CLASS_DF`r`n""CIENG_TANK"",1`r`n" | Set-Content -Encoding ascii t_rst_dss.qli
|
||||||
|
" dssqld reset (ISS-028): $(Q '-m' 't_rst_dss.qli')"
|
||||||
|
Start-Sleep 3
|
||||||
|
E 'f_class.qli' 'cls.qlo' | Select-Object -Last 1 | ForEach-Object { " after dssqld reset: $_" }
|
||||||
|
$job = Start-Job { param($d) Set-Location $d; "2`n8`nCIENG_TANK`n0`n`n-1`n-1`n" | & opcdbg 0 2>&1 | Out-String } -ArgumentList $PSScriptRoot
|
||||||
|
if (Wait-Job $job -Timeout 30) { $o = Receive-Job $job; " opcdbg reset: " + (($o -split "`n" | Where-Object { $_ -match 'reset|Reset|error|Error' } | Select-Object -Last 3) -join ' | ') } else { Stop-Job $job; ' opcdbg reset: timed out' }
|
||||||
|
Remove-Job $job -Force
|
||||||
|
Get-Process opcdbg -ErrorAction SilentlyContinue | Where-Object { $_.StartTime -gt (Get-Date).AddMinutes(-2) } | Stop-Process -Force
|
||||||
|
Start-Sleep 3
|
||||||
|
E 'f_class.qli' 'cls.qlo' | Select-Object -Last 1 | ForEach-Object { " after opcdbg reset: $_" }
|
||||||
|
W 'TANK1.LEVEL' 85; Start-Sleep 3
|
||||||
|
Umh 'CIENG_TANK CI-Eng-Sample.TANK1'
|
||||||
|
W 'TANK1.LEVEL' 50; Start-Sleep 2
|
||||||
|
"=== V15 change attribute CAPACITY 200 -> 400"
|
||||||
|
E 'f_attr.qli' 'attr.qlo' | ForEach-Object { " before: $_" }
|
||||||
|
" set: $(Q '-m' 't_cap.qli')"
|
||||||
|
Start-Sleep 2
|
||||||
|
W 'TANK1.LEVEL' 49; Start-Sleep 1; W 'TANK1.LEVEL' 50; Start-Sleep 3
|
||||||
|
" VOLUME at level 50 (expect 200): $(V 'TANK1.CALC.VOLUME')"
|
||||||
|
}
|
||||||
9
examples/CI-Eng-Sample/shared/write_test/f_almcur.qli
Normal file
9
examples/CI-Eng-Sample/shared/write_test/f_almcur.qli
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
@LANGUAGE
|
||||||
|
ENGLISH
|
||||||
|
|
||||||
|
@VERSION
|
||||||
|
1.03.00
|
||||||
|
|
||||||
|
@SELECT
|
||||||
|
'ITEM_NAME = "CI-Eng-Sample.TANK1.LEVEL"'
|
||||||
|
@ALARM_CURRENT
|
||||||
12
examples/CI-Eng-Sample/shared/write_test/f_attr.qli
Normal file
12
examples/CI-Eng-Sample/shared/write_test/f_attr.qli
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
@LANGUAGE
|
||||||
|
ENGLISH
|
||||||
|
|
||||||
|
@VERSION
|
||||||
|
1.03.00
|
||||||
|
|
||||||
|
@FIELDS
|
||||||
|
NAME,ATTR_VALUE
|
||||||
|
|
||||||
|
@SELECT
|
||||||
|
'NAME = "CI-Eng-Sample.TANK1.CALC:CAPACITY"'
|
||||||
|
@OBJECT_ATTR_VAL
|
||||||
12
examples/CI-Eng-Sample/shared/write_test/f_class.qli
Normal file
12
examples/CI-Eng-Sample/shared/write_test/f_class.qli
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
@LANGUAGE
|
||||||
|
ENGLISH
|
||||||
|
|
||||||
|
@VERSION
|
||||||
|
1.03.00
|
||||||
|
|
||||||
|
@FIELDS
|
||||||
|
NAME,COMPILE,RESET_REQUIRED,OBJECTS,OBJECTS_RESET
|
||||||
|
|
||||||
|
@SELECT
|
||||||
|
'NAME = "CIENG_TANK"'
|
||||||
|
@CLASS_DF
|
||||||
12
examples/CI-Eng-Sample/shared/write_test/f_repdf.qli
Normal file
12
examples/CI-Eng-Sample/shared/write_test/f_repdf.qli
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
@LANGUAGE
|
||||||
|
ENGLISH
|
||||||
|
|
||||||
|
@VERSION
|
||||||
|
1.03.00
|
||||||
|
|
||||||
|
@FIELDS
|
||||||
|
NAME,GENERATE
|
||||||
|
|
||||||
|
@SELECT
|
||||||
|
'NAME = "CIENG_LOOP" or NAME = "CIENG_TANK1"'
|
||||||
|
@REPORT_DF
|
||||||
12
examples/CI-Eng-Sample/shared/write_test/f_repval.qli
Normal file
12
examples/CI-Eng-Sample/shared/write_test/f_repval.qli
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
@LANGUAGE
|
||||||
|
ENGLISH
|
||||||
|
|
||||||
|
@VERSION
|
||||||
|
1.03.00
|
||||||
|
|
||||||
|
@FIELDS
|
||||||
|
NAME,REPORT_NAME,GENERATION_TIME,ACTION_PROCESS,USER_NAME
|
||||||
|
|
||||||
|
@SELECT
|
||||||
|
'REPORT_NAME = "CIENG_TANK1" or REPORT_NAME = "CIENG_INFLOW_HI" or REPORT_NAME = "CIENG_LOOP"'
|
||||||
|
@REPORT_VAL
|
||||||
18
examples/CI-Eng-Sample/shared/write_test/load_write_test.cmd
Normal file
18
examples/CI-Eng-Sample/shared/write_test/load_write_test.cmd
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
@echo off
|
||||||
|
REM Write-test load (V9, V10, V12, V15) on the shared R1.05 test server (2026-10-09).
|
||||||
|
REM Sample sections, items, sub-items, alarm definitions, trigger/classes/objects, item alarm,
|
||||||
|
REM printer and reports, plus the test records. No Modbus, no OPC UA, no history group, no user.
|
||||||
|
cd /d "%~dp0"
|
||||||
|
dssqld -i 01_section_df.qli -l 01_section_df.qlo
|
||||||
|
dssqld -i 01b_alarm_df.qli -l 01b_alarm_df.qlo
|
||||||
|
dssqld -i 02_item_df.qli -l 02_item_df.qlo
|
||||||
|
dssqld -i 02b_sub_item_df.qli -l 02b_sub_item_df.qlo
|
||||||
|
dssqld -i 05_trigger_df.qli -l 05_trigger_df.qlo
|
||||||
|
dssqld -i 06_class_df.qli -l 06_class_df.qlo
|
||||||
|
dssqld -i 07_object_df.qli -l 07_object_df.qlo
|
||||||
|
dssqld -m 16_item_alarm_df.qli -l 16_item_alarm_df.qlo
|
||||||
|
powershell -NoProfile -ExecutionPolicy Bypass -File 17_printer_df.ps1
|
||||||
|
dssqld -i 17_printer_df.qli -l 17_printer_df.qlo
|
||||||
|
dssqld -i 18_report_df.qli -l 18_report_df.qlo
|
||||||
|
dssqld -i t_str.qli -l t_str.qlo
|
||||||
|
dssqld -i t_loop.qli -l t_loop.qlo
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
@echo off
|
||||||
|
REM Removes everything load_write_test.cmd loaded.
|
||||||
|
cd /d "%~dp0"
|
||||||
|
dssqld -r t_loop_rm.qli -l t_loop_rm.qlo
|
||||||
|
dssqld -m 83a_stop_report_df.qli -l 83a_stop_report_df.qlo
|
||||||
|
dssqld -r 83_remove_report_df.qli -l 83_remove_report_df.qlo
|
||||||
|
dssqld -r 84_remove_printer_df.qli -l 84_remove_printer_df.qlo
|
||||||
|
if exist "%TLS_LST_PATH%\cieng_report.txt" del "%TLS_LST_PATH%\cieng_report.txt"
|
||||||
|
dssqld -r 86_remove_object_df.qli -l 86_remove_object_df.qlo
|
||||||
|
dssqld -r 87_remove_class_df.qli -l 87_remove_class_df.qlo
|
||||||
|
dssqld -r 88_remove_trigger_df.qli -l 88_remove_trigger_df.qlo
|
||||||
|
dssqld -r 90b_remove_sub_item_df.qli -l 90b_remove_sub_item_df.qlo
|
||||||
|
dssqld -r t_str_rm.qli -l t_str_rm.qlo
|
||||||
|
dssqld -r 91_remove_item_df.qli -l 91_remove_item_df.qlo
|
||||||
|
dssqld -r 92_remove_section_df.qli -l 92_remove_section_df.qlo
|
||||||
|
dssqld -r 93_remove_alarm_df.qli -l 93_remove_alarm_df.qlo
|
||||||
11
examples/CI-Eng-Sample/shared/write_test/t_block.qli
Normal file
11
examples/CI-Eng-Sample/shared/write_test/t_block.qli
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
@LANGUAGE
|
||||||
|
ENGLISH
|
||||||
|
|
||||||
|
@VERSION
|
||||||
|
1.03.00
|
||||||
|
|
||||||
|
@FIELDS
|
||||||
|
NAME,BLOCKED
|
||||||
|
|
||||||
|
@ITEM_DF
|
||||||
|
"CI-Eng-Sample.TANK1.INFLOW",1
|
||||||
11
examples/CI-Eng-Sample/shared/write_test/t_cap.qli
Normal file
11
examples/CI-Eng-Sample/shared/write_test/t_cap.qli
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
@LANGUAGE
|
||||||
|
ENGLISH
|
||||||
|
|
||||||
|
@VERSION
|
||||||
|
1.03.00
|
||||||
|
|
||||||
|
@FIELDS
|
||||||
|
NAME,ATTR_VALUE
|
||||||
|
|
||||||
|
@OBJECT_ATTR_VAL
|
||||||
|
"CI-Eng-Sample.TANK1.CALC:CAPACITY","400"
|
||||||
31
examples/CI-Eng-Sample/shared/write_test/t_cls.qli
Normal file
31
examples/CI-Eng-Sample/shared/write_test/t_cls.qli
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
@LANGUAGE
|
||||||
|
ENGLISH
|
||||||
|
|
||||||
|
@VERSION
|
||||||
|
1.03.00
|
||||||
|
|
||||||
|
@FIELDS
|
||||||
|
NAME,COMPILE,METHOD
|
||||||
|
|
||||||
|
@CLASS_DF
|
||||||
|
"CIENG_TANK",1,@"
|
||||||
|
CLASS CIENG_TANK;
|
||||||
|
PROLOG
|
||||||
|
ATTRIBUTE CAPACITY OBJECT FLOAT;
|
||||||
|
PROMPT CAPACITY QUERY "Tank capacity (m3)";
|
||||||
|
SIGNAL LEVEL := SECTION || ".LEVEL" TRIGGER VALUE;
|
||||||
|
SIGNAL VOLUME := FROM "CI-Eng-Sample.TEMPLATES.TPL_REAL" MAKE
|
||||||
|
"DESCRIPTION" EQUAL "Tank volume (m3), class CIENG_TANK";
|
||||||
|
IF CAPACITY <= 0 THEN
|
||||||
|
ERROR "CIENG_TANK: capacity must be > 0";
|
||||||
|
ENDIF;
|
||||||
|
BODY
|
||||||
|
METHOD CALC;
|
||||||
|
BODY
|
||||||
|
VOLUME := LEVEL * CAPACITY / 100.0;
|
||||||
|
IF LEVEL >=: 80.0 THEN
|
||||||
|
PRINT "CIENG_TANK ", SECTION, ": V15 changed text, volume ", VOLUME;
|
||||||
|
ENDIF;
|
||||||
|
ENDMETHOD CALC;
|
||||||
|
ENDCLASS CIENG_TANK;
|
||||||
|
"@
|
||||||
11
examples/CI-Eng-Sample/shared/write_test/t_dr.qli
Normal file
11
examples/CI-Eng-Sample/shared/write_test/t_dr.qli
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
@LANGUAGE
|
||||||
|
ENGLISH
|
||||||
|
|
||||||
|
@VERSION
|
||||||
|
1.03.00
|
||||||
|
|
||||||
|
@FIELDS
|
||||||
|
NAME,DELAY,REPEAT
|
||||||
|
|
||||||
|
@ITEM_DF
|
||||||
|
"CI-Eng-Sample.TANK1.LEVEL",5,10
|
||||||
11
examples/CI-Eng-Sample/shared/write_test/t_dr0.qli
Normal file
11
examples/CI-Eng-Sample/shared/write_test/t_dr0.qli
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
@LANGUAGE
|
||||||
|
ENGLISH
|
||||||
|
|
||||||
|
@VERSION
|
||||||
|
1.03.00
|
||||||
|
|
||||||
|
@FIELDS
|
||||||
|
NAME,DELAY,REPEAT
|
||||||
|
|
||||||
|
@ITEM_DF
|
||||||
|
"CI-Eng-Sample.TANK1.LEVEL",0,0
|
||||||
11
examples/CI-Eng-Sample/shared/write_test/t_gen.qli
Normal file
11
examples/CI-Eng-Sample/shared/write_test/t_gen.qli
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
@LANGUAGE
|
||||||
|
ENGLISH
|
||||||
|
|
||||||
|
@VERSION
|
||||||
|
1.03.00
|
||||||
|
|
||||||
|
@FIELDS
|
||||||
|
NAME,PARAM_VALUE_1,GENERATE
|
||||||
|
|
||||||
|
@REPORT_DF
|
||||||
|
"CIENG_TANK1","CI-Eng-Sample.TANK1.INFLOW",1
|
||||||
14
examples/CI-Eng-Sample/shared/write_test/t_loop.qli
Normal file
14
examples/CI-Eng-Sample/shared/write_test/t_loop.qli
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
@LANGUAGE
|
||||||
|
ENGLISH
|
||||||
|
|
||||||
|
@VERSION
|
||||||
|
1.03.00
|
||||||
|
|
||||||
|
@FIELDS
|
||||||
|
NAME,DESCRIPTION,PRIORITY,ADHOC_ENABLED,LIFE_TIME,QUERY
|
||||||
|
|
||||||
|
@REPORT_DF
|
||||||
|
"CIENG_LOOP","Endless loop test for rptstp",0,1,"1 Days",@"
|
||||||
|
set @i 0;
|
||||||
|
loop set @i @i + 1; endloop;
|
||||||
|
"@
|
||||||
11
examples/CI-Eng-Sample/shared/write_test/t_loop_gen.qli
Normal file
11
examples/CI-Eng-Sample/shared/write_test/t_loop_gen.qli
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
@LANGUAGE
|
||||||
|
ENGLISH
|
||||||
|
|
||||||
|
@VERSION
|
||||||
|
1.03.00
|
||||||
|
|
||||||
|
@FIELDS
|
||||||
|
NAME,GENERATE
|
||||||
|
|
||||||
|
@REPORT_DF
|
||||||
|
"CIENG_LOOP",1
|
||||||
11
examples/CI-Eng-Sample/shared/write_test/t_loop_rm.qli
Normal file
11
examples/CI-Eng-Sample/shared/write_test/t_loop_rm.qli
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
@LANGUAGE
|
||||||
|
ENGLISH
|
||||||
|
|
||||||
|
@VERSION
|
||||||
|
1.03.00
|
||||||
|
|
||||||
|
@FIELDS
|
||||||
|
NAME
|
||||||
|
|
||||||
|
@REPORT_DF
|
||||||
|
"CIENG_LOOP"
|
||||||
11
examples/CI-Eng-Sample/shared/write_test/t_str.qli
Normal file
11
examples/CI-Eng-Sample/shared/write_test/t_str.qli
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
@LANGUAGE
|
||||||
|
ENGLISH
|
||||||
|
|
||||||
|
@VERSION
|
||||||
|
1.03.00
|
||||||
|
|
||||||
|
@FIELDS
|
||||||
|
NAME,DESCRIPTION,ITEM_REP,STRING_LENGTH,AUDIT_INFO
|
||||||
|
|
||||||
|
@ITEM_DF
|
||||||
|
"CI-Eng-Sample.DEMO.STR100","Test string item, length 100","String",100,0
|
||||||
11
examples/CI-Eng-Sample/shared/write_test/t_str_rm.qli
Normal file
11
examples/CI-Eng-Sample/shared/write_test/t_str_rm.qli
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
@LANGUAGE
|
||||||
|
ENGLISH
|
||||||
|
|
||||||
|
@VERSION
|
||||||
|
1.03.00
|
||||||
|
|
||||||
|
@FIELDS
|
||||||
|
NAME
|
||||||
|
|
||||||
|
@ITEM_DF
|
||||||
|
"CI-Eng-Sample.DEMO.STR100"
|
||||||
11
examples/CI-Eng-Sample/shared/write_test/t_unblock.qli
Normal file
11
examples/CI-Eng-Sample/shared/write_test/t_unblock.qli
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
@LANGUAGE
|
||||||
|
ENGLISH
|
||||||
|
|
||||||
|
@VERSION
|
||||||
|
1.03.00
|
||||||
|
|
||||||
|
@FIELDS
|
||||||
|
NAME,BLOCKED
|
||||||
|
|
||||||
|
@ITEM_DF
|
||||||
|
"CI-Eng-Sample.TANK1.INFLOW",0
|
||||||
|
|
@ -9,3 +9,5 @@ that area's skill (`.claude/skills/<area>/reference/`).
|
||||||
| `progress.md` | Working order of the manuals and status of every practiced task |
|
| `progress.md` | Working order of the manuals and status of every practiced task |
|
||||||
| `manuals/` | One summary per manual (`IM36K….md`), written in our own words |
|
| `manuals/` | One summary per manual (`IM36K….md`), written in our own words |
|
||||||
| `document-map.md` | All EN manuals by IM number, with editions |
|
| `document-map.md` | All EN manuals by IM number, with editions |
|
||||||
|
| `version-differences.md` | What changed from R1.03 to R1.05 (manuals and installed files) |
|
||||||
|
| `r105-verification.md` | R1.05 checks marked *not tested* and the steps awaiting user verification |
|
||||||
|
|
|
||||||
|
|
@ -2,113 +2,115 @@
|
||||||
|
|
||||||
| | |
|
| | |
|
||||||
|---|---|
|
|---|---|
|
||||||
| **Software** | Yokogawa CI Server **R1.03** (R1.03.00 or later) |
|
| **Software** | Yokogawa CI Server **R1.05** (R1.05.00); R1.03 editions kept for comparison |
|
||||||
| **Documentation set** | English manuals, editions dated Sep. 2023 (see Edition column) |
|
| **Documentation set** | English manuals, R1.05 editions dated Feb. 2026; R1.03 editions dated Sep. 2023 |
|
||||||
| **Source** | `ciserver.pdf` (English page) in the documentation folder |
|
| **Source** | `ciserver.pdf` (English page) in the documentation folder |
|
||||||
|
|
||||||
> [!IMPORTANT]
|
> [!IMPORTANT]
|
||||||
> **Documentation location is machine-specific.**
|
> **Documentation location is machine-specific.**
|
||||||
> The links below point to the default location on the machine where this map was written:
|
> The links below point to the location on the R1.05 test server:
|
||||||
> `C:\Users\Public\Yokogawa\tls\doc\EN\`
|
> `C:\Yokogawa\CIServer\tls\doc\EN\` (on the R1.03 development machine it was
|
||||||
|
> `C:\Users\Public\Yokogawa\tls\doc\EN\`). In general it is `%TLS_ALLUSERS_PATH%\doc\EN\`.
|
||||||
>
|
>
|
||||||
> The PDFs are **not** stored in this repository. If your CI Server documentation is installed
|
> The PDFs are **not** stored in this repository. If your CI Server documentation is installed
|
||||||
> elsewhere, the links will not open. Look up the manual by its **IM number / file name**
|
> elsewhere, the links will not open. Look up the manual by its **IM number / file name**
|
||||||
> (e.g. `IM36K01C10-01EN.pdf`) in your own `...\doc\EN\` folder, or find-and-replace
|
> (e.g. `IM36K01C10-01EN.pdf`) in your own `...\doc\EN\` folder, or find-and-replace
|
||||||
> `file:///C:/Users/Public/Yokogawa/tls/doc/EN/` in this file with your local path.
|
> `file:///C:/Yokogawa/CIServer/tls/doc/EN/` in this file with your local path.
|
||||||
>
|
>
|
||||||
> If your installed CI Server release is not R1.03, check that your manual editions match the ones listed here.
|
> What changed between the editions: `version-differences.md`.
|
||||||
|
|
||||||
## Read Me First
|
## Read Me First
|
||||||
|
|
||||||
| Document | IM Number | Edition |
|
| Document | IM Number | R1.05 edition | R1.03 edition |
|
||||||
|---|---|---|
|
|---|---|---|---|
|
||||||
| [Read Me First](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K01A10-01EN.pdf) | IM 36K01A10-01EN | 2nd Edition, Sep. 2023 |
|
| [Read Me First](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K01A10-01EN.pdf) | IM 36K01A10-01EN | 4th Edition, Feb. 2026 | 2nd Edition, Sep. 2023 |
|
||||||
| [CI Server Release Information](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K01A50-01EN.pdf) | IM 36K01A50-01EN | 3rd Edition, Sep. 2023 |
|
| [CI Server Release Information](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K01A50-01EN.pdf) | IM 36K01A50-01EN | 5th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
| Document | IM Number | Edition |
|
| Document | IM Number | R1.05 edition | R1.03 edition |
|
||||||
|---|---|---|
|
|---|---|---|---|
|
||||||
| [CI Server Setup](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K01C10-01EN.pdf) | IM 36K01C10-01EN | 3rd Edition, Sep. 2023 |
|
| [CI Server Setup](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K01C10-01EN.pdf) | IM 36K01C10-01EN | 5th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
| [CI Server Security Guide](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K01C30-01EN.pdf) | IM 36K01C30-01EN | 3rd Edition, Sep. 2023 |
|
| [CI Server Security Guide](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K01C30-01EN.pdf) | IM 36K01C30-01EN | 5th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
|
|
||||||
## User Manual
|
## User Manual
|
||||||
|
|
||||||
### Engineering Basics
|
### Engineering Basics
|
||||||
|
|
||||||
| Document | IM Number | Edition |
|
| Document | IM Number | R1.05 edition | R1.03 edition |
|
||||||
|---|---|---|
|
|---|---|---|---|
|
||||||
| [Engineering Module - I/O Processes](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10C10-01EN.pdf) | IM 36K10C10-01EN | 3rd Edition, Sep. 2023 |
|
| [Engineering Module - I/O Processes](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10C10-01EN.pdf) | IM 36K10C10-01EN | 5th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
| [Engineering Module - Alarms](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10C20-01EN.pdf) | IM 36K10C20-01EN | 3rd Edition, Sep. 2023 |
|
| [Engineering Module - Alarms](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10C20-01EN.pdf) | IM 36K10C20-01EN | 4th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
| [Engineering Module - Reporting](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10C30-01EN.pdf) | IM 36K10C30-01EN | 3rd Edition, Sep. 2023 |
|
| [Engineering Module - Reporting](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10C30-01EN.pdf) | IM 36K10C30-01EN | 4th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
| [Engineering Module - Historical](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10C40-01EN.pdf) | IM 36K10C40-01EN | 3rd Edition, Sep. 2023 |
|
| [Engineering Module - Historical](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10C40-01EN.pdf) | IM 36K10C40-01EN | 5th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
| [Edit Module](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10C50-01EN.pdf) | IM 36K10C50-01EN | 3rd Edition, Sep. 2023 |
|
| [Edit Module](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10C50-01EN.pdf) | IM 36K10C50-01EN | 5th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
| [Advanced Operating Graphics](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10C60-01EN.pdf) | IM 36K10C60-01EN | 3rd Edition, Sep. 2023 |
|
| [Advanced Operating Graphics](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10C60-01EN.pdf) | IM 36K10C60-01EN | 5th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
|
|
||||||
### Function
|
### Function
|
||||||
|
|
||||||
| Document | IM Number | Edition |
|
| Document | IM Number | R1.05 edition | R1.03 edition |
|
||||||
|---|---|---|
|
|---|---|---|---|
|
||||||
| [Excel Add-in Data Analysis and Reporting](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10E10-01EN.pdf) | IM 36K10E10-01EN | 3rd Edition, Sep. 2023 |
|
| [Excel Add-in Data Analysis and Reporting](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10E10-01EN.pdf) | IM 36K10E10-01EN | 4th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
| [OPC Interface](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10E20-01EN.pdf) | IM 36K10E20-01EN | 2nd Edition, Sep. 2023 |
|
| [OPC Interface](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10E20-01EN.pdf) | IM 36K10E20-01EN | 4th Edition, Feb. 2026 | 2nd Edition, Sep. 2023 |
|
||||||
| [Alarm System Performance Analysis](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10E30-01EN.pdf) | IM 36K10E30-01EN | 3rd Edition, Sep. 2023 |
|
| [Alarm System Performance Analysis](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10E30-01EN.pdf) | IM 36K10E30-01EN | 4th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
|
|
||||||
## Tutorial
|
## Tutorial
|
||||||
|
|
||||||
| Document | IM Number | Edition |
|
| Document | IM Number | R1.05 edition | R1.03 edition |
|
||||||
|---|---|---|
|
|---|---|---|---|
|
||||||
| [CI Server Tutorial](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10G10-01EN.pdf) | IM 36K10G10-01EN | 3rd Edition, Sep. 2023 |
|
| [CI Server Tutorial](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10G10-01EN.pdf) | IM 36K10G10-01EN | 5th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
|
|
||||||
## Engineering Manual
|
## Engineering Manual
|
||||||
|
|
||||||
### System Design / System Construction
|
### System Design / System Construction
|
||||||
|
|
||||||
| Document | IM Number | Edition |
|
| Document | IM Number | R1.05 edition | R1.03 edition |
|
||||||
|---|---|---|
|
|---|---|---|---|
|
||||||
| [CI Server System Design/Management](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10J10-01EN.pdf) | IM 36K10J10-01EN | 3rd Edition, Sep. 2023 |
|
| [CI Server System Design/Management](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10J10-01EN.pdf) | IM 36K10J10-01EN | 5th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
| [High Availability Computing](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10J20-01EN.pdf) | IM 36K10J20-01EN | 3rd Edition, Sep. 2023 |
|
| [High Availability Computing](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10J20-01EN.pdf) | IM 36K10J20-01EN | 4th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
| [Active Directory Integration](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10J40-01EN.pdf) | IM 36K10J40-01EN | 3rd Edition, Sep. 2023 |
|
| [Active Directory Integration](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10J40-01EN.pdf) | IM 36K10J40-01EN | 4th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
|
|
||||||
### Function
|
### Function
|
||||||
|
|
||||||
| Document | IM Number | Edition |
|
| Document | IM Number | R1.05 edition | R1.03 edition |
|
||||||
|---|---|---|
|
|---|---|---|---|
|
||||||
| [Class/Object Engineering](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10L10-01EN.pdf) | IM 36K10L10-01EN | 3rd Edition, Sep. 2023 |
|
| [Class/Object Engineering](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10L10-01EN.pdf) | IM 36K10L10-01EN | 4th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
| [Alarm Management Engineering](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10L15-01EN.pdf) | IM 36K10L15-01EN | 3rd Edition, Sep. 2023 |
|
| [Alarm Management Engineering](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10L15-01EN.pdf) | IM 36K10L15-01EN | 4th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
| [History Management Engineering](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10L20-01EN.pdf) | IM 36K10L20-01EN | 3rd Edition, Sep. 2022 |
|
| [History Management Engineering](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10L20-01EN.pdf) | IM 36K10L20-01EN | 4th Edition, Feb. 2026 | 3rd Edition, Sep. 2022 |
|
||||||
| [Audit Trail Management Engineering](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10L25-01EN.pdf) | IM 36K10L25-01EN | 3rd Edition, Sep. 2023 |
|
| [Audit Trail Management Engineering](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10L25-01EN.pdf) | IM 36K10L25-01EN | 4th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
| [BUS Service Engineering](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10L30-01EN.pdf) | IM 36K10L30-01EN | 3rd Edition, Sep. 2023 |
|
| [BUS Service Engineering](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10L30-01EN.pdf) | IM 36K10L30-01EN | 4th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
| [ITEM Service Engineering - ITH](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10L35-01EN.pdf) | IM 36K10L35-01EN | 3rd Edition, Sep. 2023 |
|
| [ITEM Service Engineering - ITH](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10L35-01EN.pdf) | IM 36K10L35-01EN | 4th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
| [ITEM Service Engineering - ITM](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10L36-01EN.pdf) | IM 36K10L36-01EN | 3rd Edition, Sep. 2023 |
|
| [ITEM Service Engineering - ITM](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10L36-01EN.pdf) | IM 36K10L36-01EN | 4th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
| [EQUIPMENT Service Engineering - Utilities](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10L40-01EN.pdf) | IM 36K10L40-01EN | 3rd Edition, Sep. 2023 |
|
| [EQUIPMENT Service Engineering - Utilities](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10L40-01EN.pdf) | IM 36K10L40-01EN | 4th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
| [EQUIPMENT Service Engineering - Configuration](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10L41-01EN.pdf) | IM 36K10L41-01EN | 3rd Edition, Sep. 2023 |
|
| [EQUIPMENT Service Engineering - Configuration](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10L41-01EN.pdf) | IM 36K10L41-01EN | 5th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
| [Data Access Engineering](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10L45-01EN.pdf) | IM 36K10L45-01EN | 3rd Edition, Sep. 2023 |
|
| [Data Access Engineering](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10L45-01EN.pdf) | IM 36K10L45-01EN | 5th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
| [Data Set Service Engineering](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10L50-01EN.pdf) | IM 36K10L50-01EN | 3rd Edition, Sep. 2023 |
|
| [Data Set Service Engineering](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10L50-01EN.pdf) | IM 36K10L50-01EN | 5th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
| [Exchange Tool Engineering](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10L55-01EN.pdf) | IM 36K10L55-01EN | 3rd Edition, Sep. 2023 |
|
| [Exchange Tool Engineering](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10L55-01EN.pdf) | IM 36K10L55-01EN | 5th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
|
|
||||||
### Language
|
### Language
|
||||||
|
|
||||||
| Document | IM Number | Edition |
|
| Document | IM Number | R1.05 edition | R1.03 edition |
|
||||||
|---|---|---|
|
|---|---|---|---|
|
||||||
| [Class Description Language - Traditional](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10P10-01EN.pdf) | IM 36K10P10-01EN | 3rd Edition, Sep. 2023 |
|
| [Class Description Language - Traditional](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10P10-01EN.pdf) | IM 36K10P10-01EN | 4th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
| [Class Description Language - Java](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10P11-01EN.pdf) | IM 36K10P11-01EN | 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:/Users/Public/Yokogawa/tls/doc/EN/IM36K10P20-01EN.pdf) | IM 36K10P20-01EN | 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:/Users/Public/Yokogawa/tls/doc/EN/IM36K10P30-01EN.pdf) | IM 36K10P30-01EN | 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; skill `pytools`) |
|
||||||
|
|
||||||
### Setup
|
### Setup
|
||||||
|
|
||||||
| Document | IM Number | Edition |
|
| Document | IM Number | R1.05 edition | R1.03 edition |
|
||||||
|---|---|---|
|
|---|---|---|---|
|
||||||
| [CI Portal Setup](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10R10-01EN.pdf) | IM 36K10R10-01EN | 3rd Edition, Sep. 2023 |
|
| [CI Portal Setup](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10R10-01EN.pdf) | IM 36K10R10-01EN | 5th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
| [Setup File Editor](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10R20-01EN.pdf) | IM 36K10R20-01EN | 3rd Edition, Sep. 2023 |
|
| [Setup File Editor](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10R20-01EN.pdf) | IM 36K10R20-01EN | 4th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
| [Graphic Display Setup](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10R30-01EN.pdf) | IM 36K10R30-01EN | 3rd Edition, Sep. 2023 |
|
| [Graphic Display Setup](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10R30-01EN.pdf) | IM 36K10R30-01EN | 4th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
| [Report Server Setup](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K10R40-01EN.pdf) | IM 36K10R40-01EN | 3rd Edition, Sep. 2023 |
|
| [Report Server Setup](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K10R40-01EN.pdf) | IM 36K10R40-01EN | 4th Edition, Feb. 2026 | 3rd Edition, Sep. 2023 |
|
||||||
|
|
||||||
## Not Listed in the Map
|
## Not Listed in the Map
|
||||||
|
|
||||||
These files are in the `EN` folder but do not appear in `ciserver.pdf`:
|
These files are in the `EN` folder but do not appear in `ciserver.pdf`:
|
||||||
|
|
||||||
| Document | IM Number | Edition |
|
| Document | IM Number | R1.05 edition | R1.03 edition |
|
||||||
|---|---|---|
|
|---|---|---|---|
|
||||||
| [CI Server Software License Agreement](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K01A20-01EN.pdf) | IM 36K01A20-01EN | 1st Edition, Jan. 2021 |
|
| [CI Server Software License Agreement](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K01A20-01EN.pdf) | IM 36K01A20-01EN | 1st Edition, Jan. 2021 | 1st Edition, Jan. 2021 |
|
||||||
| [CI Server Terms and Conditions of Open Source Software](file:///C:/Users/Public/Yokogawa/tls/doc/EN/IM36K01A30-01EN.pdf) | IM 36K01A30-01EN | 2nd Edition, Mar. 2022 |
|
| [CI Server Terms and Conditions of Open Source Software](file:///C:/Yokogawa/CIServer/tls/doc/EN/IM36K01A30-01EN.pdf) | IM 36K01A30-01EN | 5th Edition, Feb. 2026 | 2nd Edition, Mar. 2022 |
|
||||||
|
|
|
||||||
|
|
@ -21,12 +21,12 @@ development system (see "Test system" in `progress.md`); they do not exist on ot
|
||||||
|---|---|---|---|---|---|---|
|
|---|---|---|---|---|---|---|
|
||||||
| ISS-001 | 2026-09-30 | ITEM (`itmval`) | Writing an item with `itmval -p -n AID.WRPS.SIM.INFLOW -v 400` added the `uoff` option flag (options 0x…8a → 0x…8e). The flag stayed after writing the original value back. Meaning of `uoff` unknown; not found in the EN manuals by text search. | closed | 2026-09-30 (phase 5): IM 36K10C10 §3.5 gives the option bits: 1 blocked, 2 offline, **4 updated offline** (written by an application while offline), 8 acknowledged, **16 updated blocked**, 32 direct alarm, 64 delayed alarm. 0x8a = offline + acknowledged (+0x80, not documented); +4 = 0x8e, so `uoff` = updated offline and `ublk` = updated blocked. Matches all observations. Not yet found: how to clear the flags (probably on the next update from the station). Closed 2026-09-30 (confirmed by user). Earlier notes: writing internal sample items (`CI-Eng-Sample.*`, no station) does **not** set `uoff` (options stay 0x…88), so it is tied to station-connected items (the AID item was already `off`, its station not communicating). Still to find: meaning and how to clear it (ITEM Service IM 36K10L35/L36, Engineering Module I/O Processes IM 36K10C10). Revisit in phase 5 with a station item. 2026-09-30 later: unblocking a sample item left the flag `ublk` (after `blk` was cleared), so `u…` flags may mean "was …" (un-blocked / un-offline). Still unconfirmed. | `.claude/skills/system-management/tasks/read-write-item.md` (replace the `uoff` note under "Read the current value"); `knowledge/progress.md` row "Write an item with `itmval -p`" |
|
| ISS-001 | 2026-09-30 | ITEM (`itmval`) | Writing an item with `itmval -p -n AID.WRPS.SIM.INFLOW -v 400` added the `uoff` option flag (options 0x…8a → 0x…8e). The flag stayed after writing the original value back. Meaning of `uoff` unknown; not found in the EN manuals by text search. | closed | 2026-09-30 (phase 5): IM 36K10C10 §3.5 gives the option bits: 1 blocked, 2 offline, **4 updated offline** (written by an application while offline), 8 acknowledged, **16 updated blocked**, 32 direct alarm, 64 delayed alarm. 0x8a = offline + acknowledged (+0x80, not documented); +4 = 0x8e, so `uoff` = updated offline and `ublk` = updated blocked. Matches all observations. Not yet found: how to clear the flags (probably on the next update from the station). Closed 2026-09-30 (confirmed by user). Earlier notes: writing internal sample items (`CI-Eng-Sample.*`, no station) does **not** set `uoff` (options stay 0x…88), so it is tied to station-connected items (the AID item was already `off`, its station not communicating). Still to find: meaning and how to clear it (ITEM Service IM 36K10L35/L36, Engineering Module I/O Processes IM 36K10C10). Revisit in phase 5 with a station item. 2026-09-30 later: unblocking a sample item left the flag `ublk` (after `blk` was cleared), so `u…` flags may mean "was …" (un-blocked / un-offline). Still unconfirmed. | `.claude/skills/system-management/tasks/read-write-item.md` (replace the `uoff` note under "Read the current value"); `knowledge/progress.md` row "Write an item with `itmval -p`" |
|
||||||
| ISS-002 | 2026-09-30 | DATABASE (`dsschk`) | `dsschk -d ITEM_DF -v` (check only) exits 0 with no console output and nothing new in `umhlog.log`. Where results are reported is unknown. | closed | Closed 2026-09-30 (confirmed by user). 2026-09-30: `dsschk -e -v` prints a start/end line per dataset (228 checked, no problems) and logs to `umhlog.log`. Plain `dsschk` only compares copies between nodes, so it prints nothing on a single-node system. `ismchk` needs a database file name (usage: `ismchk data_base_name`), not run yet. | Create `.claude/skills/system-management/tasks/consistency-check.md` and add it to that skill's `SKILL.md`; `knowledge/manuals/IM36K10J10-01EN.md` §4.1.1 consistency tools (add where output goes); `knowledge/progress.md` row "Consistency check" |
|
| ISS-002 | 2026-09-30 | DATABASE (`dsschk`) | `dsschk -d ITEM_DF -v` (check only) exits 0 with no console output and nothing new in `umhlog.log`. Where results are reported is unknown. | closed | Closed 2026-09-30 (confirmed by user). 2026-09-30: `dsschk -e -v` prints a start/end line per dataset (228 checked, no problems) and logs to `umhlog.log`. Plain `dsschk` only compares copies between nodes, so it prints nothing on a single-node system. `ismchk` needs a database file name (usage: `ismchk data_base_name`), not run yet. | Create `.claude/skills/system-management/tasks/consistency-check.md` and add it to that skill's `SKILL.md`; `knowledge/manuals/IM36K10J10-01EN.md` §4.1.1 consistency tools (add where output goes); `knowledge/progress.md` row "Consistency check" |
|
||||||
| ISS-003 | 2026-09-30 | DATABASE (`dssqld`) | Filtered export (`dssqld -e <out> <filter>.qli`) failed with a guessed filter syntax (`@ITEM_DF`, `@FIELD`, `@SELECT`). | closed | Closed 2026-09-30 (confirmed by user). 2026-09-30: the quick load **data** format is now known and verified (`@LANGUAGE`, `@VERSION`, `@FIELDS`, `@<DATASET>`, quoted CSV records, `\` continuation, `!` comments; IM 36K10L45 §9.11). Filter syntax found (IM 36K10L50 §3.6) and practiced, awaiting confirmation: a file with `@SELECT`, then the filter in single quotes (strings in double quotes), then `@<DATASET>`; run `dssqld -e <out> <filter>.qli`. `ITEM_HISTORY` returns nothing unless the filter names `ITEM_NAME` and a `SAMPLE_TIME` range (`SAMPLE_TIME > "dd-mm-yyyy hh:mm:ss" and SAMPLE_TIME < ...`). | `.claude/skills/system-management/tasks/export-dataset.md` section "Filtered exports"; `knowledge/manuals/IM36K10J10-01EN.md` §5.6 step 1; `knowledge/progress.md` row "Export a dataset" |
|
| ISS-003 | 2026-09-30 | DATABASE (`dssqld`) | Filtered export (`dssqld -e <out> <filter>.qli`) failed with a guessed filter syntax (`@ITEM_DF`, `@FIELD`, `@SELECT`). | closed | R1.05 (2026-10-08): the quick load format section is now IM 36K10L45 5th ed. §10.13 (was §9.11). Closed 2026-09-30 (confirmed by user). 2026-09-30: the quick load **data** format is now known and verified (`@LANGUAGE`, `@VERSION`, `@FIELDS`, `@<DATASET>`, quoted CSV records, `\` continuation, `!` comments; IM 36K10L45 §9.11). Filter syntax found (IM 36K10L50 §3.6) and practiced, awaiting confirmation: a file with `@SELECT`, then the filter in single quotes (strings in double quotes), then `@<DATASET>`; run `dssqld -e <out> <filter>.qli`. `ITEM_HISTORY` returns nothing unless the filter names `ITEM_NAME` and a `SAMPLE_TIME` range (`SAMPLE_TIME > "dd-mm-yyyy hh:mm:ss" and SAMPLE_TIME < ...`). | `.claude/skills/system-management/tasks/export-dataset.md` section "Filtered exports"; `knowledge/manuals/IM36K10J10-01EN.md` §5.6 step 1; `knowledge/progress.md` row "Export a dataset" |
|
||||||
| ISS-004 | 2026-09-30 | ITEM (`itmval`) | `itmval -g -a <1..5>` returns `ITM-E-WRONG_ATT` on `AID.WRPS.*` items, so reading limits is unproven. | closed | Closed 2026-09-30 (confirmed by user). On `CI-Eng-Sample.TANK1.LEVEL` (limits set) `-a 1..5` returned deadband 0, low 20, high 80, low-low 10, high-high 90. The error only occurs on items without limits. | `.claude/skills/system-management/tasks/read-write-item.md` (limits section); `knowledge/progress.md` row "Read an item with `itmval -g`" |
|
| ISS-004 | 2026-09-30 | ITEM (`itmval`) | `itmval -g -a <1..5>` returns `ITM-E-WRONG_ATT` on `AID.WRPS.*` items, so reading limits is unproven. | closed | Closed 2026-09-30 (confirmed by user). On `CI-Eng-Sample.TANK1.LEVEL` (limits set) `-a 1..5` returned deadband 0, low 20, high 80, low-low 10, high-high 90. The error only occurs on items without limits. | `.claude/skills/system-management/tasks/read-write-item.md` (limits section); `knowledge/progress.md` row "Read an item with `itmval -g`" |
|
||||||
| ISS-005 | 2026-09-30 | DATABASE (`dssqld`) | Loading `04_item_his_df.qli` straight after creating the storage group gave 2 errors once; three other runs were clean. Error text not captured. | closed | Added a 5 s pause in `load.cmd`. No recurrence since: every full sample reload in phases 6-12 (latest 2026-10-01) loaded `04_item_his_df.qli` with 0 errors. Closed 2026-10-01 (confirmed by user). | `examples/CI-Eng-Sample/load.cmd`; `.claude/skills/system-management/tasks/load-remove-records.md` |
|
| ISS-005 | 2026-09-30 | DATABASE (`dssqld`) | Loading `04_item_his_df.qli` straight after creating the storage group gave 2 errors once; three other runs were clean. Error text not captured. | closed | Added a 5 s pause in `load.cmd`. No recurrence since: every full sample reload in phases 6-12 (latest 2026-10-01) loaded `04_item_his_df.qli` with 0 errors. Closed 2026-10-01 (confirmed by user). | `examples/CI-Eng-Sample/load.cmd`; `.claude/skills/system-management/tasks/load-remove-records.md` |
|
||||||
| ISS-006 | 2026-09-30 | HISTORY (`ithloahis`) | Samples dated before the start of the current storage unit were not stored (no error shown); samples after it were. Also, a new storage group stored nothing until CI Server was restarted. | closed | Closed 2026-10-01 (confirmed by user). Confirm with History Management (IM 36K10L20) in phase 9: how to load into older units, and whether a restart is really required. 2026-09-30 (phase 5): IM 36K10L35 §1.3/§5 explains the first part: event storage picks the unit by time stamp, never older than 60 units, and within the storage process's `gap_time` (ITHEEX/ITHEIX 2880 min) and, for EVENT/ITEM, `max_sample_delay` (ITHEIX 14400 min); older data needs earlier unit files (`hisdbg`, `hisrecover`, `isfrename`), `ithrecover <group> -p` and a restart. Practice in phase 9. 2026-10-01 (phase 9, verified): (1) restart **is** required — `CIENG_SCAN10S` / `CIENG_AGG` loaded at 11:54 and `CIENG_EVENT` reloaded at 11:32 stored nothing until the 12:00 restart, then stored at once. (2) The first unit of a new Event/Item or Aggregation group is dated 2 days back (= `gap_time` 2880 min), but samples loaded into that pre-restart unit (11:50, 30-Sep) were still dropped; samples inside the active unit (12:02) and inside a unit closed by a forced rollover (12:03 into unit 3,1) were stored. So: samples older than the first unit opened since the restart are dropped silently. Loading older data would need `hisrecover` / `isfrename` / `ithrecover` (not practiced). Proposed close: documented in `load-history.md` and skill `history-management`. | `.claude/skills/system-management/tasks/load-history.md`; `examples/CI-Eng-Sample/README.md`; `knowledge/manuals/IM36K10J10-01EN.md` command-line tools |
|
| ISS-006 | 2026-09-30 | HISTORY (`ithloahis`) | Samples dated before the start of the current storage unit were not stored (no error shown); samples after it were. Also, a new storage group stored nothing until CI Server was restarted. | closed | Closed 2026-10-01 (confirmed by user). Confirm with History Management (IM 36K10L20) in phase 9: how to load into older units, and whether a restart is really required. 2026-09-30 (phase 5): IM 36K10L35 §1.3/§5 explains the first part: event storage picks the unit by time stamp, never older than 60 units, and within the storage process's `gap_time` (ITHEEX/ITHEIX 2880 min) and, for EVENT/ITEM, `max_sample_delay` (ITHEIX 14400 min); older data needs earlier unit files (`hisdbg`, `hisrecover`, `isfrename`), `ithrecover <group> -p` and a restart. Practice in phase 9. 2026-10-01 (phase 9, verified): (1) restart **is** required — `CIENG_SCAN10S` / `CIENG_AGG` loaded at 11:54 and `CIENG_EVENT` reloaded at 11:32 stored nothing until the 12:00 restart, then stored at once. (2) The first unit of a new Event/Item or Aggregation group is dated 2 days back (= `gap_time` 2880 min), but samples loaded into that pre-restart unit (11:50, 30-Sep) were still dropped; samples inside the active unit (12:02) and inside a unit closed by a forced rollover (12:03 into unit 3,1) were stored. So: samples older than the first unit opened since the restart are dropped silently. Loading older data would need `hisrecover` / `isfrename` / `ithrecover` (not practiced). Proposed close: documented in `load-history.md` and skill `history-management`. | `.claude/skills/system-management/tasks/load-history.md`; `examples/CI-Eng-Sample/README.md`; `knowledge/manuals/IM36K10J10-01EN.md` command-line tools |
|
||||||
| ISS-007 | 2026-09-30 | INTEGRATION (monitoring) | `intdskmon` wrote 61.9 for a C: drive that is 61.9 % used / 38.1 % free, although the manual says it monitors the disk free space rate. `intspawn` did nothing when the command path was ~130 characters; a short path worked (limit unknown). | closed | Disk value: the test showed **used** % (61.9 on a 61.9 % used disk), and the task file says so; installed behaviour is the reference. `intspawn` path limit: not measured (needs admin edits of `tls\sup\<name>.sup` and restarts for each length); guidance kept: put the command in a `.cmd` with a short path (other CI Server tools cut paths at 79 characters, ISS-020). Closed 2026-10-01 (confirmed by user). | `.claude/skills/system-management/tasks/monitoring-processes.md`; `knowledge/manuals/IM36K10J10-01EN.md` §4.1.6; `examples/CI-Eng-Sample/monitoring/` |
|
| ISS-007 | 2026-09-30 | INTEGRATION (monitoring) | `intdskmon` wrote 61.9 for a C: drive that is 61.9 % used / 38.1 % free, although the manual says it monitors the disk free space rate. `intspawn` did nothing when the command path was ~130 characters; a short path worked (limit unknown). | closed | Disk value: the test showed **used** % (61.9 on a 61.9 % used disk), and the task file says so; installed behaviour is the reference. `intspawn` path limit: not measured (needs admin edits of `tls\sup\<name>.sup` and restarts for each length); guidance kept: put the command in a `.cmd` with a short path (other CI Server tools cut paths at 79 characters, ISS-020). Closed 2026-10-01 (confirmed by user). | `.claude/skills/system-management/tasks/monitoring-processes.md`; `knowledge/manuals/IM36K10J10-01EN.md` §4.1.6; `examples/CI-Eng-Sample/monitoring/` |
|
||||||
| ISS-008 | 2026-09-30 | ACCESS (ODBC server `odbsrv`) | `ci_start.log` on the test system shows `CppServerAPI::Run() failed: InitializeSslCtx(): SSL_CTX_use_certificate_chain_file() failed.` right after ACCESS Service starts. Which component and certificate is not known. | closed | Closed 2026-10-01 (confirmed by user): cause known, ODBC server left as is (not licensed/used on the test system). Identify in phase 7. 2026-10-01 (phase 7): cause found. The message comes from the ODBC server `odbsrv` (ACCESS Service, Simba): `odbsrv.sup` has `USESSL = YES` and `access_start.cmd` points it at `%TLS_ROOT_PATH%\tls\pki\odbsrv\SampleServerCertificate.pem` / `SampleServerKey.pem`, but that folder does not exist and no sample certificate is installed. `odbsrv` exits right after start (`DUR-W-REM_PROC, Process ODBSRV exited unexpectedly`), port 1583 does not listen. Fix (admin, only if ODBC is licensed and wanted): install a certificate + key there, or set `USESSL = NO`. Not applied. Close when the user confirms. | `.claude/skills/installation-security/tasks/setup-check.md`; `knowledge/manuals/IM36K10L45-01EN.md` §1 (done); `.claude/skills/data-access/tasks/access-checks.md` (done) |
|
| ISS-008 | 2026-09-30 | ACCESS (ODBC server `odbsrv`) | `ci_start.log` on the test system shows `CppServerAPI::Run() failed: InitializeSslCtx(): SSL_CTX_use_certificate_chain_file() failed.` right after ACCESS Service starts. Which component and certificate is not known. | closed | R1.05 (2026-10-08): unchanged on the R1.05 test server: same `ci_start.log` message, `tls\pki\odbsrv` missing, port 1583 not listening, `odbsrv.sup` identical. Closed 2026-10-01 (confirmed by user): cause known, ODBC server left as is (not licensed/used on the test system). Identify in phase 7. 2026-10-01 (phase 7): cause found. The message comes from the ODBC server `odbsrv` (ACCESS Service, Simba): `odbsrv.sup` has `USESSL = YES` and `access_start.cmd` points it at `%TLS_ROOT_PATH%\tls\pki\odbsrv\SampleServerCertificate.pem` / `SampleServerKey.pem`, but that folder does not exist and no sample certificate is installed. `odbsrv` exits right after start (`DUR-W-REM_PROC, Process ODBSRV exited unexpectedly`), port 1583 does not listen. Fix (admin, only if ODBC is licensed and wanted): install a certificate + key there, or set `USESSL = NO`. Not applied. Close when the user confirms. | `.claude/skills/installation-security/tasks/setup-check.md`; `knowledge/manuals/IM36K10L45-01EN.md` §1 (done); `.claude/skills/data-access/tasks/access-checks.md` (done) |
|
||||||
| ISS-009 | 2026-09-30 | Security Guide | DCOM port range printed as 20500–20550 in the firewall table but "2500–20550" in the OPC configuration table. Taken as a typo for 20500–20550. | closed | Confirm on a system with IT security applied. Closed 2026-10-01 (confirmed by user). | `knowledge/manuals/IM36K01C30-01EN.md` §4 |
|
| ISS-009 | 2026-09-30 | Security Guide | DCOM port range printed as 20500–20550 in the firewall table but "2500–20550" in the OPC configuration table. Taken as a typo for 20500–20550. | closed | Confirm on a system with IT security applied. Closed 2026-10-01 (confirmed by user). | `knowledge/manuals/IM36K01C30-01EN.md` §4 |
|
||||||
|
|
||||||
| ISS-010 | 2026-09-30 | ITEM (sub-items) | The Integrator sub-item adds value × seconds; setting `TIME_UNIT` = Hour made no difference (1 per second while the main item was 1). The Tutorial lists a time unit only for Rate-of-Change. | closed | 2026-09-30 (phase 5): IM 36K10C10 §3.2 and `itm.sup` answer it: the integral is divided by the **integration granule** `itm_int_secs` (label "Integration granule, sec.") in `itm.sup` — **system-wide**, installed value 1 (seconds); 60 = minutes, 3600 = hours. `TIME_UNIT` only applies to Rate-of-Change. Practiced 2026-09-30: set to 60 and restarted → `CI-Eng-Sample.PUMP1.RUNNING.RUN_SECONDS` rose exactly 1.0 in 60 s; restored to 1 (file identical to backup) → 8 in 8 s. Existing integrator values are not converted when the granule changes. Closed 2026-09-30 (confirmed by user). | `examples/CI-Eng-Sample/02b_sub_item_df.qli`; `knowledge/manuals/IM36K10G10-01EN.md` |
|
| ISS-010 | 2026-09-30 | ITEM (sub-items) | The Integrator sub-item adds value × seconds; setting `TIME_UNIT` = Hour made no difference (1 per second while the main item was 1). The Tutorial lists a time unit only for Rate-of-Change. | closed | 2026-09-30 (phase 5): IM 36K10C10 §3.2 and `itm.sup` answer it: the integral is divided by the **integration granule** `itm_int_secs` (label "Integration granule, sec.") in `itm.sup` — **system-wide**, installed value 1 (seconds); 60 = minutes, 3600 = hours. `TIME_UNIT` only applies to Rate-of-Change. Practiced 2026-09-30: set to 60 and restarted → `CI-Eng-Sample.PUMP1.RUNNING.RUN_SECONDS` rose exactly 1.0 in 60 s; restored to 1 (file identical to backup) → 8 in 8 s. Existing integrator values are not converted when the granule changes. Closed 2026-09-30 (confirmed by user). | `examples/CI-Eng-Sample/02b_sub_item_df.qli`; `knowledge/manuals/IM36K10G10-01EN.md` |
|
||||||
|
|
@ -37,9 +37,9 @@ development system (see "Test system" in `progress.md`); they do not exist on ot
|
||||||
| ISS-015 | 2026-09-30 | Setup File Editor | In `wfla_display.sup` the seven main keywords (`RELATION_LOCATION` … `TIMER_INTERVAL`) come before the only tab line `!TAB = Debug`. By IM 36K10R20 §3.1, keywords before the first `!TAB` are not shown, yet IM 36K10R10 §4.4.1 shows them on a *General* tab. What the editor really shows is unknown. | closed | Closed 2026-09-30 (checked in the Setup File Editor by the user; installed software is the reference). The editor shows keywords placed before the first `!TAB` on a **General** tab, followed by the defined tabs: `wfla_display.sup` shows *General* (all 7 fields, values as in the file) and *Debug*. The manual's statement that such keywords are ignored does not hold in R1.03. | `knowledge/manuals/IM36K10R20-01EN.md` §3; `knowledge/manuals/IM36K10R10-01EN.md` §4; `.claude/skills/portal-setup/tasks/change-setup-file.md` |
|
| ISS-015 | 2026-09-30 | Setup File Editor | In `wfla_display.sup` the seven main keywords (`RELATION_LOCATION` … `TIMER_INTERVAL`) come before the only tab line `!TAB = Debug`. By IM 36K10R20 §3.1, keywords before the first `!TAB` are not shown, yet IM 36K10R10 §4.4.1 shows them on a *General* tab. What the editor really shows is unknown. | closed | Closed 2026-09-30 (checked in the Setup File Editor by the user; installed software is the reference). The editor shows keywords placed before the first `!TAB` on a **General** tab, followed by the defined tabs: `wfla_display.sup` shows *General* (all 7 fields, values as in the file) and *Debug*. The manual's statement that such keywords are ignored does not hold in R1.03. | `knowledge/manuals/IM36K10R20-01EN.md` §3; `knowledge/manuals/IM36K10R10-01EN.md` §4; `.claude/skills/portal-setup/tasks/change-setup-file.md` |
|
||||||
| ISS-016 | 2026-09-30 | Setup File Editor | The R1.03 editor has features IM 36K10R20 §2 does not describe: a *Templates* tab next to *Setup Files*; a *Status* column in the file list (e.g. "Default"); *Undo Field* and *Reset Field* buttons on the edit form besides OK/Cancel/Help; a status bar with the selected file's description and the time. | closed | Installed software is the reference (user decision). 2026-09-30, tested on `wfla_display.sup` (`DUR_QUEUE_SIZE` 1000 → 2000): clicking **OK writes the file immediately** (only the active line changed; the manual says OK keeps the change in memory until Exit). Status becomes **Changed** when an active value differs from the file's `!DEFAULT` block; the changed field's label turns **blue**. *Reset Field* is enabled when the cursor is in a changed field; *Reset Field* + *OK* put the value back to the `!DEFAULT` value (2000 → 1000) and wrote the file at once (16:22:28); the rest of the file was unchanged. Still to find: what *Templates* holds and what *Undo Field* does. Closed 2026-10-01 (confirmed by user). | `knowledge/manuals/IM36K10R20-01EN.md` §2; `.claude/skills/portal-setup/tasks/change-setup-file.md` |
|
| ISS-016 | 2026-09-30 | Setup File Editor | The R1.03 editor has features IM 36K10R20 §2 does not describe: a *Templates* tab next to *Setup Files*; a *Status* column in the file list (e.g. "Default"); *Undo Field* and *Reset Field* buttons on the edit form besides OK/Cancel/Help; a status bar with the selected file's description and the time. | closed | Installed software is the reference (user decision). 2026-09-30, tested on `wfla_display.sup` (`DUR_QUEUE_SIZE` 1000 → 2000): clicking **OK writes the file immediately** (only the active line changed; the manual says OK keeps the change in memory until Exit). Status becomes **Changed** when an active value differs from the file's `!DEFAULT` block; the changed field's label turns **blue**. *Reset Field* is enabled when the cursor is in a changed field; *Reset Field* + *OK* put the value back to the `!DEFAULT` value (2000 → 1000) and wrote the file at once (16:22:28); the rest of the file was unchanged. Still to find: what *Templates* holds and what *Undo Field* does. Closed 2026-10-01 (confirmed by user). | `knowledge/manuals/IM36K10R20-01EN.md` §2; `.claude/skills/portal-setup/tasks/change-setup-file.md` |
|
||||||
| ISS-017 | 2026-09-30 | CI Portal setup files | IM 36K10R10 §4 says the logon method is the one user-interface setting normally changed, but the R1.03 `jwuiisg.sup` *Information* tab says the login method and login control settings have moved to `dssana.sup` (authentication and authorization). `dssana.sup` is not described in R10. | closed | Installed software is the reference. 2026-09-30: `dssana.sup` ("Authentication and authorization setup") has tabs General, User Interfaces, Clients System Trust, Login control (`LOGIN_METHOD = <client>, <user interface>, <method>, …`), Active Directory, Single Sign On, Password rules, Logging. Manuals mentioning it: IM 36K01A50 (5×), 36K10C10 (6×), 36K10J40 (13×), 36K10L45 (2×), 36K10L50 (3×). Cover it in phase 5 (C10) and phase 13 (J40). 2026-09-30: login methods (Automatic, Manual CI Server, Manual OS, No, SSO, Deny) now summarized from C10 §2.2 in `knowledge/manuals/IM36K10C10-01EN.md`; AD/SSO details remain for J40. Closed 2026-10-01 (confirmed by user). | `knowledge/manuals/IM36K10R10-01EN.md` §4; `.claude/skills/portal-setup/SKILL.md` |
|
| ISS-017 | 2026-09-30 | CI Portal setup files | IM 36K10R10 §4 says the logon method is the one user-interface setting normally changed, but the R1.03 `jwuiisg.sup` *Information* tab says the login method and login control settings have moved to `dssana.sup` (authentication and authorization). `dssana.sup` is not described in R10. | closed | Installed software is the reference. 2026-09-30: `dssana.sup` ("Authentication and authorization setup") has tabs General, User Interfaces, Clients System Trust, Login control (`LOGIN_METHOD = <client>, <user interface>, <method>, …`), Active Directory, Single Sign On, Password rules, Logging. Manuals mentioning it: IM 36K01A50 (5×), 36K10C10 (6×), 36K10J40 (13×), 36K10L45 (2×), 36K10L50 (3×). Cover it in phase 5 (C10) and phase 13 (J40). 2026-09-30: login methods (Automatic, Manual CI Server, Manual OS, No, SSO, Deny) now summarized from C10 §2.2 in `knowledge/manuals/IM36K10C10-01EN.md`; AD/SSO details remain for J40. Closed 2026-10-01 (confirmed by user). | `knowledge/manuals/IM36K10R10-01EN.md` §4; `.claude/skills/portal-setup/SKILL.md` |
|
||||||
| ISS-018 | 2026-09-30 | Authorization (`dssana.sup`) | IM 36K10C10 §2.2 says the *No* login method applies the user profile `FT_NO_LOGIN`; the installed `dssana.sup` names `CI_NO_LOGIN` (and `CI_NO_LOGIN_OPCUAS` for anonymous OPC UA) as the no-login profile. `USER_DF` on the test system has `CI_NO_LOGIN_OPCUAS` but no `CI_NO_LOGIN`. | closed | Installed software is the reference: use `CI_NO_LOGIN`. Answered in phase 13 (2026-10-01): the `dssana.sup` help says that when no user with the no-login profile name exists, **full authorization** is used (not "no profile" as IM 36K10C10 says). Verified indirectly: `Quickload Utility` has *No* login with an empty profile, and every `dssqld` change is recorded in the audit trail as user `FULL AUTHORIZATION`. Documented in `authorization/tasks/login-methods.md` (create a restricted `CI_NO_LOGIN` user before using *No* login). Closed 2026-10-01 (confirmed by user). | `knowledge/manuals/IM36K10C10-01EN.md` §2 |
|
| ISS-018 | 2026-09-30 | Authorization (`dssana.sup`) | IM 36K10C10 §2.2 says the *No* login method applies the user profile `FT_NO_LOGIN`; the installed `dssana.sup` names `CI_NO_LOGIN` (and `CI_NO_LOGIN_OPCUAS` for anonymous OPC UA) as the no-login profile. `USER_DF` on the test system has `CI_NO_LOGIN_OPCUAS` but no `CI_NO_LOGIN`. | closed | R1.05 (2026-10-08): the manual now names CI_NO_LOGIN, see ISS-125. Installed software is the reference: use `CI_NO_LOGIN`. Answered in phase 13 (2026-10-01): the `dssana.sup` help says that when no user with the no-login profile name exists, **full authorization** is used (not "no profile" as IM 36K10C10 says). Verified indirectly: `Quickload Utility` has *No* login with an empty profile, and every `dssqld` change is recorded in the audit trail as user `FULL AUTHORIZATION`. Documented in `authorization/tasks/login-methods.md` (create a restricted `CI_NO_LOGIN` user before using *No* login). Closed 2026-10-01 (confirmed by user). | `knowledge/manuals/IM36K10C10-01EN.md` §2 |
|
||||||
| ISS-019 | 2026-09-30 | ITEM (string items) | Maximum string item length differs by source: IM 36K10C10 §3.3.4 says default 80, max 100; the Tutorial summary says up to 168 without audit; the data dictionary (`dssqld -f`) gives `ITEM_DF.STRING_LENGTH` range 1–200, default 80. | closed | Tested 2026-09-30 on CI-Eng-Sample (`dssqld -i`, `itmval -p/-g`, non-elevated): `STRING_LENGTH` 100, 168 and 200 load with or without `AUDIT_INFO`; 201 fails with `DSS-E-VAL_RANGE`. An item holds **length − 1** characters: a 99-character value in a length-100 item is stored with status 9 NORMAL; longer values are cut to length − 1 with status **12 OVERRANGED** (100 → 99, 200 → 199, 201 → 199). So the data dictionary (1–200) is right. Test items removed. Closed 2026-09-30 (confirmed by user). | `knowledge/manuals/IM36K10C10-01EN.md` §3; `knowledge/manuals/IM36K10G10-01EN.md` (items); `.claude/skills/item-engineering/SKILL.md` |
|
| ISS-019 | 2026-09-30 | ITEM (string items) | Maximum string item length differs by source: IM 36K10C10 §3.3.4 says default 80, max 100; the Tutorial summary says up to 168 without audit; the data dictionary (`dssqld -f`) gives `ITEM_DF.STRING_LENGTH` range 1–200, default 80. | closed | R1.05 (2026-10-08): the manuals now say max 200 bytes, see ISS-124. Tested 2026-09-30 on CI-Eng-Sample (`dssqld -i`, `itmval -p/-g`, non-elevated): `STRING_LENGTH` 100, 168 and 200 load with or without `AUDIT_INFO`; 201 fails with `DSS-E-VAL_RANGE`. An item holds **length − 1** characters: a 99-character value in a length-100 item is stored with status 9 NORMAL; longer values are cut to length − 1 with status **12 OVERRANGED** (100 → 99, 200 → 199, 201 → 199). So the data dictionary (1–200) is right. Test items removed. Closed 2026-09-30 (confirmed by user). | `knowledge/manuals/IM36K10C10-01EN.md` §3; `knowledge/manuals/IM36K10G10-01EN.md` (items); `.claude/skills/item-engineering/SKILL.md` |
|
||||||
| ISS-020 | 2026-09-30 | DATABASE (`dssqld`) | `dssqld -i "<long absolute path>\user.qli"` failed with `CRL-E-ENOENT` / `DSSQ-E-QLD_FILOPN`: the path in the message was cut after 79 characters (`…\73b3559a-12.`). A relative file name from the same folder works. Similar to the `intspawn` path limit (ISS-007). | closed | Tested 2026-10-01: the limit is **79 characters** for the whole path. An input file of 80–81 characters gives `DSSQ-E-Q_QLIEXT` (the name is cut, e.g. `….ql`), 85+ gives `CRL-E-ENOENT`. An `-e` output path of 80+ characters gives **no error**, but no file appears under the given name. Documented: keep paths ≤ 79 characters, or `cd` to the folder and use relative names. Close when the user confirms. Closed 2026-10-01 (confirmed by user). | `.claude/skills/system-management/tasks/load-remove-records.md`; `.claude/skills/system-management/tasks/export-dataset.md` |
|
| ISS-020 | 2026-09-30 | DATABASE (`dssqld`) | `dssqld -i "<long absolute path>\user.qli"` failed with `CRL-E-ENOENT` / `DSSQ-E-QLD_FILOPN`: the path in the message was cut after 79 characters (`…\73b3559a-12.`). A relative file name from the same folder works. Similar to the `intspawn` path limit (ISS-007). | closed | R1.05 (2026-10-08): same limit, see ISS-123. Tested 2026-10-01: the limit is **79 characters** for the whole path. An input file of 80–81 characters gives `DSSQ-E-Q_QLIEXT` (the name is cut, e.g. `….ql`), 85+ gives `CRL-E-ENOENT`. An `-e` output path of 80+ characters gives **no error**, but no file appears under the given name. Documented: keep paths ≤ 79 characters, or `cd` to the folder and use relative names. Close when the user confirms. Closed 2026-10-01 (confirmed by user). | `.claude/skills/system-management/tasks/load-remove-records.md`; `.claude/skills/system-management/tasks/export-dataset.md` |
|
||||||
| ISS-021 | 2026-09-30 | EQUIPMENT (`eqpiostat`) | IM 36K10L40 §2 says `eqpiostat` stores hourly I/O statistics per station line in "history group STATION_STAT". On the test system `eqpiostat` runs (started by `equipment_start.cmd` on the host node) and `STATION_STAT` is a dataset, but `dssqld -e` returned 0 records, also with filters on `TIME_STAMP` and `STATION` (AID Modbus stations, which send requests). | closed | Answered 2026-10-01: with `CIENG_PLC` communicating (Modbus slave mirror running), `STATION_STAT` holds one record per hour per station line (10 records since 30-09-2026 18:00; e.g. `TIMESPAN` 831 s, `SENDS`/`GOODANS` 1560/1560, no errors). The earlier empty export had no communicating station. Closed 2026-10-01 (confirmed by user). | `knowledge/manuals/IM36K10L40-01EN.md` §2 |
|
| ISS-021 | 2026-09-30 | EQUIPMENT (`eqpiostat`) | IM 36K10L40 §2 says `eqpiostat` stores hourly I/O statistics per station line in "history group STATION_STAT". On the test system `eqpiostat` runs (started by `equipment_start.cmd` on the host node) and `STATION_STAT` is a dataset, but `dssqld -e` returned 0 records, also with filters on `TIME_STAMP` and `STATION` (AID Modbus stations, which send requests). | closed | Answered 2026-10-01: with `CIENG_PLC` communicating (Modbus slave mirror running), `STATION_STAT` holds one record per hour per station line (10 records since 30-09-2026 18:00; e.g. `TIMESPAN` 831 s, `SENDS`/`GOODANS` 1560/1560, no errors). The earlier empty export had no communicating station. Closed 2026-10-01 (confirmed by user). | `knowledge/manuals/IM36K10L40-01EN.md` §2 |
|
||||||
| ISS-022 | 2026-09-30 | ITEM (`itmval -f`) | `itmval -f <file> vs -n CI-Eng-Sample.TANK1.LEVEL` (IM 36K10L36 §1.4, write a restore command) crashes with a segmentation fault (bash) / access violation 0xC0000005 (PowerShell) and writes no file; also with `-l`. The manual's space-separated form `-n <inst> <unit> <tag>` is rejected with `FSL-E-NARG_ALL`. `itmval -g`/`-p` work. | open | Workaround: build restore lines from `itmval -g` output. Report to Yokogawa support if needed. Retested 2026-10-01 with the documented syntax `itmval -f <file> <opts> -n <item>` (`<opts>` = letters from `vsqo`, e.g. `vs`): still a segmentation fault from bash and from `cmd`, in a short and a long folder, relative or absolute file name; `cmd` leaves an **empty** file. Also crashes right after a CI Server restart (so not the licence-time effect of ISS-030). Treat `-f` as broken on R1.03.00; report to Yokogawa support if needed. | `knowledge/manuals/IM36K10L36-01EN.md` §3; `.claude/skills/system-management/tasks/read-write-item.md` |
|
| ISS-022 | 2026-09-30 | ITEM (`itmval -f`) | `itmval -f <file> vs -n CI-Eng-Sample.TANK1.LEVEL` (IM 36K10L36 §1.4, write a restore command) crashes with a segmentation fault (bash) / access violation 0xC0000005 (PowerShell) and writes no file; also with `-l`. The manual's space-separated form `-n <inst> <unit> <tag>` is rejected with `FSL-E-NARG_ALL`. `itmval -g`/`-p` work. | open | Workaround: build restore lines from `itmval -g` output. Report to Yokogawa support if needed. Retested 2026-10-01 with the documented syntax `itmval -f <file> <opts> -n <item>` (`<opts>` = letters from `vsqo`, e.g. `vs`): still a segmentation fault from bash and from `cmd`, in a short and a long folder, relative or absolute file name; `cmd` leaves an **empty** file. Also crashes right after a CI Server restart (so not the licence-time effect of ISS-030). Treat `-f` as broken on R1.03.00; report to Yokogawa support if needed. | `knowledge/manuals/IM36K10L36-01EN.md` §3; `.claude/skills/system-management/tasks/read-write-item.md` |
|
||||||
| ISS-023 | 2026-09-30 | ITEM / ITH (manual vs install) | Installed ITEM Service differs from IM 36K10L35/L36: `item_start.cmd` starts `itheix` (EVENT/ITEM storage, not described), aggregation `ithsag`/`ithrag`, two instances of each retrieve process, and `itmtim 100 1000 1 200 1` (five arguments, three documented); `itm.sup` item pool is 650000 KB (manual default 50000) and has `not_regained` (not described); `itheix.sup` has `max_sample_delay`, `max_samples_queued`, `max_open_files`. | closed | Closed 2026-09-30 (user decision: the installed software is the reference). Summaries describe the installed values. | `knowledge/manuals/IM36K10L35-01EN.md`; `knowledge/manuals/IM36K10L36-01EN.md` |
|
| ISS-023 | 2026-09-30 | ITEM / ITH (manual vs install) | Installed ITEM Service differs from IM 36K10L35/L36: `item_start.cmd` starts `itheix` (EVENT/ITEM storage, not described), aggregation `ithsag`/`ithrag`, two instances of each retrieve process, and `itmtim 100 1000 1 200 1` (five arguments, three documented); `itm.sup` item pool is 650000 KB (manual default 50000) and has `not_regained` (not described); `itheix.sup` has `max_sample_delay`, `max_samples_queued`, `max_open_files`. | closed | Closed 2026-09-30 (user decision: the installed software is the reference). Summaries describe the installed values. | `knowledge/manuals/IM36K10L35-01EN.md`; `knowledge/manuals/IM36K10L36-01EN.md` |
|
||||||
|
|
@ -47,20 +47,20 @@ development system (see "Test system" in `progress.md`); they do not exist on ot
|
||||||
| ISS-025 | 2026-09-30 | PROCESS (PRINT) | A Traditional `PRINT "… 80 %, volume ", VOLUME;` logged `OPC-I-INFO, UMH Message Text Error: Message number 083A001B (… level reached 80 )`: the text is cut at the `%` and the rest is lost. Without `%` the full text is logged. | closed | Tested 2026-10-01 with a temporary class (removed): `PRINT "… 50 %% …"` logs `50 % …` correctly; `\%` and `%c` with 37 both give the *Message Text Error* and cut the text. Documented: write `%%`. Close when the user confirms. Closed 2026-10-01 (confirmed by user). | `knowledge/manuals/IM36K10P10-01EN.md` §4; `.claude/skills/class-object-engineering/tasks/traditional-class.md` |
|
| ISS-025 | 2026-09-30 | PROCESS (PRINT) | A Traditional `PRINT "… 80 %, volume ", VOLUME;` logged `OPC-I-INFO, UMH Message Text Error: Message number 083A001B (… level reached 80 )`: the text is cut at the `%` and the rest is lost. Without `%` the full text is logged. | closed | Tested 2026-10-01 with a temporary class (removed): `PRINT "… 50 %% …"` logs `50 % …` correctly; `\%` and `%c` with 37 both give the *Message Text Error* and cut the text. Documented: write `%%`. Close when the user confirms. Closed 2026-10-01 (confirmed by user). | `knowledge/manuals/IM36K10P10-01EN.md` §4; `.claude/skills/class-object-engineering/tasks/traditional-class.md` |
|
||||||
| ISS-026 | 2026-09-30 | PROCESS (`opc.sup`) | Installed PROCESS setup differs from IM 36K10L10 §2: `IMMED-EVENTS = NO` (manual: default on); `FLOW-CONTROL = 30,60` (manual 300/360 s); four executors `OPCEXE1`–`4` with fixed priority ranges (manual examples `OPCEXE01`…) and `opcdbg` still defaults to `OPCEXE`; keyword `VARTAB-SIZE` (manual `VARITAB-SIZE`); hidden keywords `FLDSEP`, `IGNEXI` not described; `ALARM-ITEMS` not set; class source file `opc_clssrc.dat` (manual `opc_clasrc.dat`); `opcini.sup` (licence line) not described. | closed | Installed software is the reference (standing user decision); summary written from the installed files. Close when the user confirms. Closed 2026-10-01 (confirmed by user). | `knowledge/manuals/IM36K10L10-01EN.md` §2, §5 |
|
| ISS-026 | 2026-09-30 | PROCESS (`opc.sup`) | Installed PROCESS setup differs from IM 36K10L10 §2: `IMMED-EVENTS = NO` (manual: default on); `FLOW-CONTROL = 30,60` (manual 300/360 s); four executors `OPCEXE1`–`4` with fixed priority ranges (manual examples `OPCEXE01`…) and `opcdbg` still defaults to `OPCEXE`; keyword `VARTAB-SIZE` (manual `VARITAB-SIZE`); hidden keywords `FLDSEP`, `IGNEXI` not described; `ALARM-ITEMS` not set; class source file `opc_clssrc.dat` (manual `opc_clasrc.dat`); `opcini.sup` (licence line) not described. | closed | Installed software is the reference (standing user decision); summary written from the installed files. Close when the user confirms. Closed 2026-10-01 (confirmed by user). | `knowledge/manuals/IM36K10L10-01EN.md` §2, §5 |
|
||||||
| ISS-027 | 2026-09-30 | PROCESS (`opcdbg`) | IM 36K10L10 §4 says the `opcdbg` *Dump classes/objects* files can be read by `dssqld`. The files have no `@LANGUAGE`/`@FIELDS`/`@<dataset>` headers (`NAME,"desc",prio` + source lines prefixed `- `); `dssqld -i` on the object dump gave `DSS-E-UNK_DS_NM, Unknown data set name`. | closed | Use `dssqld -e CLASS_DF` / `OBJECT_DF` for transfers (documented in `opcdbg-checks.md`). No installed tool that reads the dump format was found. Closed 2026-10-01 (confirmed by user). | `knowledge/manuals/IM36K10L10-01EN.md` §4; `.claude/skills/class-object-engineering/tasks/opcdbg-checks.md` |
|
| ISS-027 | 2026-09-30 | PROCESS (`opcdbg`) | IM 36K10L10 §4 says the `opcdbg` *Dump classes/objects* files can be read by `dssqld`. The files have no `@LANGUAGE`/`@FIELDS`/`@<dataset>` headers (`NAME,"desc",prio` + source lines prefixed `- `); `dssqld -i` on the object dump gave `DSS-E-UNK_DS_NM, Unknown data set name`. | closed | Use `dssqld -e CLASS_DF` / `OBJECT_DF` for transfers (documented in `opcdbg-checks.md`). No installed tool that reads the dump format was found. Closed 2026-10-01 (confirmed by user). | `knowledge/manuals/IM36K10L10-01EN.md` §4; `.claude/skills/class-object-engineering/tasks/opcdbg-checks.md` |
|
||||||
| ISS-028 | 2026-09-30 | PROCESS (class reset) | After recompiling a class with objects (`RESET_REQUIRED` 1), `dssqld -m` with `CLASS_DF` `RESET` = 1 (also with `RESET_NODE` = host node name) is accepted with 0 errors but does not reset; `OBJECT_DF` `RESET` = 1 is refused (`OPC-E-OBJ_RSTREQ`). `opcdbg` Classes → 8 *Reset class* works; it asks for a reset report file, which the manual does not list. | closed | Use `opcdbg`. 2026-10-01: `CLASS_RESET_COMMAND` cannot be driven by `dssqld` (read/update only; no record to update — *Not found*; insert `DSS-E-NO_AUTH`). Test class `CIENG_INCR` was recompiled and reset again with `opcdbg` (`RESET_REQUIRED` back to 0). Engineering Module reset verified by the user 2026-10-01: *Configuration › I/O processing › Classes* › right-click the class › *Reset* opens *Class - reset* (reset node, *Force extended reset*, *Abort after first failure*, progress, reset report) — the GUI for `CLASS_RESET_COMMAND`; *Reset* reset 1 of 1 object, `RESET_REQUIRED` back to 0, object running. Closed 2026-10-01 (confirmed by user). | `.claude/skills/class-object-engineering/tasks/change-reset-class.md`; `knowledge/manuals/IM36K10L10-01EN.md` §4 |
|
| ISS-028 | 2026-09-30 | PROCESS (class reset) | After recompiling a class with objects (`RESET_REQUIRED` 1), `dssqld -m` with `CLASS_DF` `RESET` = 1 (also with `RESET_NODE` = host node name) is accepted with 0 errors but does not reset; `OBJECT_DF` `RESET` = 1 is refused (`OPC-E-OBJ_RSTREQ`). `opcdbg` Classes → 8 *Reset class* works; it asks for a reset report file, which the manual does not list. | closed | R1.05 (2026-10-09, V15): still the same, `dssqld -m` RESET 1 has no effect; use opcdbg or the Engineering Module. Use `opcdbg`. 2026-10-01: `CLASS_RESET_COMMAND` cannot be driven by `dssqld` (read/update only; no record to update — *Not found*; insert `DSS-E-NO_AUTH`). Test class `CIENG_INCR` was recompiled and reset again with `opcdbg` (`RESET_REQUIRED` back to 0). Engineering Module reset verified by the user 2026-10-01: *Configuration › I/O processing › Classes* › right-click the class › *Reset* opens *Class - reset* (reset node, *Force extended reset*, *Abort after first failure*, progress, reset report) — the GUI for `CLASS_RESET_COMMAND`; *Reset* reset 1 of 1 object, `RESET_REQUIRED` back to 0, object running. Closed 2026-10-01 (confirmed by user). | `.claude/skills/class-object-engineering/tasks/change-reset-class.md`; `knowledge/manuals/IM36K10L10-01EN.md` §4 |
|
||||||
| ISS-029 | 2026-09-30 | PROCESS (Java) | IM 36K10P11 §10.4 says a new Java class must be reset before objects are added, otherwise the code does not take effect. A Java class inserted with `COMPILE` 1 by `dssqld` ran its first object correctly without any reset (twice, including a full sample reload). | open | Installed behaviour is the reference; keep "reset after changing a class that has objects". Check whether the Engineering Module path (compile without quick load) behaves differently. | `knowledge/manuals/IM36K10P11-01EN.md` §7; `.claude/skills/class-object-engineering/tasks/java-class.md` |
|
| ISS-029 | 2026-09-30 | PROCESS (Java) | IM 36K10P11 §10.4 says a new Java class must be reset before objects are added, otherwise the code does not take effect. A Java class inserted with `COMPILE` 1 by `dssqld` ran its first object correctly without any reset (twice, including a full sample reload). | open | Installed behaviour is the reference; keep "reset after changing a class that has objects". Check whether the Engineering Module path (compile without quick load) behaves differently. | `knowledge/manuals/IM36K10P11-01EN.md` §7; `.claude/skills/class-object-engineering/tasks/java-class.md` |
|
||||||
| ISS-030 | 2026-10-01 | BUS (UMH tools) | `umhman` (hex code → text) crashes with redirected input (bash: segmentation fault 139 with CRLF input; PowerShell `Start-Process -RedirectStandardInput`: 0xC0000005); with an argument it only prompts. `umhtestprog` prints `UMH TEST UTILITY` and crashes (segmentation fault). `umhmsg 8010008` stops with `umh_panic: …umhmsg.exe, license expired` although other tools (`dssqld`, `itmval`) still worked at that time. | closed | Retested 2026-10-01 right after a CI Server restart: all three work — `umhman` with piped input (bash, LF or CRLF; via `cmd <` too), `umhmsg 083A001B text "…"` writes the message to `umhlog.log` (process `UMHMSG_<pid>`, prints nothing), `umhtestprog` runs its self-test. The earlier failures came late in an unlicensed session (licence nearly expired). `itmval -f` (ISS-022) still crashes on a fresh start, so it is a separate fault. Closed 2026-10-01 (confirmed by user). | `.claude/skills/system-management/tasks/bus-utilities.md`; `knowledge/manuals/IM36K10L30-01EN.md` §3 |
|
| ISS-030 | 2026-10-01 | BUS (UMH tools) | `umhman` (hex code → text) crashes with redirected input (bash: segmentation fault 139 with CRLF input; PowerShell `Start-Process -RedirectStandardInput`: 0xC0000005); with an argument it only prompts. `umhtestprog` prints `UMH TEST UTILITY` and crashes (segmentation fault). `umhmsg 8010008` stops with `umh_panic: …umhmsg.exe, license expired` although other tools (`dssqld`, `itmval`) still worked at that time. | closed | Retested 2026-10-01 right after a CI Server restart: all three work — `umhman` with piped input (bash, LF or CRLF; via `cmd <` too), `umhmsg 083A001B text "…"` writes the message to `umhlog.log` (process `UMHMSG_<pid>`, prints nothing), `umhtestprog` runs its self-test. The earlier failures came late in an unlicensed session (licence nearly expired). `itmval -f` (ISS-022) still crashes on a fresh start, so it is a separate fault. Closed 2026-10-01 (confirmed by user). | `.claude/skills/system-management/tasks/bus-utilities.md`; `knowledge/manuals/IM36K10L30-01EN.md` §3 |
|
||||||
| ISS-031 | 2026-10-01 | LICENCE (unlicensed node) | The unlicensed test node counts down about 1 hour of run time per CI Server start (`License time left` in `smd_<node>_LOW_smdsnp_general.log`, 3600 s → `*** license problem : 3 ***`); then `dssqld`/`itmval` stop with `license expired` and `ISF-F-LIC_PROB, DATABASE Service is not licensed`. A PC sleep pauses the count (start 17:25, ran out 09:52 next day). Restart of the CI Service resets it (verified 2026-10-01, back after ~45 s). | closed | Closed 2026-10-01 (confirmed by user): known limitation of the unlicensed test system, documented in system-check. Known limitation of the test system, documented in `system-check`. Plan tests in ≤ 1 h blocks. Close when the user confirms. | `.claude/skills/system-check/SKILL.md` §3 (done) |
|
| ISS-031 | 2026-10-01 | LICENCE (unlicensed node) | The unlicensed test node counts down about 1 hour of run time per CI Server start (`License time left` in `smd_<node>_LOW_smdsnp_general.log`, 3600 s → `*** license problem : 3 ***`); then `dssqld`/`itmval` stop with `license expired` and `ISF-F-LIC_PROB, DATABASE Service is not licensed`. A PC sleep pauses the count (start 17:25, ran out 09:52 next day). Restart of the CI Service resets it (verified 2026-10-01, back after ~45 s). | closed | Closed 2026-10-01 (confirmed by user): known limitation of the unlicensed test system, documented in system-check. Known limitation of the test system, documented in `system-check`. Plan tests in ≤ 1 h blocks. Close when the user confirms. | `.claude/skills/system-check/SKILL.md` §3 (done) |
|
||||||
| ISS-032 | 2026-10-01 | ACCESS (OPC UA server node IDs) | IM 36K10L45 §10.3 shows CI Server node IDs (`{"nsid":"32"}`, `{"0":"Value","itnm":"ITEM1"}`) and the CI Server namespace `http://www.yokogawa.com/CI_Server/` (ns 3) but not which namespace the **entities** use. With that URI (or `urn:<host>:Yokogawa:CI_SERVER_OPC_UA_SERVER`) the client point was silently not monitored. Browsing (`OPCUAC_TAG_DF`) shows sections/items in **`urn:Yokogawa:CI_SERVER_OPC_UA_SERVER`**; with it `{"0":"Value","itnm":"<item>"}` and `{"0":"Value","nsid":"<n>"}` both work. IM 36K10E20 §2.2.6 also asks to enable `OPXUAS_USE_NAME_NODEIDS` and restart for CI client ↔ CI server; not needed on the test system. | closed | 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` §7 (done); `knowledge/manuals/IM36K10E20-01EN.md` §3 (done); `.claude/skills/data-access/tasks/opcua-client.md` (done) |
|
| ISS-032 | 2026-10-01 | ACCESS (OPC UA server node IDs) | IM 36K10L45 §10.3 shows CI Server node IDs (`{"nsid":"32"}`, `{"0":"Value","itnm":"ITEM1"}`) and the CI Server namespace `http://www.yokogawa.com/CI_Server/` (ns 3) but not which namespace the **entities** use. With that URI (or `urn:<host>:Yokogawa:CI_SERVER_OPC_UA_SERVER`) the client point was silently not monitored. Browsing (`OPCUAC_TAG_DF`) shows sections/items in **`urn:Yokogawa:CI_SERVER_OPC_UA_SERVER`**; with it `{"0":"Value","itnm":"<item>"}` and `{"0":"Value","nsid":"<n>"}` both work. IM 36K10E20 §2.2.6 also asks to enable `OPXUAS_USE_NAME_NODEIDS` and restart for CI client ↔ CI server; not needed on the test system. | closed | R1.05 (2026-10-08): sections are now IM 36K10L45 5th ed. §11.3 and IM 36K10E20 4th ed. §2.3; `OPXUAS_USE_NAME_NODEIDS` is still NO by default. 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` §7 (done); `knowledge/manuals/IM36K10E20-01EN.md` §3 (done); `.claude/skills/data-access/tasks/opcua-client.md` (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-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 | 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 |
|
||||||
| ISS-040 | 2026-10-01 | HISTORY (aggregation) | Aggregation group `CIENG_AGG` (30 min + hour, `TANK1.LEVEL` max/min/avg) ran (`ithsag.log`: *Aggregation Completed*) but stored no values: retrieval gave `0x09 = ITM error` per period. `TANK1.LEVEL` was in `CIENG_EVENT` and `CIENG_SCAN10S`, both priority 0. Also `INTERPOLATION = "30 minutes"` is refused by `dssqld`; the installed name is `30Minutes`. | closed | Closed 2026-10-01 (confirmed by user). 2026-10-01 14:02: after `CIENG_SCAN10S` got `PRIORITY` 10, the 13:30–14:00 period stored max 77, min 33, avg 52.7, quality 1000 (`ithdbg` 20 and `dssqld` with `INTERPOLATION = "30Minutes"`). Cause: equal source priorities (C40 §2.1 says the highest-priority group is the source, but not that a tie gives nothing). Sample fixed (priority 10). The hourly value for 13:00–14:00 was not stored (first half had no source); not rechecked. Proposed close. | `.claude/skills/history-management/tasks/storage-groups.md` §4 (done); `knowledge/manuals/IM36K10C40-01EN.md` §3 (done); `examples/CI-Eng-Sample/03_his_group_df.qli`, `README.md` (done) |
|
| ISS-040 | 2026-10-01 | HISTORY (aggregation) | Aggregation group `CIENG_AGG` (30 min + hour, `TANK1.LEVEL` max/min/avg) ran (`ithsag.log`: *Aggregation Completed*) but stored no values: retrieval gave `0x09 = ITM error` per period. `TANK1.LEVEL` was in `CIENG_EVENT` and `CIENG_SCAN10S`, both priority 0. Also `INTERPOLATION = "30 minutes"` is refused by `dssqld`; the installed name is `30Minutes`. | closed | Closed 2026-10-01 (confirmed by user). 2026-10-01 14:02: after `CIENG_SCAN10S` got `PRIORITY` 10, the 13:30–14:00 period stored max 77, min 33, avg 52.7, quality 1000 (`ithdbg` 20 and `dssqld` with `INTERPOLATION = "30Minutes"`). Cause: equal source priorities (C40 §2.1 says the highest-priority group is the source, but not that a tie gives nothing). Sample fixed (priority 10). The hourly value for 13:00–14:00 was not stored (first half had no source); not rechecked. Proposed close. | `.claude/skills/history-management/tasks/storage-groups.md` §4 (done); `knowledge/manuals/IM36K10C40-01EN.md` §3 (done); `examples/CI-Eng-Sample/03_his_group_df.qli`, `README.md` (done) |
|
||||||
| ISS-041 | 2026-10-01 | GRAPHICS (HTML trend) | In the HTML display (`localhost:8080/mobileoperator/?d=CIENG_Tank`) the trend shows the pen legend `CI-Eng-Sample.TANK1.LEVEL [CIENG_SCAN10S]` and time axis but draws no line, although `ITEM_HISTORY` has 420 samples in the shown hour. Browser console: `Mismatch between number of labels (Time,CI-Eng-Sample.TANK1.LEVEL [CIENG_SCAN10S]) and number of columns in array (51)`. The trend has 4 further empty pens. 2026-10-01 later: the trend also had the property `chart.attribute[00]` connected to `TANK1.LEVEL` (added by mistake with the pen); the Operator Interface (desktop) showed *Short attribute name ( 61.0) is invalid*. After removing it the desktop trend draws the line, but the HTML trend still logs the mismatch error. | closed | Tried 2026-10-01 (fresh session after a restart, 283 history samples in the hour): removing the 4 empty pens, and `updating` true / `updateInterval` 10 like the factory `AOG_TrendOpen` — the mismatch error and the empty trend stayed in both cases (changes reverted). Still to try: a Micro Trend, the HTML-supported trend properties (IM 36K10R30 §4.8.7), clearing the browser/`MO_CACHE_DISPLAYS` cache (the console shows `CIENG_Tank.xml` *loaded (from cache)*), and adding the pen to the factory *Open Trend* display in the HTML client. **Cause found 2026-10-02** (trend lab `CIENG_TrendLab`): a web-client defect, not a display setting. `DataSource.refresh()` in the web trend code (`mobileoperator\src\…\charts\trend\datasources\DataSource.js`, same in the served `src\lib\fasttools.min.js`) numbers **all 50** internal pen slots (`PEN_COUNT_LIMIT`; the filter for empty/hidden pens is commented out), so each data row has 51 columns, while the dygraph labels only list visible pens with an item. Proof: a 50-pen test display drew normally in the browser. Ruled out on the way: the `?historygroup` suffix, empty pens, `optimised`. **Workaround** (verified on the web): pad each trend to 50 visible pens with `displays/add_trend_spares.ps1` (spares scaled out of view, blank unique legend texts); sample `CIENG_TrendLab` uses it. Alternatively a Micro Trend (ISS-055). Report to Yokogawa. Close when the user confirms. Closed 2026-10-02 (confirmed by user). | `.claude/skills/graphics/tasks/trend.md` (done); `create-display.md`, `deploy-displays.md` (done); `knowledge/manuals/IM36K10R30-01EN.md` §4 (done) |
|
| ISS-041 | 2026-10-01 | GRAPHICS (HTML trend) | In the HTML display (`localhost:8080/mobileoperator/?d=CIENG_Tank`) the trend shows the pen legend `CI-Eng-Sample.TANK1.LEVEL [CIENG_SCAN10S]` and time axis but draws no line, although `ITEM_HISTORY` has 420 samples in the shown hour. Browser console: `Mismatch between number of labels (Time,CI-Eng-Sample.TANK1.LEVEL [CIENG_SCAN10S]) and number of columns in array (51)`. The trend has 4 further empty pens. 2026-10-01 later: the trend also had the property `chart.attribute[00]` connected to `TANK1.LEVEL` (added by mistake with the pen); the Operator Interface (desktop) showed *Short attribute name ( 61.0) is invalid*. After removing it the desktop trend draws the line, but the HTML trend still logs the mismatch error. | closed | R1.05 (2026-10-09): fixed on the web client, see ISS-096. Tried 2026-10-01 (fresh session after a restart, 283 history samples in the hour): removing the 4 empty pens, and `updating` true / `updateInterval` 10 like the factory `AOG_TrendOpen` — the mismatch error and the empty trend stayed in both cases (changes reverted). Still to try: a Micro Trend, the HTML-supported trend properties (IM 36K10R30 §4.8.7), clearing the browser/`MO_CACHE_DISPLAYS` cache (the console shows `CIENG_Tank.xml` *loaded (from cache)*), and adding the pen to the factory *Open Trend* display in the HTML client. **Cause found 2026-10-02** (trend lab `CIENG_TrendLab`): a web-client defect, not a display setting. `DataSource.refresh()` in the web trend code (`mobileoperator\src\…\charts\trend\datasources\DataSource.js`, same in the served `src\lib\fasttools.min.js`) numbers **all 50** internal pen slots (`PEN_COUNT_LIMIT`; the filter for empty/hidden pens is commented out), so each data row has 51 columns, while the dygraph labels only list visible pens with an item. Proof: a 50-pen test display drew normally in the browser. Ruled out on the way: the `?historygroup` suffix, empty pens, `optimised`. **Workaround** (verified on the web): pad each trend to 50 visible pens with `displays/add_trend_spares.ps1` (spares scaled out of view, blank unique legend texts); sample `CIENG_TrendLab` uses it. Alternatively a Micro Trend (ISS-055). Report to Yokogawa. Close when the user confirms. Closed 2026-10-02 (confirmed by user). | `.claude/skills/graphics/tasks/trend.md` (done); `create-display.md`, `deploy-displays.md` (done); `knowledge/manuals/IM36K10R30-01EN.md` §4 (done) |
|
||||||
| ISS-042 | 2026-10-01 | GRAPHICS (layouts) | Installed vs `Layouts.readme`: the factory layouts use status line item types `displayName`, `playbackIndicator` and `dateTime` and the commands `reload <frame>` / `reload all`, none of which the readme lists (readme: `statusText`, `userName`, `progresBar`, `graphicsQueueLevel`, `connectionState`); the readme also writes `zooom` for the zoom command (factory files use `zoom`). | closed | Installed software is the reference (standing user decision). Close when the user confirms. Closed 2026-10-01 (confirmed by user). | `.claude/skills/graphics/tasks/layouts.md` §2 |
|
| ISS-042 | 2026-10-01 | GRAPHICS (layouts) | Installed vs `Layouts.readme`: the factory layouts use status line item types `displayName`, `playbackIndicator` and `dateTime` and the commands `reload <frame>` / `reload all`, none of which the readme lists (readme: `statusText`, `userName`, `progresBar`, `graphicsQueueLevel`, `connectionState`); the readme also writes `zooom` for the zoom command (factory files use `zoom`). | closed | Installed software is the reference (standing user decision). Close when the user confirms. Closed 2026-10-01 (confirmed by user). | `.claude/skills/graphics/tasks/layouts.md` §2 |
|
||||||
| ISS-043 | 2026-10-01 | REPORT (system reports) | IM 36K10C30 App. 1.3 names two system reports `ALM_ATTS_CUR` and `ALM_ATRS_HIS`; the installed reports are `ALM_ATTRS_CUR` and `ALM_ATTRS_HIS`. The other 26 names match. | closed | Installed software is the reference (standing user decision). Close when the user confirms. Closed 2026-10-01 (confirmed by user). | `knowledge/manuals/IM36K10C30-01EN.md` §8 (done) |
|
| ISS-043 | 2026-10-01 | REPORT (system reports) | IM 36K10C30 App. 1.3 names two system reports `ALM_ATTS_CUR` and `ALM_ATRS_HIS`; the installed reports are `ALM_ATTRS_CUR` and `ALM_ATTRS_HIS`. The other 26 names match. | closed | Installed software is the reference (standing user decision). Close when the user confirms. Closed 2026-10-01 (confirmed by user). | `knowledge/manuals/IM36K10C30-01EN.md` §8 (done) |
|
||||||
| ISS-044 | 2026-10-01 | REPORT (scheduling) | Behaviour not in the manuals, found by quick load: a generation interval below 10 minutes is refused (`HIS-E-ROLLTOFAST`, the interval is the rollover of the report's storage group); a scheduled report cannot be deleted (`RPT-E-ACTIVE`) until `ACTIVATION_TIME` and `GENERATION_INTERVAL` are cleared; `CORRECT_DAYLIGHT` 0 counts intervals in UTC (06:00 set for January ran at 05:00 in October); a past activation time moves to the next slot - once (modify, past time within the lifetime) a single report labelled with the old time was generated, at insert with an older time none. | closed | Documented as verified behaviour; the one-off generation for a past activation time is not fully understood. Close when the user confirms. Closed 2026-10-01 (confirmed by user). | `.claude/skills/reporting/tasks/define-reports.md` §1, §5, §6; `knowledge/manuals/IM36K10C30-01EN.md` §2; `examples/CI-Eng-Sample/83a_stop_report_df.qli`, `18_report_df.qli` |
|
| ISS-044 | 2026-10-01 | REPORT (scheduling) | Behaviour not in the manuals, found by quick load: a generation interval below 10 minutes is refused (`HIS-E-ROLLTOFAST`, the interval is the rollover of the report's storage group); a scheduled report cannot be deleted (`RPT-E-ACTIVE`) until `ACTIVATION_TIME` and `GENERATION_INTERVAL` are cleared; `CORRECT_DAYLIGHT` 0 counts intervals in UTC (06:00 set for January ran at 05:00 in October); a past activation time moves to the next slot - once (modify, past time within the lifetime) a single report labelled with the old time was generated, at insert with an older time none. | closed | Documented as verified behaviour; the one-off generation for a past activation time is not fully understood. Close when the user confirms. Closed 2026-10-01 (confirmed by user). | `.claude/skills/reporting/tasks/define-reports.md` §1, §5, §6; `knowledge/manuals/IM36K10C30-01EN.md` §2; `examples/CI-Eng-Sample/83a_stop_report_df.qli`, `18_report_df.qli` |
|
||||||
|
|
@ -80,7 +80,7 @@ development system (see "Test system" in `progress.md`); they do not exist on ot
|
||||||
| ISS-058 | 2026-10-02 | DATA EXPOSURE (ITEM_HISTORY, manual vs installed) | IM 36K10G10 ch. 10 lists `ITEM_HISTORY` as an exposure source (filter required). The installed `dbc.sup` (R1.03 and R1.05, identical) has the change-log line `PCL Aug-19 e12150 Refactor to support MS-SQL/ODBC, remove ITM history support`. An `ITEM_HISTORY` record (all fields, quoted filter, ISS-057) on the user's R1.05 system never created its table; it was disabled and then deleted, so whether ITEM_HISTORY works with a correct filter is **not tested**. | open | Treat ITEM_HISTORY exposure as unsupported and use `ITEM_VALUES` with `AGG_INTERVAL`. To close: on an R1.05 system, create an `ITEM_HISTORY` record with an unquoted filter and check whether `DBCSND` stays up and the table is created. | `.claude/skills/data-access/tasks/rdbms-exposure.md`; `knowledge/manuals/IM36K10G10-01EN.md`; `knowledge/manuals/IM36K10L45-01EN.md` §8 |
|
| ISS-058 | 2026-10-02 | DATA EXPOSURE (ITEM_HISTORY, manual vs installed) | IM 36K10G10 ch. 10 lists `ITEM_HISTORY` as an exposure source (filter required). The installed `dbc.sup` (R1.03 and R1.05, identical) has the change-log line `PCL Aug-19 e12150 Refactor to support MS-SQL/ODBC, remove ITM history support`. An `ITEM_HISTORY` record (all fields, quoted filter, ISS-057) on the user's R1.05 system never created its table; it was disabled and then deleted, so whether ITEM_HISTORY works with a correct filter is **not tested**. | open | Treat ITEM_HISTORY exposure as unsupported and use `ITEM_VALUES` with `AGG_INTERVAL`. To close: on an R1.05 system, create an `ITEM_HISTORY` record with an unquoted filter and check whether `DBCSND` stays up and the table is created. | `.claude/skills/data-access/tasks/rdbms-exposure.md`; `knowledge/manuals/IM36K10G10-01EN.md`; `knowledge/manuals/IM36K10L45-01EN.md` §8 |
|
||||||
| ISS-059 | 2026-10-02 | DATA EXPOSURE (authentication) | IM 36K10G10 §10.2 says to add the `CIX_PROCESS` account to SQL Server as a Windows user (db_owner) in a domain. The CI Service runs as the **local** `.\CIX_PROCESS` (also on the user's domain-joined R1.05 CI Server), which a SQL Server on another host cannot authenticate. | closed | Closed 2026-10-02 (confirmed by user): use a SQL login with db_owner on the target database; SQL Server set to mixed mode (needs a SQL Server restart). Windows authentication only if the SQL host knows the account (not tested). Tested in R1.05 only. | `.claude/skills/data-access/tasks/rdbms-exposure.md` (done); `knowledge/manuals/IM36K10G10-01EN.md` (done) |
|
| ISS-059 | 2026-10-02 | DATA EXPOSURE (authentication) | IM 36K10G10 §10.2 says to add the `CIX_PROCESS` account to SQL Server as a Windows user (db_owner) in a domain. The CI Service runs as the **local** `.\CIX_PROCESS` (also on the user's domain-joined R1.05 CI Server), which a SQL Server on another host cannot authenticate. | closed | Closed 2026-10-02 (confirmed by user): use a SQL login with db_owner on the target database; SQL Server set to mixed mode (needs a SQL Server restart). Windows authentication only if the SQL host knows the account (not tested). Tested in R1.05 only. | `.claude/skills/data-access/tasks/rdbms-exposure.md` (done); `knowledge/manuals/IM36K10G10-01EN.md` (done) |
|
||||||
| ISS-060 | 2026-10-02 | DATA EXPOSURE (rows of steady items) | IM 36K10G10 ch. 10 says `ITEM_VALUES` is exposed once per interval, with the aggregation time as timestamp when the item did not change. In one snapshot on R1.05 (1-minute interval), changing items had rows at 02:13:23 while steady items (`VALUE_COUNT` 1) were still at 02:12:24. Whether steady items get a row every interval (maybe written later) or only after an update is not known. | open | Count rows per item over one hour (`SELECT NAME, COUNT(*) … WHERE [TIMESTAMP] > … GROUP BY NAME`) and compare steady with changing items. Until then the task says: take a steady item's last row at or before T. | `.claude/skills/data-access/tasks/rdbms-exposure.md` |
|
| ISS-060 | 2026-10-02 | DATA EXPOSURE (rows of steady items) | IM 36K10G10 ch. 10 says `ITEM_VALUES` is exposed once per interval, with the aggregation time as timestamp when the item did not change. In one snapshot on R1.05 (1-minute interval), changing items had rows at 02:13:23 while steady items (`VALUE_COUNT` 1) were still at 02:12:24. Whether steady items get a row every interval (maybe written later) or only after an update is not known. | open | Count rows per item over one hour (`SELECT NAME, COUNT(*) … WHERE [TIMESTAMP] > … GROUP BY NAME`) and compare steady with changing items. Until then the task says: take a steady item's last row at or before T. | `.claude/skills/data-access/tasks/rdbms-exposure.md` |
|
||||||
| ISS-061 | 2026-10-02 | INSTALLATION (folder permissions) | On the user's R1.05 system installed in `C:\Yokogawa\CIServer` (outside Program Files) `tls\sup` and `dbc.sup` inherit **Authenticated Users: Modify** (plus Users: Read): any signed-in user can read the SQL password in `dbc.sup` and change setup files. On the R1.03 development machine (Program Files) `tls\sup` gives Users: ReadAndExecute (read still possible, no write). | closed | Closed 2026-10-02 (user decision: shared internal dev/demo server, left as is). Option if needed, not applied or tested: `icacls <dbc.sup> /inheritance:r /grant:r "SYSTEM:(F)" "Administrators:(F)" "CIX_PROCESS:(R)"`; folder rights in general are set by the IT Security Tool. | `.claude/skills/installation-security/tasks/setup-check.md` (done); `.claude/skills/data-access/tasks/rdbms-exposure.md` (done) |
|
| ISS-061 | 2026-10-02 | INSTALLATION (folder permissions) | On the user's R1.05 system installed in `C:\Yokogawa\CIServer` (outside Program Files) `tls\sup` and `dbc.sup` inherit **Authenticated Users: Modify** (plus Users: Read): any signed-in user can read the SQL password in `dbc.sup` and change setup files. On the R1.03 development machine (Program Files) `tls\sup` gives Users: ReadAndExecute (read still possible, no write). | closed | R1.05 (2026-10-08): confirmed again on the R1.05 test server (`icacls`: Authenticated Users:(M) inherited on the install folder and `tls\sup`). Closed 2026-10-02 (user decision: shared internal dev/demo server, left as is). Option if needed, not applied or tested: `icacls <dbc.sup> /inheritance:r /grant:r "SYSTEM:(F)" "Administrators:(F)" "CIX_PROCESS:(R)"`; folder rights in general are set by the IT Security Tool. | `.claude/skills/installation-security/tasks/setup-check.md` (done); `.claude/skills/data-access/tasks/rdbms-exposure.md` (done) |
|
||||||
| ISS-062 | 2026-10-02 | GRAPHICS (layouts) | `Layouts.readme` lists the menu/toolbar command `help`, but in R1.03 the Operator Interface fails with *Failed to execute menu command 'help'*, *Unrecognized keyword* (`MNUCMD`, `IllegalArgumentException`). The factory layouts do not use it. | open | Software is the reference: documented as not supported. Close when the user confirms. | `.claude/skills/graphics/tasks/layouts.md` §6 (done) |
|
| ISS-062 | 2026-10-02 | GRAPHICS (layouts) | `Layouts.readme` lists the menu/toolbar command `help`, but in R1.03 the Operator Interface fails with *Failed to execute menu command 'help'*, *Unrecognized keyword* (`MNUCMD`, `IllegalArgumentException`). The factory layouts do not use it. | open | Software is the reference: documented as not supported. Close when the user confirms. | `.claude/skills/graphics/tasks/layouts.md` §6 (done) |
|
||||||
| ISS-063 | 2026-10-02 | GRAPHICS (layouts) | The readme does not say that menu items with the commands `toolbar`, `statusline` and `playback record` must be `type="check"`. With a normal item the Operator Interface does not start (*INITFAILED*, `JMenuItem cannot be cast to JCheckBoxMenuItem` in `MenuToolbarOption.checkState`); the web client just drops check items. | open | Rule added to the task. Close when the user confirms. | `.claude/skills/graphics/tasks/layouts.md` §6 (done) |
|
| ISS-063 | 2026-10-02 | GRAPHICS (layouts) | The readme does not say that menu items with the commands `toolbar`, `statusline` and `playback record` must be `type="check"`. With a normal item the Operator Interface does not start (*INITFAILED*, `JMenuItem cannot be cast to JCheckBoxMenuItem` in `MenuToolbarOption.checkState`); the web client just drops check items. | open | Rule added to the task. Close when the user confirms. | `.claude/skills/graphics/tasks/layouts.md` §6 (done) |
|
||||||
| ISS-064 | 2026-10-02 | GRAPHICS (layouts) | Readme: `rows`/`cols` `n*` values share the remaining space by fraction (as HTML frames). Observed: the desktop ignores the fractions (`2*,1*` gave 800:88 px, sizes follow the displays); the web client turns every `n*` into its single *main* panel, so two `n*` overwrite each other. | open | Use one `n*` per frame set, all other divisions in pixels or `fitDisplay`. Close when the user confirms. | `.claude/skills/graphics/tasks/layouts.md` §6 (done) |
|
| ISS-064 | 2026-10-02 | GRAPHICS (layouts) | Readme: `rows`/`cols` `n*` values share the remaining space by fraction (as HTML frames). Observed: the desktop ignores the fractions (`2*,1*` gave 800:88 px, sizes follow the displays); the web client turns every `n*` into its single *main* panel, so two `n*` overwrite each other. | open | Use one `n*` per frame set, all other divisions in pixels or `fitDisplay`. Close when the user confirms. | `.claude/skills/graphics/tasks/layouts.md` §6 (done) |
|
||||||
|
|
@ -93,5 +93,96 @@ development system (see "Test system" in `progress.md`); they do not exist on ot
|
||||||
| ISS-071 | 2026-10-06 | GRAPHICS (layout commands, desktop) | Only one layout command can run at a time: five *Execute command* `ACTION navigate …` actions in one *On entry* gave *IllegalStateException: A command is already being executed* (2026-10-03); reproduced 2026-10-06 with two `ACTION reload all` on one button (test display `CIENG_Test`). Layout commands cannot be chained (`Layouts.readme` has no separator). | open | Documented in `layouts.md` §3. Close when the user confirms. | `.claude/skills/graphics/tasks/layouts.md` §3 (done) |
|
| ISS-071 | 2026-10-06 | GRAPHICS (layout commands, desktop) | Only one layout command can run at a time: five *Execute command* `ACTION navigate …` actions in one *On entry* gave *IllegalStateException: A command is already being executed* (2026-10-03); reproduced 2026-10-06 with two `ACTION reload all` on one button (test display `CIENG_Test`). Layout commands cannot be chained (`Layouts.readme` has no separator). | open | Documented in `layouts.md` §3. Close when the user confirms. | `.claude/skills/graphics/tasks/layouts.md` §3 (done) |
|
||||||
| ISS-072 | 2026-10-06 | AUTH (users, quick load) | A user loaded with `dssqld` without a `PASSWORD` field (as `users-groups.md` advised: "a password is not required on import") has **no** password set: every logon fails with *DSS-E-UNK_USER Unknown user name/password combination*, also with an empty password; clearing the password in the Engineering Module made it work. With `PASSWORD ""` given explicitly the user logs on with an empty password on the desktop and the web (sample user `CIENG`, 2026-10-06). | closed | Answered by test 2026-10-06; `users-groups.md` corrected, sample `08b_user_df.qli` uses `PASSWORD ""`. Close when the user confirms. | `.claude/skills/authorization/tasks/users-groups.md` (done); `examples/CI-Eng-Sample/08b_user_df.qli` (done) |
|
| ISS-072 | 2026-10-06 | AUTH (users, quick load) | A user loaded with `dssqld` without a `PASSWORD` field (as `users-groups.md` advised: "a password is not required on import") has **no** password set: every logon fails with *DSS-E-UNK_USER Unknown user name/password combination*, also with an empty password; clearing the password in the Engineering Module made it work. With `PASSWORD ""` given explicitly the user logs on with an empty password on the desktop and the web (sample user `CIENG`, 2026-10-06). | closed | Answered by test 2026-10-06; `users-groups.md` corrected, sample `08b_user_df.qli` uses `PASSWORD ""`. Close when the user confirms. | `.claude/skills/authorization/tasks/users-groups.md` (done); `examples/CI-Eng-Sample/08b_user_df.qli` (done) |
|
||||||
| ISS-073 | 2026-10-06 | DSS (remove group / DSSSDA) | Removing an authorization group while a session of one of its users is open fails with *DSSP-E-NODEL … in dataset USER_VAL*; after logging out the session was still referenced, and a retry stopped the process `DSSSDA03` (*DUR-F-BAD_SIZE, Negative size not allowed*; `DUR-W-REM_PROC … exited unexpectedly`); following DSS requests failed with *DUR-F-UNKNOWN_ATT … DSSSDA03* until CI Server was restarted (2026-10-06). After the restart the group was removed without error. `USER_VAL` exports only its header, so open sessions cannot be listed. | open | Workaround: log out the user's sessions and restart CI Server before removing the group; noted in the sample `remove.cmd` / README and `users-groups.md`. Not repeated on purpose (it stops a CI Server process). Report to Yokogawa. | `.claude/skills/authorization/tasks/users-groups.md` (done); `examples/CI-Eng-Sample/remove.cmd`, `README.md` (done) |
|
| ISS-073 | 2026-10-06 | DSS (remove group / DSSSDA) | Removing an authorization group while a session of one of its users is open fails with *DSSP-E-NODEL … in dataset USER_VAL*; after logging out the session was still referenced, and a retry stopped the process `DSSSDA03` (*DUR-F-BAD_SIZE, Negative size not allowed*; `DUR-W-REM_PROC … exited unexpectedly`); following DSS requests failed with *DUR-F-UNKNOWN_ATT … DSSSDA03* until CI Server was restarted (2026-10-06). After the restart the group was removed without error. `USER_VAL` exports only its header, so open sessions cannot be listed. | open | Workaround: log out the user's sessions and restart CI Server before removing the group; noted in the sample `remove.cmd` / README and `users-groups.md`. Not repeated on purpose (it stops a CI Server process). Report to Yokogawa. | `.claude/skills/authorization/tasks/users-groups.md` (done); `examples/CI-Eng-Sample/remove.cmd`, `README.md` (done) |
|
||||||
| ISS-074 | 2026-10-06 | GRAPHICS (HTML display login) | IM 36K10R30 §4 lists the user profile fields used by the HTML display login as "… initial display, locale (layout not)". On R1.03.00 the profile's *Layout* is used too: a logon as `CIENG` (layout `CIENG_Operator`) at `/mobileoperator/` without `?l=` opened `CIENG_Operator` (2026-10-02 with ADMIN, 2026-10-06 with `CIENG`). | open | Installed software is the reference; R30 summary and `layouts.md` §3 updated. Close when the user confirms. | `knowledge/manuals/IM36K10R30-01EN.md` (done); `.claude/skills/graphics/tasks/layouts.md` §3, §5 (done) |
|
| ISS-074 | 2026-10-06 | GRAPHICS (HTML display login) | IM 36K10R30 §4 lists the user profile fields used by the HTML display login as "… initial display, locale (layout not)". On R1.03.00 the profile's *Layout* is used too: a logon as `CIENG` (layout `CIENG_Operator`) at `/mobileoperator/` without `?l=` opened `CIENG_Operator` (2026-10-02 with ADMIN, 2026-10-06 with `CIENG`). | closed | Closed 2026-10-08 by ISS-095: the manual also marks Layout as supported; the earlier reading came from a garbled text extraction. Installed software is the reference; R30 summary and `layouts.md` §3 updated. Close when the user confirms. | `knowledge/manuals/IM36K10R30-01EN.md` (done); `.claude/skills/graphics/tasks/layouts.md` §3, §5 (done) |
|
||||||
| ISS-075 | 2026-10-06 | GRAPHICS (`jwuiutl -v`) | `deploy-displays.md` called `jwuiutl -v` "report only", but `jwuiutl -d -v -i -l <log> <display>` re-saves the validated display (normalised XML: defaults dropped, positions as attributes; 9 618 → 11 191 bytes for `CIENG_Test`, 2026-10-06). On 2026-10-02 a validation of eight displays hung on one and left `<name>.lck` and `<name>.xml.tmp`; not reproduced on 2026-10-06. | open | Documented in `deploy-displays.md` §2 and the C50 summary. Close when the user confirms. | `.claude/skills/graphics/tasks/deploy-displays.md` §2 (done); `knowledge/manuals/IM36K10C50-01EN.md` (done) |
|
| ISS-075 | 2026-10-06 | GRAPHICS (`jwuiutl -v`) | `deploy-displays.md` called `jwuiutl -v` "report only", but `jwuiutl -d -v -i -l <log> <display>` re-saves the validated display (normalised XML: defaults dropped, positions as attributes; 9 618 → 11 191 bytes for `CIENG_Test`, 2026-10-06). On 2026-10-02 a validation of eight displays hung on one and left `<name>.lck` and `<name>.xml.tmp`; not reproduced on 2026-10-06. | open | Documented in `deploy-displays.md` §2 and the C50 summary. Close when the user confirms. | `.claude/skills/graphics/tasks/deploy-displays.md` §2 (done); `knowledge/manuals/IM36K10C50-01EN.md` (done) |
|
||||||
|
| ISS-076 | 2026-10-08 | EQUIPMENT (IEC 104 naming, R1.05) | IM 36K10L41 5th ed. §3.31.1–3.31.2 still calls the IEC 104 manager `eqp104` / `eqp104.sup` and says its name starts with "eqp". R1.05 installs `eqt104.exe` (no `eqp104.exe`), template `eta104_eqt.sup`, and `IEC104_LINE_DF.EQUIPMENT_MAN` defaults to `EQT104` (R1.05 test server, read-only). App. 1.3 gives upgrade steps for IEC 61850 only. Unknown whether an R1.03 IEC 104 line needs the same renaming after an upgrade. | open | Installed software is the reference; summaries use `EQT104`. Needs an upgrade test or a Yokogawa answer. | `knowledge/manuals/IM36K10L41-01EN.md` §1–2, §3.28–3.31 row (done); `.claude/skills/equipment/SKILL.md` (done) |
|
||||||
|
| ISS-077 | 2026-10-08 | EQUIPMENT (IEC 104 setup file, R1.05) | The installed template `eta104_eqt.sup` has a keyword `quality_code_parsing = Y\|N` (default N) that moves IEC 104 cause of transmission and quality flags into the item quality field instead of the item status. The 5th ed. manual does not describe it. | open | Behaviour not tested (no IEC 104 device). | `knowledge/manuals/IM36K10L41-01EN.md` §3.28–3.31 row (done) |
|
||||||
|
| ISS-078 | 2026-10-08 | EQUIPMENT (EQT utilities, R1.05) | IM 36K10L40 4th ed. describes only `eqpfrcscn`, `eqpiostat` and `eqpdbg` (and still lists IEC 61850, I/O type 1636, under `eqpfrcscn`). R1.05 installs `eqtdbg` (same menu, default process `EQT`), `eqtfrcscn` (template `eqtfrcscn.tpl`) and `eqtiostat` (start line commented out in `equipment_start.cmd`). None is in the manual. | open | Documented from installed files only; `eqtdbg`/`eqtfrcscn` not run (shared server, no EQT line). | `knowledge/manuals/IM36K10L40-01EN.md` §1–3, installed section (done); `.claude/skills/equipment/SKILL.md` (done) |
|
||||||
|
| ISS-079 | 2026-10-08 | EQUIPMENT (IEC 61850 client name) | IM 36K10L41 5th ed. §3.32 tells the user to give the IED engineer the client name "EQP850", while §3.32.1 and App. 1.3 use `EQT850`, the process name R1.05 actually uses. | open | Presumably `EQT850`; low priority. | `knowledge/manuals/IM36K10L41-01EN.md` §3.32 (done) |
|
||||||
|
| ISS-080 | 2026-10-08 | ACCESS (OPC UA client status item, R1.05) | IM 36K10E20 4th ed. §2.1.2 lists integer states 0–5 for the station `STATUS_ITEM` (0 preparing, 1 connected, 2 communication error and reconnecting, 3 connect attempt failed, 4 server shutdown received, 5 connection recreated); IM 36K10L45 5th ed. §10.9.2 still calls it a Boolean. On R1.03 a Boolean item with 1 = connected was verified. | open | R1.05 (2026-10-08): with the sample's Boolean status item the station showed 0 / status 4 while the server rejected the client and 1 / status 5 when connected; integer states 2–5 still not observed. Re-test on an R1.05 system with an Integer status item (not on the shared R1.05 test server without approval). | `.claude/skills/data-access/tasks/opcua-client.md` §2; `knowledge/manuals/IM36K10E20-01EN.md` |
|
||||||
|
| ISS-081 | 2026-10-08 | ACCESS (OPC UA server `ServerConfig.xml`, R1.05) | IM 36K10L45 5th ed. §11.7 places `ServerConfig.xml` in `%TLS_ROOT_PATH%\tls\exe`; on the R1.05 test server it exists only in `%TLS_SAV_PATH%` (IM 36K10E20 4th ed. §3.4 agrees). On R1.03 it was in `tls\exe`. The R1.05 file only adds SDK blocks (roles, user password management, PubSub settings, thread pools). | closed | Installed software is the reference (standing user decision). Close when the user confirms. | `.claude/skills/data-access/tasks/access-checks.md`; `knowledge/manuals/IM36K10L45-01EN.md`; `knowledge/manuals/IM36K10E20-01EN.md` |
|
||||||
|
| ISS-082 | 2026-10-08 | ACCESS (OPC UA server keywords, R1.05) | The manual names the switch that keeps the native model visible next to an imported information model `OPXUAS_ENABLE_NATIVE_MODEL_TREE`; the installed `opxuas.sup` has `OPXUAS_ENABLE_OWN_MODEL_TREE`. The installed file also has a hidden `OPXUAS_METHOD_TIMEOUT_MARGIN` (10000 ms) that the manual does not describe. | closed | Installed software is the reference (standing user decision). Close when the user confirms. | `knowledge/manuals/IM36K10L45-01EN.md` |
|
||||||
|
| ISS-083 | 2026-10-08 | ACCESS (OPC UA client setup defaults, R1.05) | IM 36K10L45 5th ed. §10.11 gives `OPXC_SERVICE_CALL_TIME_OUT` default 10 s; the installed template `epauac_eqp.sup` has 60 s. The template also has `OPXC_DISABLE_SAV_FILE`, `OPXC_ALARM_TIME_ATTRIBUTE` and a hidden `OPXC_CERT_EXP_PERIOD_WARN` (2 months) that the manual does not describe. The installed `opxuac_mon.sup` was not updated (still 10 s, none of the new keywords). | open | Installed software is the reference. Open question: whether per-process files created on R1.03 should get the new keywords after an upgrade. | `knowledge/manuals/IM36K10L45-01EN.md`; `.claude/skills/data-access/tasks/access-checks.md` |
|
||||||
|
| ISS-084 | 2026-10-08 | ACCESS (OPC UA client fallback setup file) | The R1.03 manual (and the R1.03 summary) named the fallback client setup file `opxuac.sup`, which exists on neither version. The R1.05 manual (IM 36K10L45 5th ed. §10.11) names `epauac_eqp.sup`, which matches both installations. | closed | Answered by the R1.05 manual and the installed files. Close when the user confirms. | `knowledge/manuals/IM36K10L45-01EN.md` |
|
||||||
|
| ISS-085 | 2026-10-08 | ACCESS (OPC A&E server, R1.05) | The installed `opxsys.sup` has a new keyword `OPXAES_DIR_ALM = YES` (A&E server "direct" alarm events) that IM 36K10L45 5th ed. does not describe. | open | Behaviour not tested (OPC A&E loopback is not allowed). | `knowledge/manuals/IM36K10L45-01EN.md`; `.claude/skills/data-access/tasks/access-checks.md` |
|
||||||
|
| ISS-086 | 2026-10-08 | INSTALLATION (upgrade merge, R1.05) | IM 36K01C10 5th ed. §2.1.5, §3.3.8, §3.3.15 write the upgrade backup, `jupgutl`, `jmrgconfig.properties` and log paths as `C:\Program Files (x86)\…` and `C:\Users\Public\…`. On the R1.05 test server (installed in `C:\Yokogawa\CIServer`) they are `%TLS_ROOT_PATH%\tls\upg`, `%TLS_ROOT_PATH%\tls\com\jupgutl.cmd`, `%TLS_WAP_PATH%\cfg\properties\jmrgconfig.properties` and `%TLS_SAV_PATH%\jmrg\ref-data`. The text says `-c` takes the properties file, but the examples pass the `properties` folder. | open | Paths written with `%TLS_*%`. The `-c` argument needs a test on a non-shared machine (no upgrade was done on the R1.05 test server). | `knowledge/manuals/IM36K01C10-01EN.md`; `.claude/skills/installation-security/SKILL.md` |
|
||||||
|
| ISS-087 | 2026-10-08 | SECURITY (RESTful API ports, R1.05) | The RESTful API server `jrstsrv` listens on TCP 34597 (documented, `JRST_NETWORK_PORT`) and also on TCP 7073 on all addresses. 7073 is not in the Security Guide port table (IM 36K01C30 5th ed. §3.2) or in `jrstsrv.sup`. | open | Do not open 7073 in the firewall unless a need is found. Find out what it is (Yokogawa question). | `knowledge/manuals/IM36K01C30-01EN.md`; `.claude/skills/installation-security/tasks/setup-check.md` |
|
||||||
|
| ISS-088 | 2026-10-08 | WINDOWS (WMIC) | IM 36K01C10 5th ed. App. 1.3 still uses `wmic qfe list full`, but WMIC is not installed on Windows Server 2025 / 24H2 (missing on the R1.05 test server). `Get-HotFix` works there. | closed | Use `Get-HotFix`. Close when the user confirms. | `knowledge/manuals/IM36K01C10-01EN.md`; `tools/setup_check.ps1` |
|
||||||
|
| ISS-089 | 2026-10-08 | INSTALLATION (local groups, R1.05) | On the R1.05 test server (no dual-redundant platform, no IT Security Tool) the local group `RDC_GA_CLIENT` exists with member `CIX_PROCESS`. The Security Guide mentions this group only for the dual-redundant platform (IM 36K01C30 5th ed. §4.9). | closed | Information only: apparently created by the installer; no action. Close when the user confirms. | `knowledge/manuals/IM36K01C30-01EN.md` |
|
||||||
|
| ISS-090 | 2026-10-08 | DOCS (CI Server + PRM) | IM 36K01C10 5th ed. §4.1.1 requires PRM R4.06 or later in a note but R4.08 or later in Table 4.1.1-1 (integration code 1901-0302-03-01). | open | Use R4.08 until clarified (from docs; no PRM available). | `knowledge/manuals/IM36K01C10-01EN.md` |
|
||||||
|
| ISS-091 | 2026-10-08 | DSS (temporary files) | Each `dssqld` run (exports and quick loads) left a 0-byte `dss_<n>_<id>.tmp` in `%TLS_LST_PATH%`, and loading a class left a `dss_*.tmp` holding the class source (R1.05 test server: 34 files after one session of checks and a sample load/remove). They are not removed by CI Server. | closed | Corrected by ISS-119: not every dssqld run leaves such a file. Test cleanup deletes them: `examples/CI-Eng-Sample/shared/clean_dss_tmp.ps1 -Since <test start>` (0-byte files and files with sample text only). Not checked on R1.03. Close when the user confirms. | `examples/CI-Eng-Sample/README.md` (done); `knowledge/r105-verification.md` (done) |
|
||||||
|
| ISS-092 | 2026-10-08 | GRAPHICS (installed files R1.05) | Read-only comparison of the R1.05 graphics files with R1.03 not done (remote commands refused): `Layouts.readme`, factory layouts, DEPLOY structure, `jwuiutl.cmd` and help, `connectrdp.cmd`, mobileoperator files, AOG/symbol lists. | closed | 2026-10-09 (V5): done - Layouts.readme and components identical; jwuiutl/jwuiged load the JCEF browser component from tls\exe\lib\jcef; connectrdp.cmd present; no factory Layouts-original.xml. Awaiting user verification (`knowledge/r105-verification.md` V5). | `.claude/skills/graphics/tasks/layouts.md`, `deploy-displays.md`; `knowledge/manuals/IM36K10R30-01EN.md` |
|
||||||
|
| ISS-093 | 2026-10-08 | GRAPHICS (HTML display enterprise / restrictions) | IM 36K10R30 4th ed. marks enterprise operation as supported on the HTML display (§4.4, §4.7.15 removed, §4.8) and changes §4.10: no more "no automatic reconnect" and "no HTML export from CI View"; new "HIS-TSE not supported on the web". Not in the revision table in that detail. | open | Not tested (no enterprise setup; shared server). | `knowledge/manuals/IM36K10R30-01EN.md` (done); `.claude/skills/graphics/tasks/deploy-displays.md` (done) |
|
||||||
|
| ISS-094 | 2026-10-08 | GRAPHICS (`jwuiutl`) | IM 36K10C50 5th ed. §1.5 describes `jwuiutl -m/-M` output as space-separated; on R1.03 it was comma-separated. On R1.03 an export without `-o` wrote into `mobileoperator\operatorInterfaces\<deployment>`, not the current directory as the help says. R1.05 behaviour not checked. | open | 2026-10-09 (V5): jwuiutl --help identical to R1.03; -m output format still unchecked. `jwuiutl --help` is read-only (V5); a search run only on a non-shared system. | `knowledge/manuals/IM36K10C50-01EN.md` (done); `.claude/skills/graphics/tasks/deploy-displays.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). | closed | 2026-10-09: verified on the web with a temporary 2-pen trend display: both pens draw (history and live). Desktop not checked. 2026-10-09 (V5): PEN_COUNT_LIMIT still 50, but DataSource.js re-enables the empty/invisible-pen checks commented out in R1.03 (change e12620) - probably fixed; test on a non-shared system. 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)`). | closed | 2026-10-09 (V5): R1.05 adds AOG_UAC_MethodArg_Call2; AOG_OPCUA_Methods (named in C60 §1.2.2) is not installed. Installed software is the reference. 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 | 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 | 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. | closed | 2026-10-09 (V6): the four scripts differ only by the extension-script hooks (ISS-121). 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). | closed | 2026-10-09 (V6): hisdbg 1/20/6 work as on R1.03. 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-103 | 2026-10-08 | HISTORY (storage groups on R1.05) | Storage groups (Event/Item, Scan/Time, Aggregation), `ITEM_HISTORY` reads and aggregation not re-tested on R1.05: a new group needs a CI Server restart (ISS-006), not allowed on the shared server. History setup files are identical apart from licence/instance lines. | open | Not tested; needs a server where a restart is allowed. | `.claude/skills/history-management/tasks/storage-groups.md` (done) |
|
||||||
|
| ISS-108 | 2026-10-08 | PORTAL (installation media) | IM 36K10R10 4th ed. §3.1 (R1.04): CI Portal setup runs from the mounted CI Server ISO file instead of the DVD; not in the revision table. §3.3 only gained a reference to IM 36K10L30 ch. 3. | closed | Documented. Close when the user confirms. | `knowledge/manuals/IM36K10R10-01EN.md` (done) |
|
||||||
|
| ISS-109 | 2026-10-08 | PORTAL / BUS (`dur.sup`) | R1.05 `dur.sup` has a new switch `gateway_core` (General tab, installed No) and a new adaptive queue set `ADTSTO, 1.00`. IM 36K10R10 does not mention them; see ISS-116 for the gateway configuration. | closed | Installed software is the reference. Close when the user confirms. | `knowledge/manuals/IM36K10R10-01EN.md`, `.claude/skills/portal-setup/SKILL.md` (done) |
|
||||||
|
| ISS-110 | 2026-10-08 | PORTAL (`jwuiisg.sup` keywords) | R1.05 `jwuiisg.sup` has keywords IM 36K10R10 §4.3 does not describe: `SERVER_FILE_CACHE`, `HTTP_TO_HTTPS_REDIRECT`, `RECONNECT_TIMEOUT_OVERRIDE`, and a new tab *Access Control* (`RESTRICT_IP_ACCESS`, `HOSTNAME_WHITELISTING`). | closed | Installed software is the reference; documented from the file's own help. Close when the user confirms. | `knowledge/manuals/IM36K10R10-01EN.md`, `.claude/skills/portal-setup/tasks/check-web-access.md` (done) |
|
||||||
|
| ISS-111 | 2026-10-08 | PORTAL (web security headers, CSP) | R1.05 `jwuiisg.sup` installs 7 security response headers and 9 `CSP_ENTRY` lines (R1.03: only X-Frame-Options, no CSP); verified in the HTTP responses on 8080/8443. | closed | 2026-10-09: fix verified - CSP_ENTRY = frame-src, "'self'" plus one line per allowed host in jwuiisg.sup, then a CI Server restart (JWUIISG reads the file only at start); the external page then loaded in the display. Close when the user confirms. 2026-10-09: answered with a temporary display - the default R1.05 CSP (no frame-src, default-src self) blocks external pages in a web browser component on the web client; same-origin pages load. Possible fix (not tested): a CSP_ENTRY with frame-src for the allowed host. Open question: does the CSP block external content in displays (web browser component, external images, map viewer)? Not tested. Upgraded systems may keep their old settings depending on the merge. | `knowledge/manuals/IM36K10R10-01EN.md`, `.claude/skills/portal-setup/tasks/check-web-access.md` (done); `.claude/skills/graphics` (open) |
|
||||||
|
| ISS-112 | 2026-10-08 | SETUP FILE EDITOR (`jwuiisg.sup` metadata) | R1.05 `jwuiisg.sup` metadata quirks: two keyword blocks end with `!ENDKEYWORD!`; `SERVER_FILE_CACHE=0` without spaces in `!DEFAULT`; `RECONNECT_TIMEOUT_OVERRIDE` has no active or default line; `RESTRICT_IP_ACCESS` has no keyword for the allowed addresses. | open | Awaiting user verification in the Setup File Editor GUI (V7). | `knowledge/manuals/IM36K10R20-01EN.md`, `IM36K10R10-01EN.md` (done) |
|
||||||
|
| ISS-113 | 2026-10-08 | SETUP FILE EDITOR (R1.05 GUI) | R1.05 `fsuedit.cmd` only adds `tls\exe\lib\*` to the class path; metadata keywords and `!KIND`s unchanged. The R1.03 GUI findings (ISS-015/016) are not re-checked on R1.05. | open | Awaiting user verification (V7). | `knowledge/manuals/IM36K10R20-01EN.md`, `.claude/skills/portal-setup/tasks/change-setup-file.md` (done) |
|
||||||
|
| ISS-116 | 2026-10-08 | BUS / SYSTEM DESIGN (gateway core) | IM 36K10J10 5th ed. has a new §3.2.6 *Gateway* configuration, not in the revision table: a gateway-licensed CI Core has no operator interface (nor do CI Portals / CI View connected to it); switched on with `GATEWAY_CORE` in `dur.sup`; a licence/switch mismatch is logged. IM 36K10L30 does not describe the keyword. | open | Not tested (no gateway licence; needs admin and a restart). | `knowledge/manuals/IM36K10J10-01EN.md`, `IM36K10L30-01EN.md`, `.claude/skills/system-management/tasks/bus-utilities.md` (done) |
|
||||||
|
| ISS-117 | 2026-10-08 | DATABASE (DSS processes R1.05) | R1.05 `database_start.cmd` starts DSSSDA00–03 as fixed lines plus new DSSSDARST (RESTful API) and DSSSDAPY (pyTOOLS): 12 dsssda and 7 dssevt processes. `dss.sup`: `DSSSDA_QUESZ` 252 → 1000, new `DSSMAN_QUESZ = 1000`, two new `DSSSDA_SRV` lines. After an upgrade it runs the `*_u0104`/`*_u0105` conversion programs. Not in IM 36K10L50. | closed | Verified read-only. Close when the user confirms. | `knowledge/manuals/IM36K10L50-01EN.md`, `.claude/skills/system-management/tasks/dss-tools.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-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 | 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-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-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 | 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-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. | closed | 2026-10-09: re-tested on R1.05 with approval (V9): same behaviour as R1.03 (blk/ublk, silent ignore, 99 characters + status 12). 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. | closed | 2026-10-09 (V16): a local change - the Setup File Editor shows the field in blue (differs from the default; screenshot by the user), saved 2026-09-12. The installed reference copies (tls\sav\jmrg\ref-data R1.01.00-R1.04.00) and R1.03 all have 5. The repo states the default 5. Close when the user confirms. 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 | 2026-10-09 (V14): confirmed - OPCJEXE never answers the performance request (OPCEXE1 answers at once with the same input; OPCJEXE attached, nothing logged); the waiting opcdbg stays and must be stopped. Open question for Yokogawa: does the debugger support the Java executor? 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). | closed | 2026-10-09: re-tested on R1.05 with approval (V15): compile → RESET_REQUIRED 1, old code until reset; opcdbg reset works; attribute change works. 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) |
|
||||||
|
| ISS-182 | 2026-10-12 | GRAPHICS (layouts, web) | Layout command `logout` is a *secondary* logout and is always disabled on the R1.05 web client (`LayoutWindow.js`); the R1.03 table said it works on the web. | closed | Use `exit` (closes the window; the last window ends the session, the browser closes the tab). Verified on the R1.05 web client 2026-10-12. The sample layout `CIENG_Operator` still has a `logout` item: change it after re-testing on the sample (ISS-188). | `graphics/tasks/layouts.md` §6.4, `examples/CI-Eng-Sample/layouts/CIENG_Operator.xml` |
|
||||||
|
| ISS-183 | 2026-10-12 | GRAPHICS (web, visibility) | Ellipses, textFields and numberFields that start with `<visible>false</visible>` stay hidden on the R1.05 web client when their visibility connection becomes true (rectangles, texts, numbers work). | closed | Leave those components visible at start (workaround). Verified 2026-10-12. | `graphics/tasks/create-display.md` §R1.05 web client |
|
||||||
|
| ISS-184 | 2026-10-12 | GRAPHICS (web, String items) | A `<text>` bound to a String item is stretched to its box with `keepOriginalSize` false and centred with true; `textField` `opaque false` is ignored (white background). | closed | Left-aligned text: borderless read-only `textField` with the background colour set or connected. Verified 2026-10-12. | `graphics/tasks/create-display.md` |
|
||||||
|
| ISS-185 | 2026-10-12 | PROCESS (Java, signals) | Changing the signal or attribute definitions of a Java class while an object exists fails with only `DSI-E-OPCCOMERR` in the `.qlo`; the reason is in `tls\lst\opc_t*.lst`. Recreating the object loses its attributes. | closed | Remove object, modify class, insert object; rebuild attribute data from items. Verified on R1.05 2026-10-12. | `class-object-engineering/tasks/change-reset-class.md` §3, `java-class.md` §4a |
|
||||||
|
| ISS-186 | 2026-10-12 | TOOLS (Windows security) | A PowerShell script that opens a TCP listener (Modbus test server) is blocked by Windows antivirus/AMSI: *This script contains malicious content and has been blocked* (engineering PC, Windows 10). | closed | Use the Java test server `tools/ModbusSim.java` (CI Server JDK). Seen 2026-10-12. | `tools/README.md`, `equipment/tasks/modbus-station.md` |
|
||||||
|
| ISS-187 | 2026-10-12 | ITEM (quick load) | `STRING_LENGTH` 0 on a Real item in a mixed `@FIELDS` block is refused (`DSS-E-VAL_RANGE`). | closed | Separate `@FIELDS` blocks for String and other items. Verified on R1.05 2026-10-12. | `item-engineering/tasks/string-items.md` |
|
||||||
|
| ISS-188 | 2026-10-12 | SAMPLE (R1.05) | The R1.05 findings of 2026-10-12 were verified with a user project, not with CI-Eng-Sample (displays, layouts and users of the sample are not loaded on the shared R1.05 server). | open | Re-test on CI-Eng-Sample when the full sample can be loaded on an R1.05 system, including replacing the sample layout `logout` item with `exit`. | `knowledge/progress.md` R1.05 table |
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue