PID

O bloco de função PID realiza o controle proporcional/integral/derivativo ao longo do tempo CYCLE. Calcula o valor XOUT considerando o erro entre a variável de processo PV e o valor desejado SP, e os ganhos KP, TR e TD.

XOUT = KP * ((PV - SP) + (I_TERM / TR) + (D_TERM * TD))

onde I_TERM corresponde ao termo integral e D_TERM ao termo derivativo.

Bloco

               PID
         +-------------+
BOOL ----|AUTO     XOUT|---- REAL
         |             |
REAL ----|PV           |
         |             |
REAL ----|SP           |
         |             |
REAL ----|X0           |
         |             |
REAL ----|KP           |
         |             |
REAL ----|TR           |
         |             |
REAL ----|TD           |
         |             |
TIME ----|CYCLE        |
         +-------------+

Parâmetros

Nome

Classe

Tipo

Dim.

V. Ini.

Descrição

AUTO

Entrada

BOOL

FALSE

0 - manual , 1 - automatico

PV

Entrada

REAL

0.0

Process variable

SP

Entrada

REAL

0.0

Set point

X0

Entrada

REAL

0.0

Manual output adjustment -Typically from transfer station

KP

Entrada

REAL

0.0

Proportionality constant

TR

Entrada

REAL

0.0

Reset time

TD

Entrada

REAL

0.0

Derivative time constant

CYCLE

Entrada

TIME

T#0ms

Sampling period

XOUT

Saída

REAL

0.0

Output value

Quando a entrada AUTO é FALSE, o valor de XOUT será o valor X0.

Quando a entrada AUTO é TRUE, o valor de XOUT será calculado a partir do valor de erro (PV - SP) e as ganhos KP, TR e TD ao longo do tempo CYCLE.

Exemplo

Declaração de Variáveis

Nome

Tipo

Valor Inicial

Descrição

inp_AUTO

BOOL

FALSE

0 - manual, 1 - automatic

inp_PV

REAL

10.0

Process variable

inp_SP

REAL

80.0

Set point

inp_X0

REAL

50.0

Manual output adjustment

inp_KP

REAL

3.0

Proportionality constant

inp_TR

REAL

1.0

Reset time

inp_TD

REAL

2.0

Derivative time constant

inp_CYCLE

TIME

T#200ms

Sampling period

out_XOUT

REAL

Output value

my_PID

PID

Instancia do bloco de função PID

Clique aqui para baixar a tabela de variáveis

Código ST

(* ... *)

(* Timer TON para gerar ciclo de execução do bloco de função PID *)
my_TON(PT := inp_CYCLE);
my_TON.IN := TRUE;

(* se atingiu tempo de amostragem, executa bloco de função PID *)
IF (my_TON.Q = TRUE) THEN

  (* executa bloco de função PID a cada ciclo de amostragem *)
  my_PID(
      AUTO  := inp_AUTO,  (* 0 - manual, 1 - automatic   *)
      PV    := inp_PV,    (* Process variable            *)
      SP    := inp_SP,    (* Set point                   *)
      X0    := inp_X0,    (* Manual output adjustment    *)
      KP    := inp_KP,    (* Proportionality constant    *)
      TR    := inp_TR,    (* Reset time                  *)
      TD    := inp_TD,    (* Derivative time constant    *)
      CYCLE := inp_CYCLE  (* Sampling period             *)
      );

  (* obtem valor de atuação gerado pelo bloco de função PID *)
  out_XOUT := my_PID.XOUT;

  (* reseta timer para gerar novo ciclo de ativação do bloco de função PID *)
  my_TON.IN := FALSE;

END_IF;
(* ... *)