PID_EX

Executa o controle Proporcional/Integral/Derivativo de uma malha, calculando a saída de controle OV a partir do erro entre o setpoint SP e a variável de processo PV, com estratégias de ANTI-WINDUP e comutação bumpless manual/automático. É um bloco de função (mantém estado entre scans; requer instância).

Biblioteca: HI_STD · Namespace: HILS · Tipo: bloco de função

Bloco de função

              PID_EX
         +----------------+
BOOL ----|START    CYC_EVT|---- BOOL
         |                |
BOOL ----|AUTO        OVFL|---- BOOL
         |                |
BOOL ----|REV         UNDF|---- BOOL
         |                |
BOOL ----|OUT_CPL   RESULT|---- INT
         |                |
BOOL ----|RESET           |
         |                |
TIME ----|CYC_TME         |
         |                |
REAL ----|KP              |
         |                |
REAL ----|KI              |
         |                |
REAL ----|KD              |
         |                |
REAL ----|PV_MIN          |
         |                |
REAL ----|PV_MAX          |
         |                |
REAL ----|PV              |
         |                |
REAL ----|SP              |
         |                |
REAL ----|OV_INI          |
         |                |
REAL ----|OV_MIN          |
         |                |
REAL ----|OV_MAX          |
         |                |
REAL ----|OV ------------ |----
         +----------------+

A saída de controle é calculada pela equação:

OUT = KP * ((SP - PV) + (KI * I_TERM) + (KD * D_TERM))

onde I_TERM é o termo integral e D_TERM o termo derivativo. A implementação usa ANTI-WINDUP para evitar a saturação do termo integral e incorpora bumpless ao comutar de manual para automático, evitando transientes na saída OV.

A entrada START ativa o bloco, que opera em modo manual ou automático conforme a entrada AUTO. Em modo manual, o bloco não altera OV, que pode ser livremente definida pela aplicação. A entrada CYC_TME define o tempo de ciclo do PID (default = 200 ms): o bloco de controle é executado uma vez a cada intervalo de tempo.

Os valores de PV e SP devem ser fornecidos na faixa entre PV_MIN e PV_MAX. A saída de controle é gerada na faixa entre OV_MIN e OV_MAX, sendo inicializada (na ativação de START) com o valor OV_INI. Para operar em modo automático o usuário deve especificar os ganhos KP, KI e KD.

A entrada REV, quando ativa, inverte a ação de controle: um erro positivo faz a saída de controle diminuir (e vice-versa). A entrada OUT_CPL, quando ativa, complementa o valor calculado da saída (OV := OV_MAX - (OV - OV_MIN)). A entrada RESET, na transição 0 ? 1, força o recálculo do termo integral na próxima iteração do bloco em função de OV e dos ganhos correntes.

Importante

O tempo de ciclo é definido em função do processo a ser controlado. Em geral valores entre 100 e 200 ms são suficientes para controle da malha com boa resposta e estabilidade. Para processos mais rápidos este tempo deve ser reduzido, lembrando que o tempo de execução de um bloco PID é significativo no tempo total de scan da aplicação. Mantenha este valor o maior possível que atenda à sua aplicação.

Nota

Se houver erros no processo de inicialização do PID, a saída de controle permanece inalterada. Apenas quando não houver erros nos parâmetros especificados é que a saída OV assumirá o valor OV_INI definido.

Parâmetros

Nome

Direção

Tipo

Padrão

Faixa / Unidade

Descrição

START

IN

BOOL

TRUE

—

Inicia a operação do bloco; deve permanecer ativo para o bloco ficar operacional.

AUTO

IN

BOOL

TRUE

—

Modo de operação (FALSE: manual, TRUE: automático). Em manual o bloco não atua em OV.

REV

IN

BOOL

FALSE

—

Ação de controle reversa (erro > 0 ? diminuição em OV).

OUT_CPL

IN

BOOL

FALSE

—

Saída de controle complementar (OV := OV_MAX - (OV - OV_MIN)).

RESET

IN

BOOL

FALSE

—

Recalcula o termo integral para manter a saída inalterada. Opera por transição de subida.

CYC_TME

IN

TIME

T#200ms

ms

Tempo de ciclo do PID; salvo internamente na ativação de START.

KP

IN

REAL

0.5

> 0

Ganho proporcional. Deve ser maior que zero para habilitar a operação do bloco.

KI

IN

REAL

0.2

= 0

Ganho integral (KI = KP / TI). Zero remove o termo integral da equação.

KD

IN

REAL

0.0

= 0

Ganho derivativo (KD = KP * TD). Zero remove o termo derivativo da equação.

PV_MIN

IN

REAL

0.0

—

Valor mínimo da variável de processo e do setpoint; salvo na ativação de START.

PV_MAX

IN

REAL

100.0

—

Valor máximo da variável de processo e do setpoint; salvo na ativação de START.

PV

IN

REAL

0.0

PV_MIN .. PV_MAX

Variável de processo em unidade de engenharia.

SP

IN

REAL

0.0

PV_MIN .. PV_MAX

Setpoint em unidade de engenharia.

OV_INI

IN

REAL

0.0

OV_MIN .. OV_MAX

Valor inicial transferido para OV na transição 0 ? 1 de START.

OV_MIN

IN

REAL

0.0

—

Valor mínimo da saída de controle; salvo na ativação de START.

OV_MAX

IN

REAL

100.0

—

