Vai al contenuto
PLC Forum


Pid Controllo Temperatura


Messaggi consigliati

Inserito:

Salve a tutti, tempo fa ho scritto questo codice per la regolazione della temperatura (visto che FB58 era troppo ingombrante), poi a causa della chisura della ditta non sono mai riuscito a provarlo.

Volevo sapere se secondo voi funziona decentemente e se si può migliorare.

FUNCTION_BLOCK "PID"
TITLE =PID
VERSION : 0.1


VAR_INPUT
  PV : INT;    
  SP : INT;    
  dt_S : REAL;    
END_VAR
VAR_OUTPUT
  POS_Q : BOOL;    
  NEG_Q : BOOL;    
END_VAR
VAR
  PID : STRUCT     
   Kp : REAL;    
   chi : REAL;    
   Kd : REAL;    
  END_STRUCT;    
  Parameters : STRUCT     
   Cycle_time : REAL;    
   Min_time : REAL;    
  END_STRUCT;    
  Error : REAL;    
  Previous_error : REAL;    
  P : REAL;    
  I : REAL;    
  D : REAL;    
  OUT : REAL;    
  Elapsed_time : REAL;    
  Target_time : REAL;    
  POS : BOOL;    
END_VAR
BEGIN
NETWORK
TITLE =Calcolo del PID

      L     #Elapsed_time; 
      L     0; 
      ==R  ; 
      SPBN  _101; 

//Calcolo dell'errore
      L     #SP; 
      L     #PV; 
      -I   ; 
      ITD  ; 
      DTR  ; 
      T     #Error; 

//PID
      L     #Error; 
      L     #PID.Kp; 
      *R   ; 
      T     #P; 

      L     #Error; 
      L     #PID.chi; 
      *R   ; 
      L     #dt_S; 
      *R   ; 
      L     #I; 
      +R   ; 
      T     #I; 
//Anti wind-up
      L     #I; 
      L     1.000000e+003; 
      >R   ; 
      SPBN  _102; 

      L     1.000000e+003; 
      T     #I; 

_102: L     #I; 
      L     -1.000000e+003; 
      <R   ; 
      SPBN  _103; 

      L     -1.000000e+003; 
      T     #I; 


_103: NOP   0; 


      L     #Error; 
      L     #Previous_error; 
      -R   ; 
      L     #dt_S; 
      /R   ; 
      L     #PID.Kd; 
      *R   ; 
      T     #D; 


      L     #P; 
      L     #I; 
      +R   ; 
      L     #D; 
      +R   ; 
      T     #OUT; 


      L     #Error; 
      T     #Previous_error; 


      L     #OUT; 
      L     1.000000e+003; 
      >R   ; 
      SPBN  _104; 

      L     1.000000e+003; 
      T     #OUT; 

_104: L     #OUT; 
      L     -1.000000e+003; 
      <R   ; 
      SPBN  _105; 

      L     -1.000000e+003; 
      T     #OUT; 


_105: NOP   0; 

      L     #OUT; 
      T     MD   200; 

      L     #OUT; 
      L     0.000000e+000; 
      >R   ; 
      SPBN  _106; 

      S     #POS; 
      SPA   _107; 

_106: R     #POS; 
_107: NOP   0; 

      L     #OUT; 
      ABS  ; 
      L     #Parameters.Cycle_time; 
      *R   ; 
      L     1.000000e+003; 
      /R   ; 
      T     #Target_time; 

      L     #Target_time; 
      L     #Parameters.Min_time; 
      <R   ; 
      SPBN  _101; 

      L     0; 
      T     #Target_time; 

_101: NOP   0; 

NETWORK
TITLE =Comando uscite

      L     #Elapsed_time; 
      L     #dt_S; 
      +R   ; 
      T     #Elapsed_time; 

      R     #POS_Q; 
      R     #NEG_Q; 

      L     #Elapsed_time; 
      L     #Target_time; 
      <=R  ; 
      SPBN  _201; 

      U     #POS; 
      =     #POS_Q; 

      UN    #POS; 
      =     #NEG_Q; 

_201: NOP   0; 

      L     #Elapsed_time; 
      L     #Parameters.Cycle_time; 
      >=R  ; 
      SPBN  _202; 

      L     0.000000e+000; 
      T     #Elapsed_time; 

_202: NOP   0; 

END_FUNCTION_BLOCK


Federico Milan
Inserita:

Forse ti converrebbe fare una ricerca sul forum prima di postare, per almeno due validi motivi:

1. discussioni sul PID ce ne sono molte e molto interessanti

2. Esiste già il PID su sistemi Siemens, con funzionalità avanzate tra cui l'anti bump, ...

Poi sartebbe auspicabile che ponessi il quesito in modo più approfondito, magari indicando quale riga non ti convince o dettagliando le tue scelte, il copia incolla di codice non è sempre producente, o almeno non sempre si ottiene l'aiuto voluto.

Segui queste piccole indicazioni e troverai nel forum un valido aiuto.

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...