How to tune a PID temperature controller on ovens, heaters and exchangers
Tune oven, heater and exchanger PID loops: thermal lag, transport dead time, filtered derivative, anti-windup and an IMC/SIMC worked example.
A temperature loop is the slowest honest job most plant engineers still hand to a PID. The chamber or the tube wall stores energy; the sensor sits behind a thermowell; the heater or steam valve cannot suck heat back out once it has been delivered. Those three facts — lag, delay, and a one-sided actuator — decide the structure, the starting gains, and the overshoot you are allowed to live with. Copying a flow-loop PI onto an oven is how you get a two-hour creep that never quite reaches recipe. Copying a motion-control PID onto the same oven is how you get a 20 °C overshoot and a ruined batch.
This article is the field procedure for ovens, electric heaters, jackets and liquid–liquid exchangers. The running numbers are the electric-oven example in PID Solver 360: process gain K = 2.5 °C/%, time constant τ = 120 s, dead time L = 15 s, heater limited to 0–100 % power, heat-up from 20 °C to 180 °C. Load that plant, compute a rule in the auto tuner, and keep the closed-loop plot next to the algebra below. The same workflow is written out for any loop in the step-by-step tuning guide and in the documentation; here the physics is thermal and the units are degrees and percent fire.
What the energy balance actually is
Temperature is stored energy. For a well-mixed chamber with a resistive heater the simplest useful balance is
C dT/dt = P · u − (T − T_amb) / RC is thermal capacity in J/°C (mass times specific heat, plus whatever steel and product ride along). P is heater power at 100 % duty, in W. u is duty cycle as a fraction, or percent if you keep the units consistent. R is thermal resistance to ambient in °C/W. The open-loop gain and time constant fall out immediately:
K = P · R (in °C per fraction, or °C/% if u is percent)
τ = R · C (in seconds)A 12 kW element into a chamber that loses 48 W/°C to the room has K = 12000/48 = 250 °C per unit duty, which is 2.5 °C/%. If the combined air, rack and product heat capacity is 5760 J/°C, then τ = 5760/48 = 120 s. Those are not magic library numbers; they are a 12 kW benchtop oven with a few kilograms of steel and a leaky door. A production kiln with a 200 kW element and a 4 t load will have a time constant of tens of minutes. Do not transplant Kp across that gap.
The first-order model is the energy store. Everything else — the thermowell, the air mixing time, the heater sheath, the length of duct or pipe between the actuator and the sensor — appears as apparent dead time L. The working plant is therefore first-order-plus-dead-time:
G(s) = K · e^(−L s) / (τ s + 1)For the oven, L/τ = 15/120 = 0.125. That ratio is lag-dominant: derivative can buy back the phase that fifteen seconds of delay stole, and you are not yet in the dead-time-compensator regime. When L/τ climbs above about 0.4, as on a long steam-traced line with the sensor far downstream, PID still works but the gain must come down and the derivative term is no longer a free lunch.
Ovens, cartridge heaters and exchangers are not the same plant
An electric oven or furnace is the energy balance above. The actuator is often a solid-state relay with a 1–10 s cycle time, which adds to L. Cooling is passive unless you have a blower or a quench. Overshoot on a large heat-up is therefore expensive: you wait for losses to eat the extra joules.
A cartridge heater in a metal block is the same structure with a smaller C and a much smaller L if the RTD is in the same block. τ of 20–60 s is common. Derivative is still useful; noise is usually low. The trap is a sensor in a different block from the heater, which inflates L and makes a tight PID ring.
A liquid–liquid or steam–liquid exchanger is a transport process. The tube-side outlet temperature responds to a valve change only after the fluid that was in the tubes at the moment of the move has been displaced. Dead time is roughly V / q, volume over volumetric flow. At 8 m³/h through a 40 L hold-up that is 18 s of pure delay before mixing and wall lag. Gain K in °C/% valve also moves with flow: at low flow the residence time is long and a given steam-valve move produces a larger outlet-temperature change. Tune at the production flow, not at a convenient idle.
Jacketed vessels sit between the two. The jacket is a fast flow or steam loop; the batch temperature is a slow energy store. That is the textbook case for cascade, treated later. Do not ask one PID to throttle the steam valve from a noisy batch RTD three minutes away. The inner loop will do the fast work if you give it a flow or jacket-temperature PV.
Where the fifteen seconds of dead time come from
Dead time on a temperature loop is almost never a single physical delay. It is the sum of several lags that are faster than τ and that the FOPDT fit lumps into L. Name them on the loop sheet or you will “retune” a loop whose sensor was the problem.
The thermowell is the usual culprit. A 6 mm stainless well in a gas oven can add 10–20 s of lag; the same well in a liquid is faster; a heavy flanged well in a low-velocity gas duct can exceed 40 s. If you can use a grounded thin-wall well or a spring-loaded RTD, you buy bandwidth that no amount of Kd will recover. An ungrounded transmitter with a 1 s damping setting on top of that well is a second filter. Put the damping in one place, document it, and include it in L.
Air or liquid mixing is the next term. A recirculating oven with a failed fan looks like a much larger L and a drifting gain, because the sensor sees a stratified pocket. A pipe sensor mounted on the wall instead of in the bulk flow does the same. Before you touch Kp, confirm that the PV is the temperature the product actually sees.
Heater and valve dynamics are the third. An SSR with a 2 s time-proportioning window cannot deliver a correction faster than that window. A steam valve with a 4–20 mA positioner and a 3 s stroke adds its own lag. If the inner actuator is slow, cascade or a faster valve beats a larger derivative time.
Transport delay is the fourth, and it is the one that scales with flow. On an exchanger,
L_transport ≈ V_pipe / qDrop the flow from 10 m³/h to 4 m³/h and a 12 s transport delay becomes 30 s. The SIMC gain you calculated at design flow is then too high. This is why a temperature loop that was quiet in July rings in January when the plant is on reduced rate.
The identification experiment must wait long enough to see the true steady state. For τ = 120 s that means several minutes after the PV has visibly bent toward the new value, not the first 90 s of the S-curve. A truncated test understates τ, overstates K if you have not finished, and produces an aggressive Kp that overshoots on the real plant.
Identify K, τ and L on a real heater
Put the controller in manual. Wait until temperature is as flat as the furnace ever gets. Step the output by a known amount — 10 % is a typical bump; 5 % if you are near a trip. Record until the PV has settled to a new straight line, not until it has “mostly” moved.
On the oven, a 10 % step from a steady 40 % fire should raise temperature by about 2.5 × 10 = 25 °C if you are in the linear region. That is K. If the bump from 40 % to 50 % gives 22 °C and the bump from 70 % to 80 % gives 18 °C, gain is falling with temperature (radiation grows as T^4) and you must pick the K at the recipe, not the K near ambient.
Read L as the time from the output step to the first clear departure of PV, after you have mentally ignored noise. Read τ as the additional time from that departure to 63 % of the final change. The two-point method in the tuning-methods article is cleaner on a noisy trace: time to 28 % of the change and time to 63 %, then
τ ≈ 1.5 (t63 − t28)
L ≈ t63 − τFor the library oven you should recover something close to τ = 120 s, L = 15 s. If you recover L = 40 s on a unit whose well is short, the sensor is in a dead pocket or the SSR window is huge. Fix the measurement before you invent a Smith predictor.
Steady-state fire at the 180 °C recipe, starting from a 20 °C ambient with u = 0 corresponding to ambient, is
u_ss = (180 − 20) / 2.5 = 64 %That 64 % is the number the integral term must find after the heat-up. It is also a check on the model: if the real oven needs 80 % to hold 180 °C, your K is optimistic and every rule that divides by K will over-gain the loop. Recalculate K from the production hold, not only from the bump.
Identify at the temperature and load you actually run. A 30 °C bump around 50 °C on an empty oven is a different plant from a 180 °C hold with product on the racks.
Choose PID, not PI, and put derivative on the measurement
Temperature is the process class that earns the D term. The plant is lag-dominant, the PV from an RTD or a good thermocouple is quiet compared with a DP cell, and the delay L = 15 s is large enough that a PI controller must back off Kp to keep phase margin. Derivative restores high-frequency phase. The decision table in P, PI, PD or PID says the same thing: use full PID when lag and dead time matter and the measurement is clean enough.
Use the ISA (ideal) form when you are talking to a DCS faceplate,
u = Kp [ e + (1/Ti) ∫ e dt − Td dPV_f/dt ]and convert to parallel Ki = Kp/Ti, Kd = Kp Td when you type into the calculator. The minus sign on the derivative is deliberate: derivative on measurement, not on error. A recipe step from 170 °C to 180 °C is a 10 °C jump in error in one scan. Raw Kd · de/dt on a 0.5 s sample is a several-hundred-percent spike on the heater. That spike is derivative kick; the dedicated article derivative kick and filtering works the numbers. On a temperature loop you have no excuse for leaving D on error. Setpoint weighting b = 1, c = 0 is the same idea: proportional may see the SP step, derivative must not.
Filter the derivative. The industrial approximation is
D(s) = − Kp Td s / ( (Td/N) s + 1 ) · PV(s)with N in the range 8–20. N = 8 is safer on a slightly noisy well; N = 20 is sharper on a clean block RTD. The library oven uses Kd = 25, which is Td = 25/3.8 ≈ 6.6 s. With N = 10 the filter time is Tf = 0.66 s — fast relative to τ = 120 s, slow enough to knock down thermocouple dither. Raw Kd with N → ∞ will modulate the SSR on every bit of ADC noise and the heater will tick like a flow valve. That is not “the process hunting”. That is an unfiltered differentiator.
If the only PV you have is a noisy IR pyrometer on a moving web, you may still be better with PI plus a modest PV filter than with PID. Derivative cannot create information that the sensor did not measure. A flow loop is the extreme of that advice; a well-instrumented oven is not.
Anti-windup is not optional on a 0–100 % heater
The heater cannot go below 0 % and cannot go above 100 %. During a cold start from 20 °C to 180 °C the error is 160 °C. With Kp = 3.8 %/°C the proportional term alone is
u_P = 3.8 × 160 = 608 %The output hits 100 % on the first scan and stays there until the chamber is close to recipe. While it sits on the stop, every second of remaining error is charged into the integrator unless you freeze it. Without anti-windup the integral at the moment PV finally reaches 180 °C is already large enough to demand well above 64 % fire, so the heater stays pegged, temperature overshoots by tens of degrees, and you wait for the overshoot to decay through the walls.
Back-calculation, as explained in anti-windup, recomputes the integral so that P + I + D sits on the limit:
I ← u_limit − P − D (while saturated)The heater then comes off 100 % before PV reaches setpoint, which is exactly what you want on a thermal mass. Enable anti-windup in the simulator whenever uMin and uMax are finite — which is always on a real heater. Also enable it for the cool-down direction if you have a bipolar actuator (heat/cool). A one-sided heater cannot undo an overshoot except by waiting; that is an argument for a modest setpoint ramp and for not demanding 0 % overshoot on a 160 °C step.
A related pitfall is integral action during a known saturation. Some recipes hold the oven in manual at 100 % until a watch-dog temperature, then switch to auto. If you bump to auto with a large remaining error and a live integrator, you repeat the windup story. Either preload the integral at 64 % (the expected hold) or use a setpoint ramp from the current PV.
IMC and SIMC numbers you can type before lunch
You now have K = 2.5 °C/%, τ = 120 s, L = 15 s. The robust starting point for a temperature loop is SIMC PI or Rivera IMC-PID, not Ziegler–Nichols quarter-decay. Compute them in the auto tuner and write them on the loop sheet.
SIMC PI with the tight default τc = L = 15 s:
Kp = (1/K) · τ / (τc + L) = (1/2.5) · 120 / 30 = 1.60 %/°C
Ti = min(τ, 4(τc + L)) = min(120, 120) = 120 sParallel integral gain is Ki = Kp/Ti = 1.60/120 = 0.0133 %/°C/s. This PI is slow and polite. Overshoot on the 160 °C heat-up is small if anti-windup is on; settling to ±2 °C will take on the order of 10–15 minutes. Use it when product quality hates overshoot more than it hates time — chocolate, some polymers, a furnace with a tight max-temperature interlock.
Tighten the closed-loop time constant to τc = 8 s (a bit faster than L/2, still honest about delay):
Kp = 120 / (2.5 × 23) = 2.09 %/°C
Ti = min(120, 92) = 92 s
Ki = 2.09 / 92 = 0.0227 %/°C/sThat is a reasonable PI if you refuse derivative. Rise is quicker; you will see a few degrees of overshoot on a large step.
Rivera IMC-PID for FOPDT, using the usual half-delay approximation and a filter λ:
Kp = (τ + L/2) / [ K (λ + L/2) ]
Ti = τ + L/2
Td = τ L / (2 τ + L)With λ = L = 15 s:
Kp = 127.5 / (2.5 × 22.5) = 2.27 %/°C
Ti = 127.5 s
Td = 1800 / 255 = 7.06 sParallel: Ki = 2.27/127.5 = 0.0178, Kd = 2.27 × 7.06 = 16.0. This is the first PID I would put on the oven if I had a clean RTD. Derivative time of 7 s is a fraction of τ and comparable to L/2, which is where D belongs on this plant.
The library starting point in the temperature example is more aggressive on proportional and integral:
Kp = 3.8 %/°C, Ki = 0.06 1/s, Kd = 25
Ti = Kp/Ki ≈ 63 s, Td = Kd/Kp ≈ 6.6 sThat Kp is almost exactly open-loop Ziegler–Nichols (1.2 τ /(K L) = 3.84), but Ti has been lengthened from Ziegler–Nichols’ 2 L = 30 s to 63 s so the heat-up does not ring, and Td is close to 0.5 L. In IMC language it is roughly λ ≈ 6 s, which is optimistic: it assumes the model is right and the well is the well you identified. Use it as a fast reference in simulation; on a plant with ageing elements and a dirty well, start from IMC with λ = L and only then take Kp up.
AMIGO PID, built to be robust across L/τ, gives a lower gain on this lag-dominant heater (order Kp ≈ 1.5, Ti on the order of τ). It is a good “do not disturb the operators” set. Cohen–Coon is the wrong neighbourhood: it was derived for delay-dominant plants and will look nervous here.
Convert forms before you download to the PLC. If the faceplate is series (interacting) PID, Td and Ti are not the ISA numbers. The documentation lists the conversions; PID Solver 360 stays in parallel internally. A factor-of-two error in Td on a heater is a noisy SSR, not a subtle robustness issue.
What the closed-loop heat-up should look like
Simulate 1200 s, sample around 0.5 s, anti-windup on, derivative on PV, N ≈ 10. A healthy 20 → 180 °C response on this plant has four visible features.
The output goes straight to 100 % and holds. That is not a defect; the error is 160 °C and you asked for a large step. Around the time PV passes roughly 140–160 °C the output should already be falling toward 64 %, not sitting at 100 % until 179 °C. If it stays pegged until the PV crosses setpoint, anti-windup is off or Ti is far too small.
Temperature itself should wait about 15 s, then rise on a smooth S-curve. Overshoot of 8–12 °C on a 160 °C step (5–8 %) is typical of the aggressive library PID with anti-windup. For product that cannot exceed 185 °C you either ramp the setpoint in 20–40 °C steps, detune to SIMC PI, or add a hard PV clamp in the interlock (not in the PID). Settling to ±2 °C inside 15–20 min is a fair spec for this oven; demanding ±0.5 °C in five minutes is a different machine.
One gentle undershoot after the peak is acceptable. Three rings are not: Kp or Kd is too large relative to the true L. A 40-minute crawl that never overshoots and is still 4 °C low at t = 1200 s is timid integral or an identified K that was too large (so Kp came out too small).
Margins belong in the same sitting. Aim for a phase margin of about 40–60° and a gain margin above 6 dB, as discussed in gain and phase margin. A Ziegler–Nichols PID on this model often sits near the low end of that band. IMC with λ = L sits more comfortably. Check the numbers in the simulator before you call the set “done”.
Overshoot is a quality spec, not a tuning vanity
Control literature minimises IAE. Product does not care about IAE. A powder-coating oven that peaks 15 °C above recipe can scorch the edge of the parts while the centre is still coming up. A chocolate tempering loop that undershoots into the wrong crystal form is off-spec even if the ITAE is beautiful. A semiconductor furnace with a wafer max-temperature limit treats overshoot as a scrap event.
Write the spec in engineering units before you pick a rule:
- Maximum allowed PV, not just setpoint (e.g. 185 °C hard).
- Band for “in spec” (e.g. 178–182 °C) and the time you may spend getting there.
- Whether a large recipe change is a ramp or a step. Most plants should ramp.
If the hard max is 185 °C and the recipe is 180 °C, you have 5 °C of headroom. The aggressive library PID that overshoots 10 °C is illegal. Options that actually work: a setpoint ramp of 2–4 °C/min so the heater comes off the stop early; SIMC PI with τc = L; two-degree-of-freedom PID with b < 1 so the proportional term does not fully see the SP step; an inner power loop so the master temperature PID writes a limited power setpoint rather than raw SSR demand.
Do not “fix overshoot” by crushing Kp to 0.4 and leaving a 30-minute lag unless the process truly wants that. You have only moved the problem into long heat-up times and poor disturbance rejection when someone opens the door. The optimiser can put a hard overshoot penalty in the cost; use that when the spec is asymmetric (overshoot forbidden, slow rise allowed).
Load disturbances on temperature are door openings, feed changes, and steam-pressure dips. A PI with Ti = 120 s rejects a door-open event slowly because the integrator is slow; the IMC-PID with Td ≈ 7 s reacts to the falling PV and puts fire in sooner. That is the operational reason to keep D on a clean temperature PV even if the setpoint response was already acceptable with PI.
Cascade: let a fast inner loop eat the valve
The single-loop picture assumes the manipulated variable is heat. On many plants it is not. Steam flow, jacket flow, or thyristor power is a faster loop of its own, disturbed by upstream pressure and by the nonlinear valve. Putting the temperature PID straight onto that valve forces a slow controller to correct a fast hydraulic disturbance. Cascade is the standard fix.
The inner (slave) loop is typically flow or power. Tune it as a fast PI: see flow-loop practice and the flow example. Time constant of a few seconds, derivative off, valve characteristic handled by positioner or by a characterised SP. The outer (master) loop is temperature. Its “actuator” is now the inner-loop setpoint, which looks like a well-behaved, almost first-order power delivery with a small extra delay.
A worked sketch for a steam-heated exchanger:
- Inner: steam flow, 0–2000 kg/h,
τ ≈ 2 s,L ≈ 0.5 s, PI withTi ≈ 2–4 s. - Outer: outlet temperature,
Kin °C per (kg/h) once the inner loop is closed,τstill on the order of 1–3 min,Lthe transport delay plus inner-loop settling. - Master output scaled 0–100 % to 0–2000 kg/h. Anti-windup on the master must use the saturated inner setpoint, not the master’s unsaturated request, or you wind the temperature integral against a flow valve that is already wide open.
Do not make the inner loop slower than the outer. If someone detuned the flow PI “because it looked busy”, the temperature master will start fighting steam-header disturbances again. Inner loop bandwidth should be at least five to ten times the outer. On the oven, an inner power loop with a 1 s thyristor is so fast that the temperature PID can treat power as the true MV; cascade still helps because it linearises the SSR and rejects supply-voltage changes.
Jacket temperature as the inner PV is the batch-reactor pattern. Inner PID holds jacket at the master’s request; outer PID is batch temperature. The jacket loop can use modest derivative; the batch loop often uses PI with a long Ti because the batch τ is many minutes. That split is how you avoid a single sluggish PID on the steam valve.
A tank level is the wrong inner loop for temperature. Level is inventory; it does not deliver heat. If the plant is a well-mixed tank with a heating coil, the cascade inner loop is coil flow or steam flow, not level. Level may be a separate inventory loop with its own rules for integrating processes.
Pitfalls that look like “bad PID”
Tuning on a small bump, running a large heat-up. Gains identified around 180 °C with a 5 °C step do not include the saturation of a 160 °C start. Always simulate the production step with limits on. The linear FOPDT is invalid while the heater is stuck at 100 %, which is why anti-windup and a ramp matter more than a 10 % change in Kp.
SSR cycle time not in the model. A 10 s time-proportioning window on a 15 s dead-time plant is a different plant. Either use burst-fire / phase-angle control with a short cycle, or add ~half the window to L and retune.
Sensor in the wrong place. A thermocouple on the heater sheath will make the PID think the oven is fast and will leave the product cold. A sensor in a stagnant corner will add delay and will overshoot the product. Put the control PV where the spec is written.
Derivative on error, unfiltered. Every recipe change slams the heater. Operators then disable D forever and you are back to a slow PI. Fix the structure; do not throw the term away on a clean oven RTD.
Direct action on a heater. Increasing PV must decrease fire (reverse acting) unless you are on a cooler. Wrong action runs away. No tuning rule detects that.
Ignoring gain change with temperature and load. Radiation, product mass and door seals change K and τ. A set that is calm on an empty oven can overshoot with a full load (larger τ, sometimes larger effective L) or ring when empty (smaller τ). If the product mix varies, pick the gains for the worst-case L/τ and accept a slower empty-oven response, or schedule Kp with load.
Copying parallel gains into an ISA faceplate. Ki = 0.06 is not Ti = 0.06. On this oven Ti is 63 s. That mistake, a factor of a thousand if someone also mixes minutes and seconds, is a classic overnight-hold disaster.
No simulation of noise and a door-open disturbance. A pretty setpoint step with Kd = 25 can still chatter the SSR when the thermocouple dithers by 0.3 °C. Add noise in the simulator, look at the CO trend, and raise Tf or drop Kd until the heater duty is something a solid-state relay may be asked to do.
A commissioning sequence that does not waste product
Start with the model, not with the live recipe. Enter K, τ and L in PID Solver 360, pick IMC or SIMC in tuning mode, and inspect overshoot, settling and the CO on a 20 → 180 °C step with 0–100 % limits and anti-windup. If the product cannot take the overshoot, increase λ or τc, enable a setpoint ramp, or switch to PI. Compare structures using the notes in the complete PID guide.
On the plant, confirm reverse action, scaling (PV in °C, OP in %), and that the SSR or valve actually moves in manual. Repeat a small open-loop bump at the production temperature to confirm K has not walked. Download the simulated gains. Put the loop in auto on a small setpoint change — 5 °C, not 160 °C — and watch both PV and OP. Then run the production heat-up with the ramp you simulated.
If the small step is sluggish and the OP never uses more than 20 % of its authority, Kp is low or K was overestimated. If the small step rings, Kp or Kd is high or L was underestimated. If the large heat-up overshoots after a long sit at 100 %, anti-windup is missing. If OP chatters while PV is smooth, derivative filtering is missing. Those four sentences diagnose most temperature loops without a second trip to the textbook.
When the loop is close, a short run through the optimiser against an overshoot-aware cost will shave the last minutes off heat-up without violating the max-temperature spec. Do not start the optimiser from (Kp, Ki, Kd) = (1, 1, 1) on a plant with K = 2.5 and τ = 120 s; start from the IMC set you already trust.
Temperature is slow enough that a careful afternoon of identification and simulation is cheaper than a week of “nudge Kp and wait twenty minutes”. Use the industrial applications overview when you need to place this loop next to flow, level and motion on the same unit, and use closed-loop metrics when you have to explain to a quality engineer why 8 °C of overshoot on a 160 °C step is or is not acceptable. The oven does not care which rule you name. It cares that fire comes off the stop in time, that the well is measuring the product, and that nobody asked a differentiator to follow a recipe step.
Put this into practice — model your process, auto-tune it and check the stability margins.
Launch PID Solver 360