PID flow control best practices: PI first, quiet valves, honest characteristics
PI-first practices for noisy industrial flow loops: valve characteristics, stiction, cascade slaves, PV filters and a worked FOPDT example.
A liquid flow loop is the fastest common regulatory loop on a process unit, and it is the one most often ruined by a derivative term copied from a temperature faceplate. The process is nearly instantaneous: a valve moves, the inertia of a few metres of liquid and the transmitter lag are over in a second or two, and after that you are looking at turbulence, a DP cell, and a sticky packing gland. The controller’s job is to hold m³/h against header-pressure swings, not to sculpt a pretty setpoint step. That job is PI, a sensible installed characteristic, and enough filtering that the valve stem does not follow the noise.
The running numbers in this article match the flow example in PID Solver 360: K = 1.4 L/min per percent valve, τ = 2 s, L = 0.4 s, PI gains Kp = 0.8, Ki = 0.9, Kd = 0, 0–100 % valve, a 0 → 45 L/min step (2.7 m³/h) over a 40 s horizon. Load that plant, keep derivative off, and use the auto tuner as a check, not as a licence to add Td. The general workflow is in how to tune a PID controller and in the documentation; what follows is the hydraulics and the field habits that keep a flow loop from hunting.
Why a flow process is fast, noisy and self-regulating
Incompressible liquid in a short line does not store much mass. A simplified balance on the pipe volume V is
ρ V d(q_out)/dt ≈ ΔP_drive(u) − ΔP_drop(q)which, after linearisation, is a first-order lag with a time constant set by inertia and by how steeply pressure drop rises with flow. On a typical 2 inch line feeding a meter, τ is 0.5–5 s. The flow example uses τ = 2 s and L = 0.4 s from valve stroke plus transmitter damping. L/τ = 0.2 is mixed but still fast: the whole closed-loop story is over in tens of seconds, not tens of minutes.
The process is self-regulating. Open the valve and flow rises to a new steady value set by the installed pressure drop, not to infinity. Gain K is therefore a real number in (flow units) per %:
K = Δq_ss / ΔuOn the library plant, K = 1.4 L/min/%. A 10 % valve step should move the flow by 14 L/min if you are in the linear region. At 45 L/min setpoint the linear model wants a steady opening of 45/1.4 ≈ 32 % if zero opening is zero flow. Check that number on the real meter: if 32 % gives 38 L/min, the installed characteristic is already bending and your K is only valid near that point.
Noise is not optional. An orifice-plate DP transmitter on a turbulent line sees a broadband signal whose peak-to-peak can be 1–3 % of span even when the mean flow is steady. A magnetic meter is quieter; a vortex meter can shed; a Coriolis meter is usually the cleanest and the slowest. The PID does not know the difference. Derivative on that DP signal is a command to dither the valve. That is the first best practice: PI, not PID, unless you have a documented, quiet PV and a lag that actually needs phase lead — which a 2 s flow loop almost never does. The structure choice is the same one in P versus PI versus PID.
Units you should refuse to mix
Flow is where unit mistakes are cheapest and most embarrassing. 45 L/min is 2.7 m³/h is 0.75 L/s is 11.9 US gpm. K = 1.4 is meaningless until you write 1.4 L/min/%. If the DCS PV is in m³/h and you identified K in L/min, Kp will be wrong by a factor of 60. Percent-of-span PID is safer across loops only if every transmitter range is documented. Recranging a 0–60 L/min meter to 0–100 L/min without retuning is a silent gain change of 0.6.
Valve output is almost always 0–100 %. Direct versus reverse action still matters. A fail-closed feed valve is reverse acting: increasing PV (flow) must close the valve. A fail-open dump valve on a recycle is often direct. Get this wrong and the loop runs away in a second or two, which on flow is fast enough to trip a pump.
The valve, not the PID, is usually the process
Most of what a flow “process model” captures is the control valve plus the installed pressure drop. If the valve is wrong, no SIMC formula will save you. Three plots belong on the loop sheet: inherent characteristic, installed characteristic, and the measured q versus % from a slow stroke in manual.
A linear trim is designed so that, at constant ΔP, flow is proportional to travel. That is the right inherent characteristic when the valve takes most of the line drop — a short recirculation line, a pump recycle, a laboratory skid. It is the wrong inherent characteristic when the valve is a small drop in a long line: as the valve opens, line losses eat the available ΔP and the installed curve goes quick-opening. You then have huge K near the seat and almost no K at 70 % travel. The PID, tuned at 40 %, will be sluggish at 70 % and violent when the operator cuts rate.
An equal-percentage trim is designed so that, at constant ΔP,
q = q_max · R^(x − 1)where x is fraction of travel and R is rangeability, often 30–50. Equal-percentage is the default on process lines precisely because the installed curve, once you include piping losses, comes out closer to linear. That is the whole point: you buy a curved inherent characteristic to cancel a curved installation. If someone installed linear trim on a high-loss line, the PID will look “nonlinear” no matter what Ti you pick.
Quick-opening trim is for on–off and for dump valves. Using it for regulation gives a huge gain in the first 20 % of travel. Tune there and the loop is dead at mid-stroke; tune at mid-stroke and it chatters near the seat.
Installed gain is what the PID sees:
K_installed(x) = dq/du at the current opening, current upstream/downstream pressureA honest commissioning test is a slow 10 % → 90 % stroke in manual with the pump at production speed, logged every few percent. If K at 20 % is three times K at 60 %, you have a characterisation problem, not a tuning problem. Fixes that work, in order of preference: change trim; add a positioner characterisation (cam or digital curve) so that the PID writes a linearised “flow fraction”; move the valve to take more of the drop (larger line, smaller valve — the usual economic fight); or, as a last resort, gain-schedule Kp with PV or with OP.
The library FOPDT with constant K = 1.4 is the linearised plant at one operating point. Simulate a 0 → 45 L/min start-up with that model and you will get a clean PI response. On the unit, the first 10 % of travel may be a different K. Always repeat a small bump at the normal rate, not only from zero.
Positioners, stroking time and the 0.4 s dead time
L = 0.4 s on the example is not mysterious. A pneumatic actuator without a positioner can take 1–3 s to stroke and will add hysteresis. A digital positioner with a 4–20 mA inner loop can stroke a small valve in a few tenths of a second and is itself a cascade slave you do not get to tune on many plants. If the positioner is in “slow” mode to save air, you just lengthened L. Include stroking time in the model. A PI with Ti = 0.9 s on a valve that needs 2 s to move will cut the air the wrong way and look like stiction even when the packing is fine.
Boosters on large valves reduce stroke time but can make the positioner loop lively. If the flow PID is hunting at 1–2 Hz, look at the positioner, not at Kp = 0.8.
Derivative amplifies noise; a PV filter is a different tool
The derivative term in parallel form is Kd de/dt. On a flow transmitter the error contains a noise component n(t) whose derivative is huge. Even a 0.5 L/min dither on a 0.02 s sample is a 25 L/min/s spike; with Kd of only 0.05 that is already a 1.25 % kick on the valve every sample, and real DP noise is worse. There is no useful phase lead to harvest on a plant with τ = 2 s that justifies that. Leave `Kd = 0`.
People then confuse two filters.
A derivative filter Tf = Td/N only exists if Td exists. It tames D; it does not justify turning D on. See derivative kick and filtering for the temperature case where D is actually wanted. On flow, disabling D is cleaner than enabling D and burying it in a heavy filter.
A PV filter (transmitter damping, or a first-order lag in the DCS) sits on the measurement before the PID. It reduces the noise the proportional term sees as well. That is useful, and it costs you bandwidth: you have added lag to the loop, which is extra L or extra τ. A 0.5–1 s damping on a 2 s plant is already a serious fraction of the process. Typical practice: use the lightest transmitter damping that keeps the OP trend from looking like the DP spectrum — often 0.2–1 s on a mag meter, more on a raw orifice — then tune PI on the filtered plant. Do not tune on an undamped trend and then add 2 s of damping; you will have twice the lag you designed for.
If you need more noise rejection than a short PV filter can give, you have the wrong meter or the orifice is in a bad run of pipe, not a missing Td.
On a noisy flow PV, derivative is not “a bit of damping”. It is a high-pass path from turbulence to the packing gland. Set Kd to zero and spend the effort on the meter run and the valve characteristic.
PI numbers that match a few-second plant
SIMC PI on the library FOPDT with the tight choice τc = L = 0.4 s:
Kp = τ / [K (τc + L)] = 2 / (1.4 × 0.8) = 1.79 % / (L/min)
Ti = min(τ, 4(τc + L)) = min(2, 3.2) = 2 sThat is a textbook starting point: integral time equal to the process time constant, modest gain. Parallel Ki = Kp/Ti = 0.90 — which happens to match the library Ki = 0.9 even though the library Kp = 0.8 is more conservative than SIMC’s 1.79. The library set is
Kp = 0.8, Ki = 0.9, Kd = 0
Ti = Kp/Ki ≈ 0.89 sso it is weaker on P and faster on reset than SIMC. That combination is a common field choice on flow: keep Kp down so header noise and a sticky valve do not make a limit cycle, and keep Ti around one second so offset dies before the operator notices. On many plant flow loops Ti is 2–8 s, not 0.9 s, because the valve is larger, the transmitter is damped, and nobody wants the stem chasing a 1 s rumble. Match Ti to the filtered τ, not to a laboratory 2 s skid.
IMC PI with λ = τc is the same formula as SIMC for FOPDT when you do not take the min(τ, 4(τc+L)) clip. For this plant they coincide at τc = L. Ziegler–Nichols PI, Kp = 0.9 τ/(K L) = 0.9 × 2 / (1.4 × 0.4) = 3.21, Ti = 3.3 L = 1.32 s, is too hot for a noisy meter: that Kp will amplify DP dither into visible valve travel. Do not use Ziegler–Nichols on flow unless you like watching packing wear.
Worked closed-loop picture, 0 → 45 L/min, library PI, limits 0–100 %:
- Dead time 0.4 s with no PV movement.
- Rise to ~90 % of setpoint in a few seconds;
Kp = 0.8times a 45 L/min error is 36 % of valve on the first instant, which is already the right neighbourhood of the 32 % steady opening, so proportional does a lot of the job. - Integral closes the remaining gap over ~2–4 s. Slight overshoot (a few L/min) is normal and usually harmless on flow.
- Steady OP around 32 %. If OP wanders ±5 % while PV is within 0.5 L/min of SP, you are fighting noise or stiction, not offset.
Anti-windup still matters when you start from a closed valve and a large setpoint, or when the pump cannot make the requested m³/h. Without it the integrator winds to “150 % valve” during the wait and overshoots when the pump finally catches up. The mechanism is identical to the heater case in anti-windup explained; the time scale is seconds, so the overshoot is a brief flow spike that can trip a downstream high-flow interlock. Enable it in the simulator.
Simulate 40 s with dt around 0.02 s. A 1 s sample on a 2 s plant is bordering on too slow; a 0.1 s DCS scan is typical and is fine. Margins should look easy — phase margin well above 40° — if Kd = 0 and Kp is not the Ziegler–Nichols value. If they do not, you have added too much PV filter. Read gain and phase margin and closed-loop metrics the same way you would for a slower loop; just remember that “settling time” here is 10 s, not 10 min.
When a few seconds of Ti is wrong
Ti of a few seconds is typical for liquid flow with a decent valve. It is wrong in several neighbouring cases.
Gas flow through a long header has capacity; τ can be tens of seconds and the loop starts to look like pressure. Use the pressure-style PI or a mild PID, not Ti = 1 s.
A very large valve with a 10 s stroke is an actuator-limited loop. Ti must not be faster than the stroke. Tune the positioner first.
A Coriolis meter with 1 s damping plus a long hose to a reactor is not τ = 2 s. Re-identify.
A flow controller used as a ratio slave (wild stream times a ratio) should still be a fast PI. The ratio calculation is not a reason to add derivative.
Flow as the cascade slave
This is the highest-value use of a flow PID on a process plant. Temperature, composition, tank inventory and many pressure loops are slow. Their disturbances often arrive through a utility or a feed whose flow can be measured. Put a fast flow PI underneath the slow master and the master sees a linearised, disturbance-rejected actuator.
Pattern:
- Master: temperature, composition, or level.
- Master OP: 0–100 % scaled to a flow setpoint, e.g. 0–4 m³/h.
- Slave: this flow PI,
Tiof a few seconds,Kd = 0. - Slave PV: the flow meter on the steam, jacket water, or feed.
The slave must be several times faster than the master. A temperature master with τ = 120 s and a flow slave with τ = 2 s is an easy decade. If someone detunes the flow loop “because the valve looked busy”, the master inherits header disturbances and you have paid for a meter you are not using.
Master anti-windup must know when the slave is saturated — valve wide open, pump at the stop, flow SP not achieved. Back-calculate the master integral from the achieved flow, or at least from the slave’s limited SP. Otherwise a temperature integral winds while steam flow is stuck at maximum, and the jacket overshoots when pressure returns.
Do not put derivative on the slave “to make cascade snappier”. Snappiness comes from a working positioner and a linear installed characteristic. The temperature tuning article covers the master side; this article is the slave.
Level cascade is the other common pair: outer level, inner flow on the inlet or outlet. For surge tanks the master should be slow (averaging level); the inner flow loop stays fast. That split is how you avoid slamming a feed valve every time the level transmitter dithers. See integrating level control for the master. The inner flow loop still follows the rules here: PI, quiet OP, honest K.
Stiction, hysteresis and the limit cycle that tuning cannot kill
Control-valve stiction is static friction in packing, a dry stem, a damaged positioner, or an undersized actuator. The valve does not move until the PID output has travelled a deadband d %, then it jumps. A PI controller facing a stuck valve sees persistent error, winds, and when the valve finally breaks loose it overshoots the flow. The error reverses, the integrator winds the other way, and you have a limit cycle whose amplitude is set by d and whose period is set by Ti and the plant. Turning Kp down lengthens the period; it does not remove the cycle. Turning Ti up does the same. Derivative makes it worse if the jump looks like a step in PV.
Field signatures:
- PV square-ish or triangular at a period of tens of seconds, OP a sawtooth of a few percent.
- In manual, the valve does not respond to 0.5 % OP changes but jumps on 2–3 %.
- The cycle survives every “retune” and vanishes when you put the loop in manual at a fixed OP.
The fix is mechanical or positioner-related: repack, add a positioner if missing, enable a small-amplitude positioner pulse or “jiggling” only if the vendor supports it and the process can tolerate it, or replace the valve. A PI with a small deadband or with “integral deadzone” can hide a 0.5 % stiction from the operator; it cannot restore tight flow control. Do not add Kd to “predict” the stick-slip. You will predict noise.
Hysteresis without stiction (a loose linkage, a reversing pneumatic) looks like a loop that never quite settles to the same OP for the same SP. Characterise it with an up-stroke and a down-stroke in manual. If the gap is 4 % of travel, your effective resolution is 4 %, and demanding ±0.5 % flow is theatre.
Split-range valves (two valves, one PID) add a dead zone or a gain jump at the split. Tune and linearise each half; do not expect one Kp to fit a 1 inch and a 4 inch valve in series on the same OP.
Identification that does not lie on a fast loop
Open-loop bump tests on flow are easy to do badly because the loop is fast and the operators are impatient. Procedure that works:
Put the controller in manual at the normal rate. Wait until the mean flow is flat; ignore the noise band. Step OP by 5–10 % — enough to see above the noise, not so much that you trip a pump. Record at 10 Hz or faster if you can; a 1 s historian sample on a 2 s plant is barely enough to see L = 0.4 s.
Fit K from the change in mean PV, not from a single noisy peak. Fit L as the time to first consistent move of the mean. Fit τ from 63 % of the mean change. If the response is essentially complete in one second and then noisy, you may be looking at stroke time plus a very small hydraulic τ; a FOPDT with τ = 1–2 s, L = 0.3–0.6 s is still a good PID design model. Do not fit a second-order oscillation to turbulence.
If the bump up and the bump down give different K, you have hysteresis or a nonlinear installed curve. Report both; tune for the larger K if you care about stability, for the smaller K if you care about offset at that end of the range.
Closed-loop identification (relay, or a small SP step in auto) is possible because the loop is fast, but a relay that saturates the valve will excite stiction and you will identify the stick-slip cycle, not the hydraulics. Keep relay amplitude small.
Feed the FOPDT into the auto tuner, take the SIMC or IMC PI, set Kd = 0 even if the PID column fills in a Td, and confirm in the simulator with a noise term if the tool allows it. Then look at the OP. A “good” PV with a 15 % peak-to-peak OP is not a good flow loop; you are carving the trim. Drop Kp, add a little PV damping, or fix the meter.
Pitfalls specific to flow
PID because the faceplate had three numbers. The third number should be zero. Operators who “saw D help on the dryer” will enable it here and wear the valve.
Tuning at night minimum flow, running at noon maximum. Installed K changes with the number of users on the header. If noon K is twice night K, night’s aggressive PI will hunt at noon. Tune at the high-gain condition or schedule.
Pump on a VSD and a valve in series, both trying to control flow. Pick one MV. Valve throttling against a fixed-speed pump is the classic loop; VSD on the pump with the valve wide open is often better energetically. Two PIDs on the same m³/h is a fight.
Measuring flow after a long hose and controlling a valve at the pump. You have added transport delay. L grows, and a Ti of 0.9 s is too fast. Move the meter or slow the PI.
Ignoring flashing and cavitation. The PV becomes noisy and the trim erodes; K walks. That is a sizing and ΔP problem. Retuning weekly is a clue.
Direct-acting the wrong way on a cooling-water return. Fast runaway, tripped pump, phone call. Check action in manual with a 2 % bump before auto.
Filtering in three places. Transmitter damping 2 s, DCS PV filter 2 s, positioner slow — you have built a 5 s plant and then blamed SIMC for being sluggish.
Using Ziegler–Nichols ultimate-sensitivity on a live flow valve. You will cycle the valve against the seat. Use an open-loop bump or a model in PID Solver 360.
A practical sequence for a new flow loop
Stroke the valve in manual. Confirm fail position, tight shutoff, and that 0–100 % in the DCS is 0–100 % at the actuator. Log q versus % at production header pressure. Decide whether the installed curve is acceptable. Fit a FOPDT at the normal rate. Compute SIMC PI, Kd = 0. Add the least PV damping that quiets OP. Enable anti-windup. Put in auto on a 5–10 % SP step, not a 0 → 100 % slam. Watch OP as hard as you watch PV.
If the loop is a cascade slave, tune it this way before you ever put the master in auto. A busy-looking slave that holds flow within 1 % of SP with a calm stem is a good slave. A dead-looking slave with 5 % flow error is a bad slave, even if the master eventually compensates.
When the hydraulics are ugly, the optimiser will not invent a linear valve. It can shave overshoot on the linear model. Use it after the characteristic is honest, not instead of a trim change.
Flow is where PID looks easy and mechanical reality is not. The algorithm should be the boring part: PI, Ti of a few seconds, modest Kp, no derivative, anti-windup on, filters documented. The interesting part is the meter run, the installed characteristic, the packing gland, and whether this loop is allowed to be fast because it is a slave, or must be a little dull because it feeds a unit that hates a moving stem. Put the library plant in the solver, then go to the pipe and see which of those two loops you actually have.
Put this into practice — model your process, auto-tune it and check the stability margins.
Launch PID Solver 360