diff --git a/.claude/skills/authorization/SKILL.md b/.claude/skills/authorization/SKILL.md new file mode 100644 index 0000000..56dc9b9 --- /dev/null +++ b/.claude/skills/authorization/SKILL.md @@ -0,0 +1,29 @@ +--- +name: authorization +description: >- + CI Server R1.03 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 + (ITEM_READ, ITEM_MODIFY_VALUE, …), set process areas, logoff timeout or initial display for + a user, change how users log in (dssana.sup login method: Automatic, Manual CI Server, + Manual OS, No, SSO, Deny), or hide Engineering Module features with a scheme. + Sources IM 36K10C10-01EN §2; Active Directory and single sign-on follow in phase 13 (IM 36K10J40). +--- + +# Authorization (R1.03) + +Background: `knowledge/manuals/IM36K10C10-01EN.md` §2 (login methods, actions, user tabs, +schemes). Login settings are in `dssana.sup` on CI Core (skill `portal-setup` for reading +and changing setup files). + +Rules: +- 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 + and sets any password; never put real passwords in repo files. +- Remove users before the authorization group they belong to. + +| Task | File | Status | +|---|---|---| +| Create, check and remove authorization groups and users (quick load) | `tasks/users-groups.md` | verified | +| Login methods per client and user interface (`dssana.sup`, tab *Login control*) | C10 summary §2 | from docs (installed values read) | +| Schemes (hide Engineering Module features) | C10 summary §2 | from docs | +| Active Directory, single sign-on, password rules | phase 13 | not covered | diff --git a/.claude/skills/authorization/tasks/users-groups.md b/.claude/skills/authorization/tasks/users-groups.md new file mode 100644 index 0000000..8da8f1d --- /dev/null +++ b/.claude/skills/authorization/tasks/users-groups.md @@ -0,0 +1,86 @@ +--- +task: Create, check and remove authorization groups and users with quick load +version: R1.03 +source: IM 36K10C10-01EN §2.4, §2.5; data dictionary (`dssqld -f`); practiced on the test system 2026-09-30 +status: verified +--- + +# Authorization groups and users (quick load) + +Engineering Module equivalent: *Authorization → Authorization groups / User → Add*. +Datasets: `AUTH_GROUP_DF` (groups), `AUTH_ACTION_DF` (allowed action names), `USER_DF` +(users). Works from a normal prompt while CI Server is running. Use short relative file +names (`cd` to the folder first): long absolute paths are cut (ISS-020). + +## List what exists + +``` +dssqld -e groups.qli -d AUTH_GROUP_DF -c -l groups.lst +dssqld -e users.qli -d USER_DF -c -l users.lst +dssqld -e actions.qli -d AUTH_ACTION_DF -c -l actions.lst +``` + +Installed on R1.03: groups `SYSTEM_MANAGER`, `ENGINEER`, `OPERATOR`, `GUEST`; users `ADMIN`, +`ADMINE`, `OPER`, `CI_NO_LOGIN_OPCUAS`. Passwords export as `****`. + +## Group + +Required: `NAME`. Actions go in `ACTION_NAME_1`, `ACTION_NAME_2`, … and must be names from +`AUTH_ACTION_DF` (e.g. `ITEM_READ`, `ITEM_MODIFY_VALUE`, `SECTION_BLOCK_UNBLOCK`, +`ALARM_CURRENT_ACK`). Example (`examples/CI-Eng-Sample/08_auth_group_df.qli`): + +``` +@FIELDS +NAME,DESCRIPTION,ACTION_NAME_1,ACTION_NAME_2,ACTION_NAME_3,ACTION_NAME_4 + +@AUTH_GROUP_DF +"CIENG_VIEWER","CI-Eng-Sample read-only viewer","ITEM_READ","SECTION_READ","ALARM_CURRENT_READ","ALARM_CHRONO_READ" +``` + +## User + +Required: `NAME` (≤ 32) and `AUTH_GROUP` (an existing group). Optional: `DESCRIPTION`, +`PROCESS_AREAS` (e.g. `"1-999"`), `LOGOFF_TIMEOUT` (minutes, 0–999), `INITIAL_DISPLAY`, +`LOCALE`, `ENTERPRISE`, playback fields. A password is **not** required on import; set it in +the Engineering Module (the user does this, not Claude). Template: + +``` +@FIELDS +NAME,DESCRIPTION,AUTH_GROUP,PROCESS_AREAS,LOGOFF_TIMEOUT + +@USER_DF +"","","CIENG_VIEWER","1-999",15 +``` + +Defaults filled in on import (seen): display authorization level 999, language *System*, +playback *HMI Client dependent* / *No*, merge priority 1. Changes take effect at the user's +next login. + +## Check and remove + +Filtered export (`@SELECT`, see `system-management` task `export-dataset.md`): + +``` +@SELECT +'NAME = ""' +@USER_DF +``` + +Remove users first, then the group, in one `NAME`-only file (`dssqld -r`): + +``` +@FIELDS +NAME + +@USER_DF +"" + +@AUTH_GROUP_DF +"CIENG_VIEWER" +``` + +## Test system (2026-09-30) + +Group `CIENG_VIEWER` and user `CIENG_TEST` (no password, logoff 15 min) loaded with 0 errors, +exported back as defined, then removed (1 + 1 removed, 0 errors). The group is part of +CI-Eng-Sample; the sample creates no users. diff --git a/.claude/skills/equipment/SKILL.md b/.claude/skills/equipment/SKILL.md new file mode 100644 index 0000000..7ebb4fd --- /dev/null +++ b/.claude/skills/equipment/SKILL.md @@ -0,0 +1,34 @@ +--- +name: equipment +description: >- + CI Server R1.03 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 + 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 + 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 + equipment debugger (eqpdbg). Sources IM 36K10L40-01EN, IM 36K10L41-01EN, IM 36K10C10-01EN §4.1. +--- + +# Equipment (R1.03) + +Background: `knowledge/manuals/IM36K10L41-01EN.md` (line types, station parameters, +conversion types, Modbus, driver table), `IM36K10L40-01EN.md` (forced scan, statistics, +`eqpdbg`), `IM36K10C10-01EN.md` §4.1 (Engineering Module forms). + +Rules: +- Run the `system-check` skill first; follow the user's chosen way of working. +- Loading a line creates files in `tls\com` and `tls\sup` and starts an equipment manager; + removing it stops the manager and deletes them. Only do this on test systems or with the + user's approval. +- Outputs write to real devices: never write to a production station's output points without + the user's explicit approval. +- `eqpdbg`: only the read-only actions (see L40 summary) unless the user approves. + +| 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 | +| CI Server as Modbus slave (mirror `eqpmdcmem` + `eqpmdcslvtcp`) | `tasks/modbus-station.md` §1 | verified (by hand and via start file after a restart) | +| Read-only equipment manager status with `eqpdbg` | `system-management` task `tuning-checks.md` | verified | +| Forced scan (`eqpfrcscn`), hourly statistics (`eqpiostat`) | L40 summary | from docs (statistics empty, ISS-021) | +| Other protocols | L41 summary §3.8–3.40 | from docs (no hardware) | diff --git a/.claude/skills/equipment/tasks/modbus-station.md b/.claude/skills/equipment/tasks/modbus-station.md new file mode 100644 index 0000000..2f59f02 --- /dev/null +++ b/.claude/skills/equipment/tasks/modbus-station.md @@ -0,0 +1,122 @@ +--- +task: Modbus TCP station by quick load (line, station, scan type, points, items) +version: R1.03 +source: IM 36K10L41-01EN §2, §3.1–3.2, §3.6–3.7; IM 36K10C10-01EN §4.1; practiced on CI-Eng-Sample 2026-09-30 +status: verified +--- + +# Modbus TCP station by quick load + +Uses the CI-Eng-Sample loopback station `CIENG_PLC` as the worked example (files in +`examples/CI-Eng-Sample/`: `09_modbus_line_df.qli`, `10_modbus_station_df.qli`, +`11_item_eqp_df.qli`, removal `80_`–`82_`). For a real device, replace the address, unit id, +points and conversion settings. Works from a normal prompt while CI Server is running; use +short relative file names. + +## 1. (Test only) CI Server as its own Modbus slave + +CI Server ships a Modbus slave "mirror" that needs no hardware: +- `eqpmdcmem -n EQPMDCMEM`: slave memory (64K registers, 64K bits per unit id; input and + holding registers are the same memory, as are coils and input bits). The name must be + `EQPMDCMEM`: the TCP slave looks for it. +- `eqpmdcslvtcp -n EQPMDCSLVTCP -p 5020`: Modbus TCP listener (default port 502). + +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/ +eqpciengslv_start.cmd` and `_stop.cmd` to `%TLS_ROOT_PATH%\tls\com`: `equipment_start.cmd` +runs every `eqp*start.cmd` there. + +## 2. Line (`MODBUS_LINE_DF`) + +``` +@FIELDS +NAME,DESCRIPTION,LINE_TYPE,EQUIPMENT_MAN,HEART_BEAT,TIMEOUT,DEAD_TIME,REPEAT_CONNECTION_DELAY + +@MODBUS_LINE_DF +"CIENG_MB_LINE","CI-Eng-Sample Modbus loopback line","TCP/IP","EQPCIENG",100,3000,30,10 +``` + +- `EQUIPMENT_MAN` = equipment manager process name, must start with `EQP`, ≤ 12 characters. +- Leave `EQUIPMENT_NODE` out: it defaults to the local node (keeps files portable). +- Loading it **creates** `tls\com\eqpcieng_start.cmd`, `eqpcieng_stop.cmd` and + `tls\sup\eqpcieng.sup` (written by the CI Service, no admin rights needed) and **starts** + `eqpmdc -n EQPCIENG` a few seconds later. Wait ~15 s before loading stations. + +## 3. Station, scan type, points (`MODBUS_STATION_DF`, `MODBUS_SCAN_TYPE_DF`, `MODBUS_POINT_DF`) + +``` +@FIELDS +NAME,DESCRIPTION,LINE,PROTOCOL,LINE_1_DEVICE,SUB_STATION_ID,OUTPUT_METHOD,STATUS_ITEM,ON_SCAN + +@MODBUS_STATION_DF +"CIENG_PLC","Loopback to CI Server Modbus slave (port 5020)","CIENG_MB_LINE","Open Modbus/TCP","localhost:5020",1,"On change and connect","CI-Eng-Sample.PLC1.COMM_OK",1 + +@FIELDS +NAME,DESCRIPTION,SCAN_INTERVAL + +@MODBUS_SCAN_TYPE_DF +"CIENG_SCAN1S","CI-Eng-Sample 1 s scan",1000 + +@FIELDS +NAME,STATION,POINT,DESCRIPTION,IO_ADDRESS,EXTERNAL_RELATION,SCAN_TYPE,CONV_TYPE,BITS + +@MODBUS_POINT_DF +"CIENG_PLC:SP","CIENG_PLC","SP","Setpoint, holding register 1","RO:1","Output","CIENG_SCAN1S","Binary",16 +"CIENG_PLC:PV","CIENG_PLC","PV","Read-back, input register 1","RI:1","Input","CIENG_SCAN1S","Binary",16 +``` + +- `PROTOCOL`: `Open Modbus/TCP`, `RTU` or `Ascii`. The CI Server TCP slave only answered + **Open Modbus/TCP** (with `RTU` every request timed out, `EQP-E-TCPRCVTMO`; ISS-024). +- `LINE_1_DEVICE` `[:]`, default port 502. `SUB_STATION_ID` = Modbus unit id. +- `STATUS_ITEM`: an existing Boolean item; 1 = communication good, 0 = bad, status 22 + OFFSCAN when off-scan. Load it before the station. +- Points need `NAME` = `:` as well as `STATION` and `POINT` + (without it: `DSS-E-PIDX_FST`). +- Addresses: `DO:n` coil, `DI:n` input bit, `RO:n[,bit]` holding register, `RI:n[,bit]` input + register (numbers from 1, not 40001/30001). `EXTERNAL_RELATION`: `Input`, `Output`, + `Input + Output`. `CONV_TYPE`: `Binary`, `Linear` (with `ELEC_LOW/HIGH`, `PHYS_LOW/HIGH`), + `Float` (`FLOAT_TYPE` Intel, swap words), `Digital`, … (L41 summary §3.3). + +## 4. Connect items (`ITEM_DF.STATION`, `POINT`) + +``` +@FIELDS +NAME,DESCRIPTION,ITEM_REP,VALUE_FORMAT,STATION,POINT + +@ITEM_DF +"CI-Eng-Sample.PLC1.SETPOINT","Setpoint written to holding register 1","Integer","99999","CIENG_PLC","SP" +"CI-Eng-Sample.PLC1.READBACK","Read back from input register 1","Integer","99999","CIENG_PLC","PV" +``` + +## 5. Test + +``` +itmval -p -n CI-Eng-Sample.PLC1.SETPOINT -v 1234 +itmval -g -n CI-Eng-Sample.PLC1.READBACK +itmval -g -n CI-Eng-Sample.PLC1.COMM_OK +printf '3\n1\n-1\n' | eqpdbg 0 EQPCIENG # slave 1: scan status, line status, request statistics +``` + +Before the first good scan input items show `off` (offline) and status 13 NOT INIT. + +**Off-scan / on-scan** (`dssqld -m` with `NAME,ON_SCAN` = 0 or 1): off-scan sets the status +item to 0 / status 22 OFFSCAN and freezes input items at their last value with the `off` +flag; a value written to an output while off-scan reached the device after going back +on-scan (output method *On change and connect*). + +## 6. Remove (reverse order) + +1. Items connected to points (`ITEM_DF` names). +2. Points, then station, then scan type (one file, in that order). +3. Line: this **stops** the equipment manager and deletes its start/stop scripts, setup file + and `tls\sav` files. +4. The status item and section with the other items. + +## Test system (2026-09-30) + +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, +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 +`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*). diff --git a/.claude/skills/item-engineering/SKILL.md b/.claude/skills/item-engineering/SKILL.md index 5ac92fa..78628b3 100644 --- a/.claude/skills/item-engineering/SKILL.md +++ b/.claude/skills/item-engineering/SKILL.md @@ -3,8 +3,9 @@ name: item-engineering description: >- CI Server R1.03 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, - scale or value format, block or unblock items or sections, or understand item status and - option flags. Sources IM 36K10G10-01EN (Tutorial); to be extended with IM 36K10C10 in phase 5. + 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 + (blk, off, uoff, ublk). Sources IM 36K10G10-01EN (Tutorial) and IM 36K10C10-01EN. --- # Item engineering (R1.03) @@ -21,3 +22,5 @@ Rules: |---|---|---| | Sub-items (integrator, min-max) | `tasks/sub-items.md` | verified | | Block / unblock an item; write to a blocked item | `tasks/block-item.md` | verified | +| String items: length limit (1–200) and truncation | `tasks/string-items.md` | verified | +| Item forms, limits, PIT filter, clamping, alarm tab, option bits, item statuses | `knowledge/manuals/IM36K10C10-01EN.md` §3–4 | from docs | diff --git a/.claude/skills/item-engineering/tasks/block-item.md b/.claude/skills/item-engineering/tasks/block-item.md index 581cd3e..706fa2e 100644 --- a/.claude/skills/item-engineering/tasks/block-item.md +++ b/.claude/skills/item-engineering/tasks/block-item.md @@ -33,4 +33,6 @@ dssqld -m block.qli -l block.qlo - `itmval -p -n -v ` on a blocked item is **silently ignored** (no error, value unchanged; `knowledge/issues.md` ISS-011). Add `-o` to overwrite: `itmval -p -n -v -o`. -- After unblocking, `blk` is replaced by `ublk` (meaning not yet confirmed, see ISS-001). +- 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, + ISS-001). diff --git a/.claude/skills/item-engineering/tasks/string-items.md b/.claude/skills/item-engineering/tasks/string-items.md new file mode 100644 index 0000000..d0134a8 --- /dev/null +++ b/.claude/skills/item-engineering/tasks/string-items.md @@ -0,0 +1,37 @@ +--- +task: String items: length limit and truncation +version: R1.03 +source: IM 36K10C10-01EN §3.3.4; data dictionary (`dssqld -f`); practiced on CI-Eng-Sample 2026-09-30 +status: verified +--- + +# String items + +A string item has a maximum length set when it is created (`ITEM_DF.STRING_LENGTH`). + +| Rule | Value (verified) | +|---|---| +| 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) | +| Characters the item holds | **length − 1** (length 100 holds 99) | +| Value that fits | stored, status 9 NORMAL | +| 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 +allows 200 (`knowledge/issues.md` ISS-019). Multi-byte characters take more than one byte. + +Quick load (the section must exist): + +``` +@FIELDS +NAME,DESCRIPTION,ITEM_REP,STRING_LENGTH,AUDIT_INFO + +@ITEM_DF +"
.","Status text","String",120,0 +``` + +Write and read: `itmval -p -n
. -v "text"`, `itmval -g -n
.`. +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 +load it again. diff --git a/.claude/skills/item-engineering/tasks/sub-items.md b/.claude/skills/item-engineering/tasks/sub-items.md index 1bd6453..16ebacc 100644 --- a/.claude/skills/item-engineering/tasks/sub-items.md +++ b/.claude/skills/item-engineering/tasks/sub-items.md @@ -1,7 +1,7 @@ --- task: Create sub-items (integrator, min-max) version: R1.03 -source: IM 36K10G10-01EN §3.1.5, §3.2.3; practiced with CI-Eng-Sample 2026-09-30 +source: IM 36K10G10-01EN §3.1.5, §3.2.3; IM 36K10C10-01EN §3.2; practiced with CI-Eng-Sample 2026-09-30 status: verified --- @@ -27,9 +27,13 @@ Load with `dssqld -i .qli -l .qlo`; remove with a `NAME`-only file a ## Behaviour (verified) -- **Integrator** adds *value × seconds*: with the main item at 1 it grows by 1 per second. - `TIME_UNIT` (e.g. `Hour`) made no difference (`knowledge/issues.md` ISS-010); to show hours, - divide by 3600 where the value is used. +- **Integrator** adds *value × time unit*: with the main item at 1 it grows by 1 per second + by default. The time unit is the **integration granule** `itm_int_secs` in `itm.sup` + (Setup File Editor label "Integration granule, sec."), **system-wide** for all integrators, + installed value 1. Setting 60 and restarting CI Server made it grow by 1 per minute + (verified 2026-09-30, ISS-010). Changing it is a setup-file change (skill `portal-setup`, + task `change-setup-file.md`); existing integrator values are not 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 written to the main item: writing 30, 70, 50 gave 70. - `TIME_UNIT` (Second, Minute, Hour, Day) belongs to Rate-of-Change (from docs, not practiced). diff --git a/.claude/skills/system-management/tasks/read-write-item.md b/.claude/skills/system-management/tasks/read-write-item.md index f5feef4..ef32f54 100644 --- a/.claude/skills/system-management/tasks/read-write-item.md +++ b/.claude/skills/system-management/tasks/read-write-item.md @@ -32,9 +32,12 @@ Quality = 0 - **Status** is a number from `STATUS_DF` (export it with `dssqld -e status_df.qli -d STATUS_DF -c` to look numbers up). Common ones: 9 `NORMAL`, 13 `NOT INIT` (never written; new items start here), 4 / 5 `BOOLEAN 0` / `BOOLEAN 1`, 11 `HIGH HIGH`. -- **Options** lists item flags as words after the hex value, e.g. `ack` (acknowledged), - `off` (item's station not communicating). `uoff` also appears on station items after a write; - its meaning is not yet known (see `knowledge/issues.md` ISS-001). +- **Options** lists item flags as words after the hex value (option bits, IM 36K10C10 §3.5): + `blk` 1 blocked, `off` 2 offline (station not communicating), `uoff` 4 **updated offline** + (written by an application such as `itmval` while offline), `ack` 8 acknowledged, `ublk` 16 + **updated blocked** (written while blocked, e.g. with `-o`); 32/64 direct/delayed alarm. + So writing a station item whose station is down adds `uoff` (0x…8a → 0x…8e); internal items + (no station) never get it. ## Read limits diff --git a/.claude/skills/system-management/tasks/tuning-checks.md b/.claude/skills/system-management/tasks/tuning-checks.md index efd792c..37e8a6b 100644 --- a/.claude/skills/system-management/tasks/tuning-checks.md +++ b/.claude/skills/system-management/tasks/tuning-checks.md @@ -37,8 +37,20 @@ Read the newest entries: Test system (2026-09-30): common memory 665.6 MB, free 665.3 MB; queues empty; 3 lock collisions in total. +## 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 +read-only codes listed in the manual summaries: + +| Command | Shows | Reference | +|---|---|---| +| `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 ` | 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, +update scan status); do not use them without the user's approval. + ## Not yet practiced -Debug launchers (`jwuipoi_debug`, `jhmiset_debug`, …), interactive debuggers (`itmdbg`, -`opcdbg`, `eqpdbg`, …), and per-process debug settings; see -`knowledge/manuals/IM36K10J10-01EN.md` §5.5.2. +Debug launchers (`jwuipoi_debug`, `jhmiset_debug`, …), other debuggers (`opcdbg`, `ithdbg`, +…), and per-process debug settings; see `knowledge/manuals/IM36K10J10-01EN.md` §5.5.2. diff --git a/examples/CI-Eng-Sample/01_section_df.qli b/examples/CI-Eng-Sample/01_section_df.qli index eafc087..bd48bdd 100644 --- a/examples/CI-Eng-Sample/01_section_df.qli +++ b/examples/CI-Eng-Sample/01_section_df.qli @@ -14,3 +14,4 @@ NAME,SECTION_PATH,SECTION_NAME,DESCRIPTION "CI-Eng-Sample.PUMP1","CI-Eng-Sample","PUMP1","Sample pump 1" "CI-Eng-Sample.SYSTEM","CI-Eng-Sample","SYSTEM","Sample system monitoring" "CI-Eng-Sample.DEMO","CI-Eng-Sample","DEMO","Tutorial examples (class/object)" +"CI-Eng-Sample.PLC1","CI-Eng-Sample","PLC1","Modbus loopback station CIENG_PLC" diff --git a/examples/CI-Eng-Sample/02_item_df.qli b/examples/CI-Eng-Sample/02_item_df.qli index 61cc540..8ff1a91 100644 --- a/examples/CI-Eng-Sample/02_item_df.qli +++ b/examples/CI-Eng-Sample/02_item_df.qli @@ -19,3 +19,4 @@ LOW_LOW_LIMIT,LOW_LIMIT,HIGH_LIMIT,HIGH_HIGH_LIMIT,SCALE_LOW_LIMIT,SCALE_HIGH_LI "CI-Eng-Sample.SYSTEM.PING_LOCALHOST","localhost reachable, from inttcpmon","Integer","9",0,0,0,0,0,1 "CI-Eng-Sample.SYSTEM.PROC_ALM","ALARM process (alm) running, from intmon","Integer","9",0,0,0,0,0,1 "CI-Eng-Sample.DEMO.COUNTER","Counter 1..100 driven by object DEMO.INCR1","Integer","999",0,0,0,0,0,100 +"CI-Eng-Sample.PLC1.COMM_OK","Station CIENG_PLC communication (1 = good), status item","Boolean","",0,0,0,0,0,0 diff --git a/examples/CI-Eng-Sample/02b_sub_item_df.qli b/examples/CI-Eng-Sample/02b_sub_item_df.qli index eff3969..3cb47fb 100644 --- a/examples/CI-Eng-Sample/02b_sub_item_df.qli +++ b/examples/CI-Eng-Sample/02b_sub_item_df.qli @@ -5,7 +5,7 @@ ENGLISH 1.03.00 ! CI-Eng-Sample sub-items (Tutorial IM 36K10G10-01EN 3.1.5, 3.2.3), CI Server R1.03.00 -! Integrator: adds value x seconds (RUNNING = 1 -> running seconds; TIME_UNIT has no effect, verified). +! Integrator: adds value x integration granule (itm_int_secs in itm.sup, default 1 s; TIME_UNIT has no effect, verified). ! Min-Max: keeps the maximum (or minimum) of the main item. @FIELDS NAME,DESCRIPTION,SUB_TYPE,TIME_UNIT,MIN_MAX diff --git a/examples/CI-Eng-Sample/08_auth_group_df.qli b/examples/CI-Eng-Sample/08_auth_group_df.qli new file mode 100644 index 0000000..eb0c8c0 --- /dev/null +++ b/examples/CI-Eng-Sample/08_auth_group_df.qli @@ -0,0 +1,13 @@ +@LANGUAGE +ENGLISH + +@VERSION +1.03.00 + +! CI-Eng-Sample read-only authorization group (IM 36K10C10-01EN 2.4), CI Server R1.03.00 +! Actions are NAME values from AUTH_ACTION_DF. +@FIELDS +NAME,DESCRIPTION,ACTION_NAME_1,ACTION_NAME_2,ACTION_NAME_3,ACTION_NAME_4 + +@AUTH_GROUP_DF +"CIENG_VIEWER","CI-Eng-Sample read-only viewer","ITEM_READ","SECTION_READ","ALARM_CURRENT_READ","ALARM_CHRONO_READ" diff --git a/examples/CI-Eng-Sample/09_modbus_line_df.qli b/examples/CI-Eng-Sample/09_modbus_line_df.qli new file mode 100644 index 0000000..0f9cb0b --- /dev/null +++ b/examples/CI-Eng-Sample/09_modbus_line_df.qli @@ -0,0 +1,14 @@ +@LANGUAGE +ENGLISH + +@VERSION +1.03.00 + +! CI-Eng-Sample Modbus line (IM 36K10L41-01EN 3.6.1), CI Server R1.03.00 +! Loading it creates tls\com\eqpcieng_start.cmd, _stop.cmd and tls\sup\eqpcieng.sup and +! starts equipment manager EQPCIENG (eqpmdc) after a few seconds. EQUIPMENT_NODE blank = local node. +@FIELDS +NAME,DESCRIPTION,LINE_TYPE,EQUIPMENT_MAN,HEART_BEAT,TIMEOUT,DEAD_TIME,REPEAT_CONNECTION_DELAY + +@MODBUS_LINE_DF +"CIENG_MB_LINE","CI-Eng-Sample Modbus loopback line","TCP/IP","EQPCIENG",100,3000,30,10 diff --git a/examples/CI-Eng-Sample/10_modbus_station_df.qli b/examples/CI-Eng-Sample/10_modbus_station_df.qli new file mode 100644 index 0000000..5e8c910 --- /dev/null +++ b/examples/CI-Eng-Sample/10_modbus_station_df.qli @@ -0,0 +1,30 @@ +@LANGUAGE +ENGLISH + +@VERSION +1.03.00 + +! CI-Eng-Sample Modbus station, scan type and points (IM 36K10L41-01EN 3.6.3-3.6.5), CI Server R1.03.00 +! The station talks to CI Server's own Modbus slave mirror (eqpmdcmem + eqpmdcslvtcp on port 5020, +! started by equipment/eqpciengslv_start.cmd). Protocol must be Open Modbus/TCP (RTU does not answer). +! Input and holding registers share memory in the mirror (RI:1 = RO:1), as do inputs and coils (DI:1 = DO:1). +@FIELDS +NAME,DESCRIPTION,LINE,PROTOCOL,LINE_1_DEVICE,SUB_STATION_ID,OUTPUT_METHOD,STATUS_ITEM,ON_SCAN + +@MODBUS_STATION_DF +"CIENG_PLC","Loopback to CI Server Modbus slave (port 5020)","CIENG_MB_LINE","Open Modbus/TCP","localhost:5020",1,"On change and connect","CI-Eng-Sample.PLC1.COMM_OK",1 + +@FIELDS +NAME,DESCRIPTION,SCAN_INTERVAL + +@MODBUS_SCAN_TYPE_DF +"CIENG_SCAN1S","CI-Eng-Sample 1 s scan",1000 + +@FIELDS +NAME,STATION,POINT,DESCRIPTION,IO_ADDRESS,EXTERNAL_RELATION,SCAN_TYPE,CONV_TYPE,BITS + +@MODBUS_POINT_DF +"CIENG_PLC:SP","CIENG_PLC","SP","Setpoint, holding register 1","RO:1","Output","CIENG_SCAN1S","Binary",16 +"CIENG_PLC:PV","CIENG_PLC","PV","Read-back, input register 1 (same memory)","RI:1","Input","CIENG_SCAN1S","Binary",16 +"CIENG_PLC:CMD","CIENG_PLC","CMD","Command, coil 1","DO:1","Output","CIENG_SCAN1S","Digital",1 +"CIENG_PLC:FB","CIENG_PLC","FB","Feedback, input bit 1 (same memory)","DI:1","Input","CIENG_SCAN1S","Digital",1 diff --git a/examples/CI-Eng-Sample/11_item_eqp_df.qli b/examples/CI-Eng-Sample/11_item_eqp_df.qli new file mode 100644 index 0000000..2261e16 --- /dev/null +++ b/examples/CI-Eng-Sample/11_item_eqp_df.qli @@ -0,0 +1,15 @@ +@LANGUAGE +ENGLISH + +@VERSION +1.03.00 + +! CI-Eng-Sample items connected to Modbus points (ITEM_DF STATION + POINT), CI Server R1.03.00 +@FIELDS +NAME,DESCRIPTION,ITEM_REP,VALUE_FORMAT,STATION,POINT + +@ITEM_DF +"CI-Eng-Sample.PLC1.SETPOINT","Setpoint written to holding register 1","Integer","99999","CIENG_PLC","SP" +"CI-Eng-Sample.PLC1.READBACK","Read back from input register 1","Integer","99999","CIENG_PLC","PV" +"CI-Eng-Sample.PLC1.CMD","Command written to coil 1","Boolean","","CIENG_PLC","CMD" +"CI-Eng-Sample.PLC1.FEEDBACK","Feedback read from input bit 1","Boolean","","CIENG_PLC","FB" diff --git a/examples/CI-Eng-Sample/80_remove_item_eqp_df.qli b/examples/CI-Eng-Sample/80_remove_item_eqp_df.qli new file mode 100644 index 0000000..cc9ec6b --- /dev/null +++ b/examples/CI-Eng-Sample/80_remove_item_eqp_df.qli @@ -0,0 +1,15 @@ +@LANGUAGE +ENGLISH + +@VERSION +1.03.00 + +! Remove the CI-Eng-Sample items connected to Modbus points +@FIELDS +NAME + +@ITEM_DF +"CI-Eng-Sample.PLC1.SETPOINT" +"CI-Eng-Sample.PLC1.READBACK" +"CI-Eng-Sample.PLC1.CMD" +"CI-Eng-Sample.PLC1.FEEDBACK" diff --git a/examples/CI-Eng-Sample/81_remove_modbus_station_df.qli b/examples/CI-Eng-Sample/81_remove_modbus_station_df.qli new file mode 100644 index 0000000..c5ff8ca --- /dev/null +++ b/examples/CI-Eng-Sample/81_remove_modbus_station_df.qli @@ -0,0 +1,21 @@ +@LANGUAGE +ENGLISH + +@VERSION +1.03.00 + +! Remove CI-Eng-Sample Modbus points, scan type and station (points first) +@FIELDS +NAME + +@MODBUS_POINT_DF +"CIENG_PLC:SP" +"CIENG_PLC:PV" +"CIENG_PLC:CMD" +"CIENG_PLC:FB" + +@MODBUS_STATION_DF +"CIENG_PLC" + +@MODBUS_SCAN_TYPE_DF +"CIENG_SCAN1S" diff --git a/examples/CI-Eng-Sample/82_remove_modbus_line_df.qli b/examples/CI-Eng-Sample/82_remove_modbus_line_df.qli new file mode 100644 index 0000000..d0a2ab8 --- /dev/null +++ b/examples/CI-Eng-Sample/82_remove_modbus_line_df.qli @@ -0,0 +1,12 @@ +@LANGUAGE +ENGLISH + +@VERSION +1.03.00 + +! Remove the CI-Eng-Sample Modbus line (after its stations) +@FIELDS +NAME + +@MODBUS_LINE_DF +"CIENG_MB_LINE" diff --git a/examples/CI-Eng-Sample/85_remove_auth_group_df.qli b/examples/CI-Eng-Sample/85_remove_auth_group_df.qli new file mode 100644 index 0000000..1ad82be --- /dev/null +++ b/examples/CI-Eng-Sample/85_remove_auth_group_df.qli @@ -0,0 +1,12 @@ +@LANGUAGE +ENGLISH + +@VERSION +1.03.00 + +! Remove the CI-Eng-Sample authorization group (remove its users first) +@FIELDS +NAME + +@AUTH_GROUP_DF +"CIENG_VIEWER" diff --git a/examples/CI-Eng-Sample/91_remove_item_df.qli b/examples/CI-Eng-Sample/91_remove_item_df.qli index d91a425..f67e82b 100644 --- a/examples/CI-Eng-Sample/91_remove_item_df.qli +++ b/examples/CI-Eng-Sample/91_remove_item_df.qli @@ -18,3 +18,4 @@ NAME "CI-Eng-Sample.SYSTEM.PING_LOCALHOST" "CI-Eng-Sample.SYSTEM.PROC_ALM" "CI-Eng-Sample.DEMO.COUNTER" +"CI-Eng-Sample.PLC1.COMM_OK" diff --git a/examples/CI-Eng-Sample/92_remove_section_df.qli b/examples/CI-Eng-Sample/92_remove_section_df.qli index d57a8e8..62fed29 100644 --- a/examples/CI-Eng-Sample/92_remove_section_df.qli +++ b/examples/CI-Eng-Sample/92_remove_section_df.qli @@ -12,5 +12,6 @@ NAME "CI-Eng-Sample.TANK1" "CI-Eng-Sample.PUMP1" "CI-Eng-Sample.SYSTEM" +"CI-Eng-Sample.PLC1" "CI-Eng-Sample.DEMO" "CI-Eng-Sample" diff --git a/examples/CI-Eng-Sample/README.md b/examples/CI-Eng-Sample/README.md index ab12d36..5212346 100644 --- a/examples/CI-Eng-Sample/README.md +++ b/examples/CI-Eng-Sample/README.md @@ -39,7 +39,7 @@ cmd /c "\examples\CI-Eng-Sample\remove.cmd" | `CI-Eng-Sample.SYSTEM.DISK_C` | Item, Real | Target for `intdskmon` (reports **used** %) | | `CI-Eng-Sample.SYSTEM.PING_LOCALHOST` | Item, Integer | Target for `inttcpmon` (1 = reachable) | | `CI-Eng-Sample.SYSTEM.PROC_ALM` | Item, Integer | Target for `intmon` (1 = `alm` process running) | -| `CI-Eng-Sample.PUMP1.RUNNING.RUN_SECONDS` | Sub-item, Integrator | Running time in seconds (adds value × seconds) | +| `CI-Eng-Sample.PUMP1.RUNNING.RUN_SECONDS` | Sub-item, Integrator | Running time in seconds (adds value × integration granule, `itm_int_secs` in `itm.sup`, default 1 s) | | `CI-Eng-Sample.TANK1.LEVEL.MAX` | Sub-item, Min-Max | Highest level seen | | `CI-Eng-Sample.DEMO` | Section | Tutorial examples | | `CI-Eng-Sample.DEMO.COUNTER` | Item, Integer | Counts 1…100, one step per second, written by `DEMO.INCR1` | @@ -47,8 +47,16 @@ cmd /c "\examples\CI-Eng-Sample\remove.cmd" | `CIENG_INCR` | Class (traditional) | Increments `DEMO.COUNTER`, wraps at 100; compiled on load | | `CI-Eng-Sample.DEMO.INCR1` | Object | Instance of `CIENG_INCR` | | `CIENG_EVENT` | Item storage group | Event/Item, lifetime 1 week, rollover 1 day | +| `CI-Eng-Sample.PLC1` | Section | Modbus loopback station | +| `CI-Eng-Sample.PLC1.COMM_OK` | Item, Boolean | Status item of station `CIENG_PLC` (1 = communicating, status 22 when off-scan) | +| `CI-Eng-Sample.PLC1.SETPOINT` / `.READBACK` | Items, Integer | Written to holding register 1 (`RO:1`) / read from input register 1 (`RI:1`), same memory | +| `CI-Eng-Sample.PLC1.CMD` / `.FEEDBACK` | Items, Boolean | Written to coil 1 (`DO:1`) / read from input bit 1 (`DI:1`), same memory | +| `CIENG_MB_LINE` | Modbus line (TCP/IP) | Equipment manager `EQPCIENG` (created and started by loading the line) | +| `CIENG_PLC` | Modbus station | Open Modbus/TCP to `localhost:5020`, unit 1, output method *On change and connect* | +| `CIENG_SCAN1S` | Modbus scan type | 1000 ms | +| `CIENG_VIEWER` | Authorization group | Read-only: `ITEM_READ`, `SECTION_READ`, `ALARM_CURRENT_READ`, `ALARM_CHRONO_READ`. No users are created by the sample. | -All items are internal (no station), so the project works without any PLC or simulator. +All items except `PLC1.*` are internal (no station). The `PLC1` station talks to CI Server's own Modbus slave mirror (see below), so no PLC is needed either. New items start with status 13 (`NOT INIT`) until a value is written. ## Files @@ -61,10 +69,29 @@ New items start with status 13 (`NOT INIT`) until a value is written. | `03_his_group_df.qli` | Item storage group (`HIS_GROUP_DF`) | | `04_item_his_df.qli` | Items in the storage group (`ITEM_HIS_DF`, name `:`) | | `05_trigger_df.qli`, `06_class_df.qli`, `07_object_df.qli` | Trigger group, class (source in the `METHOD` memo, `@"` … `"@`, `COMPILE` 1), object | -| `86_`…`92_remove_*.qli` | Names to delete, in reverse order | +| `08_auth_group_df.qli` | Authorization group (`AUTH_GROUP_DF`) | +| `09_modbus_line_df.qli`, `10_modbus_station_df.qli`, `11_item_eqp_df.qli` | Modbus line; station, scan type, points; items connected to points | +| `equipment/eqpciengslv_start.cmd`, `_stop.cmd` | Start/stop the Modbus slave mirror (copy to `tls\com`) | +| `80_`…`92_remove_*.qli` | Names to delete, in reverse order | | `load.cmd`, `remove.cmd` | Run the steps in the right order | | `monitoring/*.sup.txt` | Setup-file lines for the monitoring processes (not applied by `load.cmd`) | +## Modbus slave mirror (for station CIENG_PLC) + +`CIENG_PLC` reads and writes CI Server's own Modbus slave: `eqpmdcmem` (slave memory) and +`eqpmdcslvtcp` (Modbus TCP on port 5020). Without them the station reports bad communication +(`COMM_OK` = 0) but everything loads. To start them with CI Server, an administrator copies +`equipment/eqpciengslv_start.cmd` and `eqpciengslv_stop.cmd` to `%TLS_ROOT_PATH%\tls\com`; +for a quick test they can also be started by hand from a normal prompt: + +``` +start eqpmdcmem -n EQPMDCMEM +start eqpmdcslvtcp -n EQPMDCSLVTCP -p 5020 +``` + +Remove the two files from `tls\com` when the sample is removed. See skill `equipment`, task +`modbus-station.md`. + ## Monitoring processes (optional) `monitoring/` holds the lines to add to the setup files in `%TLS_ROOT_PATH%\tls\sup\` so that diff --git a/examples/CI-Eng-Sample/equipment/eqpciengslv_start.cmd b/examples/CI-Eng-Sample/equipment/eqpciengslv_start.cmd new file mode 100644 index 0000000..a334d51 --- /dev/null +++ b/examples/CI-Eng-Sample/equipment/eqpciengslv_start.cmd @@ -0,0 +1,5 @@ +@echo off +REM CI-Eng-Sample: start the Modbus slave mirror used by station CIENG_PLC. +REM Copy to %TLS_ROOT_PATH%\tls\com (administrator); equipment_start.cmd calls every eqp*start.cmd there. +start /B /NORMAL %TLS_ROOT_PATH%\tls\exe\eqpmdcmem.exe -n EQPMDCMEM +start /B /NORMAL %TLS_ROOT_PATH%\tls\exe\eqpmdcslvtcp.exe -n EQPMDCSLVTCP -p 5020 diff --git a/examples/CI-Eng-Sample/equipment/eqpciengslv_stop.cmd b/examples/CI-Eng-Sample/equipment/eqpciengslv_stop.cmd new file mode 100644 index 0000000..06ec4d9 --- /dev/null +++ b/examples/CI-Eng-Sample/equipment/eqpciengslv_stop.cmd @@ -0,0 +1,4 @@ +@echo off +REM CI-Eng-Sample: stop the Modbus slave mirror. +%TLS_ROOT_PATH%\tls\exe\durstp.exe -msk -t 10 -p EQPMDCSLVTCP +%TLS_ROOT_PATH%\tls\exe\durstp.exe -msk -t 10 -p EQPMDCMEM diff --git a/examples/CI-Eng-Sample/load.cmd b/examples/CI-Eng-Sample/load.cmd index eee7df1..bfa4197 100644 --- a/examples/CI-Eng-Sample/load.cmd +++ b/examples/CI-Eng-Sample/load.cmd @@ -15,3 +15,12 @@ rem Processing: trigger group, class (compiled on load via COMPILE = 1), object 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 +rem Authorization: read-only group (no users are created by the sample) +dssqld -i 08_auth_group_df.qli -l 08_auth_group_df.qlo +rem Equipment: Modbus loopback line, station, scan type, points, connected items. +rem The station needs the Modbus slave mirror (equipment\eqpciengslv_start.cmd, see README). +dssqld -i 09_modbus_line_df.qli -l 09_modbus_line_df.qlo +echo Waiting 15 seconds for equipment manager EQPCIENG to start... +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 diff --git a/examples/CI-Eng-Sample/remove.cmd b/examples/CI-Eng-Sample/remove.cmd index 36c1154..c354c05 100644 --- a/examples/CI-Eng-Sample/remove.cmd +++ b/examples/CI-Eng-Sample/remove.cmd @@ -5,6 +5,10 @@ rem Order: object, class, trigger group, storage links, stop + delete storage gr rem A storage group with an active unit cannot be deleted (HIS-E-GROUPHASUNT), so the rem group first gets a stop time one minute ahead; the script waits until it has passed. cd /d "%~dp0" +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 85_remove_auth_group_df.qli -l 85_remove_auth_group_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 diff --git a/knowledge/issues.md b/knowledge/issues.md index dcc9f36..03b91ac 100644 --- a/knowledge/issues.md +++ b/knowledge/issues.md @@ -19,21 +19,28 @@ development system (see "Test system" in `progress.md`); they do not exist on ot | ID | Date | Area | Issue | Status | Next step / resolution | Update on close | |---|---|---|---|---|---|---| -| 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. | open | 2026-09-30: 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-003 | 2026-09-30 | DATABASE (`dssqld`) | Filtered export (`dssqld -e .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`, `@`, 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 `@`; run `dssqld -e .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-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. | open | Added a 5 s pause in `load.cmd`. If it happens again, capture `04_item_his_df.qlo`. | `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. | open | Confirm with History Management (IM 36K10L20) in phase 9: how to load into older units, and whether a restart is really required. | `.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. | open | 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 -p` and a restart. Practice in phase 9. | `.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). | open | Confirm the disk value meaning and the path limit. | `.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 (web/OPC UA server?) | `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. | open | Identify in phase 7 (OPC Interface IM 36K10E20, Data Access IM 36K10L45). | `.claude/skills/installation-security/tasks/setup-check.md`; the phase 7 skill | | 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. | open | Confirm on a system with IT security applied. | `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. | open | Confirm with ITEM Service manuals (IM 36K10L35/L36) in phase 5: is there a scaling option for integrators? | `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` | | ISS-011 | 2026-09-30 | ITEM (blocking) | A write to a blocked item with `itmval -p` (without `-o`) is silently ignored: no error message, value unchanged. | open | Check in phase 5 whether any status/return code signals this. | `.claude/skills/system-management/tasks/read-write-item.md` | | ISS-012 | 2026-09-30 | CI Portal setup files | IM 36K10R10 §4.4 names the alarm item/display relation setup file `wfla_displays.sup`; the installed file is `wfla_display.sup` (no `s`). | closed | Closed 2026-09-30 (user decision: the installed software and files are the reference). The repo uses `wfla_display.sup`. | `knowledge/manuals/IM36K10R10-01EN.md` §4; `.claude/skills/portal-setup/tasks/read-setup-file.md` | | ISS-013 | 2026-09-30 | CI Portal setup files | Installed values differ from the defaults stated in IM 36K10R10 §4.4: `wfla_display.sup` `DUR_QUEUE_SIZE = 1000` (manual 500 kB); `wflgdi.sup` `DUR_QUEUE_SIZE = 252` (manual 1000 kB); `wfla_display.sup` and `wflcdi.sup` set `TIMER_INTERVAL = 10` (manual: 1 s when not set). | closed | Closed 2026-09-30 (user decision: the installed software and files are the reference). The repo quotes the installed values as defaults. | `knowledge/manuals/IM36K10R10-01EN.md` §4 | | ISS-014 | 2026-09-30 | CI Portal setup files | `jwuiisg.sup` has a *Security* tab (`SECURITY_ENABLED`, `CORS_ENTRY`, `HEADER_ENTRY`) that IM 36K10R10 §4.3 does not describe. | closed | Closed 2026-09-30 (user decision: the installed software and files are the reference). Documented from the file's own `!KEYWORD`/`!HELP` text. Installed CORS allows all origins (`allowedOrigins "*"`); tightening it is a site security decision. | `knowledge/manuals/IM36K10R10-01EN.md` §4.3 | | 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. | open | 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. | `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. | open | 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 = , , , …`), 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). | `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. | open | 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 = , , , …`), 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. | `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`. | open | Installed software is the reference: use `CI_NO_LOGIN`. Still to check: behaviour of a *No* login when that user does not exist (manual: no profile applied). Covered again in phase 13 (IM 36K10J40). | `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-020 | 2026-09-30 | DATABASE (`dssqld`) | `dssqld -i "\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). | open | Find the exact limit (79/80 characters?) and whether `-l` and `-e` paths are also cut. Until then: `cd` to the folder and use short relative names. | `.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). | open | Check whether records appear after a full hour with a communicating station, or whether the dataset is read another way (e.g. Engineering Module, report). | `knowledge/manuals/IM36K10L40-01EN.md` §2 | +| ISS-022 | 2026-09-30 | ITEM (`itmval -f`) | `itmval -f 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 ` 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. | `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-024 | 2026-09-30 | EQUIPMENT (Modbus slave) | IM 36K10L41 §3.7 says `EQPMDCSLVTCP` waits for "MODBUS RTU requests via TCP/IP" and the CI Server master should use "MODBUS RTU via TCP/IP". A Modbus master station with `PROTOCOL = RTU` to `eqpmdcslvtcp` (port 5020) got no answer (`EQP-E-TCPRCVTMO`, 4 requests, 0 valid); with `Open Modbus/TCP` it worked at once. | closed | Closed 2026-09-30 (user decision: installed software is the reference). Use `Open Modbus/TCP` towards `eqpmdcslvtcp`. | `knowledge/manuals/IM36K10L41-01EN.md` §3.7; `.claude/skills/equipment/tasks/modbus-station.md` | diff --git a/knowledge/manuals/IM36K10C10-01EN.md b/knowledge/manuals/IM36K10C10-01EN.md new file mode 100644 index 0000000..a0dbc2d --- /dev/null +++ b/knowledge/manuals/IM36K10C10-01EN.md @@ -0,0 +1,247 @@ +--- +manual: IM 36K10C10-01EN +title: Engineering Module - I/O Processes +edition: 3rd Edition, Sep. 2023 +version: R1.03 +status: from docs; setup files and default datasets (users, authorization groups, schemes, trigger groups) checked read-only on the test system (2026-09-30) +--- + +# Engineering Module - I/O Processes (R1.03) + +The Engineering Module (Java GUI) defines what CI Server knows: users and rights, sections, +items and sub-items, equipment (lines, stations, points, scan types), item statuses, classes, +sequences and trigger groups. Section numbers refer to the manual. Command-line equivalents +used in this repo are given where they exist (quick load with `dssqld`, dataset names from +`dssqld -f`). + +## 1. Window (§1) + +Menu bar, toolbar, configuration tree (left), work area with property sheets, message area and +edit history (undo/redo of edits). +- *View → List*: List Items (item search), List Objects, item list of a section with values, + record layout list. +- *Archive*: automatic/manual archive, retrieve, mount/initialize/register storage media + (history, phase 9). +- *Playback*: record Engineering Module operations and open the recording viewer. +- Configuration tree areas: sections and items; I/O processing (equipment, classes, …); + alarms; reports; history; authorization; references. + +## 2. Authorization (§2) + +**Login setup lives in `dssana.sup`** (Setup File Editor), on **CI Core**, so each CI Portal / +user interface combination can have its own login method (tab *Login control*, +`LOGIN_METHOD = , , , , `). It also holds single sign-on, Active Directory and password rules (§2.1.1, §2.2). + +Login methods: + +| Method | Behaviour | +|---|---| +| Automatic | Windows user name = CI Server user name; no password | +| Manual CI Server | CI Server login form; user must exist in CI Server | +| Manual OS | Windows login form; with AD on, AD attributes pick the CI Server profile; with AD off the Windows name (without domain) must exist as CI Server user | +| No | No login; a no-login profile is applied. Only on CI Portal itself, not remote CI View. Protect that profile with a password. | +| SSO | AD single sign-on, no credentials; if SSO is off in `dssana.sup`, falls back to Manual CI Server | +| Deny | The user interface cannot be started | + +With AD, a user in several groups gets the merged profiles (priority per profile). If no users +exist yet, the Engineering Module asks you to define one instead of logging in. + +Test system (`dssana.sup` installed values): local Engineering/Edit Module, Operator +Interface etc. use **SSO**; remote Playback Viewer, Quickload and Display/Symbol utilities are +**Deny**; OPC UA/ODBC use *Manual CI Server*. The no-login profile named there is +`CI_NO_LOGIN` (the manual says `FT_NO_LOGIN`, ISS-018); no user of that name exists on the +test system. + +**Enterprise engineers (§2.3)** may maintain only their area: sections and everything in them, +definitions and deployments, authorization data, and equalization — and can deploy to a +server only if they have write rights there (e.g. on `ITEM_DF`). + +**Authorization groups (§2.4)** (`AUTH_GROUP_DF`, actions in `AUTH_ACTION_DF`): a group is a +list of allowed actions. Most are `_` for a dataset +category (e.g. `ITEM`, `SECTION`, `STATION`, `CLASS`, `OBJECT`, `USER`, `AUTH_GROUP`, +`TRIGGER_GROUP`, `HIS_GROUP`, `REPORT`, `DISPLAY`, `ALARM_*`, `AUD*`). Others are single +actions, e.g. `ITEM_MODIFY_VALUE`, `ITEM_MODIFY_LIMIT_HIGH`, `ITEM_MODIFY_BLOCKED_VALUE`, +`ITEM_ACK_ALARM`, `SECTION_BLOCK_UNBLOCK`, `STATION_ON_OFF_SCAN`, `ALARM_CURRENT_ACK`, +`REPORT_GENERATE_ADHOC`, `SYS_LOG_READ`, `EXECUTE_GENERAL_COMMANDS`, +`HIS_GROUP_FORCE_ROLLOVER`. Installed also: `AGGREGATION_OVERWRITE_*` (not in the manual). +Default groups on R1.03: `SYSTEM_MANAGER`, `ENGINEER`, `OPERATOR` (process areas 1–999) and +`GUEST`. + +**Users (§2.5)** (`USER_DF`); changes apply at the user's next login. Tabs: +- *General*: name, description, password (≤ 31 characters, case-sensitive), enterprise user + (must be deployed to every CI Core where needed), authorization group, process areas + (1–999, lists/ranges like `3 5 8 10-19`), locale (`en-US`, `ja-JP`; blank = Windows). +- *Directory services*: AD group mapping and profile priority (higher wins when merging). +- *Alarming*: alarm selection area, alarm shelving group. +- *Operator Interface*: logoff timeout (min, 0 = off), deployment folder (default + `%TLS_WAP_PATH%\cfg\operatorInterfaces\DEPLOY`), layout, initial display. +- *Destinations*: user's report printer for on-demand reports. +- *Playback*: recording on/off/"HMI Client dependent" (then set in + `%TLS_WAP_PATH%\cfg\playback\playback.xml` per client, application and user), and whether the + user may switch recording, change its properties, view, play all users' recordings, export. +Default users on R1.03: `ADMIN` (SYSTEM_MANAGER), `ADMINE` (enterprise admin), `OPER`, and +`CI_NO_LOGIN_OPCUAS` (anonymous OPC UA). + +**Schemes (§2.6)** (`SCHEME_DF`) hide Engineering Module folders and fields a project does not +need. Activating one restarts the Engineering Module (OK/Apply do not activate). Tabs: General +(multi-language, OPC server, playback, enterprise), I/O processing (PIT filter, STX-Bachmann, +hide item statuses), Alarming (e-mail notification, AOI, ASA, first-out, collection, groups, +diagnostic flag, OPC AE detection, predefined ack types only), Processing (control item, +sequences, priorities, extended reset, predefined trigger groups only), Reporting (item +trigger, priorities, lifetime), Historization (external archive, warning time, non-item +groups, direct storage), Authorization (process areas, predefined groups only). Installed: +`STARTER`, `STANDARD`, `ADVANCED`, none active. + +## 3. Items (§3) + +**Concepts (§3.1)**: an item holds value plus conversion, format, alarm parameters, I/O +authority, application info and status. Name `Section[.Sub-section…].Item`, max **255 bytes** +(multi-byte characters count more). An item can be connected to one I/O point on a station. +Raw values are converted to engineering units (e.g. linear `f(x)=ax+b` from electrical to +physical limits; overflow/underflow and a DELTA change limit give statuses; other conversions: +IM 36K10L41). + +**Limits and deadband**: up to four limits (none, H+L, or all four) plus one deadband on the +normal side; statuses LOWLOW, LOW, NORMAL, HIGH, HIGHHIGH. Scale high/low give +OVERRANGED/UNDERRANGED and override limit statuses. Booleans get status TRUE/FALSE +(BOOLEAN 1/0). + +**PIT filter** (reduces history events; used only if the application honours it): an update +passes when `(P OR I) AND NOT T`. +- P: |new − reference| > P. +- I: integral of (sample − reference) × seconds > I (1 s resolution). +- T: for T seconds after a pass, nothing passes. +- Each pass sets a new reference. + +**Sub-items (§3.2)**: Integrator, Pulse counter (Boolean main item, counts 0→1), Min/Max +indicator (runs until reset), Rate of change (time unit day/hour/minute/second chosen per +sub-item), Type-less (a free Real item written by PROCESS/REPORT services or applications). +- **Integrator**: `new = (t_now − t_prev) × previous value + old`, evaluated every second; + negative values subtract. The result is divided by the **integration granule** + `itm_int_secs` in `itm.sup` — **system-wide**, default and test-system value 1 (seconds); + 3600 gives hours (answers ISS-010). +- Sub-items have no Equipment tab and are **not** blocked with their main item. + +**Defining (§3.3)** — right-click node/section → Add. Sections: name cannot be changed (delete +and recreate; only possible when empty), new sections are UNBLOCKED; fields Blocked, Visible +via OPC, Alarm inhibit, plus read-only parent flags. Nesting is limited by the 255-character +path. Blocking a large section can take long. + +Item form tabs: General, Item Management, Limits and filtering (not for Boolean), Equipment, +Alarm (only if alarming on), Area of interest. Item name (tag): letters, digits, `_` +recommended; tag and type cannot be changed (delete and recreate). +- *General*: engineering units, value format (`9`, `0`, `+`, `.`, `EEEE`, date/time codes + `D DD M MM MMM Y YY YYYY h hh mm ss p`, `\` escapes a letter), representation (Boolean, + Integer 32-bit, Real 64-bit, String), alarming, audit trailing, *remember last value + immediately* (keep value/status/quality over a warm restart instead of NOT INIT), process + areas, comment 1/2, map position (WGS 84 latitude/longitude). +- *Item management*: blocked, OPC visible (+ read/write; also needs the section visible), + alarm inhibit, parent flags, data exposure aggregation interval (60 s–7 days, 0 = off). +- *Limits and filtering*: HH/H/L/LL, deadband (values may be rounded), scale high/low, limit + clamping (HH-LL, H-L, scale, none), out-of-range support, trend axis limits, PIT values. + String items: max length, default 80. The manual says max 100; the installed software + accepts 1–200 and stores length − 1 characters, cutting longer values with status 12 + OVERRANGED (verified, ISS-019). +- *Equipment*: pick an existing I/O point of a station, or define a new point here (created + with the item; delete it yourself when deleting the item). No connection = internal item. +- *Alarming*: OPC AE detection (AE station/event source) or CI Server detection, diagnostic + item, acknowledgment type, alarm collection, first-out group/item, delay time, repeat time, + per-status alarm state (None, Normal, Alarm 1–3), priority 0–15 (15 highest unless + `alm.sup` inverts it), text, colour, mnemonic, shelve enable. Ack types, collections and + first-out groups must exist first. +- *Areas of interest*: up to 16 labels used to filter alarms. + +**Blocking and offline (§3.4)**: blocked (manual, per item/sub-item, nested section or top +section) and offline (station connection lost) items are not updated by equipment. Unblocking +a section leaves items that were blocked individually still blocked. + +**Update value (§3.5)** (= `itmval -p`): value, status, quality code, *Overwrite blocked* +(= `itmval -o`), lock (user/terminal). **Option bits** (explains the `blk`/`off`/`uoff`/`ublk` +flags of `itmval -g`, ISS-001): + +| Bit | Value | Meaning | +|---|---|---| +| 0 | 1 | Blocked | +| 1 | 2 | Offline (no connection to equipment) | +| 2 | 4 | **Updated offline**: written by an application (object, this form, `itmval`) while offline | +| 3 | 8 | Acknowledged (last alarm event) | +| 4 | 16 | **Updated blocked**: written by an application while blocked | +| 5 | 32 | Direct alarm (alarm state reached, delay running) | +| 6 | 64 | Delayed alarm (after the delay; set together with bit 5) | + +Also on the form: force to normal / force to alarm, priority, colour, mnemonic, text. + +## 4. I/O processing (§4) + +**Equipment (§4.1)**: *lines* (protocol/connection), *stations* (controllers, identified +internally by equipment manager + slave number; up to 4095 per manager) and *points* (I/O +addresses). Details per station type: IM 36K10L40/L41. +- Station form: line, redundant lines and TCP/IP addresses, preferred line; **On scan** + (off-scan stops input updates for the whole station — cheaper than blocking each item; + outputs continue), **Suppress outputs**, output method (on change / on change and connect); + status items: general communication (1 good, 0 bad, status OFFSCAN when off-scan), line 1, + line 2 (typeless sub-items show sub-line states for Modbus TCP), line selection. +- Scan types (`SCAN_TYPE_DF`): name + interval (ms); intervals are multiples of the equipment + manager's tick. PLC reads are grouped using *maximum gap* and *maximum size*. +- *All equipment definitions* shows lines, stations, points and scan types read-only; + editing is done under each plug-in's own tree node. Points created from an item form are + shown as `[]`. + +**Item statuses (§4.2)** (`STATUS_DF`): numbers 0–255 mapped to a system text (fixed), +description (user text), mnemonic, alarm priority, alarm state, colour, shelve enable. +**100–127 are free**; the rest are reserved (34–99 and 128+ used for DCS/batch/HAC interfaces). +Common ones: 1 CALCULATE, 3 BLOCKED, 4/5 BOOLEAN 0/1, 6 UNDERRANGED, 7 LOW LOW, 8 LOW, +9 NORMAL, 10 HIGH, 11 HIGH HIGH, 12 OVERRANGED, 13 NOT INIT, 14 OFFLINE, 15 UPD OFFLINE, +16 UPD BLOCKED, 21 DELTA, 22 OFFSCAN, 23 OUT_SUPR, 24 BAD VALUE. + +**Classes (§4.3)** (`CLASS_DF`): templates in the PROCESS Service traditional language +(IM 36K10P10) or Java (IM 36K10P11); the language is fixed once created and the two cannot +reference each other. Changing a class needs a **reset** before objects use it. + +**Sequences (§4.4)** (`SEQUENCE_DF`): a one-off program (class and object in one) tied to a +**control item**; traditional language only. Compile, then set activation time, trigger +interval (or trigger once / event-driven `TRIGGER` on TIMER or ITEM), deactivation time, +daylight-saving correction. Blocking the control item puts the sequence off-line; the `STEP` +variable is the control item's value. Classes are preferred for maintainability. + +**Trigger groups (§4.5)** (`TRIGGER_DF`): name (≤ 15 characters, letter first, then letters, +digits, `_`), activation time (immediate or date), deactivation (infinite or date), trigger +once or interval (seconds … years), daylight-saving correction. Triggers fire at activation +time + n × interval. Editable except the name; deletable only when unused. Installed defaults: +`ONCE`, `ONE_SECOND`, `TWO_SECONDS`, `FIVE_SECONDS`, `TEN_SECONDS`, `THIRTY_SECONDS`, +`ONE_MINUTE`, `TWO_MINUTES`, `FIVE_MINUTES`, `TEN_MINUTES`, `THIRTY_MINUTES`, `ONE_HOUR`. + +## 5. Class and object engineering (§5) + +Flow: trigger group → class (code, compile) → object → test → (symbol → display → test). +PROCESS Service runs at 1-second resolution at best. +- **Class** (§5.2): name ≤ 15 characters (letter first); language; priority (load balancing, + ranges set in the PROCESS Service setup file); *Extended reset enabled*. Code tab (template, + Compile after reopening the form), Listing tab (errors start `**** ERROR:`; double-click to + jump), Trigger Groups tab. +- **Object** (§5.3): created under a section like an item; node (blank = local / control + item's node), priority 0–999 (0 = class priority), class, optional **control item** (object + runs when its status is on-line; BLOCKED disables methods; `STEP` = its value), map + position, up to 99 attribute prompts. Item management: *Items may exist* (reuse existing + items with identical attributes), *Leave items* (keep created items when deleting the + object), blocked, OPC visible, alarm inhibit. Object trigger groups override the class's. +- **Testing** (§5.4): `PRINT` statements go to the message log (remove afterwards); right-click + object → *Debug* collects a trace (triggers, methods, changed signals/attributes) shown when + debug is switched off. +- **Reset** (§5.5): compiled changes take effect only after resetting the class (all objects) + or single objects; control may be lost briefly; there is no indication which objects were + reset. *Normal reset* for body changes; *extended reset* when the **signature** changes + (traditional: prolog section; Java: attribute/signal declarations or `create()`); it may + create/modify/delete signal items. If the compiler misses a signature change, force it + (*Extended reset forced*). +- **Symbols** (§5.6–5.9): a symbol can be tied to a PROCESS Service class; its component + properties connect to class signals (e.g. fill colour via a threshold table); on a display + each symbol instance is pointed at an object (Edit Module, phase 10). + +## Differences from the installed software + +Logged in `knowledge/issues.md`; the installed software is taken as right: +- ISS-018: no-login profile `CI_NO_LOGIN` (manual: `FT_NO_LOGIN`). +- ISS-019 (closed): string item maximum length is 200 in the software (manual: 100; Tutorial: 168). +- Installed authorization actions include `AGGREGATION_OVERWRITE_*`, not listed in §2.4. diff --git a/knowledge/manuals/IM36K10G10-01EN.md b/knowledge/manuals/IM36K10G10-01EN.md index 5410079..d616f86 100644 --- a/knowledge/manuals/IM36K10G10-01EN.md +++ b/knowledge/manuals/IM36K10G10-01EN.md @@ -36,7 +36,9 @@ Module and Operator Interface. **Items (ch. 3)** - Full name `Section.Sub-section.Item` (max 255 bytes; no `:` or `.` inside a name; case insensitive). Sections can be blocked as a whole, e.g. for maintenance. -- Types: Boolean, Integer, Real, String (max length 80 by default, up to 168 without audit). +- Types: Boolean, Integer, Real, String (the Tutorial says max length 80 by default, up to 168 + without audit; the installed R1.03 allows `STRING_LENGTH` 1–200 with or without audit and + holds length − 1 characters, verified, ISS-019). - Four limits (LL, L, H, HH) plus a deadband set the status LOWLOW…HIGHHIGH; the deadband sits on the normal side of each limit. Scale high/low give OVERRANGED / UNDERRANGED. Booleans set status TRUE/FALSE. @@ -101,7 +103,7 @@ history storage groups and archiving (phase 9). | Tutorial step | Done with | Result | |---|---|---| | Sections and items (3.2) | `dssqld -i` `SECTION_DF`, `ITEM_DF` | loaded | -| Sub-items (3.2.3) | `SUB_ITEM_DF` | Min-Max keeps the maximum; **Integrator adds value × seconds; `TIME_UNIT` has no effect** | +| Sub-items (3.2.3) | `SUB_ITEM_DF` | Min-Max keeps the maximum; **Integrator adds value × integration granule (`itm_int_secs` in `itm.sup`, default 1 s, system-wide); `TIME_UNIT` has no effect** (ISS-010) | | Block item (3.3) | `dssqld -m` `ITEM_DF` `BLOCKED` 1/0 | option flag `blk` (status stays 9); writes without `-o` are **silently ignored**; after unblocking the flag `ublk` appears | | Trigger group (5.1) | `TRIGGER_DF` (`TRIGGER_INTERVAL` "1 seconds") | loaded | | Class (5.2) | `CLASS_DF` with `METHOD` memo and `COMPILE` 1 | compiled on load | diff --git a/knowledge/manuals/IM36K10L35-01EN.md b/knowledge/manuals/IM36K10L35-01EN.md new file mode 100644 index 0000000..2037156 --- /dev/null +++ b/knowledge/manuals/IM36K10L35-01EN.md @@ -0,0 +1,103 @@ +--- +manual: IM 36K10L35-01EN +title: ITEM Service Engineering - ITH +edition: 3rd Edition, Sep. 2023 +version: R1.03 +status: from docs; installed ITH processes (item_start.cmd), setup files itheex.sup and itheix.sup checked read-only on the test system (2026-09-30); ithloahis practiced in phase 1 +--- + +# ITEM Service Engineering - ITH (R1.03) + +ITH is the item-history part of ITEM Service: it gathers item values from ITM and stores and +retrieves them for the storage (history) groups that HISTORY Service manages. Section numbers +refer to the manual. Storage groups themselves: phase 9 (IM 36K10L20, C40). + +## 1. Processes and data (§1) + +- **Collection/storage types** and their processes: + +| Group type (collection/storage) | Store process | Retrieve process | +|---|---|---| +| SCAN / TIME | `ITHSTX` (more: `ITHST2`…, setup key `task`) | `ITHRTT` | +| SCAN / ITEM | `ITHSIX` | `ITHRTI` | +| EVENT / EVENT | `ITHEEX` | `ITHRTE` | +| EVENT / ITEM | `ITHEIX` (not described in the manual; used by CI-Eng-Sample `CIENG_EVENT`) | `ITHREI` | +| DIRECT / EVENT (values from applications, e.g. an equipment manager reading history from the field) | `ITHSDE` | `ITHRDE` | +| DIRECT / ITEM | `ITHSDI` | `ITHRDI` | + +- `ITHSER`: one per node (normally the host). Group definition (with HIS) and retrieval: + finds the item's groups, picks the **highest-priority** group, finds the first unit in the + time window and hands the request to a retrieve process. Keeps the item directory. +- `ITHDBG` debugger, `ITHRECOVER` repair. +- Start/stop lists: `tls\com\item_start.cmd` / `item_stop.cmd`; processes for unused types can + be removed there. **Installed R1.03 start list**: `ithser`, `itheex`, `itheix`, `ithstx`, + `ithsde`, aggregation `ithsag` and retrieve processes in **two instances each** + (`ithrte00/01`, `ithrei00/01`, `ithrag00/01`, `ithrtt00/01`, `ithrde00/01`). Not started: + `ithsix`, `ithrti`, `ithsdi`, `ithrdi`. + +**Files** (in the history/data folders; do not delete): +- `ith_itmdir.dat` item directory (item, id, time window, group, priority). +- Group description `hnnggg000000.dat`, unit descriptions `hnnggguuu000.dat` (a new one on + every group change, so old compositions stay readable), unit data `hnnggguuuddd.dat` (a new + one at each start/rollover). `nn` node, `ggg` group, `uuu` unit, `ddd` data sequence. +- Record layouts: time-based (one scan of many items per record, split into file groups), + item-based (many scans of one item), event-based (one event per record). **Events older + than 60 units cannot be stored.** + +## 2. Setup files (§2) + +Each process reads `.sup` (missing → error in `umhlog`). +- `ithser.sup`: `agg_hour_method` (hourly aggregate labelled by start or end of hour, default + start), `his` (HIS address), `con_timeout` (group configuration lock, default 8 min), + `his_path`, `sh_path` (default history and shadow paths), `his_mod` (allow modifying + `ITEM_HISTORY` data via the API). +- `ithstx.sup` / `ithsix.sup`: `his`, `task`, `run_interval` (heartbeat, ≤ 1/10 of the + shortest scan interval), `max_recsize`, `itms_a_rscan`/`itms_a_dscan` (items per ITM + lock, ~50), `itms_a_rrun`/`itms_a_drun` (items per heartbeat, limits CPU peaks), + overheads; ITHSIX also `max_total_buf`, `max_grp_buf` (memory in 28-byte blocks). +- `itheex.sup` (test system values): `run_interval = 600` s, `buffer_size = 10` events, + `event_timeout = 1` s, **`gap_time = 2880` min**, `queue_size = 750` KB, optional + `overflow_item` (counts/toggles on queue overflow). +- `itheix.sup` (not in the manual; test system): `run_interval = 60`, `buffer_size = 20`, + `event_timeout = 1`, **`gap_time = 2880` min**, **`max_sample_delay = 14400` min**, + `max_samples_queued = 25` (million), `max_open_files = 10`, `queue_size = 2000`. +- `ithsde.sup` / `ithsdi.sup`: `his`, `task`, `max_open_files` (10), `max_recsize` (4000), + `gap_time` (60 min). + +## 3. `ithrecover` (§3) + +`ithrecover [-v] [-p]` repairs the relations between item definitions, group +descriptions, the item-in-use list and the item directory (trusting item definitions and group +descriptions). Needs HISTORY Service and ITHSER running, no group configuration in progress. +`-p` extends the item directory into the past for history migration (advanced; with product +support). + +## 4. `ithdbg` (§4) + +Menu: 1 group contents, 2 item directory, 3 unit data file dump, 4–18 global/group info of +each ITH process, 20 retrieve history, 80 stop a process, 90 log to file, −1 exit. Group names +are case-sensitive. + +## 5. `ithloahis` item history loader (§5) + +`ithloahis -f [-v] [-l] [-i] [-s
] [-t GMT|LST|LCT]` loads CSV history into +EVENT/EVENT and EVENT/ITEM groups (not SCAN). Groups and items must exist. `-i` also writes +the value to the item (e.g. to trigger alarms). Formats: `SCAN, item1, item2` header then +`time, v1, v2` rows (blank = no sample), or `EVENT` header then `time, item, value` rows. +Time as `29-Apr-14 11:48:17.452`, `29-04-2014 11:48:18.452` or UTC seconds. Practiced: skill +`system-management`, task `load-history.md`. + +**Loading older history (migration)**: +1. Raise `gap_time` in `itheex.sup` (EVENT/EVENT) or `gap_time` and `max_sample_delay` in + `itheix.sup` (EVENT/ITEM) beyond the age of the oldest sample (5 years ≈ 2,628,000 min); + note the old values; restart CI Server. +2. Create the group, add all items, start it immediately. +3. Create earlier unit files: `hisdbg` option 3 for unit info; copy unit files to + `%TLS_HIS_PATH%\has`, delete the unit (`hisdbg` 4), copy back, set times with + `hisrecover .his "" ""`, create the next with `isfrename`, + repeat until the original second unit's start time. +4. `ithrecover -p`, restart CI Core. +5. `ithloahis -f `. +6. Restore the setup values and restart. +This explains why samples older than the current unit were not stored in phase 1 +(`knowledge/issues.md` ISS-006). From an older CI Server version use `ITHIMPORT` instead. diff --git a/knowledge/manuals/IM36K10L36-01EN.md b/knowledge/manuals/IM36K10L36-01EN.md new file mode 100644 index 0000000..379cb0f --- /dev/null +++ b/knowledge/manuals/IM36K10L36-01EN.md @@ -0,0 +1,81 @@ +--- +manual: IM 36K10L36-01EN +title: ITEM Service Engineering - ITM +edition: 3rd Edition, Sep. 2023 +version: R1.03 +status: from docs; itm.sup, item_start.cmd and itmdbg statistics checked on the test system (2026-09-30); itmval -g/-p verified in phase 1; itmval -f crashes (ISS-022) +--- + +# ITEM Service Engineering - ITM (R1.03) + +ITM is the real-time item database (item common, shared memory). Section numbers refer to the +manual. + +## 1. Processes (§1.1–1.2) + +| Process | Role | +|---|---| +| `ITM` | item handler, message interface | +| `ITMTIM` | sends buffered item events; recalculates integrators | +| `ITMCPM` / `ITMCPS` | item copy master / slave for distributed items between nodes (buffered, compressed; after a lost MDUR link it rescans all or only changed master items in limited batches). Restart `ITMCPM` after deleting a distributed group. | +| `ITMLIMUPD` | copies limit/deadband changes to other nodes | +| `ITMREM` | cleans up event requests of processes that disappeared | +| `itmval` | command-line get/put | + +`itmtim [] [] []`: +save count = integrators saved to disk per recalculation. **Installed** `item_start.cmd` +starts `itmtim 100 1000 1 200 1` (five arguments; the last two are not documented). Also +started: `itmaah`, `intitmini`, `itmlimupd`, `itmrem`. + +## 2. `itm.sup` (§1.3) + +| Setting (keyword) | Manual default | Test system | +|---|---|---| +| Queue size (`queue_size`) | 200 KB | 200 | +| Save items (`item_save`): ITEM_BASE (per item's *remember last value*), ALWAYS, NEVER | ITEM_BASE | ITEM_BASE | +| Max item groups (`max_groups`) | 255 | 255 | +| Max items per group (`max_number`) | 65534 (255 × 65534 = 16,711,170 items) | 65534 | +| Max application info per item (`max_appl_info`) | ≤ 20 bytes always fits | 0 | +| Max update info per item (`max_upd_info`) | 512 | 512 | +| Item pool size (`pool_kbytes`), guide `0.07 × groups × items + appl KB × groups × items + 10` | **50000 KB** | **650000** | +| Integration granule (`itm_int_secs`), system-wide integrator time unit | 1 s | 1 (60 tested, ISS-010) | +| Lock timeout (`lock_timeout_secs`) | 60 s | 60 | +| Save to disk (`disk_save`) | YES | yes | +| Not regained (`not_regained`): after start, mark possibly stale values until the first update; hidden in trends | not described | no (default block) | + +## 3. `itmval` (§1.4) + +``` +itmval -g [-l] -n +itmval -p [-l] -n [-v ] [-s ] [-q ] [-o] [-t []