330 lines
8.4 KiB
Plaintext
330 lines
8.4 KiB
Plaintext
(* Código SCL generado desde LAD TwinCAT *)
|
|
(* Convertidor mejorado con SymPy - Estructura DNF preferida *)
|
|
(* Path original: \/TASK1_PID\/PID_Controllers\/Filling_Valve_PID *)
|
|
|
|
PROGRAM _Filling_Head_PID_Ctrl
|
|
VAR_OUTPUT
|
|
EN_Out : BOOL ;
|
|
END_VAR
|
|
|
|
VAR
|
|
mFillerProdSlew : REAL ;
|
|
mFillerEstSlew : SlewLimit ;
|
|
mKp_Loss : REAL ;
|
|
mR_KP : REAL ;
|
|
mR_TI : REAL ;
|
|
mR_TD : REAL ;
|
|
_Hold_int_PID : BOOL ;
|
|
_Init_int_PID : BOOL ;
|
|
mManual_Value : REAL ;
|
|
mReal_FF_value : REAL ;
|
|
mReal_Max_FF : REAL ;
|
|
mLMN_FAC : REAL ;
|
|
mDeadBand : REAL ;
|
|
mInit_Int_PID : REAL ;
|
|
mHr_Hs : REAL ;
|
|
mFillingHead_PID : FB41_PIDController;
|
|
mI_Sel_FillHead : BOOL ;
|
|
mP_Sel_FillHead : BOOL ;
|
|
mD_Sel_FillHead : BOOL ;
|
|
mPID_FillHead_OUT : REAL ;
|
|
mPIDFillHeadProp : REAL ;
|
|
mPIDFillHeadInt : REAL ;
|
|
mPIDFillHeadDer : REAL ;
|
|
mP3_Freq_Flted : LowPassFilter ;
|
|
mDiffTransducer_Flted : LowPassFilter ;
|
|
mFillValve1Press_Flted : LowPassFilter ;
|
|
mFillingHead_KP_PID : FB41_PIDController;
|
|
mFillHead_PID_En : BOOL ;
|
|
mI_Sel_FillHead_KP : BOOL ;
|
|
mP_Sel_FillHead_KP : BOOL ;
|
|
mD_Sel_FillHead_KP : BOOL ;
|
|
mPID_FillHead_KP_OUT : REAL ;
|
|
mPIDFillHead_KP_Prop : REAL ;
|
|
mPIDFillHead_KP_Int : REAL ;
|
|
mPIDFillHead_KP_Der : REAL ;
|
|
_Hold_int_KP_PID : BOOL ;
|
|
_Init_int_KP_PID : BOOL ;
|
|
mManual_KP_Value : REAL ;
|
|
mReal_KP_FF_value : REAL ;
|
|
mDead_KP_Band : REAL ;
|
|
mInit_Int_KP_PID : REAL ;
|
|
mFillingHeadPIDStat : StatisticalAnalisys ;
|
|
mHeadKP_SlewLimit : SlewLimit ;
|
|
mHead_KP_Temp : REAL ;
|
|
mOutWordToVFC : WORD ;
|
|
mRealTemp : REAL ;
|
|
mAnalogInTemp : Peripherial ;
|
|
mReset_Int_ONS : R_TRIG ;
|
|
mReset_Int : BOOL ;
|
|
mEn_ProdPressLoss : TON ;
|
|
mStartFillTON : TON ;
|
|
mStopFillTP : TP ;
|
|
mStopFillingN_ONS : F_TRIG ;
|
|
mFillerFilling : BOOL ;
|
|
mStopFilling : BOOL;
|
|
mDummy : BOOL ;
|
|
mDiffSensFaultEn: TON;
|
|
END_VAR
|
|
|
|
|
|
(* === CÓDIGO PRINCIPAL === *)
|
|
|
|
(* Código LAD convertido *)
|
|
// Red 2
|
|
// Llamada a función: _Filling_Head_PID_Ctrl.Read_Analog
|
|
CALL _Filling_Head_PID_Ctrl.Read_Analog();
|
|
mDummy := TRUE; // ACTION ejecutada
|
|
|
|
// Red 3
|
|
// Llamada a función: _Filling_Head_PID_Ctrl._KP_PID_Ctrl
|
|
CALL _Filling_Head_PID_Ctrl._KP_PID_Ctrl();
|
|
mDummy := TRUE; // ACTION ejecutada
|
|
|
|
// Red 4
|
|
// Llamada a función: _Filling_Head_PID_Ctrl.Calcolous
|
|
CALL _Filling_Head_PID_Ctrl.Calcolous();
|
|
mDummy := TRUE; // ACTION ejecutada
|
|
|
|
// Red 5
|
|
// Llamada a función: gProd_Flow
|
|
mDummy := gProd_Flow();
|
|
|
|
// Red 6
|
|
// Llamada a función: mFillerEstSlew
|
|
// Sin optimización SymPy
|
|
IF mFillerEstSlew(_POSITIV) THEN
|
|
mDummy := TRUE;
|
|
ELSE
|
|
mDummy := FALSE;
|
|
END_IF;
|
|
|
|
// Red 7
|
|
// Llamada a función: mStopFillTP
|
|
// Sin optimización SymPy
|
|
IF mStopFillTP() THEN
|
|
mDummy := TRUE;
|
|
ELSE
|
|
mDummy := FALSE;
|
|
END_IF;
|
|
|
|
// Red 1
|
|
// Sin optimización SymPy
|
|
IF NOT gAlwaysOff THEN
|
|
mP_Sel_FillHead := TRUE;
|
|
ELSE
|
|
mP_Sel_FillHead := FALSE;
|
|
END_IF;
|
|
|
|
// Red 8
|
|
// Sin optimización SymPy
|
|
IF NOT gAlwaysOff THEN
|
|
mI_Sel_FillHead := TRUE;
|
|
ELSE
|
|
mI_Sel_FillHead := FALSE;
|
|
END_IF;
|
|
|
|
// Red 9
|
|
// Sin optimización SymPy
|
|
IF NOT gAlwaysOff THEN
|
|
mD_Sel_FillHead := TRUE;
|
|
ELSE
|
|
mD_Sel_FillHead := FALSE;
|
|
END_IF;
|
|
|
|
// Red 10
|
|
// Sin optimización SymPy
|
|
IF (gBlenderCIPMode OR gBlenderRinseMode) THEN
|
|
g_Head_CIP_Rinse := TRUE;
|
|
ELSE
|
|
g_Head_CIP_Rinse := FALSE;
|
|
END_IF;
|
|
|
|
// Red 11
|
|
// Sin optimización SymPy
|
|
IF ((NOT gH_P3_ProductPump_Auto AND gH_P3_ProductPump_Manual) OR g_Head_Drain OR (gH_EV62_Status AND g_Head_CIP_Rinse) OR gP_PID_Head_Manual) THEN
|
|
g_MAN_Head := TRUE;
|
|
ELSE
|
|
g_MAN_Head := FALSE;
|
|
END_IF;
|
|
|
|
// Red 12
|
|
// Sin optimización SymPy
|
|
IF ((((gP_PID_Head_Enable OR (NOT gProdPipeRunOut_Done AND gBlendFillStartUp_Done)) AND gInFillerEV46Enable AND NOT gFlrCO2ValveEV46Pos_Fault AND gInFillerEV62Enable AND NOT gProdValveEV62Pos_Fault AND NOT gDiffSensor_Analog_Fault) OR (g_Head_CIP_Rinse AND gBlenderRun_Latch) OR g_MAN_Head OR gP_PID_Head_Manual) AND gH_Blender_OPT_BlendFillSystem) THEN
|
|
g_Head_PID_Enable := TRUE;
|
|
ELSE
|
|
g_Head_PID_Enable := FALSE;
|
|
END_IF;
|
|
|
|
// Red 14
|
|
// Llamada a función: gHead_PID_Max_Freq
|
|
mDummy := gHead_PID_Max_Freq();
|
|
|
|
// Red 15
|
|
// Llamada a función: gH_ProcessSetup_FillerDiameter
|
|
mDummy := gH_ProcessSetup_FillerDiameter();
|
|
|
|
// Red 16
|
|
// Llamada a función: mReal_FF_value
|
|
mDummy := mReal_FF_value();
|
|
|
|
// Red 17
|
|
// Llamada a función: mManual_Value
|
|
mDummy := mManual_Value();
|
|
|
|
// Red 18
|
|
// Llamada a función: _Filling_Head_PID_Ctrl.Write_Analog
|
|
CALL _Filling_Head_PID_Ctrl.Write_Analog();
|
|
mDummy := TRUE; // ACTION ejecutada
|
|
|
|
// Red 13
|
|
CALL _Filling_Head_PID_Ctrl.Write_Analog();
|
|
mDummy := TRUE; // ACTION ejecutada
|
|
|
|
END_PROGRAM
|
|
|
|
(* === SUBFUNCIONES (ACTIONs convertidas) === *)
|
|
|
|
PROCEDURE _Filling_Head_PID_Ctrl__KP_PID_Ctrl
|
|
(* Convertida desde ACTION *)
|
|
|
|
(* Código LAD convertido a SCL *)
|
|
// Red 1
|
|
IF NOT gAlwaysOff THEN
|
|
mI_Sel_FillHead_KP := TRUE;
|
|
ELSE
|
|
mI_Sel_FillHead_KP := FALSE;
|
|
END_IF;
|
|
|
|
// Red 2
|
|
IF NOT gAlwaysOff THEN
|
|
mP_Sel_FillHead_KP := TRUE;
|
|
ELSE
|
|
mP_Sel_FillHead_KP := FALSE;
|
|
END_IF;
|
|
|
|
// Red 3
|
|
IF NOT gAlwaysOff THEN
|
|
mD_Sel_FillHead_KP := TRUE;
|
|
ELSE
|
|
mD_Sel_FillHead_KP := FALSE;
|
|
END_IF;
|
|
|
|
// Red 4
|
|
IF mFillHead_PID_En THEN
|
|
mR_KP := TRUE;
|
|
ELSE
|
|
mR_KP := FALSE;
|
|
END_IF;
|
|
|
|
|
|
END_PROCEDURE
|
|
|
|
PROCEDURE _Filling_Head_PID_Ctrl_Calcolous
|
|
(* Convertida desde ACTION *)
|
|
|
|
(* Código ST original *)
|
|
gHead_PID_Cycle := gPID_Cycle_Time ;
|
|
mLMN_FAC := 1.0 ;
|
|
mDeadBand := 0.0 ;
|
|
|
|
mKp_Loss := gH_ProcessSetup_KProdLoss ;
|
|
|
|
IF gH_ProcessSetup_BPFillingValvePID<>0 THEN
|
|
(* IF gHeadPIDCtrlOk THEN*)
|
|
mHead_KP_Temp := 100 / gH_ProcessSetup_BPFillingValvePID ;
|
|
(* ELSE
|
|
mHead_KP_Temp := 50 / gH_ProcessSetup_BPFillingValvePID ;
|
|
END_IF*)
|
|
END_IF
|
|
mHeadKP_SlewLimit(i_InValue:=mHead_KP_Temp, i_SlewMax:=0.01, i_Cycle:=gHead_PID_Cycle, out:=mR_KP) ;
|
|
|
|
mR_TI := gH_ProcessSetup_TIFillingValvePID ;
|
|
mR_TD := gH_ProcessSetup_TDFillingValvePID ;
|
|
|
|
mManual_Value := 0.0 ;
|
|
IF NOT gH_P3_ProductPump_Auto AND gH_P3_ProductPump_Manual THEN
|
|
mManual_Value := gH_P3_ProductPumpFC_Manual ;
|
|
mLMN_FAC := 1.0 ;
|
|
ELSIF g_MAN_Head AND NOT g_Head_CIP_Rinse THEN
|
|
mManual_Value := gHead_PID_Manual_Value ;
|
|
mLMN_FAC := 1.0 ;
|
|
ELSIF g_Head_Drain THEN
|
|
mManual_Value := 0.0 ;
|
|
mLMN_FAC := 1.0 ;
|
|
ELSIF g_Head_CIP_Rinse AND gBlenderRinseMode THEN
|
|
mManual_Value :=gH_ProcessSetup_RinseProdPumpFreq ;
|
|
mLMN_FAC := 1.0 ;
|
|
ELSIF g_Head_CIP_Rinse THEN
|
|
mManual_Value :=gH_ProcessSetup_CIPProdPumpFreq ;
|
|
mLMN_FAC := 1.0 ;
|
|
ELSIF g_Head_PID_Enable AND gH_P3_ProductPump_Auto THEN
|
|
gH_P3_ProductPumpFC_Manual := mmH2O_TO_Freq(mPID_FillHead_OUT,gH_ProcessSetup_KProdPump) ;
|
|
mManual_Value := 0.0 ;
|
|
mLMN_FAC := 1.0 ;
|
|
ELSE
|
|
mManual_Value := 0.0 ;
|
|
mLMN_FAC := 0.0 ;
|
|
END_IF
|
|
|
|
END_PROCEDURE
|
|
|
|
PROCEDURE _Filling_Head_PID_Ctrl_PID_Monitor
|
|
(* Convertida desde ACTION *)
|
|
|
|
(* Código LAD convertido a SCL *)
|
|
// Red 2
|
|
// Llamada a función: mFillingHeadPIDStat
|
|
IF mFillingHeadPIDStat(_POSITIV) THEN
|
|
mDummy := TRUE;
|
|
ELSE
|
|
mDummy := FALSE;
|
|
END_IF;
|
|
|
|
// Red 1
|
|
IF gHeadPIDCtrlOk THEN
|
|
gHeadPIDCtrlOk := TRUE;
|
|
ELSE
|
|
gHeadPIDCtrlOk := FALSE;
|
|
END_IF;
|
|
|
|
|
|
END_PROCEDURE
|
|
|
|
PROCEDURE _Filling_Head_PID_Ctrl_Read_Analog
|
|
(* Convertida desde ACTION *)
|
|
|
|
(* Código LAD convertido a SCL *)
|
|
// Red 1
|
|
IF NOT gH_Blender_OPT_Simulation THEN
|
|
gDiffSensor_Analog_Fault := TRUE;
|
|
ELSE
|
|
gDiffSensor_Analog_Fault := FALSE;
|
|
END_IF;
|
|
|
|
|
|
END_PROCEDURE
|
|
|
|
PROCEDURE _Filling_Head_PID_Ctrl_Reset_Integral
|
|
(* Convertida desde ACTION *)
|
|
|
|
(* Código ST original *)
|
|
mInit_Int_PID := 0.0 ;
|
|
_Init_int_PID := TRUE ;
|
|
|
|
END_PROCEDURE
|
|
|
|
PROCEDURE _Filling_Head_PID_Ctrl_Write_Analog
|
|
(* Convertida desde ACTION *)
|
|
|
|
(* Código LAD convertido a SCL *)
|
|
// Red 1
|
|
IF NOT gH_Blender_OPT_Simulation THEN
|
|
gProduct_VFC_MainRefValue := TRUE;
|
|
ELSE
|
|
gProduct_VFC_MainRefValue := FALSE;
|
|
END_IF;
|
|
|
|
|
|
END_PROCEDURE
|