FUNCTION "FC_Direction" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      nInSwitchNo : USInt;
   END_VAR

   VAR_OUTPUT 
      nOutDirection : USInt;
   END_VAR

   VAR_IN_OUT 
      InOutCarrier : "stCarrier";
   END_VAR

   VAR_TEMP 
      xDestB1 : Bool;   // Ziel allgemein Block1
      xDest111 : Bool;   // Ziel befindet sich in erstem Viertel von B1
      xDest112 : Bool;   // Ziel befindet sich in zweitem Viertel von B1
      xDest113 : Bool;   // Ziel befindet sich in dritten Viertel von B1
      xDest114 : Bool;   // Ziel befindet sich in letztem Viertel von B1
      xDestB2 : Bool;   // Ziel allgemein Block2
      xDest121 : Bool;   // Ziel befindet sich in erstem Viertel von B2
      xDest122 : Bool;   // Ziel befindet sich in zweitem Viertel von B2
      xDest123 : Bool;   // Ziel befindet sich in dritten Viertel von B2
      xDest124 : Bool;   // Ziel befindet sich in letztem Viertel von B2
      xDestB3 : Bool;   // Ziel allgemein Block3
      xDest131 : Bool;   // Ziel befindet sich in erstem Viertel von B3
      xDest132 : Bool;   // Ziel befindet sich in zweitem Viertel von B3
      xDest133 : Bool;   // Ziel befindet sich in dritten Viertel von B3
      xDest134 : Bool;   // Ziel befindet sich in letztem Viertel von B3
   END_VAR


