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.
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.
Show the governing equations
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.
Define MVs, CVs, DVs and run identification
- 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.
- 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) andmove_max(the per-tick move-rate cap, Δumax). - 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). - DVs (optional) — map measured disturbances (e.g. feed flow) so the controller feeds them forward instead of reacting to their effect after the fact.
- 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.
- Click Run System ID to bump-test each MV in sequence and fit the FIR step-response model, or — if an
opcua_endpointis set on the loop — Identify (closed-loop) to dither every MV live over OPC-UA and jointly re-fit without stopping the running loop.
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 ditherAn 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.