(* @PATH := '\/TASK2_ControlMain\/Blender_Procedure' *) (* @SYMFILEFLAGS := '59392' *) PROGRAM BrixTracking VAR mLocalProdLevel : REAL ; mProdQualityGood : BOOL ; mAuxONS : R_TRIG ; mAuxONS1 : R_TRIG ; mLatchONS : BOOL ; mDummy : BOOL ; mProdBrixStat : StatisticalAnalisys ; mProdBrixSample : INT := 35 ; mWaitCycleToSample : INT ; mCycleCount : INT ; mTotalCount : INT ; mProdRefresh : REAL ; (* Time in min to refresh all product in product tank *) mProdRefreshS : REAL ; (* Time in sec to refresh all product in product tank *) mAuxProdBrixCorr : REAL ; mAuxProdBrixCorrInit : REAL ; mStart : BOOL ; mTakeSample : BOOL ; mTakeProdSample : BOOL ; mProdInit : REAL ; mAllSamples : BOOL ; END_VAR VAR_OUTPUT EN_Out : BOOL ; END_VAR (* @END_DECLARATION := '0' *) _LD_BODY _NETWORKS : 18 _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 gProdBrixTrack_Qualifier _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _LD_AND _LD_OPERATOR : 2 _LD_CONTACT gH_CMD_PrdBrixTrackingReq _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 gProdBrixTrack_Request _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _LD_CONTACT gProdBrixTrack_Qualifier _EXPRESSION _NEGATIV _EXPRESSION _POSITIV ENABLELIST : 0 ENABLELIST_END _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET gProdBrixTrack_Reset _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _LD_CONTACT gProdBrixTrack_Latch _EXPRESSION _POSITIV _EXPRESSION _POSITIV ENABLELIST : 1 _ASSIGN _OPERATOR _BOX_EXPR : 2 _ENABLED _OPERAND _EXPRESSION _POSITIV gProdBxStat_DevStd _OPERAND _EXPRESSION _POSITIV 8E-3 _EXPRESSION _POSITIV LT _EXPRESSION _POSITIV _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET mProdQualityGood ENABLELIST_END _OUTPUTS : 0 _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _LD_OR _LD_OPERATOR : 4 _LD_CONTACT mProdQualityGood _EXPRESSION _NEGATIV _LD_CONTACT gFlowToFiller _EXPRESSION _NEGATIV _LD_CONTACT gFreezeProductMeter _EXPRESSION _POSITIV _LD_CONTACT gBlenderEnToRamp _EXPRESSION _NEGATIV _EXPRESSION _POSITIV _EXPRESSION _POSITIV ENABLELIST : 0 ENABLELIST_END _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET gProdBrixTrack_Wait _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _LD_AND _LD_OPERATOR : 3 _LD_OR _LD_OPERATOR : 2 _LD_CONTACT gProdBrixTrack_Request _EXPRESSION _POSITIV _LD_CONTACT gProdBrixTrack_Latch _EXPRESSION _POSITIV _EXPRESSION _POSITIV _LD_CONTACT gProdBrixTrack_Reset _EXPRESSION _NEGATIV _LD_CONTACT gProdBrixTrack_Done _EXPRESSION _NEGATIV _EXPRESSION _POSITIV _EXPRESSION _POSITIV ENABLELIST : 0 ENABLELIST_END _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET gProdBrixTrack_Latch _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _LD_AND _LD_OPERATOR : 2 _LD_CONTACT gProdBrixTrack_Latch _EXPRESSION _POSITIV _FUNCTIONBLOCK mAuxONS1 _BOX_EXPR : 1 _EMPTY _EXPRESSION _POSITIV R_TRIG _OUTPUTS : 0 _EXPRESSION _POSITIV _EXPRESSION _POSITIV ENABLELIST : 0 ENABLELIST_END _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET mLatchONS _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _LD_AND _LD_OPERATOR : 2 _LD_CONTACT gProdBrixTrack_Latch _EXPRESSION _POSITIV _LD_CONTACT gProdBrixTrack_Wait _EXPRESSION _NEGATIV _EXPRESSION _POSITIV _EXPRESSION _POSITIV ENABLELIST : 0 ENABLELIST_END _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET gProdBrixTrack_Running _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _LD_AND _LD_OPERATOR : 2 _LD_CONTACT gProdBrixTrack_Latch _EXPRESSION _POSITIV _LD_CONTACT gProdBrixTrack_Wait _EXPRESSION _POSITIV _EXPRESSION _POSITIV _EXPRESSION _POSITIV ENABLELIST : 0 ENABLELIST_END _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET gH_Status009 _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _LD_CONTACT gProdBrixTrack_Latch _EXPRESSION _POSITIV _EXPRESSION _POSITIV ENABLELIST : 0 ENABLELIST_END _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET gH_PrdBrixTrackingRun _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _EMPTY _EXPRESSION _POSITIV ENABLELIST : 1 _ASSIGN _OPERATOR _BOX_EXPR : 3 _ENABLED _OPERAND _EXPRESSION _POSITIV gProductTankLevel>50 _OPERAND _EXPRESSION _POSITIV gProductTankLevel _OPERAND _EXPRESSION _POSITIV 60 _EXPRESSION _POSITIV SEL _EXPRESSION _POSITIV _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET mLocalProdLevel ENABLELIST_END _OUTPUTS : 0 _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _EMPTY _EXPRESSION _POSITIV ENABLELIST : 1 _ASSIGN _FUNCTION _BOX_EXPR : 1 _ENABLED _OPERAND _EXPRESSION _POSITIV mLocalProdLevel _EXPRESSION _POSITIV ProductLiterInTank _EXPRESSION _POSITIV _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET gProductLitTank ENABLELIST_END _OUTPUTS : 0 _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _EMPTY _EXPRESSION _POSITIV ENABLELIST : 1 _ASSIGN _FUNCTIONBLOCK ??? _BOX_EXPR : 0 _ENABLED _EXPRESSION _POSITIV BrixTracking.ProdSamples _OUTPUTS : 0 _EXPRESSION _POSITIV _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET mDummy ENABLELIST_END _OUTPUTS : 0 _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _LD_CONTACT gProdBrixTrack_Latch _EXPRESSION _POSITIV _EXPRESSION _POSITIV ENABLELIST : 1 _ASSIGN _FUNCTIONBLOCK ??? _BOX_EXPR : 0 _ENABLED _EXPRESSION _POSITIV BrixTracking.SampleTimeCalc _OUTPUTS : 0 _EXPRESSION _POSITIV _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET mDummy ENABLELIST_END _OUTPUTS : 0 _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _LD_CONTACT gProdBrixTrack_Latch _EXPRESSION _NEGATIV _EXPRESSION _POSITIV ENABLELIST : 1 _ASSIGN _OPERATOR _BOX_EXPR : 1 _ENABLED _OPERAND _EXPRESSION _POSITIV 0 _EXPRESSION _POSITIV MOVE _EXPRESSION _POSITIV _OUTPUTS : 2 _OUTPUT _POSITIV _NO_SET mAuxProdBrixCorr _OUTPUT _POSITIV _NO_SET gBrixTrackingCorr ENABLELIST_END _OUTPUTS : 0 _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _LD_CONTACT gProdBrixTrack_Running _EXPRESSION _POSITIV _EXPRESSION _POSITIV ENABLELIST : 0 ENABLELIST_END _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET gH_Status010 _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _LD_OR _LD_OPERATOR : 3 _LD_AND _LD_OPERATOR : 3 _LD_CONTACT gProdBrixTrack_Latch _EXPRESSION _POSITIV _LD_CONTACT mLatchONS _EXPRESSION _NEGATIV _LD_CONTACT gProdBrixTrack_Request _EXPRESSION _POSITIV _EXPRESSION _POSITIV _LD_CONTACT gBlenderRinseMode _EXPRESSION _POSITIV _LD_CONTACT gBlenderCIPMode _EXPRESSION _POSITIV _EXPRESSION _POSITIV _EXPRESSION _POSITIV ENABLELIST : 0 ENABLELIST_END _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET gProdBrixTrack_Done _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _EMPTY _EXPRESSION _POSITIV ENABLELIST : 1 _ASSIGN _FUNCTIONBLOCK ??? _BOX_EXPR : 0 _ENABLED _EXPRESSION _POSITIV BrixTracking.ProductQualityMonitor _OUTPUTS : 0 _EXPRESSION _POSITIV _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET mDummy ENABLELIST_END _OUTPUTS : 0 END_PROGRAM ACTION ProdSamples: (* Calculates the product liters during blending. Every 60 Liters of product take a sample for the statistical analisys in order to correct the product brix *) IF gBlenderBlending THEN gProductTotalizerLt.i_NewValue :=gActual_Prod_Flow ; gProductTotalizerLt.i_IntCycle := gTask02CycleTime ; gProductTotalizerLt(Out_Integral:=gProductLiters) ; END_IF IF gBlenderRinseMode OR gBlenderCIPMode THEN gProductLiters := 0.0 ; gProductTotalizerLt(Out_Integral:=gProductLiters) ; END_IF IF (gProductLiters-mProdInit)>60 THEN mTakeProdSample := TRUE ; mProdInit := gProductLiters ; END_IF (*mAuxProdBrixCorr := (gActualRecipe_Beverage_Brix - gProdBxStat_MeanValue) / 2 ;*) END_ACTION ACTION ProductQualityMonitor: _LD_BODY _NETWORKS : 3 _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _LD_OR _LD_OPERATOR : 2 _LD_CONTACT mTakeSample _EXPRESSION _POSITIV _LD_AND _LD_OPERATOR : 2 _LD_CONTACT gAlwaysOff _EXPRESSION _POSITIV _LD_CONTACT mTakeProdSample _EXPRESSION _POSITIV _EXPRESSION _POSITIV _EXPRESSION _POSITIV _EXPRESSION _POSITIV ENABLELIST : 1 _ASSIGN _FUNCTIONBLOCK mProdBrixStat _BOX_EXPR : 3 _ENABLED _OPERAND _EXPRESSION _POSITIV gProductBrix _OPERAND _EXPRESSION _POSITIV mProdBrixSample _OPERAND _EXPRESSION _POSITIV 1 _EXPRESSION _POSITIV StatisticalAnalisys _OUTPUTS : 2 _OUTPUT _POSITIV _NO_SET gProdBxStat_Variance _OUTPUT _POSITIV _NO_SET gProdBxStat_DevStd _EXPRESSION _POSITIV _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET gProdBxStat_MeanValue ENABLELIST_END _OUTPUTS : 0 _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _LD_CONTACT mTakeSample _EXPRESSION _POSITIV _EXPRESSION _POSITIV ENABLELIST : 0 ENABLELIST_END _OUTPUTS : 1 _OUTPUT _NEGATIV _SET mTakeSample _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _LD_CONTACT mTakeProdSample _EXPRESSION _POSITIV _EXPRESSION _POSITIV ENABLELIST : 0 ENABLELIST_END _OUTPUTS : 1 _OUTPUT _NEGATIV _SET mTakeProdSample END_ACTION ACTION SampleTimeCalc: IF gActual_Prod_SP<>0 THEN mProdRefresh := gProductLitTank / gActual_Prod_SP ; ELSE mProdRefresh := 0 ; END_IF mProdRefreshS := mProdRefresh * 1.6 * 60 ; IF gTask02CycleTime<>0 AND mProdBrixSample<>0 THEN mWaitCycleToSample := REAL_TO_INT(mProdRefreshS / mProdBrixSample / gTask02CycleTime) ; END_IF IF mWaitCycleToSample<1 THEN mWaitCycleToSample := 1 ; END_IF IF gProdBrixTrack_Latch AND NOT gFreezeProductMeter THEN IF mCycleCount<=mWaitCycleToSample THEN mCycleCount := mCycleCount + 1 ; ELSE mTakeSample := TRUE ; mCycleCount := 0 ; END_IF ELSE mTakeSample := FALSE ; (* mCycleCount := 0 ;*) END_IF IF mTakeSample THEN mTotalCount := mTotalCount + 1 ; END_IF IF mTotalCount>=mProdBrixSample THEN IF gProdBrixTrack_Running THEN IF NOT mStart THEN mStart := TRUE ; mAuxProdBrixCorrInit := gActualRecipe_Beverage_Brix - gProdBxStat_MeanValue ; IF mAuxProdBrixCorr=0 THEN mAuxProdBrixCorr := (gActualRecipe_Beverage_Brix - gProdBxStat_MeanValue) / 3 ; END_IF ELSE mStart := FALSE ; (* IF ABS(gActualRecipe_Beverage_Brix - gProdBxStat_MeanValue)<=mAuxProdBrixCorrInit THEN*) mAuxProdBrixCorr := mAuxProdBrixCorr + (gActualRecipe_Beverage_Brix - gProdBxStat_MeanValue) / 10 ; (* END_IF*) END_IF END_IF mAllSamples := TRUE ; mTotalCount := 0 ; ELSE mAllSamples := FALSE ; END_IF (* Check the limit boundaries to act the product tracking *) IF gProdBrixTrack_Running THEN IF NOT (ABS(mAuxProdBrixCorr)gBrixTrackingMaxCorr) THEN gBrixTrackingCorr := mAuxProdBrixCorr ; END_IF END_IF END_ACTION