PID Anti-Windup Schemes

Integrator windup in PID feedback control is well-known to control engineers. It happens when the integral term is used with some nonlinear saturation in the loop, such as when a physical variable reach its limit. When that happens, the feedback loop breaks, causing error accumulation in the integrator. This results in worse step and disturbance responses than the case of pure linear system.

To combat with the detrimental windup effects, a commercial PID controller often has some additional function called anti-windup. There are variations of implementation out there. Here we only investigate two basic schemes: conditional integration and back calculation.

Before further discussion, we have to review the two commonly-used forms of PID. First,

(1)   \begin{equation*}  u(t) = K\left( e(t) + \frac{1}{T_i}\int_{0}^t e(\tau)d\tau + T_d\frac{de(t)}{dt}\right) \end{equation*}

is often referred to as the “textbook” form. The second one is the parallel form used in Scilab Xcos block

(2)   \begin{equation*}  u(t) = K_pe(t) + K_i\int_{0}^t e(\tau)d\tau + K_d\frac{de(t)}{dt} \end{equation*}

Some tuning methods such as Ziegler Nichols use the form (1). In this article we prefer (2). This variation should not pose a problem since the parameters between the two can be related by

(3)   \begin{equation*}  K_p = K, \; K_i = \frac{K}{T_i}, \; K_d = KT_d \end{equation*}

The plant used is the same one from our Digital PID Controllers article.

(4)   \begin{equation*}  P(s) = \frac{1}{(s+1)^3} \end{equation*}

There we already performed PID parameter tuning. Those parameters will be used in the simulation.

Effects of Integrator Windup on Step Response

To see how integrator windup deteriorates the step response, we use an Xcos diagram mypid.zcos shown in Figure 1. An output limit block is connected to the PID controller output, which can be switched on/off by a selector. The saturation is set up to + 511, a limit for 10-bit DAC or PWM. Further discussion of this setup can be read from our Scilab Recipe 3: Xcos Block Seasoning.

Figure 1: Xcos diagram with saturation block [mypid.zcos]

Setup the PID block by parameters achieved from the ZNFD tuning in Digital PID Controllers, and converted by (3).

ku = 8;  // ultimate gain
tu = 3.5;  // oscillation period
kp = 0.6*ku;  // PID controller gains
ki = kp/(0.5*tu);
kd = 0.125*kp*tu;

The command input is a switching step command that starts from 0 to 1000 units at t=0.1 sec and switch to – 1000 units at t=20 secs. Run the simulation twice, first time as pure linear system (switch connected to input 1) and second time with output limit in effect (switch connected to input 2). Save the data to different variable names and plot a comparison. The result is shown in Figure 2. Notice that the windup effect for this system does not cause higher overshoot, but degrades significantly the rise time of step response.

To implement anti-windup, we will have to add extra mechanisms into our PID controller. So instead of using the PID block from Scilab palette, we have to construct our own, which is not difficult to do. Furthermore, the modified structure from our article Discrete-time PID Controller Implementation is used; i.e., the derivative part is replaced by Low-pass Filter for better noise immunity.

Figure 2 response comparison from mypid.zcos

Scheme1: Conditional Integration

The idea of conditional integration scheme is simple. Whenever there is some indication that saturation is causing error accumulation, the integrator in PID controller is turned off. There is however some variation in deciding when to switch off. The easiest one to implement is perhaps monitoring the controller output and comparing with the limits. Whenever saturation occurs, the integrator is turned off.

The Xcos model awupid_m1.zcos in Figure 3 is built to experiment with this conditional integration scheme, implemented in the lower feedback diagram.

Figure 3 PID control with conditional integration scheme [awupid_m1.zcos]

The plant blocks now accept data from a linear system P in Scilab workspace. So you can easily use the model with some other plant by constructing a new P. At this point we still use (4)

-->s = poly(0,'s');
-->P = syslin('c',1/(s+1)^3);

Notice that the derivative is implemented as an LPF with additional parameter N. We choose this as some large value, say

-->N = 1000;

Other PID gains remain the same as above.

Note: For your convenience, all setups are contained in a script file awupid.sce. Run the script once before simulation.


To see a comparison, connect the selector switch in the upper diagram to input 2. That routes the PID controller output through the output DAC limit block. Then click run. Figure 4 is the resulting scope view of output responses. Tracking performance is significantly improved with the conditional integration scheme, in the sense of overshoot reduction. However, it could not improve the rise-time of step response that degrades from the pure linear system.

Figure 4 output responses from awupid_m1.zcos

There is no parameter to adjust in the conditional integration scheme. The integrator is simply switched on or off depending on whether a signal saturates.

Scheme 2: Back Calculation

Back calculation anti-windup scheme can be viewed as supplying a supplementary feedback path around the integrator. This feedback becomes active and helps stabilize the integrator only when the main feedback loop is open due to saturation. To experiment with this scheme, use an Xcos model awupid_m2.zcos in Figure 5. The back calculation feedback is implemented in the lower diagram, with additional compensation gain kt.

Figure 5 PID control with back calculation scheme [awupid_m2.zcos]

Figure 6 shows five output responses with kt = 0.1, 0.5, 1, 2, 5. The overshoot lessens with increasing kt, though too large a value causes slower rise-time, and even induces undershoot for the case kt = 5.

Similar to the conditional integration scheme, rise-time cannot be improved to match the case of pure linear system.

Figure 6 output responses from awupid_m2.zcos


In this article, we discuss two anti-windup schemes in a PID controller and simulate some closed-loop step responses with a chosen plant transfer function. The audience can download Xcos files and perform further investigation with other choices of parameters and plants. We would also be interested to learn how these schemes behave under more realistic situations, such as tracking performance with other command inputs, with added input/output disturbances, or operating under noisy condition, etc.


  1. K.J. Astrom and T.Hagglund. Advanced PID Control Instrumentation, Systems, and Automation Society, 2006.
  2. V. Toochinda. Digital PID Controllers,, 2011.
  3. V. Toochinda. Module 4: PID Control, in Scilab Control Engineering Basics, Scilab.Ninja, 2014.


Scilab and Xcos files used

Download all as zipped file:



Comments are closed.