PID

Realiza o controle proporcional/integral/derivativo (PID) de uma variável de processo ao longo do período de amostragem CYCLE, calculando a saída de atuação XOUT a partir do erro entre PV e SP e dos ganhos KP, TR e TD. É um bloco de função (mantém estado entre scans; requer instância).

Biblioteca: IEC_STD · Namespace: IEC · Tipo: bloco de função

Bloco de função

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

A saída é dada por XOUT = KP * ((PV - SP) + (I_TERM / TR) + (D_TERM * TD)), onde I_TERM é o termo integral e D_TERM o termo derivativo, ambos integrados ao longo do período CYCLE.

Quando AUTO é FALSE (modo manual), XOUT assume o valor de X0. Quando AUTO é TRUE (modo automático), XOUT é calculado a partir do erro (PV - SP) e dos ganhos KP, TR e TD ao longo do tempo CYCLE.

Nota

O bloco deve ser executado a cada período de amostragem CYCLE para que a integração dos termos integral e derivativo seja consistente.

Parâmetros

Nome

Direção

Tipo

Padrão

Faixa / Unidade

Descrição

AUTO

IN

BOOL

FALSE

—

Modo de operação: FALSE = manual (XOUT = X0); TRUE = automático (calcula PID).

PV

IN

REAL

0.0

—

Variável de processo (process variable).

SP

IN

REAL

0.0

—

Valor desejado (set point).

X0

IN

REAL

0.0

—

Ajuste manual da saída, tipicamente de uma estação de transferência.

KP

IN

REAL

0.0

—

Constante de proporcionalidade (ganho proporcional).

TR

IN

REAL

0.0

—

Tempo de reset (constante de tempo integral).

TD

IN

REAL

0.0

—

Constante de tempo derivativa.

CYCLE

IN

TIME

T#0ms

—

Período de amostragem.

XOUT

OUT

REAL

0.0

—

Valor de atuação calculado (saída do controlador).

Pré-condições

  • O bloco deve ser executado periodicamente, a cada intervalo CYCLE (por exemplo, disparado por um TON).

  • TR deve ser diferente de zero para o cálculo do termo integral.

Observações

  • Em modo manual (AUTO = FALSE), XOUT acompanha X0, permitindo a transferência suave para o modo automático.

  • A consistência da resposta do controlador depende da execução regular do bloco no período CYCLE.

Ver também

TON

Exemplo

Clique aqui para baixar a tabela de variáveis

Código ST

VAR
    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 *)
    my_TON    : TON;             (* Timer para gerar o ciclo de amostragem *)
END_VAR

(* ... *)

(* 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;
(* ... *)