MaximaLabsOpen app

System Identification

Step tests against the dynamic solver extract a finite-impulse-response (FIR) state model per MV/CV pair — the gain matrix DMC's QP and the RTO's LP both consume.

apcsysidstep-test
Concept

Before DMC can control anything it needs a model. A step test bumps each MV (or a pseudo-random binary sequence — PRBS — for a richer, shorter test) and records the CV response; identification fits either a step-response array (DMC's native form) or a first-order-plus-dead-time (FOPDT) model to that data.

The math
Show the governing equations
τdydt=Ku(tθ)y(FOPDT)\tau\,\frac{dy}{dt} = K\,u(t-\theta) - y \quad \text{(FOPDT)}
K (gain), τ (time constant), θ (dead time) — the canonical target of a plant step test.
Execution

A maximal-length PRBS dither (LFSR-generated, verified by brute-force simulation to visit every nonzero register state exactly once before repeating) excites the process across frequencies in far less time than a sequence of individual step tests.

How to Setup (GUI)

Define MVs, CVs, DVs and run identification

  1. Open the control room — the header's "⧉ Monitors" button, or the right-rail APC icon on a converged flowsheet — to get the MIMO APC panel's General / MVs / CVs / DVs tabs.
  2. MVs — add each actuator (a node/param handle, e.g. a reactor's duty or a column's reflux ratio), and set u_min/u_max (hard limits) and move_max (the per-tick move-rate cap, Δumax).
  3. CVs — add each target (a stream field or unit metric), a setpoint (or a zone — low/high band tracking instead of a fixed point), and a weight (the diagonal of Q).
  4. DVs (optional) — map measured disturbances (e.g. feed flow) so the controller feeds them forward instead of reacting to their effect after the fact.
  5. Don't want to configure by hand? ⚡ Auto-Map Loop pre-fills a 1×1 loop (one MV, one CV) straight from the converged flowsheet as a starting point.
  6. Click Run System ID to bump-test each MV in sequence and fit the FIR step-response model, or — if an opcua_endpoint is set on the loop — Identify (closed-loop) to dither every MV live over OPC-UA and jointly re-fit without stopping the running loop.
How to Setup (SDK)

No first-class Python SDK wrapper yet — configure and identify a loop over the REST API directly:

POST /api/simulations/{sim_id}/apc/loops
{ "mvs": [...], "cvs": [...], "dvs": [...], "horizon": 30, "control_horizon": 5 }

POST /api/simulations/{sim_id}/apc/loops/{loop_id}/identify              # open-loop bump test
POST /api/simulations/{sim_id}/apc/loops/{loop_id}/identify-closed-loop  # live OPC-UA dither
Troubleshooting & Common Errors
An APC controller requires at least one MVThe loop has zero MVs configured — add at least one before running identification.
An APC controller requires at least one CVSame, for CVs — a loop needs something to control, not just something to move.
live re-identification disabledNo opcua_endpoint set on the loop — closed-loop dithering needs a live OPC-UA connection; open-loop 'Run System ID' still works without one.
model looks noisy / poorly fitA step that's too small relative to process noise, or a step that doesn't let the process settle before the next one, both degrade the fit — widen the step size or lengthen the test.