FUNCTION "FC_Jam" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_OUTPUT 
      stOutCarrierStatsStandard : "CarrierStatisticsStandard";
   END_VAR

   VAR_IN_OUT 
      arInOutJamCarrier : Array[*] of "stCarrier";
      stInOutData : "stJamData";
   END_VAR

   VAR_TEMP 
      nIdx : Int;
      nArrayMax : Int;
   END_VAR

   VAR CONSTANT 
      cDummy : USInt := 1;
   END_VAR


BEGIN
	//Prüft Einstellwert
	IF (#stInOutData.Config.nCapacitySet > #stInOutData.Config.nCapacityMax) OR (#stInOutData.Config.nCapacitySet <= 0) THEN
	    #stInOutData.Config.nCapacitySet := #stInOutData.Config.nCapacityMax;
	END_IF;
	
	//Init
	#stOutCarrierStatsStandard.nEmptyCarrier := 0;
	#stOutCarrierStatsStandard.nLoadedCarrier := 0;
	#stOutCarrierStatsStandard.nDummyCarrier := 0;
	
	//Ermittelt den Status/Füllstand des Staubereichs
	#nArrayMax := DINT_TO_INT(UPPER_BOUND(ARR := #arInOutJamCarrier, DIM := 1));
	
	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;
	    
	    //****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;
	        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_FUNCTION