BEGIN
	// TODO: Konstanten für Destinations verwenden
	
	REGION Lager Aufteilung
	    IF #InOutCarrier.nDestination >= 11100 AND #InOutCarrier.nDestination <= 11119 THEN
	        #xDestB1 := TRUE;
	        #xDest111 := TRUE;
	    ELSIF #InOutCarrier.nDestination >= 11200 AND #InOutCarrier.nDestination <= 11217 THEN
	        #xDestB1 := TRUE;
	        #xDest112 := TRUE;
	    ELSIF #InOutCarrier.nDestination >= 11300 AND #InOutCarrier.nDestination <= 11321 THEN
	        #xDestB1 := TRUE;
	        #xDest113 := TRUE;
	    ELSIF #InOutCarrier.nDestination >= 11400 AND #InOutCarrier.nDestination <= 11413 THEN
	        #xDestB1 := TRUE;
	        #xDest114 := TRUE;
	        ////////////////////////////
	    ELSIF #InOutCarrier.nDestination >= 12100 AND #InOutCarrier.nDestination <= 12119 THEN
	        #xDestB2 := TRUE;
	        #xDest121 := TRUE;
	    ELSIF #InOutCarrier.nDestination >= 12200 AND #InOutCarrier.nDestination <= 12217 THEN
	        #xDestB2 := TRUE;
	        #xDest122 := TRUE;
	    ELSIF #InOutCarrier.nDestination >= 12300 AND #InOutCarrier.nDestination <= 12321 THEN
	        #xDestB2 := TRUE;
	        #xDest123 := TRUE;
	    ELSIF #InOutCarrier.nDestination >= 12400 AND #InOutCarrier.nDestination <= 12413 THEN
	        #xDestB2 := TRUE;
	        #xDest124 := TRUE;
	        ////////////////////////////
	    ELSIF #InOutCarrier.nDestination >= 13100 AND #InOutCarrier.nDestination <= 13119 THEN
	        #xDestB3 := TRUE;
	        #xDest131 := TRUE;
	    ELSIF #InOutCarrier.nDestination >= 13200 AND #InOutCarrier.nDestination <= 13217 THEN
	        #xDestB3 := TRUE;
	        #xDest132 := TRUE;
	    ELSIF #InOutCarrier.nDestination >= 13300 AND #InOutCarrier.nDestination <= 13321 THEN
	        #xDestB3 := TRUE;
	        #xDest133 := TRUE;
	    ELSIF #InOutCarrier.nDestination >= 13400 AND #InOutCarrier.nDestination <= 13415 THEN
	        #xDestB3 := TRUE;
	        #xDest134 := TRUE;
	    END_IF;
	END_REGION
	
	
	REGION Vergabe Direction
	    CASE #nInSwitchNo OF
	            
	        "cSwi202.1":
	            REGION Switch 202.1 ***Pinbänder Block1***
	                IF #xDest111 OR #xDest112 THEN
	                    //RECHTS ABBIEGEN
	                    #nOutDirection := 2;
	                ELSIF #xDest113 OR #xDest114 THEN
	                    //LINKS ABBIEGEN
	                    #nOutDirection := 1;
	                ELSE
	                    #nOutDirection := 0; // undefined, todo
	                END_IF;
	            END_REGION
	        "cSwi203.1":
	            REGION Switch 203.1
	                IF #xDest112 OR
	                    #InOutCarrier.nDestination = "cDestAMRLoaded" OR 
	                    #InOutCarrier.nDestination = "cDestInboundEmpty" OR 
	                    #InOutCarrier.nDestination = "cDestF2HLoaded" OR
	                    #InOutCarrier.nDestination = "cDestF2HEmpty"
	                THEN
	                    #nOutDirection := 2; // GERADE/RECHTS ABBIEGEN, Block verlassen
	                ELSIF #xDest111
	                THEN
	                    #nOutDirection := 1; //LINKS ABBIEGEN, im Block bleiben    
	                ELSE
	                    #nOutDirection := 0;
	                END_IF;
	            END_REGION
	        "cSwi204.1":
	            REGION Switch 204.1
	                IF #InOutCarrier.nDestination = 11043 OR 
	                    #InOutCarrier.nDestination = "cDestAMRLoaded" OR
	                    #InOutCarrier.nDestination = "cDestInboundEmpty" OR
	                    #InOutCarrier.nDestination = "cDestF2HLoaded" OR
	                    #InOutCarrier.nDestination = "cDestF2HEmpty"
	                THEN
	                    #nOutDirection := 2;
	                    //GERADE/RECHTS ABBIEGEN, Block verlassen zu Ausfahrt
	                ELSIF #xDest111 OR #xDest112 THEN //#xDestB1
	                    #nOutDirection := 1;
	                    //LINKS ABBIEGEN, im Block bleiben    
	                ELSE
	                    #nOutDirection := 0; // undefined, todo
	                END_IF;
	            END_REGION
	        "cSwi205.1":
	            REGION Switch 205.1
	                IF #xDest114 THEN
	                    #nOutDirection := 2;
	                    ; //RECHTS ABBIEGEN, im Block bleiben
	                ELSIF #xDest113 OR
	                    #InOutCarrier.nDestination = "cDestAMRLoaded" OR
	                    #InOutCarrier.nDestination = "cDestInboundEmpty" OR
	                    #InOutCarrier.nDestination = "cDestF2HLoaded" OR
	                    #InOutCarrier.nDestination = "cDestF2HEmpty"
	                THEN
	                    #nOutDirection := 1; //GERADE/LINKS ABBIEGEN    
	                ELSE
	                    #nOutDirection := 2; //undefined, todo
	                END_IF;
	            END_REGION
	        "cSwi206.1":
	            REGION Switch 206.1
	                IF #xDest113 OR #xDest114 THEN //#xDestB1
	                    #nOutDirection := 2; //RECHTS ABBIEGEN, im Block bleiben
	                ELSIF
	                    #InOutCarrier.nDestination = "cDestAMRLoaded" OR
	                    #InOutCarrier.nDestination = "cDestInboundEmpty" OR
	                    #InOutCarrier.nDestination = "cDestF2HLoaded" OR
	                    #InOutCarrier.nDestination = "cDestF2HEmpty"
	                THEN
	                    #nOutDirection := 1; //GERADE/LINKS ABBIEGEN, Block verlassen zu Ausfahrt    
	                ELSE
	                    #nOutDirection := 2; //undefined, todo
	                END_IF;
	            END_REGION
	            
	        "cSwi222.1":
	            REGION Switch 222.1 ***Pinbänder Block2***
	                IF #xDest121 OR #xDest122 THEN
	                    //RECHTS ABBIEGEN
	                    #nOutDirection := 2;
	                ELSIF #xDest123 OR #xDest124 THEN
	                    //LINKS ABBIEGEN
	                    #nOutDirection := 1;
	                ELSE
	                    #nOutDirection := 0; // undefined, todo
	                END_IF;
	            END_REGION
	        "cSwi223.1":
	            REGION Switch 223.1
	                IF #xDest122 OR
	                    #InOutCarrier.nDestination = "cDestAMRLoaded" OR
	                    #InOutCarrier.nDestination = "cDestInboundEmpty" OR
	                    #InOutCarrier.nDestination = "cDestF2HLoaded" OR
	                    #InOutCarrier.nDestination = "cDestF2HEmpty"
	                THEN
	                    #nOutDirection := 2; // GERADE/RECHTS ABBIEGEN, Block verlassen
	                ELSIF #xDest121
	                THEN
	                    #nOutDirection := 1; //LINKS ABBIEGEN, im Block bleiben    
	                ELSE
	                    #nOutDirection := 1;
	                END_IF;
	            END_REGION
	        "cSwi224.1":
	            REGION Switch 224.1
	                IF  #InOutCarrier.nDestination = "cDestAMRLoaded" OR
	                    #InOutCarrier.nDestination = "cDestInboundEmpty" OR
	                    #InOutCarrier.nDestination = "cDestF2HLoaded" OR
	                    #InOutCarrier.nDestination = "cDestF2HEmpty"
	                THEN 
	                    #nOutDirection := 2;
	                    ;//GERADE/RECHTS ABBIEGEN, Block verlassen zu Ausfahrt
	                ELSIF #xDest121 OR #xDest122 THEN //#xDestB1
	                    #nOutDirection := 1;
	                    ;//LINKS ABBIEGEN, im Block bleiben    
	                ELSE
	                    #nOutDirection := 1; // undefined, todo
	                END_IF;
	            END_REGION
	        "cSwi225.1":
	            REGION Switch 225.1
	                IF #xDest124 THEN
	                    #nOutDirection := 2;
	                    ; //RECHTS ABBIEGEN, im Block bleiben
	                ELSIF #xDest113 OR
	                    #InOutCarrier.nDestination = "cDestAMRLoaded" OR
	                    #InOutCarrier.nDestination = "cDestInboundEmpty" OR
	                    #InOutCarrier.nDestination = "cDestF2HLoaded" OR
	                    #InOutCarrier.nDestination = "cDestF2HEmpty"
	                THEN
	                    #nOutDirection := 1; //GERADE/LINKS ABBIEGEN    
	                ELSE
	                    #nOutDirection := 2; //undefined, todo
	                END_IF;
	            END_REGION
	        "cSwi226.1":
	            REGION Switch 226.1
	                IF #xDest123 OR #xDest124 THEN //#xDestB1
	                    #nOutDirection := 2; //RECHTS ABBIEGEN, im Block bleiben
	                ELSIF #InOutCarrier.nDestination = "cDestAMRLoaded" OR
	                    #InOutCarrier.nDestination = "cDestInboundEmpty" OR
	                    #InOutCarrier.nDestination = "cDestF2HLoaded" OR
	                    #InOutCarrier.nDestination = "cDestF2HEmpty"
	                THEN
	                    #nOutDirection := 1; //GERADE/LINKS ABBIEGEN, Block verlassen zu Ausfahrt    
	                ELSE
	                    #nOutDirection := 2; //undefined, todo
	                END_IF;
	            END_REGION
	            
	        "cSwi242.1":
	            REGION Switch 242.1 ***Pinbänder Block3***
	                IF #xDest131 OR #xDest132 THEN
	                    //LINKS ABBIEGEN
	                    #nOutDirection := 1;
	                ELSIF #xDest133 OR #xDest134 THEN
	                    //RECHTS ABBIEGEN
	                    #nOutDirection := 2;
	                ELSE
	                    #nOutDirection := 0; // undefined, todo
	                END_IF;
	            END_REGION
	        "cSwi243.1":
	            REGION Switch 243.1
	                IF #xDest132 OR 
	                    #InOutCarrier.nDestination = "cDestAMRLoaded" OR
	                    #InOutCarrier.nDestination = "cDestInboundEmpty" OR
	                    #InOutCarrier.nDestination = "cDestF2HLoaded" OR
	                    #InOutCarrier.nDestination = "cDestF2HEmpty"
	                THEN
	                    #nOutDirection := 1; //GERADE/LINKS ABBIEGEN, Block verlassen
	                ELSIF #xDest131
	                THEN
	                    #nOutDirection := 2; //RECHTS ABBIEGEN, im Block bleiben    
	                ELSE
	                    #nOutDirection := 2;
	                END_IF;
	            END_REGION
	            
	        "cSwi244.1":
	            REGION Switch 244.1
	                IF  #InOutCarrier.nDestination = "cDestAMRLoaded" OR
	                    #InOutCarrier.nDestination = "cDestInboundEmpty" OR
	                    #InOutCarrier.nDestination = "cDestF2HLoaded" OR
	                    #InOutCarrier.nDestination = "cDestF2HEmpty"
	                THEN
	                    #nOutDirection := 1; //GERADE/LINKS ABBIEGEN, Block verlassen zu Ausfahrt
	                ELSIF #xDest131 OR #xDest132 THEN //#xDestB1
	                    #nOutDirection := 2; //RECHTS ABBIEGEN, im Block bleiben    
	                ELSE
	                    #nOutDirection := 2; // undefined, todo
	                END_IF;
	            END_REGION
	        "cSwi245.1":
	            REGION Switch 245.1
	                IF #xDest134 THEN
	                    #nOutDirection := 1; //LINKS ABBIEGEN, im Block bleiben
	                ELSIF #xDest133 OR
	                    #InOutCarrier.nDestination = "cDestAMRLoaded" OR
	                    #InOutCarrier.nDestination = "cDestInboundEmpty" OR
	                    #InOutCarrier.nDestination = "cDestF2HLoaded" OR
	                    #InOutCarrier.nDestination = "cDestF2HEmpty"
	                THEN
	                    #nOutDirection := 2; //GERADE/RECHTS ABBIEGEN    
	                ELSE
	                    #nOutDirection := 1; //undefined, todo
	                END_IF;
	            END_REGION
	        "cSwi246.1":
	            REGION Switch 246.1
	                IF #xDest133 OR #xDest134 THEN 
	                    #nOutDirection := 1; //LINKS ABBIEGEN, im Block bleiben
	                ELSIF #InOutCarrier.nDestination = "cDestAMRLoaded" OR
	                    #InOutCarrier.nDestination = "cDestInboundEmpty" OR
	                    #InOutCarrier.nDestination = "cDestF2HLoaded" OR
	                    #InOutCarrier.nDestination = "cDestF2HEmpty"
	                THEN
	                    #nOutDirection := 2; //GERADE/RECHTS ABBIEGEN, Block verlassen zu Ausfahrt    
	                ELSE
	                    #nOutDirection := 1; //undefined, todo
	                END_IF;
	            END_REGION
	        "cSwi267.1":
	            REGION Switch 267.1
	                IF #InOutCarrier.nDestination = "cDestF2HLoaded" THEN
	                    #nOutDirection := 1;  
	                ELSIF #InOutCarrier.nDestination = "cDestF2HEmpty" THEN
	                    #nOutDirection := 2;
	                ELSIF #InOutCarrier.nDestination = "cDestAMRLoaded" OR
	                    #InOutCarrier.nDestination = "cDestInboundEmpty"
	                THEN
	                    #nOutDirection := 3;
	                ELSE
	                    #nOutDirection := 3;
	                END_IF;
	            END_REGION
	            
	        "cSwi268.1":
	            REGION Switch 268.1
	                IF #InOutCarrier.nDestination = "cDestInboundEmpty" THEN
	                    #nOutDirection := 1; 
	                ELSIF (#InOutCarrier.nDestination = "cDestAMRLoaded") THEN
	                    #nOutDirection := 2;
	                ELSE
	                    #nOutDirection := 3;
	                END_IF;
	            END_REGION
	            
	        ELSE
	            ;
	    END_CASE;
	END_REGION
	
	
	
	
	
END_FUNCTION

