100%/C: Limits Monitoring (S2F45–F48, E30 §6.21)
tests / build-and-test (push) Failing after 35s

New LimitMonitorStore keyed by VID; each entry is a vector of
LimitDefinition (LIMITID + upper/lower deadband as arbitrary Items).
S2F45/F46 set, S2F47/F48 read.  VLAACK validates each VID exists.

Four new SxFy in the catalog; codegen handles the nested
list-of-(VID, list-of-LimitDefinition) shape.  LimitDefinition is
defined in store/limits.hpp and referenced as external_struct so the
data model and the message codecs share one type.

The actual "value crossed limit" detection + CEID emission is left to
the application's set_value path (E30 §6.21 leaves *how* the equipment
detects crossings up to the implementer).

COMPLIANCE.md: Limits Monitoring Additional capability flips .
Tests: 80 cases / 465 assertions.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-06-07 02:08:19 +02:00
parent 65db38d9f2
commit 224130d99f
6 changed files with 202 additions and 2 deletions
+75
View File
@@ -415,6 +415,81 @@ messages:
- {name: name, shape: {kind: scalar, item_type: ASCII}}
- {name: code, shape: {kind: scalar, item_type: BINARY_BYTE}}
# S2F45 / S2F46 / S2F47 / S2F48 — Limits Monitoring (E30 §6.21). Each
# VID may carry several LimitDefinitions (one per LIMITID), each with
# an upper / lower deadband expressed as an arbitrary Item.
- id: S2F45
stream: 2
function: 45
w: true
builder: s2f45_define_variable_limits
parser: parse_s2f45
body:
kind: list
struct_name: DefineLimitsRequest
fields:
- {name: dataid, shape: {kind: scalar, item_type: U4}}
- name: entries
shape:
kind: list_of
element:
kind: list
struct_name: VidLimitsEntry
fields:
- {name: vid, shape: {kind: scalar, item_type: U4}}
- name: limits
shape:
kind: list_of
element:
kind: list
struct_name: LimitDefinition
external_struct: true
fields:
- {name: limitid, shape: {kind: scalar, item_type: U1}}
- {name: upper, shape: {kind: scalar, item_type: ITEM}}
- {name: lower, shape: {kind: scalar, item_type: ITEM}}
- id: S2F46
stream: 2
function: 46
builder: s2f46_define_variable_limits_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: LimitMonitorAck, param: vlaack}
- id: S2F47
stream: 2
function: 47
w: true
builder: s2f47_variable_limit_attribute_request
parser: parse_s2f47
body:
kind: list_of
element: {kind: scalar, item_type: U4}
name: vids
- id: S2F48
stream: 2
function: 48
builder: s2f48_variable_limit_attribute_data
body:
kind: list_of
name: entries
element:
kind: list
struct_name: VidLimitsEntry
fields:
- {name: vid, shape: {kind: scalar, item_type: U4}}
- name: limits
shape:
kind: list_of
element:
kind: list
struct_name: LimitDefinition
external_struct: true
fields:
- {name: limitid, shape: {kind: scalar, item_type: U1}}
- {name: upper, shape: {kind: scalar, item_type: ITEM}}
- {name: lower, shape: {kind: scalar, item_type: ITEM}}
# S2F43 / S2F44 — Reset Spooling (E30 §6.22, configure spoolable streams).
- id: S2F43
stream: 2