FUNCTION "FC_Jam" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_OUTPUT 
      stOutCarrierStatsStandard : "CarrierStatisticsStandard";   // Standard Statistik
      stOutCarrierStatsAdv : "CarrierStatisticsF2H";   // Erweiterte Statistik (bereichsbezogen)
   END_VAR

   VAR_IN_OUT 
      arInOutJamCarrier : Array[*] of "stCarrier";   // Carrier Liste
      stInOutData : "stJamData";   // Jam Daten
   END_VAR

   VAR_TEMP 
      nIdx : Int;
      nArrayMax : Int;
   END_VAR

   VAR CONSTANT 
      cDummy : USInt := 1;
   END_VAR


BEGIN
	REGION Kapazität prüfen
	    //Prüft Einstellwert
	    IF (#stInOutData.Config.nCapacitySet > #stInOutData.Config.nCapacityMax) OR (#stInOutData.Config.nCapacitySet <= 0) THEN
	        #stInOutData.Config.nCapacitySet := #stInOutData.Config.nCapacityMax;
	    END_IF;
	END_REGION
	
	REGION Init
	    #stOutCarrierStatsStandard.nEmptyCarrier := 0;
	    #stOutCarrierStatsStandard.nLoadedCarrier := 0;
	    #stOutCarrierStatsStandard.nDummyCarrier := 0;
	    
	    #stOutCarrierStatsAdv.nDestWS1_0 := 0;
	    #stOutCarrierStatsAdv.nDestWS1_1 := 0;
	    #stOutCarrierStatsAdv.nDestWS2_0 := 0;
	    #stOutCarrierStatsAdv.nDestWS3_0 := 0;
	    #stOutCarrierStatsAdv.nDestWS4_0 := 0;
	    
	    //Ermittelt den Status/Füllstand des Staubereichs
	    #nArrayMax := DINT_TO_INT(UPPER_BOUND(ARR := #arInOutJamCarrier, DIM := 1));
	END_REGION
	
	REGION Statistik
	    IF NOT #arInOutJamCarrier[1].bStatus.%X0 THEN //Wenn 1. Teil leer, dann muss Schleife nicht ausgeführt werden
	        #stInOutData.Status.nCount := 0;
	        #stInOutData.Status.bByte.%X0 := TRUE;
	        
	        //Statistik - Jam ist leer
	        #stOutCarrierStatsStandard.nEmptyCarrier := 0;
	        #stOutCarrierStatsStandard.nLoadedCarrier := 0;
	        #stOutCarrierStatsStandard.nDummyCarrier := 0;
	        
	        #stOutCarrierStatsAdv.nDestWS1_0 := 0;
	        #stOutCarrierStatsAdv.nDestWS1_1 := 0;
	        #stOutCarrierStatsAdv.nDestWS2_0 := 0;
	        #stOutCarrierStatsAdv.nDestWS3_0 := 0;
	        #stOutCarrierStatsAdv.nDestWS4_0 := 0;
	        
	        //****Für Statistics muss dies auskommentiert werden
	        // ELSIF #arInOutJamCarrier[#nArrayMax].xOnline THEN //Wenn letztes Teil belegt, dann muss Schleife nicht ausgeführt werden
	        //     #stInOutData.Status.nCount := #nArrayMax;
	        //     #stInOutData.Status.xEmpty := FALSE;
	        //*****
	        
	    ELSE
	        FOR #nIdx := 1 TO #nArrayMax DO
	            //Statistics - nur wenn etwas vorhanden, ansonsten nicht machen
	            IF #arInOutJamCarrier[#nIdx].nBarcode <> 0 THEN
	                //Statistics Standard
	                IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND NOT #arInOutJamCarrier[#nIdx].bStatus.%X1 AND #arInOutJamCarrier[#nIdx].nBarcode <> #cDummy THEN
	                    #stOutCarrierStatsStandard.nEmptyCarrier += 1;
	                END_IF;
	                
	                IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].bStatus.%X1 AND #arInOutJamCarrier[#nIdx].nBarcode <> #cDummy THEN
	                    #stOutCarrierStatsStandard.nLoadedCarrier += 1;
	                END_IF;
	                
	                IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nBarcode = #cDummy THEN
	                    #stOutCarrierStatsStandard.nDummyCarrier += 1;
	                END_IF;
	                //  Statistics Advanced (Bereichsbezogen)  
	                IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nDestination = "cDestWS1_0" THEN
	                    #stOutCarrierStatsAdv.nDestWS1_0 += 1;
	                END_IF;
	                
	                IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nDestination = "cDestWS1_1" THEN
	                    #stOutCarrierStatsAdv.nDestWS1_1 += 1;
	                END_IF;
	                
	                IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nDestination = "cDestWS2_0" THEN
	                    #stOutCarrierStatsAdv.nDestWS2_0 += 1;
	                END_IF;
	                
	                IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nDestination = "cDestWS3_0" THEN
	                    #stOutCarrierStatsAdv.nDestWS3_0 += 1;
	                END_IF;
	                
	                IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nDestination = "cDestWS4_0" THEN
	                    #stOutCarrierStatsAdv.nDestWS4_0 += 1;
	                END_IF;
	                
	            END_IF;
	            
	            IF #arInOutJamCarrier[#nIdx].nBarcode = 0 THEN //Zählt nicht die Teile sondern merkt sich die Positionen wo ein Teil vorhanden ist (minus 1)
	                #stInOutData.Status.nCount := INT_TO_UINT(#nIdx - 1);
	                #stInOutData.Status.bByte.%X0 := FALSE;
	                EXIT;
	                //****Für Statistics würde dies benötigt werden
	            ELSIF #nIdx = #nArrayMax THEN
	                #stInOutData.Status.nCount := INT_TO_UINT(#nArrayMax);
	                #stInOutData.Status.bByte.%X0 := FALSE;
	                EXIT;
	                //******
	            END_IF;
	        END_FOR;
	    END_IF;
	END_REGION
END_FUNCTION

