Oracolo00 Inserito: 11 gennaio 2009 Segnala Inserito: 11 gennaio 2009 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: 14 gennaio 2009 Segnala Inserita: 14 gennaio 2009 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 interessanti2. 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.
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora