(* @PATH := '\/TASK2_ControlMain\/Blender_Procedure' *) (* @SYMFILEFLAGS := '59392' *) PROGRAM ProdBrixRecovery VAR mAuxONS : R_TRIG ; mSyrPerc : REAL ; mH2OPerc : REAL ; mRatio_M : REAL ; mRatio_V : REAL ; mQSugarNominal : REAL ; mQSugarActual : REAL ; mQH2ONominal : REAL ; mQH2OActual : REAL ; mTankSpaceAvail : REAL ; mSyrupKgMissing : REAL ; mSyrupLitMissing : REAL ; mTotalRecoverProd : REAL ; mKgH2OToRecover : REAL ; mTooMuchProdInTank : BOOL ; mProductElapsedONS : R_TRIG ; mProductElapsed : BOOL ; mDummy : BOOL ; END_VAR VAR_OUTPUT EN_Out : BOOL ; END_VAR (* @END_DECLARATION := '0' *) _LD_BODY _NETWORKS : 10 _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _LD_AND _LD_OPERATOR : 5 _LD_CONTACT gBlenderProdMode _EXPRESSION _POSITIV _LD_CONTACT gFirstProd_Done _EXPRESSION _POSITIV _LD_CONTACT gProductMeterOk _EXPRESSION _POSITIV _LD_CONTACT gSugarBeverage _EXPRESSION _POSITIV _LD_CONTACT gWaterRecipe _EXPRESSION _NEGATIV _EXPRESSION _POSITIV _EXPRESSION _POSITIV ENABLELIST : 0 ENABLELIST_END _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET gProdBrixRecovery_Qualifier _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _LD_AND _LD_OPERATOR : 2 _LD_CONTACT gH_CMD_ProdBrixRecoveryReq _EXPRESSION _POSITIV _FUNCTIONBLOCK mAuxONS _BOX_EXPR : 1 _EMPTY _EXPRESSION _POSITIV R_TRIG _OUTPUTS : 0 _EXPRESSION _POSITIV _EXPRESSION _POSITIV ENABLELIST : 0 ENABLELIST_END _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET gProdBrixRecovery_Request _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _LD_CONTACT gProdBrixRecovery_Qualifier _EXPRESSION _NEGATIV _EXPRESSION _POSITIV ENABLELIST : 0 ENABLELIST_END _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET gProdBrixRecovery_Reset _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _LD_CONTACT mTooMuchProdInTank _EXPRESSION _POSITIV _EXPRESSION _POSITIV ENABLELIST : 0 ENABLELIST_END _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET gProdBrixRecovery_Wait _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _EMPTY _EXPRESSION _POSITIV ENABLELIST : 1 _ASSIGN _FUNCTION _BOX_EXPR : 1 _ENABLED _OPERAND _EXPRESSION _POSITIV gProductTankLevel _EXPRESSION _POSITIV ProductLiterInTank _EXPRESSION _POSITIV _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET gTankProdAmount ENABLELIST_END _OUTPUTS : 0 _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _EMPTY _EXPRESSION _POSITIV ENABLELIST : 1 _ASSIGN _FUNCTIONBLOCK ??? _BOX_EXPR : 0 _ENABLED _EXPRESSION _POSITIV ProdBrixRecovery.BrixCalc _OUTPUTS : 0 _EXPRESSION _POSITIV _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET mDummy ENABLELIST_END _OUTPUTS : 0 _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _LD_AND _LD_OPERATOR : 3 _LD_OR _LD_OPERATOR : 2 _LD_CONTACT gProdBrixRecovery_Request _EXPRESSION _POSITIV _LD_CONTACT gProdBrixRecovery_Latch _EXPRESSION _POSITIV _EXPRESSION _POSITIV _LD_CONTACT gProdBrixRecovery_Reset _EXPRESSION _NEGATIV _LD_CONTACT gProdBrixRecovery_Done _EXPRESSION _NEGATIV _EXPRESSION _POSITIV _EXPRESSION _POSITIV ENABLELIST : 0 ENABLELIST_END _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET gProdBrixRecovery_Latch _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _LD_AND _LD_OPERATOR : 2 _LD_CONTACT gProdBrixRecovery_Latch _EXPRESSION _POSITIV _LD_CONTACT gProdBrixRecovery_Wait _EXPRESSION _NEGATIV _EXPRESSION _POSITIV _EXPRESSION _POSITIV ENABLELIST : 0 ENABLELIST_END _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET gProdBrixRecovery_Running _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _LD_CONTACT gProdBrixRecovery_Latch _EXPRESSION _POSITIV _EXPRESSION _POSITIV ENABLELIST : 0 ENABLELIST_END _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET gH_ProdBrixRecoveryRun _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _LD_CONTACT gProdBrixRecovery_Qualifier _EXPRESSION _POSITIV _EXPRESSION _POSITIV ENABLELIST : 1 _ASSIGN _FUNCTIONBLOCK mProductElapsedONS _BOX_EXPR : 1 _ENABLED _OPERATOR _BOX_EXPR : 2 _OPERATOR _BOX_EXPR : 2 _OPERAND _EXPRESSION _POSITIV gH_ProductTotalizer _OPERAND _EXPRESSION _POSITIV 0 _EXPRESSION _POSITIV GT _OPERATOR _BOX_EXPR : 2 _OPERATOR _BOX_EXPR : 2 _OPERATOR _BOX_EXPR : 1 _OPERAND _EXPRESSION _POSITIV gH_ProductTotalizer _EXPRESSION _POSITIV REAL_TO_DINT _OPERATOR _BOX_EXPR : 1 _OPERATOR _BOX_EXPR : 2 _OPERAND _EXPRESSION _POSITIV gProdAmountInSerpentine _OPERAND _EXPRESSION _POSITIV 2 _EXPRESSION _POSITIV MUL _EXPRESSION _POSITIV REAL_TO_DINT _EXPRESSION _POSITIV MOD _OPERAND _EXPRESSION _POSITIV 0 _EXPRESSION _POSITIV EQ _EXPRESSION _POSITIV AND _EXPRESSION _POSITIV R_TRIG _OUTPUTS : 0 _EXPRESSION _POSITIV _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET mProductElapsed ENABLELIST_END _OUTPUTS : 0 END_PROGRAM ACTION BrixCalc: IF gActualRecipe_Syrup_Brix<>0 AND gActualRecipe_Syrup_Brix_Fact<>0 THEN mSyrPerc := gProductBrix / (gActualRecipe_Syrup_Brix * gActualRecipe_Syrup_Brix_Fact) ; mSyrupKgMissing := (mQSugarNominal - mQSugarActual) / (gActualRecipe_Syrup_Brix * gActualRecipe_Syrup_Brix_Fact) * 100 ; END_IF mH2OPerc := 1 - mSyrPerc; IF mSyrPerc<>0 THEN mRatio_M := mH2OPerc / mSyrPerc ; END_IF IF gH2O_Density<>0 THEN mRatio_V := mRatio_M * gActualRecipe_SyrDens / gH2O_Density ; mKgH2OToRecover := (mQH2OActual - mQH2ONominal) / gH2O_Density ; END_IF CASE gH_Blender_OPT_MeterType OF 1: ; IF (mRatio_V+1)<>0 THEN gProdDensFromMeter := gActualRecipe_SyrDens * (mRatio_M + 1) / (mRatio_V + 1) ; (* Maselli *) ELSE gProdDensFromMeter := 1.0 ; END_IF 2: ; gProdDensFromMeter := gProductDens ; (* Anton Paar *) ELSE gProdDensFromMeter := 1.0 ; END_CASE mQSugarNominal := (gTankProdAmount + gProdAmountInSerpentine) * gProdDensFromMeter * gActualRecipe_Beverage_Brix / 100 ; mQSugarActual := (gTankProdAmount + gProdAmountInSerpentine) * gProdDensFromMeter * gProductBrix / 100 ; mQH2ONominal := gTankProdAmount - mQSugarNominal ; mQH2OActual := gTankProdAmount - mQSugarActual ; IF gActualRecipe_SyrDens<>0 THEN mTotalRecoverProd := (mSyrupKgMissing / gActualRecipe_SyrDens) * (gActualSP_RatioVol + 1); END_IF IF gActualSyrupDens<>0 THEN mSyrupLitMissing := mSyrupKgMissing /gActualSyrupDens ; END_IF mTankSpaceAvail := (gProdTankVolume * gProdTankStopLvl / 100) - gTankProdAmount ; IF mTankSpaceAvail>=2*gProdAmountInSerpentine THEN mTooMuchProdInTank := FALSE; ELSE mTooMuchProdInTank := TRUE; END_IF END_ACTION