Istruzione di elaborazione PID
L'istruzione di elaborazione PID è utilizzata per regolare un processo (p.es. un radiatore) sulla base di un valore misurato (p.es. temperatura) e di un valore di uscita predefinito (p.es. 20°C).
Ingresso
Per una spiegazione dettagliata dei parametri, vedere PID_DUT_31
Anziché utilizzare questa istruzione F, si consiglia di utilizzare l'istruzione FP7 corrispondente: FP_PID_BASIC
La funzione calcola un algoritmo PID i cui parametri sono definiti in una tabella dati sotto forma di ARRAY con 30 elementi, il quale viene inserito all'ingresso s.
se le impostazioni di parametro non rientrano nell'intervallo ammissibile
se le impostazioni di parametro non rientrano nell'intervallo ammissibile
Nella lista variabili globali si definiscono variabili alle quali possono accedere tutti i POU del progetto.
Tutte le variabili di ingresso e uscita utilizzate per programmare questa funzione sono state dichiarate nell'intestazione del POU. La stessa intestazione del POU è utilizzata per tutti i linguaggi di programmazione.
VAR_EXTERNAL
EnableAutoTuning: BOOL:=FALSE;
(*Switch Auto Tuning On *)
Set_Value_SP: WORD:=0;
(*A/D CH0*)
Process_Value_PV: WORD:=0;
(*A/D CH1*)
Output_Value_MV: WORD:=0;
(*D/A*)
END_VAR
VAR
PidParameters: PID_DUT_31;
(*PID Parameters*)
END_VAR
Durante l'inizializzazione della variabile PidParameters del tipo di dato PID_DUT_31, il limite superiore valore manipolato MV viene impostato su 4000. Il guadagno proporzionale Kp viene inizialmente impostato su 80 (8), Ti e Td su 200 (20s) e il tempo di campionamento Ts su 100 (1s).
La funzione standard MOVE copia il valore 16#8000 nel membro Control della DUT PidParameters quando la variabile EnableAutoTuning passa da FALSE a TRUE (ossia attiva la modalità di controllo autotuning nella funzione F355_PID_DUT).
Le variabili Set_Value_SP e Process_Value_PV vengono allocate ai membri SP e PV della DUT PidParameters. Ricevono il relativo valore dal canale del convertitore A/D 0 e 1.
Poiché il Function Block F355_PID_DUT ha un'uscita EN collegata direttamente alla linea di alimentazione, la funzione viene eseguita quando il PLC è in modalità RUN. L'uscita del controllore programmabile calcolata, memorizzata dal membro MV della DUT PidParameters, viene allocata alla variabile Output_Value_MV. Il suo valore viene restituito tramite un convertitore D/A dal PLC all'uscita del sistema.
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_F,E_MOVE,,10,2,17,6,,?DEN?Da_Num?AENO?C);
B(B_VAROUT,,PidParameters.Control,17,4,19,6,);
B(B_VARIN,,16#8000,8,4,10,6,);
B(B_CONTACT,,EnableAutoTuning,5,3,7,5,R);
B(B_COMMENT,,Enable Auto Tuning,2,1,12,2,);
L(1,4,5,4);
L(7,4,10,4);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 4 ;
NETWORK_BODY
B(B_VARIN,,Set_Value_SP,9,2,11,4,);
B(B_VAROUT,,PidParameters.SP,11,2,13,4,);
B(B_COMMENT,,Fill the DUT PID_DUT_31 with the corresponding values,2,1,24,2,);
L(1,0,1,4);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 2 ;
NETWORK_BODY
B(B_VARIN,,Process_Value_PV,9,0,11,2,);
B(B_VAROUT,,PidParameters.PV,11,0,13,2,);
L(1,0,1,2);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 7 ;
NETWORK_BODY
B(B_VARIN,,PidParameters,8,5,10,7,);
B(B_F,F355_PID_DUT!,Instance,10,3,18,7,,?DEN?D@'s'?AENO);
B(B_COMMENT,,Carry out the PID arithmetic,2,1,21,2,);
L(1,5,10,5);
L(1,0,1,7);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 4 ;
NETWORK_BODY
B(B_VARIN,,PidParameters.MV,9,2,11,4,);
B(B_VAROUT,,Output_Value_MV,11,2,13,4,);
B(B_COMMENT,,Write manipulated value to the output,2,1,21,2,);
L(1,0,1,4);
END_NETWORK_BODY
END_NET_WORK
END_BODY
(* Auto Tuning: *)
if DF(EnableAutoTuning) then
PidParameters.Control:=16#8000;
end_if;
(* Fill the DUT PidParameters with the corresponding input values: *)
PidParameters.SP:=Set_Value_SP;
PidParameters.PV:=Process_Value_PV;
(* Carry out the PID arithmetic: *)
F355_PID_DUT(PidParameters);
(* Write the manipulated value to the output: *)
Output_Value_MV:=PidParameters.MV;