FUNCTION "FC_CARR_GLOB_CORRECTION" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      xInStart : Bool;   // Ausführen der Funktion
      nInBarcodeScan : DInt;   // Gescannter Barcode
      nInStation : Int;   // Station Nummer
   END_VAR

   VAR_OUTPUT 
      arOutEventLogInfo : Array[0..1] of "stEventCorrectionInfo";   // Informationen für Log-Baustein
   END_VAR

   VAR_IN_OUT 
      InOutCarrierExpect : "stCarrier";   // Erwarteter Carrier in ScannerStation
   END_VAR

   VAR_TEMP 
      tmpPartJam : "stCarrier";   // Zwischengespeicherter Carrier, gefunden in Jambereich
      tmpPartHyperJam : "stCarrier";   // Zwischengespeicherter Carrier, gefunden in JHyperjam
      tmpDummy : "stCarrier";   // Leerer Dummy mit speziellem Barcode
      tmpEmpty : "stCarrier";   // Leerer Carrier
      nCounter : DInt;
      nIdx1 : Int;   // Schleifenindex
      tempStatus : Int;
      xResult : Bool;
   END_VAR


BEGIN
	(*************************************************************************************
	Durchsucht alle Jam- und Lagerberieche nach den Daten die mit dem gescannten Barcode verbunden sind falls am Scanner ein anderes Teil erwartet wird.
	    -Suche beginnt immer im Hyperjam.
	    -Wenn fündig im Hyperjam, dann wird erwartetes Teil durch das Teil vom Hyperjam ersetzt, dafür kommt erwartetes Teil in Hyperjam.
	    -Ansonsten wenn fündig in Jambereichen, dann werden Daten aus dem Jambereich übernommen und diese durch Dummy ersetzt
	*************************************************************************************)
	
	#tmpDummy.nBarcode := 1;
	#tmpDummy.bStatus.%X0 := TRUE;
	
	IF #xInStart AND #nInBarcodeScan > 0 THEN //Barcode muss einen Wert haben
	    REGION Hyperjam
	        FOR #nIdx1 := 1 TO "cHyperJam" DO
	            IF "DB_HyperJam".stHyperJam.arCarrier[#nIdx1].nBarcode = #nInBarcodeScan THEN //Merke gefundenes Teil und lösche ursprüngliches
	                #tmpPartHyperJam := "DB_HyperJam".stHyperJam.arCarrier[#nIdx1];
	                "DB_HyperJam".stHyperJam.arCarrier[#nIdx1] := #tmpEmpty;
	                
	                REGION Event Log
	                    #arOutEventLogInfo[0].xTrigger := TRUE;
	                    #arOutEventLogInfo[0].nCorrectionType := 0;
	                    #arOutEventLogInfo[0].sBarcode := DINT_TO_STRING(#nInBarcodeScan);
	                    #arOutEventLogInfo[0].sLoc := 'HyperJam';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#nIdx1);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartHyperJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    REGION Jam Area 0102_1
	        FOR #nIdx1 := 1 TO "cJam0102_1" DO
	            IF "DB_JamArea0102".stJam0102_1.arCarrier[#nIdx1].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea0102".stJam0102_1.arCarrier[#nIdx1];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea0102".stJam0102_1.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam0102_1" - #nIdx1), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #nIdx1,
	                                                DEST_INDEX := #nIdx1 - 1,
	                                                DEST => "DB_JamArea0102".stJam0102_1.arCarrier);
	                "DB_JamArea0102".stJam0102_1.arCarrier["cJam0102_1"] := #tmpEmpty;//lösche letzte Position
	                REGION Event Log                           
	                    #arOutEventLogInfo[0].xTrigger := TRUE;
	                    #arOutEventLogInfo[0].nCorrectionType := 1;
	                    #arOutEventLogInfo[0].sBarcode := DINT_TO_STRING(#nInBarcodeScan);
	                    #arOutEventLogInfo[0].sLoc := 'Jam0102_1';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#nIdx1);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    REGION Jam Area 0102_2
	        FOR #nIdx1 := 1 TO "cJam0102_2" DO
	            IF "DB_JamArea0102".stJam0102_2.arCarrier[#nIdx1].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea0102".stJam0102_2.arCarrier[#nIdx1];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea0102".stJam0102_2.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam0102_2" - #nIdx1), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #nIdx1,
	                                                DEST_INDEX := #nIdx1 - 1,
	                                                DEST => "DB_JamArea0102".stJam0102_2.arCarrier);
	                "DB_JamArea0102".stJam0102_2.arCarrier["cJam0102_2"] := #tmpEmpty;//lösche letzte Position
	                REGION Event Log                           
	                    #arOutEventLogInfo[0].xTrigger := TRUE;
	                    #arOutEventLogInfo[0].nCorrectionType := 1;
	                    #arOutEventLogInfo[0].sBarcode := DINT_TO_STRING(#nInBarcodeScan);
	                    #arOutEventLogInfo[0].sLoc := 'Jam0102_2';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#nIdx1);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    REGION Jam Area 0102_3
	        FOR #nIdx1 := 1 TO "cJam0102_3" DO
	            IF "DB_JamArea0102".stJam0102_3.arCarrier[#nIdx1].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea0102".stJam0102_3.arCarrier[#nIdx1];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea0102".stJam0102_3.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam0102_3" - #nIdx1), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #nIdx1,
	                                                DEST_INDEX := #nIdx1 - 1,
	                                                DEST => "DB_JamArea0102".stJam0102_3.arCarrier);
	                "DB_JamArea0102".stJam0102_3.arCarrier["cJam0102_3"] := #tmpEmpty;//lösche letzte Position
	                REGION Event Log                           
	                    #arOutEventLogInfo[0].xTrigger := TRUE;
	                    #arOutEventLogInfo[0].nCorrectionType := 1;
	                    #arOutEventLogInfo[0].sBarcode := DINT_TO_STRING(#nInBarcodeScan);
	                    #arOutEventLogInfo[0].sLoc := 'Jam0102_3';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#nIdx1);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    REGION Jam Area 0102_4
	        FOR #nIdx1 := 1 TO "cJam0102_4" DO
	            IF "DB_JamArea0102".stJam0102_4.arCarrier[#nIdx1].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea0102".stJam0102_4.arCarrier[#nIdx1];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea0102".stJam0102_4.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam0102_4" - #nIdx1), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #nIdx1,
	                                                DEST_INDEX := #nIdx1 - 1,
	                                                DEST => "DB_JamArea0102".stJam0102_4.arCarrier);
	                "DB_JamArea0102".stJam0102_4.arCarrier["cJam0102_4"] := #tmpEmpty;//lösche letzte Position
	                REGION Event Log                           
	                    #arOutEventLogInfo[0].xTrigger := TRUE;
	                    #arOutEventLogInfo[0].nCorrectionType := 1;
	                    #arOutEventLogInfo[0].sBarcode := DINT_TO_STRING(#nInBarcodeScan);
	                    #arOutEventLogInfo[0].sLoc := 'Jam0102_4';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#nIdx1);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    REGION Jam Area 0102_5
	        FOR #nIdx1 := 1 TO "cJam0102_5" DO
	            IF "DB_JamArea0102".stJam0102_5.arCarrier[#nIdx1].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea0102".stJam0102_5.arCarrier[#nIdx1];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea0102".stJam0102_5.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam0102_5" - #nIdx1), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #nIdx1,
	                                                DEST_INDEX := #nIdx1 - 1,
	                                                DEST => "DB_JamArea0102".stJam0102_5.arCarrier);
	                "DB_JamArea0102".stJam0102_5.arCarrier["cJam0102_5"] := #tmpEmpty;//lösche letzte Position
	                REGION Event Log                           
	                    #arOutEventLogInfo[0].xTrigger := TRUE;
	                    #arOutEventLogInfo[0].nCorrectionType := 1;
	                    #arOutEventLogInfo[0].sBarcode := DINT_TO_STRING(#nInBarcodeScan);
	                    #arOutEventLogInfo[0].sLoc := 'Jam0102_5';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#nIdx1);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    REGION Jam Area 0102_6
	        FOR #nIdx1 := 1 TO "cJam0102_6" DO
	            IF "DB_JamArea0102".stJam0102_6.arCarrier[#nIdx1].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea0102".stJam0102_6.arCarrier[#nIdx1];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea0102".stJam0102_6.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam0102_6" - #nIdx1), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #nIdx1,
	                                                DEST_INDEX := #nIdx1 - 1,
	                                                DEST => "DB_JamArea0102".stJam0102_6.arCarrier);
	                "DB_JamArea0102".stJam0102_6.arCarrier["cJam0102_6"] := #tmpEmpty;//lösche letzte Position
	                REGION Event Log                           
	                    #arOutEventLogInfo[0].xTrigger := TRUE;
	                    #arOutEventLogInfo[0].nCorrectionType := 1;
	                    #arOutEventLogInfo[0].sBarcode := DINT_TO_STRING(#nInBarcodeScan);
	                    #arOutEventLogInfo[0].sLoc := 'Jam0102_6';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#nIdx1);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    REGION Jam Area 0103_1
	        FOR #nIdx1 := 1 TO "cJam0103_1" DO
	            IF "DB_JamArea0103".stJam0103_1.arCarrier[#nIdx1].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea0103".stJam0103_1.arCarrier[#nIdx1];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea0103".stJam0103_1.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam0103_1" - #nIdx1), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #nIdx1,
	                                                DEST_INDEX := #nIdx1 - 1,
	                                                DEST => "DB_JamArea0103".stJam0103_1.arCarrier);
	                "DB_JamArea0103".stJam0103_1.arCarrier["cJam0103_1"] := #tmpEmpty;//lösche letzte Position
	                REGION Event Log                           
	                    #arOutEventLogInfo[0].xTrigger := TRUE;
	                    #arOutEventLogInfo[0].nCorrectionType := 1;
	                    #arOutEventLogInfo[0].sBarcode := DINT_TO_STRING(#nInBarcodeScan);
	                    #arOutEventLogInfo[0].sLoc := 'Jam0103_1';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#nIdx1);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    
	    REGION Jam Area 0104_1
	        FOR #nIdx1 := 1 TO "cJam0104_1" DO
	            IF "DB_JamArea0104".stJam0104_1.arCarrier[#nIdx1].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea0104".stJam0104_1.arCarrier[#nIdx1];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea0104".stJam0104_1.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam0104_1" - #nIdx1), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #nIdx1,
	                                                DEST_INDEX := #nIdx1 - 1,
	                                                DEST => "DB_JamArea0104".stJam0104_1.arCarrier);
	                "DB_JamArea0104".stJam0104_1.arCarrier["cJam0104_1"] := #tmpEmpty;//lösche letzte Position
	                REGION Event Log                           
	                    #arOutEventLogInfo[0].xTrigger := TRUE;
	                    #arOutEventLogInfo[0].nCorrectionType := 1;
	                    #arOutEventLogInfo[0].sBarcode := DINT_TO_STRING(#nInBarcodeScan);
	                    #arOutEventLogInfo[0].sLoc := 'Jam0104_1';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#nIdx1);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    
	    REGION Jam Area 0104_2
	        FOR #nIdx1 := 1 TO "cJam0104_2" DO
	            IF "DB_JamArea0104".stJam0104_2.arCarrier[#nIdx1].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea0104".stJam0104_2.arCarrier[#nIdx1];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea0104".stJam0104_2.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam0104_2" - #nIdx1), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #nIdx1,
	                                                DEST_INDEX := #nIdx1 - 1,
	                                                DEST => "DB_JamArea0104".stJam0104_2.arCarrier);
	                "DB_JamArea0104".stJam0104_2.arCarrier["cJam0104_2"] := #tmpEmpty;//lösche letzte Position
	                REGION Event Log                           
	                    #arOutEventLogInfo[0].xTrigger := TRUE;
	                    #arOutEventLogInfo[0].nCorrectionType := 1;
	                    #arOutEventLogInfo[0].sBarcode := DINT_TO_STRING(#nInBarcodeScan);
	                    #arOutEventLogInfo[0].sLoc := 'Jam0104_2';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#nIdx1);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    
	    REGION Jam Area 0104_3
	        FOR #nIdx1 := 1 TO "cJam0104_3" DO
	            IF "DB_JamArea0104".stJam0104_3.arCarrier[#nIdx1].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea0104".stJam0104_3.arCarrier[#nIdx1];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea0104".stJam0104_3.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam0104_3" - #nIdx1), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #nIdx1,
	                                                DEST_INDEX := #nIdx1 - 1,
	                                                DEST => "DB_JamArea0104".stJam0104_3.arCarrier);
	                "DB_JamArea0104".stJam0104_3.arCarrier["cJam0104_3"] := #tmpEmpty;//lösche letzte Position
	                REGION Event Log                           
	                    #arOutEventLogInfo[0].xTrigger := TRUE;
	                    #arOutEventLogInfo[0].nCorrectionType := 1;
	                    #arOutEventLogInfo[0].sBarcode := DINT_TO_STRING(#nInBarcodeScan);
	                    #arOutEventLogInfo[0].sLoc := 'Jam0104_3';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#nIdx1);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    
	    REGION Jam Area 0106_2
	        FOR #nIdx1 := 1 TO "cJam0106_2" DO
	            IF "DB_JamArea0106".stJam0106_2.arCarrier[#nIdx1].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea0106".stJam0106_2.arCarrier[#nIdx1];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea0106".stJam0106_2.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam0106_2" - #nIdx1), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #nIdx1,
	                                                DEST_INDEX := #nIdx1 - 1,
	                                                DEST => "DB_JamArea0106".stJam0106_2.arCarrier);
	                "DB_JamArea0106".stJam0106_2.arCarrier["cJam0106_2"] := #tmpEmpty;//lösche letzte Position
	                REGION Event Log                           
	                    #arOutEventLogInfo[0].xTrigger := TRUE;
	                    #arOutEventLogInfo[0].nCorrectionType := 1;
	                    #arOutEventLogInfo[0].sBarcode := DINT_TO_STRING(#nInBarcodeScan);
	                    #arOutEventLogInfo[0].sLoc := 'Jam0106_2';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#nIdx1);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    
	    REGION Jam Area 0107_1
	        FOR #nIdx1 := 1 TO "cJam0107_1" DO
	            IF "DB_JamArea0107".stJam0107_1.arCarrier[#nIdx1].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea0107".stJam0107_1.arCarrier[#nIdx1];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea0107".stJam0107_1.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam0107_1" - #nIdx1), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #nIdx1,
	                                                DEST_INDEX := #nIdx1 - 1,
	                                                DEST => "DB_JamArea0107".stJam0107_1.arCarrier);
	                "DB_JamArea0107".stJam0107_1.arCarrier["cJam0107_1"] := #tmpEmpty;//lösche letzte Position
	                REGION Event Log                           
	                    #arOutEventLogInfo[0].xTrigger := TRUE;
	                    #arOutEventLogInfo[0].nCorrectionType := 1;
	                    #arOutEventLogInfo[0].sBarcode := DINT_TO_STRING(#nInBarcodeScan);
	                    #arOutEventLogInfo[0].sLoc := 'Jam0107_1';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#nIdx1);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    
	    REGION Jam Area 0108_1
	        FOR #nIdx1 := 1 TO "cJam0108_1" DO
	            IF "DB_JamArea0108".stJam0108_1.arCarrier[#nIdx1].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea0108".stJam0108_1.arCarrier[#nIdx1];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea0108".stJam0108_1.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam0108_1" - #nIdx1), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #nIdx1,
	                                                DEST_INDEX := #nIdx1 - 1,
	                                                DEST => "DB_JamArea0108".stJam0108_1.arCarrier);
	                "DB_JamArea0108".stJam0108_1.arCarrier["cJam0108_1"] := #tmpEmpty;//lösche letzte Position
	                REGION Event Log                           
	                    #arOutEventLogInfo[0].xTrigger := TRUE;
	                    #arOutEventLogInfo[0].nCorrectionType := 1;
	                    #arOutEventLogInfo[0].sBarcode := DINT_TO_STRING(#nInBarcodeScan);
	                    #arOutEventLogInfo[0].sLoc := 'Jam0108_1';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#nIdx1);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    
	    REGION Jam Area 0108_2
	        FOR #nIdx1 := 1 TO "cJam0108_2" DO
	            IF "DB_JamArea0108".stJam0108_2.arCarrier[#nIdx1].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea0108".stJam0108_2.arCarrier[#nIdx1];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea0108".stJam0108_2.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam0108_2" - #nIdx1), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #nIdx1,
	                                                DEST_INDEX := #nIdx1 - 1,
	                                                DEST => "DB_JamArea0108".stJam0108_2.arCarrier);
	                "DB_JamArea0108".stJam0108_2.arCarrier["cJam0108_2"] := #tmpEmpty;//lösche letzte Position
	                REGION Event Log                           
	                    #arOutEventLogInfo[0].xTrigger := TRUE;
	                    #arOutEventLogInfo[0].nCorrectionType := 1;
	                    #arOutEventLogInfo[0].sBarcode := DINT_TO_STRING(#nInBarcodeScan);
	                    #arOutEventLogInfo[0].sLoc := 'Jam0108_2';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#nIdx1);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    
	    REGION Jam Area 0108_3
	        FOR #nIdx1 := 1 TO "cJam0108_3" DO
	            IF "DB_JamArea0108".stJam0108_3.arCarrier[#nIdx1].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea0108".stJam0108_3.arCarrier[#nIdx1];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea0108".stJam0108_3.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam0108_3" - #nIdx1), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #nIdx1,
	                                                DEST_INDEX := #nIdx1 - 1,
	                                                DEST => "DB_JamArea0108".stJam0108_3.arCarrier);
	                "DB_JamArea0108".stJam0108_3.arCarrier["cJam0108_3"] := #tmpEmpty;//lösche letzte Position
	                REGION Event Log                           
	                    #arOutEventLogInfo[0].xTrigger := TRUE;
	                    #arOutEventLogInfo[0].nCorrectionType := 1;
	                    #arOutEventLogInfo[0].sBarcode := DINT_TO_STRING(#nInBarcodeScan);
	                    #arOutEventLogInfo[0].sLoc := 'Jam0108_3';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#nIdx1);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    
	    REGION Jam Area 0110_2
	        FOR #nIdx1 := 1 TO "cJam0110_2" DO
	            IF "DB_JamArea0110".stJam0110_2.arCarrier[#nIdx1].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea0110".stJam0110_2.arCarrier[#nIdx1];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea0110".stJam0110_2.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam0110_2" - #nIdx1), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #nIdx1,
	                                                DEST_INDEX := #nIdx1 - 1,
	                                                DEST => "DB_JamArea0110".stJam0110_2.arCarrier);
	                "DB_JamArea0110".stJam0110_2.arCarrier["cJam0110_2"] := #tmpEmpty;//lösche letzte Position
	                REGION Event Log                           
	                    #arOutEventLogInfo[0].xTrigger := TRUE;
	                    #arOutEventLogInfo[0].nCorrectionType := 1;
	                    #arOutEventLogInfo[0].sBarcode := DINT_TO_STRING(#nInBarcodeScan);
	                    #arOutEventLogInfo[0].sLoc := 'Jam0110_2';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#nIdx1);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    
	    REGION Jam Area 4104_1
	        FOR #nIdx1 := 1 TO "cJam4104_1" DO
	            IF "DB_JamArea4104".stJam4104_1.arCarrier[#nIdx1].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea4104".stJam4104_1.arCarrier[#nIdx1];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea4104".stJam4104_1.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam4104_1" - #nIdx1), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #nIdx1,
	                                                DEST_INDEX := #nIdx1 - 1,
	                                                DEST => "DB_JamArea4104".stJam4104_1.arCarrier);
	                "DB_JamArea4104".stJam4104_1.arCarrier["cJam4104_1"] := #tmpEmpty;//lösche letzte Position
	                REGION Event Log                           
	                    #arOutEventLogInfo[0].xTrigger := TRUE;
	                    #arOutEventLogInfo[0].nCorrectionType := 1;
	                    #arOutEventLogInfo[0].sBarcode := DINT_TO_STRING(#nInBarcodeScan);
	                    #arOutEventLogInfo[0].sLoc := 'Jam4104_1';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#nIdx1);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    REGION Jam Area 4103_1
	        FOR #nIdx1 := 1 TO "cJam4103_1" DO
	            IF "DB_JamArea4103".stJam4103_1.arCarrier[#nIdx1].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea4103".stJam4103_1.arCarrier[#nIdx1];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea4103".stJam4103_1.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam4103_1" - #nIdx1), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #nIdx1,
	                                                DEST_INDEX := #nIdx1 - 1,
	                                                DEST => "DB_JamArea4103".stJam4103_1.arCarrier);
	                "DB_JamArea4103".stJam4103_1.arCarrier["cJam4103_1"] := #tmpEmpty;//lösche letzte Position
	                REGION Event Log                           
	                    #arOutEventLogInfo[0].xTrigger := TRUE;
	                    #arOutEventLogInfo[0].nCorrectionType := 1;
	                    #arOutEventLogInfo[0].sBarcode := DINT_TO_STRING(#nInBarcodeScan);
	                    #arOutEventLogInfo[0].sLoc := 'Jam4103_1';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#nIdx1);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    
	    END:
	    ;
	    REGION Handling
	        IF #tmpPartHyperJam.nBarcode <> 0 THEN //Gefundenes Teil aus Hyperjam
	            REGION Teil aus Hyperjam
	                IF #InOutCarrierExpect.nBarcode > 10000 THEN //Wenn erwarteter Carrier einen Barcode hat, füge ihn am Ende des Hyperjams ein
	                    "FC_TSHR_AddAtEnd"(stInTrolley := #InOutCarrierExpect,
	                                       nOutCounter => #nCounter,
	                                       xOutResult => #xResult,
	                                       arTSHR := "DB_HyperJam".stHyperJam.arCarrier);
	                    
	                    REGION Event log
	                        
	                        #arOutEventLogInfo[1].xTrigger := TRUE;
	                        #arOutEventLogInfo[1].nCorrectionType := 3;
	                        #arOutEventLogInfo[1].sBarcode := DINT_TO_STRING(#InOutCarrierExpect.nBarcode);
	                        #arOutEventLogInfo[1].sLoc := 'HyperJ';
	                        #arOutEventLogInfo[1].sPos := INT_TO_STRING(#nIdx1);
	                        #arOutEventLogInfo[1].sDest := INT_TO_STRING(#InOutCarrierExpect.nDestination);
	                        
	                    END_REGION
	                    
	                END_IF;
	                FOR #nIdx1 := 1 TO "cHyperJam" DO //Durchsuche Hyperjam nach Lücke
	                    IF NOT "DB_HyperJam".stHyperJam.arCarrier[#nIdx1].bStatus.%X0 THEN
	                        #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_HyperJam".stHyperJam.arCarrier,
	                                                        COUNT := INT_TO_UDINT("cHyperJam" - #nIdx1), //Wo die Lücke im Hyperjam entstanden ist, rücke Rest nach
	                                                        SRC_INDEX := #nIdx1,
	                                                        DEST_INDEX := #nIdx1 - 1,
	                                                        DEST => "DB_HyperJam".stHyperJam.arCarrier);
	                        "DB_HyperJam".stHyperJam.arCarrier["cHyperJam"] := #tmpEmpty; //lösche letztes Teil
	                        EXIT;
	                    END_IF;
	                END_FOR;
	                #InOutCarrierExpect := #tmpPartHyperJam; //Gib gefundenes Teil aus
	            END_REGION
	        ELSIF #tmpPartJam.nBarcode <> 0 THEN //Gefundenes Teil aus Jambereich
	            REGION Teil aus Jam
	                IF #InOutCarrierExpect.nBarcode > 10000 THEN //Wenn erwarteter Carrier einen Barcode hat, füge ihn am Ende des Hyperjams ein
	                    "FC_TSHR_AddAtEnd"(stInTrolley := #InOutCarrierExpect,
	                                       nOutCounter => #nCounter,
	                                       xOutResult => #xResult,
	                                       arTSHR := "DB_HyperJam".stHyperJam.arCarrier);
	                    
	                    REGION Event log
	                        
	                        #arOutEventLogInfo[1].xTrigger := TRUE;
	                        #arOutEventLogInfo[1].nCorrectionType := 3;
	                        #arOutEventLogInfo[1].sBarcode := DINT_TO_STRING(#InOutCarrierExpect.nBarcode);
	                        #arOutEventLogInfo[1].sLoc := 'HyperJ';
	                        #arOutEventLogInfo[1].sPos := INT_TO_STRING(#nIdx1);
	                        #arOutEventLogInfo[1].sDest := INT_TO_STRING(#InOutCarrierExpect.nDestination);
	                        
	                    END_REGION
	                    
	                END_IF;
	                FOR #nIdx1 := 1 TO "cHyperJam" DO //Durchsuche Hyperjam nach Lücke
	                    IF NOT "DB_HyperJam".stHyperJam.arCarrier[#nIdx1].bStatus.%X0 THEN
	                        #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_HyperJam".stHyperJam.arCarrier,
	                                                        COUNT := INT_TO_UDINT("cHyperJam" - #nIdx1), //Wo die Lücke im Hyperjam entstanden ist, rücke Rest nach
	                                                        SRC_INDEX := #nIdx1,
	                                                        DEST_INDEX := #nIdx1 - 1,
	                                                        DEST => "DB_HyperJam".stHyperJam.arCarrier);
	                        "DB_HyperJam".stHyperJam.arCarrier["cHyperJam"] := #tmpEmpty; //lösche letztes Teil
	                        EXIT;
	                    END_IF;
	                END_FOR;
	                #InOutCarrierExpect := #tmpPartJam; //Gib gefundenes Teil aus
	            END_REGION
	        ELSE
	            //Teil bei Suche nicht gefunden, aber das erwartete soll trotzdem in den Hyperjam kommen und außerhalb des FC dann durch den gescannten ersetzt werden
	            IF #InOutCarrierExpect.nBarcode > 10000 THEN //Wenn erwarteter Carrier einen gültigen Barcode hat, füge ihn am Ende des Hyperjams ein
	                //Um im EmptyBuffer mit erfundenen Barcodes fahren zu können, werden hier einfach irgendwelche viestelligen Codes benutzt. Die sollen dann am
	                //Scanner nicht in den Hyperjam sondern einfach durch den echten ersetzt werden. Deswegen wird hier alles < 10.000 ignoriert
	                "FC_TSHR_AddAtEnd"(stInTrolley := #InOutCarrierExpect,
	                                   nOutCounter => #nCounter,
	                                   xOutResult => #xResult,
	                                   arTSHR := "DB_HyperJam".stHyperJam.arCarrier);
	                //Es gibt keine Lücke in der Liste die man schließen muss
	                REGION Event log
	                    
	                    #arOutEventLogInfo[1].xTrigger := TRUE;
	                    #arOutEventLogInfo[1].nCorrectionType := 3;
	                    #arOutEventLogInfo[1].sBarcode := DINT_TO_STRING(#InOutCarrierExpect.nBarcode);
	                    #arOutEventLogInfo[1].sLoc := 'HyperJ';
	                    #arOutEventLogInfo[1].sPos := INT_TO_STRING(#nIdx1);
	                    #arOutEventLogInfo[1].sDest := INT_TO_STRING(#InOutCarrierExpect.nDestination);
	                    
	                END_REGION
	                
	            END_IF;
	            
	            // #xOutNotFound := TRUE;
	            #InOutCarrierExpect.nDestination := 0;
	            #InOutCarrierExpect.nBarcode := #nInBarcodeScan; //Hier werden neue Carrier im System angelegt
	            #InOutCarrierExpect.bStatus.%X0 := TRUE;
	        END_IF;
	    END_REGION
	END_IF;
	
END_FUNCTION

