FUNCTION "FC_PutToHj" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      xInLocked : Bool;
   END_VAR

   VAR_IN_OUT 
      arInOutJam : Array[*] of "stCarrier";
      xInOutStart : Bool;
      nInOutPos : Int;
   END_VAR

   VAR_TEMP 
      tmpEmptyCarr : "stCarrier";
      nCounter : DInt;
      nArrayMax : Int;
      nIdx : Int;
      nStatus : Int;
      xResult : Bool;
   END_VAR


BEGIN
	(*
	!!! PRÜFEN OB DAS ALLES NOCH SO PASST! ÜBERNOMMEN VON MUBEA!!!
	- Andere Jam Struktur (z.B. bStatus)
	- HyperJam
	
	FC fügt Teil in Staubereich an gewünschter Stelle dem Hyperjam hinzu und rückt den Rest nach
	*)
	
	#nArrayMax := DINT_TO_INT(UPPER_BOUND(ARR := #arInOutJam, DIM := 1));
	
	REGION Returnbedingung
	    IF #nInOutPos < 1 OR #nInOutPos > #nArrayMax OR NOT #arInOutJam[1].bStatus.%X0 OR NOT #xInLocked THEN
	        //Wenn Positionsangabe zu klein oder zu groß ist, oder in Jam ist gar kein Carrier online, dann beende
	        #nInOutPos := 1;
	        #xInOutStart := FALSE;
	        RETURN;
	    END_IF;
	END_REGION
	
	REGION Funktion ausführen
	    IF #xInOutStart THEN
	        IF #arInOutJam[#nInOutPos].nBarcode > 2 THEN
	            REGION normale Barcodes
	                //Füge Carrier am Ende des Hyperjams ein nur wenn nicht Dummy oder BadRead, also nur bei normalem Code
	                "FC_TSHR_AddAtEnd"(stInTrolley := #arInOutJam[#nInOutPos],
	                                   nOutCounter => #nCounter,
	                                   xOutResult => #xResult,
	                                   arTSHR := "DB_HyperJam".stHyperJam.arCarrier);
	                //lösche den ausgewählten
	                #arInOutJam[#nInOutPos] := #tmpEmptyCarr;
	                IF #nInOutPos < #nArrayMax THEN
	                    //Rücke danach auf um Lücke zu beseitigen aber nur wenn es nicht die letzte Stelle war
	                    #nStatus := MOVE_BLK_VARIANT(SRC := #arInOutJam,
	                                                 COUNT := INT_TO_UDINT(#nArrayMax - #nInOutPos),
	                                                 SRC_INDEX := #nInOutPos,
	                                                 DEST_INDEX := #nInOutPos - 1,
	                                                 DEST => #arInOutJam);
	                    //letztes löschen damit dort nichts doppeltes drinsteht
	                    #arInOutJam[#nArrayMax] := #tmpEmptyCarr;
	                END_IF;
	                //fertig, setze Startbefehl zurück und Position auf Default
	                #nInOutPos := 1;
	                #xInOutStart := FALSE;
	            END_REGION
	        ELSE
	            REGION Dummy oder unbekannt
	                //Falls doch Dummy oder unbekannter Barcode, lösche nur
	                #arInOutJam[#nInOutPos] := #tmpEmptyCarr;
	                IF #nInOutPos < #nArrayMax THEN
	                    //Rücke danach auf um Lücke zu beseitigen aber nur wenn es nicht die letzte Stelle war
	                    #nStatus := MOVE_BLK_VARIANT(SRC := #arInOutJam,
	                                                 COUNT := INT_TO_UDINT(#nArrayMax - #nInOutPos),
	                                                 SRC_INDEX := #nInOutPos,
	                                                 DEST_INDEX := #nInOutPos - 1,
	                                                 DEST => #arInOutJam);
	                    //letztes löschen damit dort nichts doppeltes drinsteht
	                    #arInOutJam[#nArrayMax] := #tmpEmptyCarr;
	                END_IF;
	                //fertig, setze Startbefehl zurück und Position auf Default
	                #nInOutPos := 1;
	                #xInOutStart := FALSE;
	            END_REGION
	        END_IF;
	    END_IF;
	END_REGION
	
END_FUNCTION

