```pascal FUNCTION_BLOCK "BlenderPIDCtrl_SaveInteg" { S7_Optimized_Access := 'FALSE' } AUTHOR : 'Author' FAMILY : TASK1 NAME : 'Name' VERSION : 1.0 VAR mMinProd : Bool; Timer135En : Bool; Timer136En : Bool; Timer137En : Bool; Timer144En : Bool; Timer145En : Bool; Timer146En : Bool; END_VAR VAR_TEMP ValBinTmr135 : Word; ValBcdTmr135 : S5Time; ValBinTmr136 : Word; ValBcdTmr136 : S5Time; ValBinTmr137 : Word; ValBcdTmr137 : S5Time; ValBinTmr144 : Word; ValBcdTmr144 : S5Time; ValBinTmr145 : Word; ValBcdTmr145 : S5Time; ValBinTmr146 : Word; ValBcdTmr146 : S5Time; END_VAR BEGIN (* This block save the Integral Component for each PID when the prod flow is minimum *) (* for the next blender start, that is at minimum speed *) (* classic code: IF ABS("Blender_Variables".gActual_Prod_SP - "Blender_Variables".gMinProduction) < 0.1 * "Blender_Variables".gMinProduction THEN*) IF ABS("Blender_Variables".gActual_Prod_SP - "Blender_Variables".gMinProduction) < REAL#0.1 * "Blender_Variables".gMinProduction THEN #mMinProd := TRUE ; ELSE #mMinProd := FALSE ; END_IF; "ONS_R"(Enable_ONS := "HMI_PID".RMM301.ManualControl.PidEnable, Aux_ONS := "mRMM301_Int_Init", ONS_R => "mRMM301_Int_ONS" ); #Timer135En := #mMinProd; IF "HMI_PID".RMM301.ManualControl.PidEnable THEN #ValBcdTmr135:= S_ODT (T_NO := "mSaveRMM301_IntTON", S := #Timer135En, TV := s5time#20s, R := "AUX FALSE", BI => #ValBinTmr135, Q => "mSaveRMM301_IntTON.Q"); IF "mSaveRMM301_IntTON.Q" AND "gRMM301_PIDCtrlOk" THEN "PID_Variables".RMM301PIDIntValue := "mPID_RMM301_Int" ; "HMI_PID".RMM301.I_ITLVAL := "PID_Variables".RMM301PIDIntValue ; #Timer135En := FALSE ; END_IF; ELSE #Timer135En := FALSE ; END_IF; IF "HMI_PID".RMM301.High_Limit OR "HMI_PID".RMM301.Low_Limit THEN (* classic code: "HMI_PID".RMM301.I_ITLVAL := 0.0 ;*) "HMI_PID".RMM301.I_ITLVAL := REAL#0.0 ; END_IF; IF "mRMM301_Int_ONS" THEN "HMI_PID".RMM301.I_ITL := TRUE ; END_IF; "ONS_R"(Enable_ONS := "HMI_PID".RMP302.ManualControl.PidEnable, Aux_ONS := "mRMP302_Int_Init", ONS_R => "mRMP302_Int_ONS" ); #Timer136En := #mMinProd; IF "HMI_PID".RMP302.ManualControl.PidEnable THEN #ValBcdTmr136:= S_ODT (T_NO := "mSaveRMP302_IntTON", S := #Timer136En, TV := s5time#20s, R := "AUX FALSE", BI => #ValBinTmr136, Q => "mSaveRMP302_IntTON.Q"); IF "mSaveRMP302_IntTON.Q" AND "gRMP302_PIDCtrlOk" THEN "PID_Variables".RMP302PIDIntValue := "mPID_RMP302_Int" ; "HMI_PID".RMP302.I_ITLVAL := "PID_Variables".RMP302PIDIntValue ; #Timer136En := FALSE ; END_IF; ELSE; #Timer136En := FALSE ; END_IF; IF "HMI_PID".RMP302.High_Limit OR "HMI_PID".RMP302.Low_Limit THEN (* classic code: "HMI_PID".RMP302.I_ITLVAL := 0.0 ;*) "HMI_PID".RMP302.I_ITLVAL := REAL#0.0 ; END_IF; IF "mRMP302_Int_ONS" THEN "HMI_PID".RMP302.I_ITL := TRUE ; END_IF; "ONS_R"(Enable_ONS := "HMI_PID".RMM303.ManualControl.PidEnable , Aux_ONS := "mRMM303_Int_Init", ONS_R => "mRMM303_Int_ONS" ); #Timer137En := #mMinProd; IF "HMI_PID".RMM303.ManualControl.PidEnable THEN #ValBcdTmr137:= S_ODT (T_NO := "mSaveRMM303_IntTON", S := #Timer137En, TV := s5time#20s, R := "AUX FALSE", BI => #ValBinTmr137, Q => "mSaveRMM303_IntTON.Q"); IF "mSaveRMM303_IntTON.Q" AND "gRMM303_PIDCtrlOk" THEN "PID_Variables".RMM303PIDIntValue := "mPID_RMM303_Int" ; "HMI_PID".RMM303.I_ITLVAL := "PID_Variables".RMM303PIDIntValue ; #Timer137En := FALSE ; END_IF; ELSE #Timer137En := FALSE ; END_IF; IF ("HMI_PID".RMM303.High_Limit OR "HMI_PID".RMM303.Low_Limit) THEN (* classic code: "HMI_PID".RMM303.I_ITLVAL := 0.0 ;*) "HMI_PID".RMM303.I_ITLVAL := REAL#0.0 ; END_IF; IF "mRMM303_Int_ONS" THEN "HMI_PID".RMM303.I_ITL := TRUE ; END_IF; // SECOND GAS INJECTION "ONS_R"(Enable_ONS := "HMI_PID".RMM304.ManualControl.PidEnable , Aux_ONS := "mRMM304_Int_Init", ONS_R => "mRMM304_Int_ONS" ); #Timer146En := #mMinProd; IF "HMI_PID".RMM304.ManualControl.PidEnable THEN #ValBcdTmr137:= S_ODT (T_NO := "mSaveRMM304_IntTON", S := #Timer146En, TV := s5time#20s, R := "AUX FALSE", BI => #ValBinTmr146, Q => "mSaveRMM304_IntTON.Q"); IF "mSaveRMM304_IntTON.Q" AND "gRMM304_PIDCtrlOk" THEN "PID_Variables".RMM304PIDIntValue := "mPID_RMM304_Int" ; "HMI_PID".RMM304.I_ITLVAL := "PID_Variables".RMM304PIDIntValue ; #Timer146En := FALSE ; END_IF; ELSE #Timer146En := FALSE ; END_IF; IF ("HMI_PID".RMM304.High_Limit OR "HMI_PID".RMM304.Low_Limit) THEN (* classic code: "HMI_PID".RMM304.I_ITLVAL := 0.0 ;*) "HMI_PID".RMM304.I_ITLVAL := REAL#0.0 ; END_IF; IF "mRMM304_Int_ONS" THEN "HMI_PID".RMM304.I_ITL := TRUE ; END_IF; "ONS_R"(Enable_ONS := "HMI_PID".RVP303.ManualControl.PidEnable, Aux_ONS := "mRVP303_Int_Init", ONS_R => "mRVP303_Int_ONS" ); #Timer144En := #mMinProd; IF "HMI_PID".RVP303.ManualControl.PidEnable THEN #ValBcdTmr144:= S_ODT (T_NO := "mSaveRVP303_IntTON", S := #Timer144En, TV := S5TIME#20s, R := "AUX FALSE", BI => #ValBinTmr144, Q => "mSaveRVP303_IntTON.Q"); IF "mSaveRVP303_IntTON.Q" THEN "PID_Variables".RVP303PIDIntValue := "mPID_RVP303_Int" ; "HMI_PID".RVP303.I_ITLVAL := "PID_Variables".RVP303PIDIntValue ; #Timer144En := FALSE ; END_IF; ELSE; #Timer144En := FALSE ; END_IF; IF "HMI_PID".RVP303.High_Limit OR "HMI_PID".RVP303.Low_Limit THEN (* classic code: "HMI_PID".RVP303.I_ITLVAL := 0.0 ;*) "HMI_PID".RVP303.I_ITLVAL := REAL#0.0 ; END_IF; IF "mRVP303_Int_ONS" THEN "HMI_PID".RVP303.I_ITL := TRUE ; END_IF; "ONS_R"(Enable_ONS := "HMI_PID".RVN302.ManualControl.PidEnable, Aux_ONS := "mRVN302_Int_Init", ONS_R => "mRVN302_Int_ONS" ); #Timer145En := #mMinProd; IF "HMI_PID".RVN302.ManualControl.PidEnable THEN #ValBcdTmr145:= S_ODT (T_NO := "mSaveRVN302_IntTON", S := #Timer145En, TV := S5TIME#20s, R := "AUX FALSE", BI => #ValBinTmr145, Q => "mSaveRVN302_IntTON.Q"); IF "mSaveRVN302_IntTON.Q" THEN "PID_Variables".RVN302PIDIntValue := "mPID_RVN302_Int" ; "HMI_PID".RVN302.I_ITLVAL := "PID_Variables".RVN302PIDIntValue ; #Timer145En := FALSE ; END_IF; ELSE; #Timer145En := FALSE ; END_IF; IF "HMI_PID".RVN302.High_Limit OR "HMI_PID".RVN302.Low_Limit THEN (* classic code: "HMI_PID".RVN302.I_ITLVAL := 0.0 ;*) "HMI_PID".RVN302.I_ITLVAL := REAL#0.0 ; END_IF; IF "mRVN302_Int_ONS" THEN "HMI_PID".RVN302.I_ITL := TRUE ; END_IF; END_FUNCTION_BLOCK ```