FUNCTION "FC_Route" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      xInSingle : Bool;   // true = einzelner Carrier wird losgeschickt, false = Array
      xInSeparate : Bool;   // Carrier und Ladung trennen
      xInSepEdge : Bool;   // Flanke vom Separator
      xInSensor : Bool;   // Sensor Eingang falls dieser verwendet wird
      xInDelay : Bool;   // true = Car werden auf den Weg geschickt bis Sensor kommt
      stInCarrier : "stCarrier";   // Einzelner Carrier für den Eingang
   END_VAR

   VAR_OUTPUT 
      stOutBookingInfo : "stEventBookingInfo";   // Infos für Logging
   END_VAR

   VAR_IN_OUT 
      arJamEntr : Array[*] of "stCarrier";   // Jam am Eingang (Platzhalter verwenden falls kein Jam vorhanden)
      arOnTheWay : Array[*] of "stCarrier";   // Carrier die für die Travel-Time unterwegs sind
      arJamExit : Array[*] of "stCarrier";   // Jam am Ausgang (Platzhalter verwenden falls kein Jam vorhanden)
   END_VAR

   VAR_TEMP 
      stCarrier : "stCarrier";   // Merker vom Eingang
      stLoadOnly : "stCarrier";   // Nur Ladung am Ende
      stCarrierOnly : "stCarrier";
      nCounter1 : DInt;   // Temp für TSHR
      nCounter2 : DInt;   // Temp für TSHR
      xResult1 : Bool;   // Temp für TSHR
      xResult2 : Bool;   // Temp für TSHR
   END_VAR


BEGIN
	REGION Abfrage ob Singlecarrier oder Array
	    IF #xInSingle THEN
	        #stCarrier := #stInCarrier; //falls kein Array vorhanden, wird hier ein einzlener Carrier verwendet
	    ELSE
	        #stCarrier := #arJamEntr[1]; //erster Carrier des Eingangs-Staubereichs
	    END_IF;
	END_REGION
	REGION Weiterbuchen
	    IF NOT #xInDelay THEN //Shift zum Ziel-Bereich sofort
	        IF #xInSepEdge AND NOT #xInSeparate THEN
	            REGION Carrier normal weiterschieben
	                "FC_TSHR_AddAtEnd"(stInTrolley := #stCarrier,
	                                   nOutCounter => #nCounter1,
	                                   xOutResult => #xResult1,
	                                   arTSHR := #arJamExit);
	                
	                "FC_TSHR_Shift"(xInShiftBack := TRUE,
	                                arTSHR := #arJamEntr);
	                
	                REGION Event Log
	                    // Info rausgeben an Log-Baustein
	                    #stOutBookingInfo.sBarcode := DELETE(IN := DINT_TO_STRING(#stCarrier.nBarcode), L := 1, P := 1);
	                    #stOutBookingInfo.sDest := DELETE(IN := INT_TO_STRING(#stCarrier.nDestination), L := 1, P := 1);
	                    // #stOutBookingInfo.sJobNo := DELETE(IN := DINT_TO_STRING(#stCarrier.stLoadData.nJobNo), L := 1, P := 1);
	                    // #stOutBookingInfo.sProductNo := DELETE(IN := DINT_TO_STRING(#stCarrier.stLoadData.nProductNo), L := 1, P := 1);
	                    
	                END_REGION
	                
	                
	            END_REGION
	        ELSIF #xInSepEdge AND #xInSeparate THEN
	            REGION Carrier/Ladung getrennt weiterschieben
	                
	                #stCarrierOnly := #stCarrier;
	                #stCarrierOnly.bStatus.%X1 := FALSE;
	                #stLoadOnly := #stCarrier;
	                
	                REGION Carrier
	                    
	                    "FC_TSHR_AddAtEnd"(stInTrolley := #stCarrierOnly,
	                                       nOutCounter => #nCounter1,
	                                       xOutResult => #xResult1,
	                                       arTSHR := #arJamExit);
	                    
	                END_REGION
	                
	                REGION Ladung
	                    "FC_TSHR_AddAtEnd"(stInTrolley := #stLoadOnly,
	                                       nOutCounter => #nCounter1,
	                                       xOutResult => #xResult1,
	                                       arTSHR := #arOnTheWay);
	                    
	                END_REGION
	                
	                "FC_TSHR_Shift"(xInShiftBack := TRUE,
	                                arTSHR := #arJamEntr);
	                
	                REGION Event Log
	                    // Info rausgeben an Log-Baustein
	                    #stOutBookingInfo.sBarcode := DELETE(IN := DINT_TO_STRING(#stCarrier.nBarcode), L := 1, P := 1);
	                    #stOutBookingInfo.sDest := DELETE(IN := INT_TO_STRING(#stCarrier.nDestination), L := 1, P := 1);
	                END_REGION
	                
	            END_REGION
	        END_IF;
	    ELSE  //Shift zum Ziel-Bereich über Verzögerung
	        IF #xInSepEdge THEN
	            REGION Carrier auf den Weg schieben
	                "FC_TSHR_AddAtEnd"(stInTrolley := #stCarrier,
	                                   nOutCounter => #nCounter1,
	                                   xOutResult => #xResult1,
	                                   arTSHR := #arOnTheWay);
	                
	                "FC_TSHR_Shift"(xInShiftBack := TRUE,
	                                arTSHR := #arJamEntr);
	            END_REGION
	            
	            REGION Event Log
	                // Info rausgeben an Log-Baustein
	                #stOutBookingInfo.sBarcode := DELETE(IN := DINT_TO_STRING(#stCarrier.nBarcode), L := 1, P := 1);
	                #stOutBookingInfo.sDest := DELETE(IN := INT_TO_STRING(#stCarrier.nDestination), L := 1, P := 1);
	            END_REGION
	            
	        END_IF;
	        IF #xInSensor THEN
	            REGION Carrier unterwegs wird durch Sensor quittiert
	                "FC_TSHR_AddAtEnd"(stInTrolley := #arOnTheWay[1],
	                                   nOutCounter => #nCounter2,
	                                   xOutResult => #xResult2,
	                                   arTSHR := #arJamExit);
	                
	                "FC_TSHR_Shift"(xInShiftBack := TRUE,
	                                arTSHR := #arOnTheWay);
	            END_REGION
	            
	            REGION Event Log
	                // Info rausgeben an Log-Baustein
	                #stOutBookingInfo.sBarcode := DELETE(IN := DINT_TO_STRING(#stCarrier.nBarcode), L := 1, P := 1);
	                #stOutBookingInfo.sDest := DELETE(IN := INT_TO_STRING(#stCarrier.nDestination), L := 1, P := 1);
	            END_REGION
	            
	        END_IF;
	    END_IF;
	END_REGION
END_FUNCTION

