Algoritmo PID

// 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;