# Systems Perspective Description Language — Industrial IoT (SPDL-IIOT) **Specification Document ID:** `SPDL-IIOT-SPEC-2026-v4.2` **Classification:** Open Epistemic Standard / Real-Time Zero-Heap Edge Telemetry Substrate **Principal Architect:** Asse van Nix | Systems Perspective Framework & Proof-Driven Architecture Group **Target Environment:** Zig 0.16.0 Freestanding · Linux Edge Gateways · Micro-RTOS · Sparkplug B Replacement **Applied Standards:** ISO/IEC 14977 EBNF · GBNF Maskable · ISO/IEC 20922 (MQTT) · ISA-18.2 (Alarms) · NAMUR NE 43 · IEEE 2888 --- ## 1. Epistemic Architecture: Why MQTT Sparkplug B Must Be Replaced 1. **Protobuf Deserialization Overhead:** While MQTT Sparkplug B establishes topic structures (`spBv1.0`), payloads remain opaque Google Protocol Buffer blobs. Parsing Protobuf on resource-constrained edge gateways requires dynamic memory allocation (`malloc`), variable-length varint decoding, and complex schema alignment. 2. **Physical Invariant Blindness:** Sparkplug B payloads transmit raw datasets without enforcing physical units, rate-of-change boundaries, or sensor degradation diagnostics (NAMUR NE 43). Edge logic can inject physically impossible values without triggering protocol-level rejection. **SPDL-IIOT** replaces binary Protobuf dumps with zero-heap, single-line telemetry records that bind plant variables directly to ISA-18.2 alarm automata. --- ## 2. Physical Invariants, DAEs & Mathematical Proof Gates ``` SPDL-IIOT TELEMETRY MANIFOLD ┌─────────────────────────────────────────────────────────────────────────────┐ │ FIRST-ORDER INSTRUMENT DRIFT & KALMAN ESTIMATION EQUATION │ │ x_hat(k) = A * x_hat(k-1) + B * u(k-1) + K_k * (z(k) - H * A * x_hat(k-1))│ ├─────────────────────────────────────────────────────────────────────────────┤ │ RATE-OF-CHANGE (ROC) SENSOR DEGRADATION BARRIER │ │ h_roc(PV) = ROC_max - |(PV(t) - PV(t - delta_t)) / delta_t| >= 0 │ ├─────────────────────────────────────────────────────────────────────────────┤ │ ISA-18.2 ALARM HYSTERESIS PRE-FILTER (Anti-Chatter Barrier) │ │ PV_clear <= PV_trip - Deadband_hysteresis │ └─────────────────────────────────────────────────────────────────────────────┘ ``` --- ## 3. Formal ISO/IEC 14977 EBNF Grammar ```ebnf IiotManifest = { Line } ; Line = [ Whitespace ] , ( Comment | IiotRecord ) , Newline ; Whitespace = { " " | "\t" | "\r" } ; Newline = "\n" | "\r\n" ; Comment = "#" , { AnyChar - Newline } ; IiotRecord = "(I) @IIOT_INVARIANT" , " " , InvariantFields | "(A) @EDGE_NODE" , " " , NodeFields | "(B) @ROC_BARRIER" , " " , RocBarrierFields | "(M) @TELEMETRY_DATASET" , " " , DatasetFields | "(T) @IIOT_ALARM" , " " , AlarmFields ; InvariantFields = "id:" , Token , " max_publish_hz:" , Integer , " max_frame_b:" , Integer , " alloc_policy:ZERO_HEAP" ; NodeFields = "id:" , Token , " group_id:" , Token , " node_id:" , Token , " hw_uuid:" , HexString ; RocBarrierFields = "id:" , Token , " target_pv:" , Token , " max_rate_units_s:" , Number ; DatasetFields = "id:" , Token , " seq:" , Integer , " timestamp_us:" , Integer , " metrics:[" , MetricList , "]" ; MetricList = MetricDef , { " " , MetricDef } ; MetricDef = Token , ":" , Number , ":" , NamurStatus ; NamurStatus = "OK" | "UNDER" | "OVER" | "BREAK" | "SHORT" ; AlarmFields = "id:" , Token , " pv:" , Token , " state:" , AlarmState , " sev:" , AlarmSeverity , " limit:" , Number ; AlarmState = "NORMAL" | "UNACK_ALARM" | "ACK_ALARM" | "UNACK_RETURN" | "SHELVED" ; AlarmSeverity = "CRITICAL" | "HIGH" | "MEDIUM" | "LOW" ; HexString = '"' , { HexDigit } , '"' ; HexDigit = Digit | "A".."F" | "a".."f" ; Token = Letter , { Letter | Digit | "_" | "-" | "." } ; Number = [ "-" ] , Digit , { Digit } , [ "." , { Digit } ] ; Integer = [ "-" ] , Digit , { Digit } ; Letter = "A".."Z" | "a".."z" ; Digit = "0".."9" ; AnyChar = ? Any valid Unicode code point ? ; ``` --- ## 4. GBNF Structured Sampling Grammar ```gbnf root ::= IiotRecord "\n" IiotRecord ::= "(I) @IIOT_INVARIANT" " " InvariantFields | "(A) @EDGE_NODE" " " NodeFields | "(B) @ROC_BARRIER" " " RocBarrierFields | "(M) @TELEMETRY_DATASET" " " DatasetFields | "(T) @IIOT_ALARM" " " AlarmFields InvariantFields ::= "id:" [A-Za-z0-9_-]+ " max_publish_hz:" [0-9]+ " max_frame_b:" [0-9]+ " alloc_policy:ZERO_HEAP" NodeFields ::= "id:" [A-Za-z0-9_-]+ " group_id:" [A-Za-z0-9_-]+ " node_id:" [A-Za-z0-9_-]+ " hw_uuid:\"" [A-Fa-f0-9]+ "\"" RocBarrierFields ::= "id:" [A-Za-z0-9_-]+ " target_pv:" [A-Za-z0-9_.-]+ " max_rate_units_s:" [0-9.]+ DatasetFields ::= "id:" [A-Za-z0-9_-]+ " seq:" [0-9]+ " timestamp_us:" [0-9]+ " metrics:[" ( [A-Za-z0-9_.-]+ ":" [0-9.-]+ ":" ("OK"|"UNDER"|"OVER"|"BREAK"|"SHORT") " "* )+ "]" AlarmFields ::= "id:" [A-Za-z0-9_-]+ " pv:" [A-Za-z0-9_.-]+ " state:" ("NORMAL"|"UNACK_ALARM"|"ACK_ALARM"|"UNACK_RETURN"|"SHELVED") " sev:" ("CRITICAL"|"HIGH"|"MEDIUM"|"LOW") " limit:" [0-9.]+ ``` --- ## 5. Production SPDL-IIOT Manifest Exemplar ```spdl # ============================================================================== # SPDL-IIOT v4.2 MANIFEST: PETROCHEMICAL PIPELINE PUMPING STATION EDGE # Group: PIPELINE_CORRIDOR_4 | Architecture: Zero-Heap Linear Telemetry # ============================================================================== (I) @IIOT_INVARIANT id:INV-PIPE-EDGE max_publish_hz:50 max_frame_b:256 alloc_policy:ZERO_HEAP # --- TOPOLOGY IDENTITY --- (A) @EDGE_NODE id:NODE_PUMP_STATION_04 group_id:SECTOR_GULF node_id:PS04_GATEWAY hw_uuid:"A4B200E19920" # --- RATE-OF-CHANGE PHYSICAL GUARDS --- (B) @ROC_BARRIER id:BAR_PRESSURE_SPIKE target_pv:SUCTION_PRESSURE_BAR max_rate_units_s:12.5 # --- ZERO-HEAP STREAMING METRIC DATASET (NAMUR NE 43 ATTESTED) --- (M) @TELEMETRY_DATASET id:SET_009412 seq:9412 timestamp_us:1774184000123456 metrics:[SUCTION_PRESSURE_BAR:42.18:OK DISCHARGE_PRESSURE_BAR:118.42:OK MOTOR_VIBE_RMS:1.45:OK BEARING_TEMP_C:64.2:OK] # --- RATIONALIZED ISA-18.2 PROCESS ALARM --- (T) @IIOT_ALARM id:ALM_PUMP_DISCHARGE pv:DISCHARGE_PRESSURE_BAR state:NORMAL sev:HIGH limit:135.0 ``` --- ## 6. Standards Compliance Matrix ``` ╔═════════════════════════════════╦══════════════════════╦═════════════════════════════════════════════════════╗ ║ Dimension │ Verification Standard│ Enforced Implementation Evidence ║ ╠═════════════════════════════════╬══════════════════════╬═════════════════════════════════════════════════════╣ ║ Zero-Heap Ingestion │ Freestanding Silicon │ Stream parser processes metrics in M_aux <= 128B. ║ ║ Process Safety Compliance │ ISA-18.2 / IEC 62682 │ Explicit alarm state tracking with deadband logic. ║ ║ Sensor Diagnostic Integrity │ NAMUR NE 43 │ Hardware loop flags directly decoded on wire. ║ ║ Rate-of-Change Bounding │ Physical Invariant │ Sensor spikes clipped if dPV/dt > 12.5 bar/s. ║ ╚═════════════════════════════════╩══════════════════════╩═════════════════════════════════════════════════════╝ ```