Valor máximo da saída de controle; salvo na ativação de START.

CYC_EVT

OUT

BOOL

FALSE

—

Pulso TRUE no ciclo imediatamente anterior a uma nova iteração do PID.

OVFL

OUT

BOOL

FALSE

—

PID saturado por overflow (limite máximo da saída de controle atingido).

UNDF

OUT

BOOL

FALSE

—

PID saturado por underflow (limite mínimo da saída de controle atingido).

RESULT

OUT

INT

0

RET_CODE

Código de erro detectado na inicialização do bloco (ver Códigos de retorno).

OV

IN_OUT

REAL

0.0

OV_MIN .. OV_MAX

Saída de controle calculada em modo automático; em modo manual não é alterada pelo bloco.

Códigos de retorno

RESULT indica, no momento em que START é acionada, se há erros de parâmetros que impedem a operação do bloco. Quando houver erro, o código é diferente de HILS.SUCCESS (0) e o bloco permanece inativo até que START retorne a FALSE, a condição de erro seja solucionada e START seja ativada novamente. Use os identificadores com o namespace HILS (ex.: HILS.GL_INV_PAR).

Código

Identificador

Significado

0

SUCCESS

Inicialização executada com sucesso; parâmetros válidos.

5

GL_INV_PAR

Parâmetro inválido: tempo de ciclo = 0, PV_MAX <= PV_MIN, OV_MAX <= OV_MIN ou OV_INI fora de OV_MIN .. OV_MAX.

Lista completa dos códigos de retorno: RET_CODE - Códigos de retorno do firmware G5.

Pré-condições

  • KP deve ser maior que zero; KI e KD maiores ou iguais a zero.

  • PV_MAX deve ser maior que PV_MIN e OV_MAX maior que OV_MIN.

  • OV_INI deve estar dentro da faixa OV_MIN .. OV_MAX.

  • CYC_TME deve ser maior que zero.

Observações

  • CYC_TME, PV_MIN, PV_MAX, OV_MIN e OV_MAX são salvos internamente na ativação de START; alterações desses parâmetros enquanto START estiver ativo não são computadas.

  • CYC_EVT pode ser usada para ajustar parâmetros (faixa da variável de processo ou ganhos) imediatamente antes da iteração do bloco, evitando processamento contínuo desnecessário.

  • Em condição de saturação (OVFL/UNDF), a estratégia de ANTI-WINDUP trata o termo integral para não atrasar a resposta quando a saída retornar à faixa linear.

Ver também

LCONV

Exemplo

Clique aqui para baixar a tabela de variáveis

Código ST

VAR
    MY_PID      : HILS.PID_EX;
    START       : BOOL := FALSE;
    MY_MAN_AUTO : BOOL := TRUE;
END_VAR
VAR_EXTERNAL
    MY_KP       : REAL := 0.5;
    MY_KD       : REAL := 0.0;
    MY_KI       : REAL := 0.1;
    MY_OV       : REAL := 0.0;
    MY_SP       : REAL := 60.0;
    MY_PV       : REAL := 60.0;
    MY_CYCLE    : TIME := T#200ms;
    MY_PV_MIN   : REAL := 0;
    MY_PV_MAX   : REAL := 100;
    MY_OV_MIN   : REAL := 0;
    MY_OV_MAX   : REAL := 100;
    MY_OV_INI   : REAL := 40.0;
END_VAR

(* ... *)

IF MY_PID.CYC_EVT THEN
    (* Ajusta o range da entrada analógica padrão para 0 .. 100 *)
    MY_PV := HILS.LCONV(
              INT_TO_REAL(AI00),   (* X    [REAL] = Valor de entrada *)
              0.0,                 (* XMIN [REAL] = Valor mínimo da entrada X *)
              4095.0,              (* XMAX [REAL] = Valor máximo da entrada X *)
              0.0,                 (* YMIN [REAL] = Valor mínimo da saída Y *)
              100.0                (* YMAX [REAL] = Valor máximo da saída Y *)
              );
END_IF;

(* Chama instância do bloco PID *)
MY_PID(
  START   := START,      (* [BOOL] Inicia operação *)
  AUTO    := MY_MAN_AUTO, (* [BOOL] Modo de operação (FALSE: Manual, TRUE: Automático) *)
  CYC_TME := MY_CYCLE,   (* [TIME] Tempo de ciclo do PID *)
  KP      := MY_KP,      (* [REAL] Ganho proporcional *)
  KI      := MY_KI,      (* [REAL] Ganho integral *)
  KD      := MY_KD,      (* [REAL] Ganho derivativo *)
  PV_MIN  := MY_PV_MIN,  (* [REAL] Valor minimo da variavel de processo e setpoint *)
  PV_MAX  := MY_PV_MAX,  (* [REAL] Valor maximo da variavel de processo e setpoint *)
  PV      := MY_PV,      (* [REAL] Variavel de processo em unidade de engenharia *)
  SP      := MY_SP,      (* [REAL] Setpoint em unidade de engenharia *)
  OV_INI  := MY_OV_INI,  (* [REAL] Valor inicial da saída *)
  OV_MIN  := MY_OV_MIN,  (* [REAL] Valor mínimo da saída *)
  OV_MAX  := MY_OV_MAX,  (* [REAL] Valor máximo da saída *)
  OV      := MY_OV       (* [REAL] Output value (OV_MIN .. OV_MAX) *)
  );

(* ... *)