Controls — HMI alarm copy
| Field | Detail |
|---|---|
| Primary artifact(s) | controls/water/hmi/alarm-strings.csv |
| Spec | RO-SPEC-001 §5.6 ; WIRE-001 — |
Summary
Operator-facing text for every ALM_* InternalLatch tag in tags.csv. Each CSV row plc_tag matches one latch bit packed into ANN_ALM_WORD0 by alarms.st. The AlarmActive screen (see screens.md) decodes the word and displays user_message / sev_hmi from this table.
Rows are ordered by ANN_ALM_WORD0 bit index (0–14). Severity in sev_hmi aligns with alarm_class on the latch tag unless noted (e.g. safety UV uses safety for CM5 banner styling).
| Bit | plc_tag | sev_hmi | requires_ack_ok |
|---|---|---|---|
| 0 | ALM_PT101_HI | critical | yes |
| 1 | ALM_PT102_HI | critical | yes |
| 2 | ALM_PT103_LO | warn | maybe |
| 3 | ALM_PT104_LO | warn | maybe |
| 4 | ALM_FEED_LOW_FLOW | warn | maybe |
| 5 | ALM_VFD_ANY_FLT | critical | yes |
| 6 | ALM_CT101_HIGH_COND | warn | maybe |
| 7 | ALM_UV_LAMP_FLT | safety | yes |
| 8 | ALM_TDS_DEVIATION | warn | maybe |
| 9 | ALM_T101_LEVEL_LOW_LATCH | critical | yes |
| 10 | ALM_T102_LEVEL_CRITICAL | critical | yes |
| 11 | ALM_UV_LAMP_30DAY | info | no |
| 12 | ALM_UV_LAMP_7DAY | warn | maybe |
| 13 | ALM_ENCL_OT_FAULT | critical | yes |
| 14 | ALM_BLOCK_ICE_ON_UV_FLT | info | no |
Ack column semantics: yes = operator should acknowledge via HMI_ACK_ALARMS after following procedure_hint; maybe = ack clears latch but underlying condition may persist; no = informational / auto-clears when guard passes (see ST alarm sequencer).
Conditional clears (not encoded in CSV): ALM_ENCL_OT_FAULT needs TT-200 < latch SP − 5 °F; ALM_UV_LAMP_FLT needs fault cleared and HMI_DISINFECT_CHKCOMPLETE; ALM_VFD_ANY_FLT ack also pulses Modbus VFD reset.
Test
CM5 Alarm block import — verify 15 rows, one plc_tag per InternalLatch ALM_* in tags.csv.
Offline parity check (from repo root):
python3 - <<'PY'
import csv
tags = {r["tag_name"] for r in csv.DictReader(open("controls/water/tags/tags.csv")) if r["tag_name"].startswith("ALM_")}
rows = list(csv.DictReader(open("controls/water/hmi/alarm-strings.csv")))
csv_tags = {r["plc_tag"] for r in rows}
assert tags == csv_tags, f"mismatch tags={sorted(tags-csv_tags)} csv={sorted(csv_tags-tags)}"
assert len(rows) == 15
print("OK:", len(rows), "alarm strings ↔ latch tags")
PY
Open items
- Spanish toggle future