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 |
REV |
IN |
BOOL |
FALSE |
— |
Ação de controle reversa (erro > 0 ? diminuição em |
OUT_CPL |
IN |
BOOL |
FALSE |
— |
Saída de controle complementar ( |
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 |
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 ( |
KD |
IN |
REAL |
0.0 |
= 0 |
Ganho derivativo ( |
PV_MIN |
IN |
REAL |
0.0 |
— |
Valor mínimo da variável de processo e do setpoint; salvo na ativação de |
PV_MAX |
IN |
REAL |
100.0 |
— |
Valor máximo da variável de processo e do setpoint; salvo na ativação de |
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_MIN |
IN |
REAL |
0.0 |
— |
Valor mínimo da saída de controle; salvo na ativação de |
OV_MAX |
IN |
REAL |
100.0 |
— |
Valor máximo da saída de controle; salvo na ativação de |
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, |
Lista completa dos códigos de retorno: RET_CODE - Códigos de retorno do firmware G5.
Pré-condições
KPdeve ser maior que zero;KIeKDmaiores ou iguais a zero.PV_MAXdeve ser maior quePV_MINeOV_MAXmaior queOV_MIN.OV_INIdeve estar dentro da faixaOV_MIN .. OV_MAX.CYC_TMEdeve ser maior que zero.
Observações
CYC_TME,PV_MIN,PV_MAX,OV_MINeOV_MAXsão salvos internamente na ativação deSTART; alterações desses parâmetros enquantoSTARTestiver ativo não são computadas.CYC_EVTpode 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
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) *)
);
(* ... *)