Skip to content

Controller Blocks

Proportional-integral controllers. The variants differ in where the limits apply and whether they follow the IEEE formulation.


Proportional-Integral (PI) controller.

pictl block diagram

Syntax

& pictl
name of variable x_k
name of variable x_j
data name, parameter name or math expression for K_i
data name, parameter name or math expression for K_p

Internal States

xix_i

Discrete Variables

None.

Equations

x˙i=Kixk0=Kpxk+xixj\begin{aligned} \dot{x}_i &= K_i \, x_k \\ 0 &= K_p \, x_k + x_i - x_j \end{aligned}

Initialization

xi=xjx_i = x_j


Proportional-Integral (PI) controller with non-windup limit on the integral term.

pictllim block diagram

Syntax

& pictllim
name of variable x_k
name of variable x_j
data name, parameter name or math expression for K_i
data name, parameter name or math expression for K_p
data name, parameter name or math expression for x_i^min
data name, parameter name or math expression for x_i^max

Internal States

xix_i

Discrete Variables

z{1,0,1}z \in \{-1, 0, 1\}

Equations

0={x˙i=Kixkif z=0xiximinif z=1xiximaxif z=10 = \begin{cases} \dot{x}_i = K_i x_k & \text{if } z = 0 \\ x_i - x_i^{min} & \text{if } z = -1 \\ x_i - x_i^{max} & \text{if } z = 1 \end{cases}

0=Kpxk+xixj0 = K_p x_k + x_i - x_j

Discrete Transitions

if z = 0:
if x_i > x_i^max: z ← 1
else if x_i < x_i^min: z ← -1
else if z = 1:
if K_i * x_k < 0: z ← 0
else if z = -1:
if K_i * x_k > 0: z ← 0

Initialization

if K_i * x_k > 0:
z ← 1; x_i ← x_i^max
else if K_i * x_k < 0:
z ← -1; x_i ← x_i^min
else:
z ← 0; x_i ← x_j

Proportional-Integral (PI) controller with non-windup limit on the integral term and limit on the proportional term.

pictl2lim block diagram

Syntax

& pictl2lim
name of variable x_k
name of variable x_j
data name, parameter name or math expression for K_i
data name, parameter name or math expression for K_p
data name, parameter name or math expression for x_i^min
data name, parameter name or math expression for x_i^max
data name, parameter name or math expression for x_p^min
data name, parameter name or math expression for x_p^max

Internal States

xix_i and xpx_p

Discrete Variables

z1{1,0,1}z_1 \in \{-1, 0, 1\} and z2{1,0,1}z_2 \in \{-1, 0, 1\}

Equations

{0=Kpxkxpif z1=00=xpxpminif z1=10=xpxpmaxif z1=1\begin{cases} 0 = K_p x_k - x_p & \text{if } z_1 = 0 \\ 0 = x_p - x_p^{min} & \text{if } z_1 = -1 \\ 0 = x_p - x_p^{max} & \text{if } z_1 = 1 \end{cases} {x˙i=Kixkif z2=00=xiximinif z2=10=xiximaxif z2=1\begin{cases} \dot{x}_i = K_i x_k & \text{if } z_2 = 0 \\ 0 = x_i - x_i^{min} & \text{if } z_2 = -1 \\ 0 = x_i - x_i^{max} & \text{if } z_2 = 1 \end{cases}

0=xp+xixj0 = x_p + x_i - x_j

Discrete Transitions

# Proportional limiter (z_1):
if z_1 = 0:
if x_p > x_p^max: z_1 ← 1
else if x_p < x_p^min: z_1 ← -1
else if z_1 = 1:
if K_p * x_k < x_p^max: z_1 ← 0
else if z_1 = -1:
if K_p * x_k > x_p^min: z_1 ← 0
# Integral limiter (z_2):
if z_2 = 0:
if x_i > x_i^max: z_2 ← 1
else if x_i < x_i^min: z_2 ← -1
else if z_2 = 1:
if K_i * x_k < 0: z_2 ← 0
else if z_2 = -1:
if K_i * x_k > 0: z_2 ← 0

Initialization

Initialization of xpx_p:

xp=min ⁣(xpmax,max(xpmin,Kpxk))x_p = \min\!\left(x_p^{max},\, \max(x_p^{min},\, K_p x_k)\right)

Initialization of xix_i and discrete variables:

if K_p * x_k > x_p^max: z_1 ← 1
else if K_p * x_k < x_p^min: z_1 ← -1
else: z_1 ← 0
if K_i * x_k > 0:
z_2 ← 1; x_i ← x_i^max
else if K_i * x_k < 0:
z_2 ← -1; x_i ← x_i^min
else:
z_2 ← 0; x_i ← x_j - x_p

Proportional-Integral (PI) controller with non-windup limit on the integral term, compliant with IEEE standards.

pictlieee block diagram

This PI controller implements the non-windup integrator specified in:

  • IEEE Std 421.5-1992, IEEE Std 421.5-2005, and IEEE Std 421.5-2016 (excitation system models for power system stability studies).

The IEEE standard specifies that the integrator state x1x_1 is frozen as soon as xjx_j reaches its lower or upper limit. To avoid limit cycles when the integrator is released, a second “open-loop” integrator tracks what x1x_1 would be if unconstrained. The lower integrator is re-activated only when Kpxk+x2K_p x_k + x_2 re-enters [xjmin,xjmax][x_j^{min},\, x_j^{max}].

Syntax

& pictlieee
name of variable x_k
name of variable x_j
data name, parameter name or math expression for K_i
data name, parameter name or math expression for K_p
data name, parameter name or math expression for x_j^min
data name, parameter name or math expression for x_j^max

Internal States

x1x_1 and x2x_2

Discrete Variables

z{2,1,0,1,2}z \in \{-2, -1, 0, 1, 2\}

Equations

if z=0:{0=Kpxk+x1xjx˙1=Kixk0=x2x1\text{if } z = 0: \quad \begin{cases} 0 = K_p x_k + x_1 - x_j \\ \dot{x}_1 = K_i \, x_k \\ 0 = x_2 - x_1 \end{cases} if z=2:{0=xjmaxxjx˙1=00=x2x1if z=1:{0=xjmaxxjx˙1=0x˙2=Kixk\text{if } z = 2: \quad \begin{cases} 0 = x_j^{max} - x_j \\ \dot{x}_1 = 0 \\ 0 = x_2 - x_1 \end{cases} \qquad \text{if } z = 1: \quad \begin{cases} 0 = x_j^{max} - x_j \\ \dot{x}_1 = 0 \\ \dot{x}_2 = K_i \, x_k \end{cases} if z=2:{0=xjminxjx˙1=00=x2x1if z=1:{0=xjminxjx˙1=0x˙2=Kixk\text{if } z = -2: \quad \begin{cases} 0 = x_j^{min} - x_j \\ \dot{x}_1 = 0 \\ 0 = x_2 - x_1 \end{cases} \qquad \text{if } z = -1: \quad \begin{cases} 0 = x_j^{min} - x_j \\ \dot{x}_1 = 0 \\ \dot{x}_2 = K_i \, x_k \end{cases}

Discrete Transitions

The tests marked (*) use x2x_2 (the open-loop integrator) to decide when the active integrator x1x_1 can be released.

if z = 0:
if x_j > x_j^max: z ← 2
else if x_j < x_j^min: z ← -2
else if z = 2:
if K_p*x_k + x_1 < x_j^max: z ← 1
else if z = 1:
if K_p*x_k + x_1 > x_j^max: z ← 2
else if K_p*x_k + x_2 < x_j^max: z ← 0 (*)
else if z = -2:
if K_p*x_k + x_1 > x_j^min: z ← -1
else if z = -1:
if K_p*x_k + x_1 < x_j^min: z ← -2
else if K_p*x_k + x_2 > x_j^min: z ← 0 (*)

Initialization

if x_j >= x_j^max:
z ← 2; x_1 ← x_j^max - K_p*x_k; x_2 ← x_1
else if x_j <= x_j^min:
z ← -2; x_1 ← x_j^min - K_p*x_k; x_2 ← x_1
else:
z ← 0; x_1 ← x_j; x_2 ← x_1