MaximaLabs
Back to gallery

Closed-loop LPG splitter — dual zero-offset PI control — a PENG-ROBINSON process flowsheet

Two independent, genuinely converged integral (PI) control loops in one train, wired on the canvas (transmitter → controller → manipulated unit, not just reported): a feed preheater's duty holds the column feed at its temperature setpoint, and the column's distillate-to-feed split ratio holds the bottoms temperature at its setpoint — a classic temperature-inferred composition control scheme (this solver has no composition transmitter, so temperature is the composition proxy, exactly as most real columns are actually controlled). Both loops reach a genuine zero-offset steady-state operating point via the flowsheet's outer fixed-point iteration (result.control_iterations > 0), each report's measured equal to its setpoint. This is honestly decentralized SISO PI control, not simultaneous MIMO DMC (no predictive horizon, no MV/CV interaction matrix, no constraint handling) — that capability lives in the separate live APC/MPC runtime (see the Control Room), not a static flowsheet example.

119 views 1 forks

FEED
PH
TT
TT FEED
PID
CTRL FEED
feed
dist
btms
COL
TT
TT BOT
PID
CTRL BOT
DIST
BOT
What this showcases
  • Rigorous PENG-ROBINSON thermodynamics, solved by the same engine every simulation runs on.
  • 4 unit operations modeled: PH, 2× TT BOT, 2× CTRL BOT, COL.
  • Focus areas: Closed-loop control, PI control, Temperature-inferred composition control.
Specification
Thermodynamics
PENG-ROBINSON
Components
n_butane, n_pentane
Unit operations
PH2× TT BOT2× CTRL BOTCOL
Open in workspace

Opens in a new tab, loaded straight into the app — no setup.

Read the step-by-step guide
Python SDK

Reproduce this exact result from Python — the real client.get_example() → run_and_wait() path, not a mockup.

from flowsim.sdk import FlowSimClient

client = FlowSimClient()
example = client.get_example("closed-loop-distillation-dual-pi")
sim = client.create_simulation(example["title"], example["flowsheet"])
result = client.run_and_wait(sim["id"])

print(result["status"])              # "converged"
streams = client.streams(sim["id"])

Stop fighting legacy software. Build your first flowsheet in 60 seconds.