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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user