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;   // Scanner-Nummer für Unterscheidungen
   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;
      i : 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 #i := 1 TO "cHyperJam" DO
	            IF "DB_HyperJam".stHyperJam.arCarrier[#i].nBarcode = #nInBarcodeScan THEN //Merke gefundenes Teil und lösche ursprüngliches
	                #tmpPartHyperJam := "DB_HyperJam".stHyperJam.arCarrier[#i];
	                "DB_HyperJam".stHyperJam.arCarrier[#i] := #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(#i);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartHyperJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    REGION Jam Area 4000_1
	        FOR #i := 1 TO "cJam4000_1" DO
	            IF "DB_JamArea4000".stJam4000_1.arCarrier[#i].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea4000".stJam4000_1.arCarrier[#i];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea4000".stJam4000_1.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam4000_1" - #i), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #i,
	                                                DEST_INDEX := #i - 1,
	                                                DEST => "DB_JamArea4000".stJam4000_1.arCarrier);
	                "DB_JamArea4000".stJam4000_1.arCarrier["cJam4000_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 := 'JamPin';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#i);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    REGION Jam Area 4001_1
	        FOR #i := 1 TO "cJam4001_1" DO
	            IF "DB_JamArea4001".stJam4001_1.arCarrier[#i].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea4001".stJam4001_1.arCarrier[#i];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea4001".stJam4001_1.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam4001_1" - #i), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #i,
	                                                DEST_INDEX := #i - 1,
	                                                DEST => "DB_JamArea4001".stJam4001_1.arCarrier);
	                "DB_JamArea4001".stJam4001_1.arCarrier["cJam4001_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 := 'JamPin';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#i);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    REGION Jam Area 4001_2
	        FOR #i := 1 TO "cJam4001_2" DO
	            IF "DB_JamArea4001".stJam4001_2.arCarrier[#i].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea4001".stJam4001_2.arCarrier[#i];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea4001".stJam4001_2.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam4001_2" - #i), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #i,
	                                                DEST_INDEX := #i - 1,
	                                                DEST => "DB_JamArea4001".stJam4001_2.arCarrier);
	                "DB_JamArea4001".stJam4001_2.arCarrier["cJam4001_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 := 'JamPin';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#i);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    REGION Jam Area 4002_1
	        FOR #i := 1 TO "cJam4002_1" DO
	            IF "DB_JamArea4002".stJam4002_1.arCarrier[#i].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea4002".stJam4002_1.arCarrier[#i];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea4002".stJam4002_1.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam4002_1" - #i), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #i,
	                                                DEST_INDEX := #i - 1,
	                                                DEST => "DB_JamArea4002".stJam4002_1.arCarrier);
	                "DB_JamArea4002".stJam4002_1.arCarrier["cJam4002_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 := 'JamPin';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#i);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    REGION Jam Area 4002_2
	        FOR #i := 1 TO "cJam4002_2" DO
	            IF "DB_JamArea4002".stJam4002_2.arCarrier[#i].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea4002".stJam4002_2.arCarrier[#i];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea4002".stJam4002_2.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam4002_2" - #i), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #i,
	                                                DEST_INDEX := #i - 1,
	                                                DEST => "DB_JamArea4002".stJam4002_2.arCarrier);
	                "DB_JamArea4002".stJam4002_2.arCarrier["cJam4002_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 := 'JamPin';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#i);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    
	    REGION Jam Area 4003_1
	        FOR #i := 1 TO "cJam4003_1" DO
	            IF "DB_JamArea4003".stJam4003_1.arCarrier[#i].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea4003".stJam4003_1.arCarrier[#i];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea4003".stJam4003_1.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam4003_1" - #i), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #i,
	                                                DEST_INDEX := #i - 1,
	                                                DEST => "DB_JamArea4003".stJam4003_1.arCarrier);
	                "DB_JamArea4003".stJam4003_1.arCarrier["cJam4003_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 := 'JamPin';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#i);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    REGION Jam Area 4003_2
	        FOR #i := 1 TO "cJam4003_2" DO
	            IF "DB_JamArea4003".stJam4003_2.arCarrier[#i].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea4003".stJam4003_2.arCarrier[#i];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea4003".stJam4003_2.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam4003_2" - #i), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #i,
	                                                DEST_INDEX := #i - 1,
	                                                DEST => "DB_JamArea4003".stJam4003_2.arCarrier);
	                "DB_JamArea4003".stJam4003_2.arCarrier["cJam4003_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 := 'JamPin';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#i);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    REGION Jam Area 4003_3
	        FOR #i := 1 TO "cJam4003_3" DO
	            IF "DB_JamArea4003".stJam4003_3.arCarrier[#i].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea4003".stJam4003_3.arCarrier[#i];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea4003".stJam4003_3.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam4003_3" - #i), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #i,
	                                                DEST_INDEX := #i - 1,
	                                                DEST => "DB_JamArea4003".stJam4003_3.arCarrier);
	                "DB_JamArea4003".stJam4003_3.arCarrier["cJam4003_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 := 'JamPin';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#i);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    REGION Jam Area 4003_4
	        FOR #i := 1 TO "cJam4003_4" DO
	            IF "DB_JamArea4003".stJam4003_4.arCarrier[#i].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea4003".stJam4003_4.arCarrier[#i];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea4003".stJam4003_4.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam4003_4" - #i), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #i,
	                                                DEST_INDEX := #i - 1,
	                                                DEST => "DB_JamArea4003".stJam4003_4.arCarrier);
	                "DB_JamArea4003".stJam4003_4.arCarrier["cJam4003_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 := 'JamPin';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#i);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    REGION Jam Area 4003_5
	        FOR #i := 1 TO "cJam4003_5" DO
	            IF "DB_JamArea4003".stJam4003_5.arCarrier[#i].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea4003".stJam4003_5.arCarrier[#i];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea4003".stJam4003_5.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam4003_5" - #i), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #i,
	                                                DEST_INDEX := #i - 1,
	                                                DEST => "DB_JamArea4003".stJam4003_5.arCarrier);
	                "DB_JamArea4003".stJam4003_5.arCarrier["cJam4003_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 := 'JamPin';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#i);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    REGION Jam Area 4003_6
	        FOR #i := 1 TO "cJam4003_6" DO
	            IF "DB_JamArea4003".stJam4003_6.arCarrier[#i].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea4003".stJam4003_6.arCarrier[#i];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea4003".stJam4003_6.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam4003_6" - #i), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #i,
	                                                DEST_INDEX := #i - 1,
	                                                DEST => "DB_JamArea4003".stJam4003_6.arCarrier);
	                "DB_JamArea4003".stJam4003_6.arCarrier["cJam4003_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 := 'JamPin';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#i);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    REGION Jam Area 4003_7
	        FOR #i := 1 TO "cJam4003_7" DO
	            IF "DB_JamArea4003".stJam4003_7.arCarrier[#i].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea4003".stJam4003_7.arCarrier[#i];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea4003".stJam4003_7.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam4003_7" - #i), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #i,
	                                                DEST_INDEX := #i - 1,
	                                                DEST => "DB_JamArea4003".stJam4003_7.arCarrier);
	                "DB_JamArea4003".stJam4003_7.arCarrier["cJam4003_7"] := #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 := 'JamPin';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#i);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    
	    REGION Jam Area 4004_1
	        FOR #i := 1 TO "cJam4004_1" DO
	            IF "DB_JamArea4004".stJam4004_1.arCarrier[#i].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea4004".stJam4004_1.arCarrier[#i];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea4004".stJam4004_1.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam4004_1" - #i), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #i,
	                                                DEST_INDEX := #i - 1,
	                                                DEST => "DB_JamArea4004".stJam4004_1.arCarrier);
	                "DB_JamArea4004".stJam4004_1.arCarrier["cJam4004_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 := 'JamPin';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#i);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    
	    REGION Jam Area 4005_1
	        FOR #i := 1 TO "cJam4005_1" DO
	            IF "DB_JamArea4005".stJam4005_1.arCarrier[#i].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea4005".stJam4005_1.arCarrier[#i];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea4005".stJam4005_1.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam4005_1" - #i), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #i,
	                                                DEST_INDEX := #i - 1,
	                                                DEST => "DB_JamArea4005".stJam4005_1.arCarrier);
	                "DB_JamArea4005".stJam4005_1.arCarrier["cJam4005_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 := 'JamPin';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#i);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    
	    REGION Jam Area 4006_1
	        FOR #i := 1 TO "cJam4006_1" DO
	            IF "DB_JamArea4006".stJam4006_1.arCarrier[#i].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea4006".stJam4006_1.arCarrier[#i];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea4006".stJam4006_1.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam4006_1" - #i), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #i,
	                                                DEST_INDEX := #i - 1,
	                                                DEST => "DB_JamArea4006".stJam4006_1.arCarrier);
	                "DB_JamArea4006".stJam4006_1.arCarrier["cJam4006_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 := 'JamPin';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#i);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    
	    REGION Jam Area 4007_1
	        FOR #i := 1 TO "cJam4007_1" DO
	            IF "DB_JamArea4007".stJam4007_1.arCarrier[#i].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea4007".stJam4007_1.arCarrier[#i];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea4007".stJam4007_1.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam4007_1" - #i), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #i,
	                                                DEST_INDEX := #i - 1,
	                                                DEST => "DB_JamArea4007".stJam4007_1.arCarrier);
	                "DB_JamArea4007".stJam4007_1.arCarrier["cJam4007_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 := 'JamPin';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#i);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    
	    REGION Jam Area 4008_1
	        FOR #i := 1 TO "cJam4008_1" DO
	            IF "DB_JamArea4008".stJam4008_1.arCarrier[#i].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea4008".stJam4008_1.arCarrier[#i];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea4008".stJam4008_1.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam4008_1" - #i), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #i,
	                                                DEST_INDEX := #i - 1,
	                                                DEST => "DB_JamArea4008".stJam4008_1.arCarrier);
	                "DB_JamArea4008".stJam4008_1.arCarrier["cJam4008_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 := 'JamPin';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#i);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    
	    REGION Jam Area 4009_1
	        FOR #i := 1 TO "cJam4009_1" DO
	            IF "DB_JamArea4009".stJam4009_1.arCarrier[#i].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea4009".stJam4009_1.arCarrier[#i];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea4009".stJam4009_1.arCarrier,
	           COUNT := INT_TO_UDINT("cJam4009_1" - #i), //lösche Teil und rücke Rest nach
	           SRC_INDEX := #i,
	           DEST_INDEX := #i - 1,
	           DEST => "DB_JamArea4009".stJam4009_1.arCarrier);
	                "DB_JamArea4009".stJam4009_1.arCarrier["cJam4009_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 := 'JamPin';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#i);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    
	    REGION Jam Area 4010_1
	        FOR #i := 1 TO "cJam4010_1" DO
	            IF "DB_JamArea4010".stJam4010_1.arCarrier[#i].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea4010".stJam4010_1.arCarrier[#i];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea4010".stJam4010_1.arCarrier,
	                                                COUNT := INT_TO_UDINT("cJam4010_1" - #i), //lösche Teil und rücke Rest nach
	                                                SRC_INDEX := #i,
	                                                DEST_INDEX := #i - 1,
	                                                DEST => "DB_JamArea4010".stJam4010_1.arCarrier);
	                "DB_JamArea4010".stJam4010_1.arCarrier["cJam4010_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 := 'JamPin';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#i);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    REGION Jam Area 4010_2
	        FOR #i := 1 TO "cJam4010_2" DO
	            IF "DB_JamArea4010".stJam4010_2.arCarrier[#i].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea4010".stJam4010_2.arCarrier[#i];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea4010".stJam4010_2.arCarrier,
	           COUNT := INT_TO_UDINT("cJam4010_2" - #i), //lösche Teil und rücke Rest nach
	           SRC_INDEX := #i,
	           DEST_INDEX := #i - 1,
	           DEST => "DB_JamArea4010".stJam4010_2.arCarrier);
	                "DB_JamArea4010".stJam4010_2.arCarrier["cJam4010_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 := 'JamPin';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#i);
	                    #arOutEventLogInfo[0].sDest := INT_TO_STRING(#tmpPartJam.nDestination);
	                END_REGION
	                GOTO END;
	            END_IF;
	        END_FOR;
	    END_REGION
	    
	    REGION Jam Area 4011_1
	        FOR #i := 1 TO "cJam4011_1" DO
	            IF "DB_JamArea4011".stJam4011_1.arCarrier[#i].nBarcode = #nInBarcodeScan (* AND #InOutCarrierExpect.nBarcode = 0 *)THEN
	                #tmpPartJam := "DB_JamArea4011".stJam4011_1.arCarrier[#i];
	                #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_JamArea4011".stJam4011_1.arCarrier,
	           COUNT := INT_TO_UDINT("cJam4011_1" - #i), //lösche Teil und rücke Rest nach
	           SRC_INDEX := #i,
	           DEST_INDEX := #i - 1,
	           DEST => "DB_JamArea4011".stJam4011_1.arCarrier);
	                "DB_JamArea4011".stJam4011_1.arCarrier["cJam4011_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 := 'JamPin';
	                    #arOutEventLogInfo[0].sPos := INT_TO_STRING(#i);
	                    #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(#i);
	                        #arOutEventLogInfo[1].sDest := INT_TO_STRING(#InOutCarrierExpect.nDestination);
	                        
	                    END_REGION
	                    
	                END_IF;
	                FOR #i := 1 TO "cHyperJam" DO //Durchsuche Hyperjam nach Lücke
	                    IF NOT "DB_HyperJam".stHyperJam.arCarrier[#i].bStatus.%X0 THEN
	                        #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_HyperJam".stHyperJam.arCarrier,
	                                                        COUNT := INT_TO_UDINT("cHyperJam" - #i), //Wo die Lücke im Hyperjam entstanden ist, rücke Rest nach
	                                                        SRC_INDEX := #i,
	                                                        DEST_INDEX := #i - 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(#i);
	                        #arOutEventLogInfo[1].sDest := INT_TO_STRING(#InOutCarrierExpect.nDestination);
	                        
	                    END_REGION
	                    
	                END_IF;
	                FOR #i := 1 TO "cHyperJam" DO //Durchsuche Hyperjam nach Lücke
	                    IF NOT "DB_HyperJam".stHyperJam.arCarrier[#i].bStatus.%X0 THEN
	                        #tempStatus := MOVE_BLK_VARIANT(SRC := "DB_HyperJam".stHyperJam.arCarrier,
	                                                        COUNT := INT_TO_UDINT("cHyperJam" - #i), //Wo die Lücke im Hyperjam entstanden ist, rücke Rest nach
	                                                        SRC_INDEX := #i,
	                                                        DEST_INDEX := #i - 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
	                "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(#i);
	                    #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

