From 8b5ed97db291734a9ac268d3f07f93ebc711766c Mon Sep 17 00:00:00 2001 From: cliu Date: Thu, 1 Oct 2026 11:41:45 +1000 Subject: [PATCH 1/3] Add alarm definitions and TANK1.LEVEL alarming to CI-Eng-Sample Co-Authored-By: Claude Opus 5.5 --- examples/CI-Eng-Sample/01b_alarm_df.qli | 33 +++++++++++++++++++ examples/CI-Eng-Sample/16_item_alarm_df.qli | 13 ++++++++ examples/CI-Eng-Sample/93_remove_alarm_df.qli | 18 ++++++++++ examples/CI-Eng-Sample/README.md | 18 ++++++++-- examples/CI-Eng-Sample/load.cmd | 4 +++ examples/CI-Eng-Sample/remove.cmd | 2 ++ 6 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 examples/CI-Eng-Sample/01b_alarm_df.qli create mode 100644 examples/CI-Eng-Sample/16_item_alarm_df.qli create mode 100644 examples/CI-Eng-Sample/93_remove_alarm_df.qli diff --git a/examples/CI-Eng-Sample/01b_alarm_df.qli b/examples/CI-Eng-Sample/01b_alarm_df.qli new file mode 100644 index 0000000..420664b --- /dev/null +++ b/examples/CI-Eng-Sample/01b_alarm_df.qli @@ -0,0 +1,33 @@ +@LANGUAGE +ENGLISH + +@VERSION +1.03.00 + +! Alarm definitions used by TANK1.LEVEL (16_item_alarm_df.qli). Load before the items refer to them. +! Acknowledgement type: every alarm needs a manual acknowledgement; a return to normal is +! acknowledged automatically only if the alarm was acknowledged (same matrix as MANUAL). +! Field _: from state N/A1/A2/A3 with Ack/Nack, to state N/A1/A2/A3; 1 = automatic. +! Unlisted matrix fields default to 0 (manual). +@FIELDS +NAME,DESCRIPTION,EAL_ACK,NA_N,NN_N,A1A_N,A2A_N,A3A_N + +@ALARM_ACK_DF +"CIENG_ACK","CI-Eng-Sample: manual ack; auto ack on return to normal if acked",0,1,1,1,1,1 + +! Area of interest (alarm grouping for displays and destinations) +@FIELDS +NAME,DESCRIPTION + +@ALARM_AOI_DF +"CIENG_TANKS","CI-Eng-Sample tank items" + +! Alarm selection area, compiled on load (COMPILE = 1). Keywords and operators need spaces. +@FIELDS +NAME,DESCRIPTION,COMPILE,EXPRESSION + +@ALARM_ASA_DF +"CIENG_TANK1","Alarms of section CI-Eng-Sample.TANK1",1,\ +@" +/* Alarm selection area : CIENG_TANK1 */ +SECTION = "CI-Eng-Sample.TANK1""@ diff --git a/examples/CI-Eng-Sample/16_item_alarm_df.qli b/examples/CI-Eng-Sample/16_item_alarm_df.qli new file mode 100644 index 0000000..d005d47 --- /dev/null +++ b/examples/CI-Eng-Sample/16_item_alarm_df.qli @@ -0,0 +1,13 @@ +@LANGUAGE +ENGLISH + +@VERSION +1.03.00 + +! Switch on alarming for TANK1.LEVEL (limits 10/20/80/90 come from 02_item_df.qli). Load with dssqld -m. +! Status and alarm state come from STATUS_DF: > 80 HIGH (Alarm 2, prio 2), > 90 HIGH HIGH (Alarm 3, prio 1). +@FIELDS +NAME,ALARMING,ACKN_TYPE,AOI_1 + +@ITEM_DF +"CI-Eng-Sample.TANK1.LEVEL",1,"CIENG_ACK","CIENG_TANKS" diff --git a/examples/CI-Eng-Sample/93_remove_alarm_df.qli b/examples/CI-Eng-Sample/93_remove_alarm_df.qli new file mode 100644 index 0000000..0345018 --- /dev/null +++ b/examples/CI-Eng-Sample/93_remove_alarm_df.qli @@ -0,0 +1,18 @@ +@LANGUAGE +ENGLISH + +@VERSION +1.03.00 + +! Remove CI-Eng-Sample alarm definitions (after the items: an acknowledgement type in use cannot be deleted) +@FIELDS +NAME + +@ALARM_ASA_DF +"CIENG_TANK1" + +@ALARM_AOI_DF +"CIENG_TANKS" + +@ALARM_ACK_DF +"CIENG_ACK" diff --git a/examples/CI-Eng-Sample/README.md b/examples/CI-Eng-Sample/README.md index 5f84a03..88a18c4 100644 --- a/examples/CI-Eng-Sample/README.md +++ b/examples/CI-Eng-Sample/README.md @@ -31,7 +31,7 @@ cmd /c "\examples\CI-Eng-Sample\remove.cmd" |---|---|---| | `CI-Eng-Sample` | Section | Top level | | `CI-Eng-Sample.TANK1`, `.PUMP1`, `.SYSTEM` | Sections | Tank, pump, system monitoring | -| `CI-Eng-Sample.TANK1.LEVEL` | Item, Real | %, format `999.9`, limits LL 10 / L 20 / H 80 / HH 90, scale 0–100 (alarming off), stored in `CIENG_EVENT` | +| `CI-Eng-Sample.TANK1.LEVEL` | Item, Real | %, format `999.9`, limits LL 10 / L 20 / H 80 / HH 90, scale 0–100, stored in `CIENG_EVENT`; alarming on (ack type `CIENG_ACK`, area `CIENG_TANKS`; `16_item_alarm_df.qli`) | | `CI-Eng-Sample.TANK1.INFLOW` | Item, Real | m3/h, format `9999.9`, scale 0–500, stored in `CIENG_EVENT` | | `CI-Eng-Sample.PUMP1.RUNNING` | Item, Boolean | | | `CI-Eng-Sample.PUMP1.MODE` | Item, Integer | 0 manual, 1 auto | @@ -67,6 +67,9 @@ cmd /c "\examples\CI-Eng-Sample\remove.cmd" | `CIENG_UA_LINE` | OPC UA client line | Client process `OPXCIENG` (created and started by loading the line) | | `CIENG_UA` | OPC UA station | `opc.tcp://localhost:34493`, Basic256Sha256 / SignAndEncrypt, anonymous; subscription `CIENG_SUB` (1 s); points `LEVEL`, `SRV_STATE` | | OPC visible | Flags | Sections `CI-Eng-Sample`, `TANK1` and item `TANK1.LEVEL` are OPC visible, item read-only (`12_opc_visible_df.qli`) | +| `CIENG_ACK` | Acknowledgement type | Every alarm needs an acknowledgement; return to normal automatic only if the alarm was acknowledged (same matrix as `MANUAL`) | +| `CIENG_TANKS` | Area of interest | Label for tank items (`TANK1.LEVEL` `AOI_1`) | +| `CIENG_TANK1` | Alarm selection area | `SECTION = "CI-Eng-Sample.TANK1"`, compiled on load | | `CIENG_VIEWER` | Authorization group | Read-only: `ITEM_READ`, `SECTION_READ`, `ALARM_CURRENT_READ`, `ALARM_CHRONO_READ`. No users are created by the sample. | Items created by objects (`TANK1.CALC.VOLUME`, `TANK1.JFLOW.sPerMin`) and their sections are @@ -89,8 +92,10 @@ New items start with status 13 (`NOT INIT`) until a value is written. | `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 | | `12_opc_visible_df.qli` | OPC visible / read flags (loaded with `dssqld -m`) | | `13_opcua_line_df.qli`, `14_opcua_station_df.qli`, `15_item_opcua_df.qli` | OPC UA client line; station, subscription, points; connected items | +| `01b_alarm_df.qli` | Alarm definitions: acknowledgement type, area of interest, alarm selection area (`ALARM_ACK_DF`, `ALARM_AOI_DF`, `ALARM_ASA_DF`) | +| `16_item_alarm_df.qli` | Switch on alarming for `TANK1.LEVEL` (loaded with `dssqld -m`) | | `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 | +| `76_`…`93_remove_*.qli` | Names to delete, in reverse order (alarm definitions last, `93`) | | `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`) | @@ -126,6 +131,14 @@ exchange, done by the user (skill `data-access`, task `opcua-client.md` §4): Then `UA.COMM_OK` = 1 and `UA.LEVEL_COPY` follows `TANK1.LEVEL`. The trust is kept when the sample is removed and loaded again. +## Alarms (TANK1.LEVEL) + +`TANK1.LEVEL` raises HIGH above 80 (Alarm 2, priority 2) and HIGH HIGH above 90 (Alarm 3, +priority 1). To try it on a test system: `itmval -p -n CI-Eng-Sample.TANK1.LEVEL -v 85`, export +`ALARM_CURRENT` (filter on `ITEM_NAME`), acknowledge with `dssqld -m` on `ALARM_CURRENT` +(`NAME`, `ACK` 1), write the level back below 80. See skill `alarm-management`, task +`item-alarming.md`. + ## Monitoring processes (optional) `monitoring/` holds the lines to add to the setup files in `%TLS_ROOT_PATH%\tls\sup\` so that @@ -137,7 +150,6 @@ testing. See the `system-management` skill, task `monitoring-processes.md`. | Phase | Adds | |---|---| -| 8 | Alarm settings on sample items | | 9 | More storage groups (scan/time, aggregation) | | 10 | A display and symbol | | 11 | A report | diff --git a/examples/CI-Eng-Sample/load.cmd b/examples/CI-Eng-Sample/load.cmd index 58bf228..c3d7666 100644 --- a/examples/CI-Eng-Sample/load.cmd +++ b/examples/CI-Eng-Sample/load.cmd @@ -5,6 +5,8 @@ rem Results go to *.qlo listing files; check that Errors = 0. rem Restart CI Server afterwards: new storage groups only start storing after a restart. cd /d "%~dp0" dssqld -i 01_section_df.qli -l 01_section_df.qlo +rem Alarm definitions (acknowledgement type, area of interest, alarm selection area) +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 03_his_group_df.qli -l 03_his_group_df.qlo @@ -33,3 +35,5 @@ echo Waiting 10 seconds for OPC UA client OPXCIENG to start... 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 +rem Alarming: switch on alarms for TANK1.LEVEL (modify existing record) +dssqld -m 16_item_alarm_df.qli -l 16_item_alarm_df.qlo diff --git a/examples/CI-Eng-Sample/remove.cmd b/examples/CI-Eng-Sample/remove.cmd index 486236c..07aa5d1 100644 --- a/examples/CI-Eng-Sample/remove.cmd +++ b/examples/CI-Eng-Sample/remove.cmd @@ -24,4 +24,6 @@ dssqld -r 90_remove_his_group_df.qli -l 90_remove_his_group_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 +rem Alarm definitions last: an acknowledgement type still used by an item cannot be deleted. +dssqld -r 93_remove_alarm_df.qli -l 93_remove_alarm_df.qlo del 90a_stop_his_group_df.qli -- 2.45.3 From ba4ce20c62584f82e556297513dd168b088b2aa6 Mon Sep 17 00:00:00 2001 From: cliu Date: Thu, 1 Oct 2026 11:41:45 +1000 Subject: [PATCH 2/3] Add alarm manual summaries (L15, C20, E30) and alarm-management skill Co-Authored-By: Claude Opus 5.5 --- .claude/skills/alarm-management/SKILL.md | 48 +++++ .../alarm-management/tasks/alarm-checks.md | 65 ++++++ .../tasks/alarm-definitions.md | 103 +++++++++ .../alarm-management/tasks/item-alarming.md | 101 +++++++++ .claude/skills/item-engineering/SKILL.md | 1 + knowledge/manuals/IM36K10C20-01EN.md | 173 ++++++++++++++++ knowledge/manuals/IM36K10E30-01EN.md | 83 ++++++++ knowledge/manuals/IM36K10L15-01EN.md | 195 ++++++++++++++++++ 8 files changed, 769 insertions(+) create mode 100644 .claude/skills/alarm-management/SKILL.md create mode 100644 .claude/skills/alarm-management/tasks/alarm-checks.md create mode 100644 .claude/skills/alarm-management/tasks/alarm-definitions.md create mode 100644 .claude/skills/alarm-management/tasks/item-alarming.md create mode 100644 knowledge/manuals/IM36K10C20-01EN.md create mode 100644 knowledge/manuals/IM36K10E30-01EN.md create mode 100644 knowledge/manuals/IM36K10L15-01EN.md diff --git a/.claude/skills/alarm-management/SKILL.md b/.claude/skills/alarm-management/SKILL.md new file mode 100644 index 0000000..17e61f0 --- /dev/null +++ b/.claude/skills/alarm-management/SKILL.md @@ -0,0 +1,48 @@ +--- +name: alarm-management +description: >- + CI Server R1.03 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, + 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, + 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 + informational event, check the alarm kernel or storage (ALM, ALH, ALDPRT, almdbg, alhdbg, + alm.sup, alh.sup, aldprt.sup), configure alarm e-mail / SMS notification (alnmgr, alnsmtp), + alarm shelving (asbman), alarm sound (aldaco), alarm counting (aldcnt), external alarms (EAL, + OPC UA alarms, CENTUM VP Vnet alarms) or analyse alarm performance (ASPA, alarm floods, KPIs, + EEMUA 191, ISA 18.2). Sources IM 36K10L15-01EN, IM 36K10C20-01EN, IM 36K10E30-01EN. +--- + +# Alarm management (R1.03) + +Background: `knowledge/manuals/IM36K10L15-01EN.md` (kernel, events, mechanisms, setup files, +debuggers), `IM36K10C20-01EN.md` (Engineering Module forms, filters, grouping, shelving, +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`. + +Rules: +- Run `system-check` first; follow the user's chosen way of working. +- **Alarms reach operators.** Switching alarming on or off, changing acknowledgement types, or + acknowledging alarms on a running plant changes what operators see: only with the user's + approval. Changing an item's alarm settings also auto-acknowledges a pending return to normal + (L15 summary, C20 §A2). +- 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. +- `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`. +- 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 + `change-setup-file.md`). + +| Task | File | Status | +|---|---|---| +| Acknowledgement type, area of interest, alarm selection area by quick load; compile check | `tasks/alarm-definitions.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 | +| Read-only checks: alarm processes, destinations, statistics, item alarm parameters, storage group, setup files; generate an INFO event | `tasks/alarm-checks.md` | verified | +| 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) | +| E-mail / SMS notification | L15 summary §10, C20 §A11 | from docs (needs an SMTP server without authentication) | +| 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) | +| Alarm performance analysis (ASPA) | E30 summary | from docs | diff --git a/.claude/skills/alarm-management/tasks/alarm-checks.md b/.claude/skills/alarm-management/tasks/alarm-checks.md new file mode 100644 index 0000000..275bc0a --- /dev/null +++ b/.claude/skills/alarm-management/tasks/alarm-checks.md @@ -0,0 +1,65 @@ +--- +task: Read-only checks of ALARM Service; generate an informational test event +version: 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 +status: verified +--- + +# ALARM Service checks + +## 1. Processes and setup files (read-only) + +| Check | How | Test system result | +|---|---|---| +| 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`) | +| 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` | +| Storage setup | `alh.sup` | `CURP`, `CURT`, `CHR`, `QUESIZE 8000`, `MAX-SEARCH 5`, `RECOVER_QUEUE Y`, `DB-JRNL WAL`, `DB-SYNC OFF` | +| Alarm printer | `aldprt.sup` | `FORMAT prio,2,spac,1,type,6,tdef,18,name,40,text,10`, `EVENTS repeat,info,ackn,alarm,prio,firstup` | +| Overview events | `wfladi.sup` `EVENTS` | `alarm,repeat,ackn,deact,info,recov,diag,firstup` (no `DIRECT`) | +| Notification / shelving | `alnmgr.sup`, `alnsmtp.sup`, `alnsms.sup`, `asbman.sup` | Defaults: SMTP `localhost, 25`, SMS `COM1:`, `SYS_WIDE_SHELF N` | +| History storage group | `dssqld -e` filter `'NAME = "ALH"'` on `HIS_GROUP_DF` | Type Alarm, rollover 1 day, lifetime 52 weeks | +| Definitions | `dssqld -e -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 | + +## 2. Alarm kernel debugger `almdbg` (read-only options) + +Interactive; pipe the answers and end with `-1` (from bash, with a timeout): + +``` +printf '1\n9\n12\n-1\n' | timeout 20 almdbg +printf '14\n
.\n10\n\n-1\n' | timeout 20 almdbg +``` + +| Option | Shows | +|---|---| +| 1 | Connected destinations, events sent, overflows (test system: `ALH`, `OPXUAS`, `ALNMGR`, `ALDPRT`) | +| 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) | +| 11 | Items with repeat or delay running | +| 12 | Statistics: start time, item-based / non-item-based / external events received, events sent | +| 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_ exited unexpectedly` +in `umhlog.log`: harmless. A blank 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` + +`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 +connect) and 4 (stop ALH) only with approval. + +## 4. Generate an informational test event (`almdbg` 16) + +Changes the alarm history (adds one INFO event; no effect on current alarms). With approval: + +``` +printf '16\n\n0\n15\n
.\n\n\n-1\n' | timeout 15 almdbg +``` + +Prompts: timestamp (blank = now), milliseconds, priority (0–15), name, status text, +description. Check with a filter `'EVENT_TYPE = "INFO"'` on `ALARM_CHRONO`. + +**Verified:** the event appears with `EVENT_TYPE` INFO, `ITEM_NAME` = the given name, `ALARM_TEXT` += status text, `DESCRIPTION` = description, priority 15, ack 1. Other text columns (`INSTALL`, +`UNIT`, `SUB`, `SOURCE`, `CATEGORY`, `CONDITION`) contain leftovers or unreadable characters +(ISS-037): use the event only as a test marker. diff --git a/.claude/skills/alarm-management/tasks/alarm-definitions.md b/.claude/skills/alarm-management/tasks/alarm-definitions.md new file mode 100644 index 0000000..bb9b96e --- /dev/null +++ b/.claude/skills/alarm-management/tasks/alarm-definitions.md @@ -0,0 +1,103 @@ +--- +task: Acknowledgement types, areas of interest and alarm selection areas by quick load +version: 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 +status: verified +--- + +# Alarm definitions (quick load) + +Sample file: `examples/CI-Eng-Sample/01b_alarm_df.qli` (removed by `93_remove_alarm_df.qli`). +Load definitions **before** the items that use them; remove them **after** those items. +Commands as in skill `system-management` (`dssqld -i` / `-m` / `-r`, `-l `); run +`dssqld` from the file's folder (paths over 79 characters are cut, ISS-020). `dssqld` returns +exit code 0 even when records fail: always read the summary table (Errors column) or listing. + +## 1. Acknowledgement type (`ALARM_ACK_DF`) + +``` +@FIELDS +NAME,DESCRIPTION,EAL_ACK,NA_N,NN_N,A1A_N,A2A_N,A3A_N + +@ALARM_ACK_DF +"","",0,1,1,1,1,1 +``` + +- Matrix field `_`: from state `N`/`A1`/`A2`/`A3`, `A` = was acknowledged, + `N` = was not, to state `N`/`A1`/`A2`/`A3`. 1 = automatic, 0 = operator must acknowledge. + Fields left out are 0. The example equals the predefined `MANUAL`: every alarm needs an + acknowledgement; returning to normal is automatic only if the alarm was acknowledged. +- `EAL_ACK` 1 makes a type for external alarms (Inactive/Active matrix); it cannot be changed + later, nor can the name. Predefined: `AUTOMATIC`, `MANUAL`, `FULLMANUAL` and `_EAL` variants. +- A description longer than 78 characters fails with `DSSG-E-STRBUFSMAL … buffer is too small (79)`. +- Delete refused while an item uses the type: `DSSP-E-NODEL … still in use` / + `DSSP-E-NODELBY, By in dataset ITEM_DF`. +- Check: `almdbg` 9 (numbers) and 10 (`` → matrix with A/M), see `alarm-checks.md`. + +## 2. Area of interest (`ALARM_AOI_DF`) + +``` +@FIELDS +NAME,DESCRIPTION + +@ALARM_AOI_DF +"","" +``` + +`NUMBER` is assigned automatically. Assign to items with `ITEM_DF` `AOI_1` … `AOI_16` (never the +same AOI twice on one item). + +## 3. Alarm selection area (`ALARM_ASA_DF`) + +``` +@FIELDS +NAME,DESCRIPTION,COMPILE,EXPRESSION + +@ALARM_ASA_DF +"","",1,\ +@" +/* comment */ +SECTION = "
." and PRIO < 3"@ +``` + +- `COMPILE` 1 compiles on load. Multi-line text: `\` at the end of the line, then `@"` … `"@`. + (Verified with a single `SECTION` condition; the `and PRIO < 3` part follows the manual.) +- Spaces are required around operators (`SECTION = "…"`, not `SECTION="…"`). Keywords and + operators: C20 summary §A8.3. `SECTION` matches only items directly in that section. +- **Check after loading** — a bad expression is still stored: + + ``` + @SELECT + 'NAME = ""' + @ALARM_ASA_DF + ``` + `dssqld -e .qli .qli -c`, then look at `LISTING` and `VALID_EXPRESSION`: + - good: `% ALC-I-CMP_SUCC, Expression compiled successfully`, `VALID_EXPRESSION` 1 + (`COMPILE` reads 0 again after compiling); + - bad: `% ALC-E-UNKNOWN_TOK, Unknown token encountered, token: (…)`, + `ALC-E-CMP_NO_SUCC`, `VALID_EXPRESSION` 0 — the load summary shows 1 error. An invalid + ASA filters out **all** alarms where it is used: fix and reload with `dssqld -m`, or remove. + +## 4. Remove + +``` +@FIELDS +NAME + +@ALARM_ASA_DF +"" + +@ALARM_AOI_DF +"" + +@ALARM_ACK_DF +"" +``` + +`dssqld -r` after the items that refer to them are removed or changed. + +## Verified (CI-Eng-Sample, 2026-10-01) + +`CIENG_ACK`, `CIENG_TANKS` (number 2), `CIENG_TANK1` (`SECTION = "CI-Eng-Sample.TANK1"`, +compiled, valid) loaded and removed in a full sample remove/reload, 0 errors. A test ASA without +spaces was stored invalid and then removed. diff --git a/.claude/skills/alarm-management/tasks/item-alarming.md b/.claude/skills/alarm-management/tasks/item-alarming.md new file mode 100644 index 0000000..e1892c9 --- /dev/null +++ b/.claude/skills/alarm-management/tasks/item-alarming.md @@ -0,0 +1,101 @@ +--- +task: Switch on alarming for an item, test an alarm, read and acknowledge alarms +version: 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 +status: verified +--- + +# Item alarming + +Sample file: `examples/CI-Eng-Sample/16_item_alarm_df.qli` (loaded with `dssqld -m`). +The item needs limits (`LOW_LOW_LIMIT`, `LOW_LIMIT`, `HIGH_LIMIT`, `HIGH_HIGH_LIMIT`, skill +`item-engineering`); its status then follows the value and maps to an alarm state through +`STATUS_DF` (installed: HIGH 10 → Alarm 2 prio 2, HIGH HIGH 11 → Alarm 3 prio 1, LOW/LOW LOW +likewise, NORMAL 9 → Normal prio 15). + +## 1. Switch on alarming (modify the item) + +``` +@FIELDS +NAME,ALARMING,ACKN_TYPE,AOI_1 + +@ITEM_DF +"
.",1,"","" +``` + +Other `ITEM_DF` alarm fields: `ALARM_INHIBIT`, `DELAY`, `REPEAT` (seconds, 0 = off), +`DIAG`, `FO_GROUP` + `FO_ITEM`, `COL_GROUP` (first-out **or** collection, not both), +`ITEM_STAT_n` / `ALARM_STATE_n` / `PRIORITY_n` / `ALARM_TEXT_n` / `ALARM_COLOR_n` / +`MNEMONIC_n` / `SHELVE_ENABLED_n` (n = 1–6, per-item status overrides). + +Any change of these fields makes ALM send a NORMAL event (acknowledged automatically when the +item is normal): it **clears a pending unacknowledged return to normal**. Avoid changing alarm +settings of items with standing alarms without the operator knowing. + +Check: `almdbg` 14 → `
.` shows *Alarm monitoring: yes*, the ack type number, +repeat and delay (`alarm-checks.md`). + +## 2. Test an alarm (test items only) + +``` +itmval -g -n
. # note the value to restore +itmval -p -n
. -v +itmval -g -n
. # Status 10 (HIGH), Options without "ack" +``` + +Unacknowledged alarms lose the `ack` option word; `t1` / `t2` appear while an alarm is direct +or delayed. + +## 3. Read current alarms and history + +Filter file (one per dataset), then `dssqld -e .qli .qli -c`: + +``` +@SELECT +'ITEM_NAME = "
."' +@ALARM_CURRENT +``` + +- `ALARM_CURRENT`: standing alarms and unacknowledged returns to normal. Key `NAME` = + `"/"`; useful fields `ALARM_TIME`, `ALARM_ORIG_TIME`, + `ALARM_ACK_TIME`, `OLD_VALUE`, `NEW_VALUE`, `PRIORITY`, `RPT_COUNT`, `ACK`, `OLD_STATUS`, + `NEW_STATUS`, `EVENT_TYPE`, `ALARM_TEXT`, `OLD_STATE`, `NEW_STATE`. +- `ALARM_CHRONO` (history; only exported when named): same fields; add a time range for big + histories, e.g. `'ITEM_NAME = "
." and ALARM_TIME > "01-10-2026 11:00:00"'`. + +## 4. Acknowledge from a script + +``` +@FIELDS +NAME,ACK + +@ALARM_CURRENT +"",1 +``` + +`dssqld -m` → summary *Modified 1*; the item gets `ack` again, history gets an `ACKNOW` event +(plus a second `ACKNOW` with the node name when `alm.sup` has `ACK_INFO`). Use the `NAME` key, +not `ITEM_NAME` (same rule as the ODBC known issue, IM 36K01A50). Acknowledging is an operator +action: only with the user's approval. + +## 5. Delay and repeat + +`DELAY` = d: DIRECT at once, DELAY after d seconds (same original time); back to normal earlier +gives NORMAL and no DELAY. `REPEAT` = r: REPEAT every r seconds after the (delayed) alarm, +`RPT_COUNT` 1, 2, …. The current alarm overview shows DIRECT only if `wfladi.sup` `EVENTS` +contains `DIRECT` (not installed by default). + +## Verified (CI-Eng-Sample `TANK1.LEVEL`, limits 10/20/80/90, ack type `CIENG_ACK` = MANUAL matrix) + +| Step | Result | +|---|---| +| `ALARMING` 1 loaded | `NORMAL` event, ack 1 | +| 44.4 → 85 | Status 10, `ALARM` HIGH Normal → Alarm 2, prio 2, `ACK` 0; in `ALARM_CURRENT` | +| Acknowledge via `ALARM_CURRENT` | `ack` option back; two `ACKNOW` records | +| 85 → 50 after ack | `NORMAL`, acknowledged automatically, `ALARM_CURRENT` empty | +| 50 → 95 → 50 without ack | `ALARM` HIGH HIGH (Alarm 3, prio 1), `NORMAL` stays in `ALARM_CURRENT` with `ACK` 0 until acknowledged | +| `DELAY` 5, `REPEAT` 10, 50 → 85 for 27 s | `DIRECT` 11:36:57, `DELAY` 11:37:02, `REPEAT` 11:37:12 and 11:37:22 (`RPT_COUNT` 1, 2), `NORMAL` 11:37:24 | +| Reset `DELAY`/`REPEAT` to 0 while the NORMAL was unacknowledged | new `NORMAL` event with ack 1; alarm gone from `ALARM_CURRENT` | +| Full sample remove/reload | 0 errors; the alarm test passed again | + +No alarm line from `ALDPRT` appeared in `umhlog.log` (ISS-035). diff --git a/.claude/skills/item-engineering/SKILL.md b/.claude/skills/item-engineering/SKILL.md index 78628b3..2e578a5 100644 --- a/.claude/skills/item-engineering/SKILL.md +++ b/.claude/skills/item-engineering/SKILL.md @@ -24,3 +24,4 @@ Rules: | 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 | +| Switch on alarming, ack type, delay/repeat, test and acknowledge alarms | skill `alarm-management`, task `item-alarming.md` | verified | diff --git a/knowledge/manuals/IM36K10C20-01EN.md b/knowledge/manuals/IM36K10C20-01EN.md new file mode 100644 index 0000000..ce4bd88 --- /dev/null +++ b/knowledge/manuals/IM36K10C20-01EN.md @@ -0,0 +1,173 @@ +--- +manual: IM 36K10C20-01EN +title: Engineering Module - Alarms +edition: 3rd Edition, Sep. 2023 +version: R1.03 +status: item alarm settings, acknowledgement types, areas of interest, alarm selection areas, delay/repeat verified by quick load on CI-Eng-Sample 2026-10-01; Engineering Module forms, overviews, grouping, shelving, link display, notifications and external/Vnet alarms from docs +--- + +# Engineering Module - Alarms (R1.03) + +How alarms are set up in the Engineering Module (*Configuration > Alarming* and the item +form) and what the operator sees. Part A = item-based alarms, part B = external alarms (OPC UA +servers, CENTUM VP). Kernel internals: `IM36K10L15-01EN.md`. Section numbers refer to the +manual. Dataset/field names below were checked on the installed system. + +## A1. Functions (§A1) + +Detection (limit check, OPC A&E), management (acknowledgement, first-out groups, alarm +collections, history), display/operation (current/historical/shelved overviews, alarm sound, +AOI and ASA filters, shelving, alarm link display), external notification (e-mail, SMS), +reporting. A jump NORMAL → HIGH HIGH gives only the HIGH HIGH alarm. + +## A2. Item form, alarm fields (§A2) + +| Form | Field (`ITEM_DF`) | Meaning | +|---|---|---| +| General | *Alarming* (`ALARMING`) | Show/notify this item's alarms | +| Item management | *Alarm inhibit* (`ALARM_INHIBIT`) | Suppress display and notification | +| Limits and filtering | `HIGH_HIGH_LIMIT`, `HIGH_LIMIT`, `LOW_LIMIT`, `LOW_LOW_LIMIT`, deadband | Status by value; deadband for the way back | +| Alarming | *OPC AE alarm detection* | Alarm from an OPC A&E source; no limit check then | +| | *Acknowledgment type* (`ACKN_TYPE`) | `ALARM_ACK_DF` name; none = automatic | +| | *Alarm collection* (`COL_GROUP`), *First-out group* (`FO_GROUP`), *First-out item* (`FO_ITEM`) | One group per item; never both kinds | +| | *Delay time* (`DELAY`), *Repeat time* (`REPEAT`), seconds, 0 = off | | +| | Up to 6 per-item status overrides: status, alarm state, priority, alarm text, colour, mnemonic, shelve enable (`ITEM_STAT_n`, `ALARM_STATE_n`, `PRIORITY_n`, `ALARM_TEXT_n`, `ALARM_COLOR_n`, `MNEMONIC_n`, `SHELVE_ENABLED_n`) | | +| Areas of interest | Area 1–16 (`AOI_1` … `AOI_16`) | Same AOI not twice | + +- Changing alarm settings re-evaluates the item even without a status change. **Verified:** a + `dssqld -m` on `ALARMING`, `DELAY` or `REPEAT` produced a NORMAL event; when the item was + back to normal but still unacknowledged, this new event was acknowledged automatically and + the alarm left `ALARM_CURRENT`. +- **Delayed alarm** (verified, `DELAY` 5): DIRECT at once, DELAY 5 s later (same original + time). The current alarm overview shows DIRECT only if `wfladi.sup` `EVENTS` includes + `DIRECT` (installed: not included; add it and restart, §A2.4). +- **Repeated alarm** (verified, `REPEAT` 10): REPEAT events every 10 s after the delay, + `RPT_COUNT` 1, 2, …; repeats can be acknowledged only in the historical overview. + +## A3. Alarm overviews (§A3) + +- Current (standing + unacknowledged), historical, shelved. Columns include alarm time, section + 1/2, tag, sub-item, alarm type (NORMAL, ALARM, ACKNOW, DELAY, DIRECT, FIRSTUP, INFO), text, + priority, acknowledgement, value, quality, OPC fields and `C…` combined fields, item name, + acknowledged by, original time, location, area nn, collection, priority text, CI attributes. + Keep to 20–30 columns (throughput, memory). +- Priority text: *Alarming > Alarm priority labels* (`ALARM_PRIORITY_DF`, 0–15, ≤ 31 ASCII + characters; empty on the test system). +- CI attributes (vendor attributes from OPC AE/UA client settings) are chosen on the overview's + *Attributes* tab; listed under *Alarming > Alarm attributes*. +- Operations (right-click): acknowledge (also the check box; current overview only), block, + shelve, link display, export (CSV/XML, all displayed rows), filters (condition; date normal or + time-interval mode). + +## A5. Acknowledgement (§A5) + +Unacknowledged alarms blink; acknowledgement is recorded as ACKNOW in history. The setting is +per **alarm state transition** (4 states × Ack/Nack × 4 states = 32 check boxes = one +acknowledgement type), not per item status — so give statuses that need different handling +different alarm states. Form: *Alarming > Acknowledgement type*; name and *External alarm* flag +cannot be changed; delete only when unused. Predefined `MANUAL`: every new alarm state manual; +N → N automatic; Ax → N automatic only if Ax was acknowledged. + +Quick load (verified, CI-Eng-Sample `01b_alarm_df.qli`): `ALARM_ACK_DF` fields `NAME`, +`DESCRIPTION` (max 78 characters), `EAL_ACK`, `_` (e.g. `A2A_N`) — see L15 +summary §5. Acknowledge from a program or script: `dssqld -m` on `ALARM_CURRENT` with `NAME` +(the `