// variáveis globais
BOOL auto; // controlador em modo automático(1)/manual(0)
REAL pv, // variável de processo (controlada)
mv, // variável manipulada
sp, // variável de referência (setpoint)
spr, // setpoint remoto
erroant,pvfant,acaoI_ant; // auxiliares;
procedure PID () {
// declaração de variáveis locais
BOOL SP_local, // setpoint Local(1)/Remoto(0)
direto, // processo com ação direta(1)/Reversa(0)
acaoP_ON, // ação proporcional ligada(1)/desligada(0)
acaoI_ON, // ação proporcional integral(1)/desligada(0)
acaoD_ON, // ação proporcional derivativa(1)/desligada(0)
DevPV, // ação derivariva na PV(1)/Erro(0)
ISA; // algoritmo PID do tipo ISA(1)/Paralelo(0)
REAL erro, erro2; // auxiliares
if not SP_local then sp:=spr;
if direto then begin // calculo do erro de controle
erro:=sp-pv;
erro2:=fator_a*sp-pv; // erro com ponderação de SP
end else begin
erro:=pv-sp;
erro2:=pv-fator_a*sp;
end;
// calculo da PV filtrada a partir de uma equação de diferença de ordem 1
PVF:=(talf/(talf+deltaT))*PVFant+(deltaT/(talf+deltaT))*PV;
if acaoP_ON then acaoP:=Kc*erro2 // calculo da ação proporcional
else acaoP:=0;
if acaoD_ON then begin // calculo da ação derivativa
if DevPV then
if direto then acaoD:=Td*(pvf_ant-pvf)/deltaT;
else acaoD:=Td*(pvf-pvfant)/deltaT
else acaoD:=Td*(erro-erroant)/deltaT;
if ISA then acaoD:=acaoD*Kc;
end else acaoD:=0;
if auto then begin
if (Ti<>0) AND (acaoI_ON) then begin // cálculo da ação integral
if ISA then acaoI:=acaoI_ant+erro*(1/Ti)*Kc*DeltaT
else acaoI:=acaoI_ant+erro*(1/Ti)*DeltaT;
end else acaoI:=0;
MV:=bias+acaoP+acaoI+acaoD;
if MV>COMax then // saturador e ‘anti-windup’
acaoI:=COMax-acaoP-acaoD-Bias
else if MV<COMin then acaoI:=COMin-acaoP-acaoD-Bias;
MV:=bias+acaoP+acaoI+acaoD;
end
else acaoI:=MV-acaoP-acaoD-bias;