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