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
      xDest211 : Bool;   // Ziel befindet sich in erstem Viertel von B1
      xDest212 : Bool;   // Ziel befindet sich in zweitem Viertel von B1
      xDest213 : Bool;   // Ziel befindet sich in dritten Viertel von B1
      xDest214 : Bool;   // Ziel befindet sich in letztem Viertel von B1
      xDestB2 : Bool;   // Ziel allgemein Block2
      xDest221 : Bool;   // Ziel befindet sich in erstem Viertel von B2
      xDest222 : Bool;   // Ziel befindet sich in zweitem Viertel von B2
      xDest223 : Bool;   // Ziel befindet sich in dritten Viertel von B2
      xDest224 : Bool;   // Ziel befindet sich in letztem Viertel von B2
      xDestB3 : Bool;   // Ziel allgemein Block3
      xDest231 : Bool;   // Ziel befindet sich in erstem Viertel von B3
      xDest232 : Bool;   // Ziel befindet sich in zweitem Viertel von B3
      xDest233 : Bool;   // Ziel befindet sich in dritten Viertel von B3
      xDest234 : Bool;   // Ziel befindet sich in letztem Viertel von B3
   END_VAR


BEGIN
	
	//ÜBERARBEITEN, NEUE TRO NAMEN
	
	REGION Lager Aufteilung
	    IF #InOutCarrier.nDestination >= 21100 AND #InOutCarrier.nDestination <= 21119 THEN
	        #xDestB1 := TRUE;
	        #xDest211 := TRUE;
	    ELSIF #InOutCarrier.nDestination >= 21200 AND #InOutCarrier.nDestination <= 21217 THEN
	        #xDestB1 := TRUE;
	        #xDest212 := TRUE;
	    ELSIF #InOutCarrier.nDestination >= 21300 AND #InOutCarrier.nDestination <= 21321 THEN
	        #xDestB1 := TRUE;
	        #xDest213 := TRUE;
	    ELSIF #InOutCarrier.nDestination >= 21400 AND #InOutCarrier.nDestination <= 21413 THEN
	        #xDestB1 := TRUE;
	        #xDest214 := TRUE;
	        ////////////////////////////
	    ELSIF #InOutCarrier.nDestination >= 22100 AND #InOutCarrier.nDestination <= 22119 THEN
	        #xDestB2 := TRUE;
	        #xDest221 := TRUE;
	    ELSIF #InOutCarrier.nDestination >= 22200 AND #InOutCarrier.nDestination <= 22217 THEN
	        #xDestB2 := TRUE;
	        #xDest222 := TRUE;
	    ELSIF #InOutCarrier.nDestination >= 22300 AND #InOutCarrier.nDestination <= 22321 THEN
	        #xDestB2 := TRUE;
	        #xDest223 := TRUE;
	    ELSIF #InOutCarrier.nDestination >= 22400 AND #InOutCarrier.nDestination <= 22413 THEN
	        #xDestB2 := TRUE;
	        #xDest224 := TRUE;
	        ////////////////////////////
	    ELSIF #InOutCarrier.nDestination >= 23100 AND #InOutCarrier.nDestination <= 23119 THEN
	        #xDestB3 := TRUE;
	        #xDest231 := TRUE;
	    ELSIF #InOutCarrier.nDestination >= 23200 AND #InOutCarrier.nDestination <= 23217 THEN
	        #xDestB3 := TRUE;
	        #xDest232 := TRUE;
	    ELSIF #InOutCarrier.nDestination >= 23300 AND #InOutCarrier.nDestination <= 23321 THEN
	        #xDestB3 := TRUE;
	        #xDest233 := TRUE;
	    ELSIF #InOutCarrier.nDestination >= 23400 AND #InOutCarrier.nDestination <= 23415 THEN
	        #xDestB3 := TRUE;
	        #xDest234 := TRUE;
	    END_IF;
	END_REGION
	
	
	REGION Vergabe Direction
	    CASE #nInSwitchNo OF
	        "cSwi313.1":
	            REGION Switch 313.1
	                IF #xDestB1 OR
	                    #xDestB2 OR 
	                    #InOutCarrier.nDestination = "cDestLvl1B1" OR
	                    #InOutCarrier.nDestination = "cDestLvl1B2"
	                THEN
	                    //RECHTS ABBIEGEN
	                    #nOutDirection := 2;
	                ELSIF 
	                    #xDestB3 OR
	                    #InOutCarrier.nDestination = "cDestLvl1B3"
	                THEN
	                    //LINKS ABBIEGEN
	                    #nOutDirection := 1;
	                ELSE
	                    //FALLBACK
	                    #nOutDirection := 0; //nicht erlaubt
	                END_IF;
	            END_REGION
	        "cSwi314.1":
	            REGION Switch 314.1
	                IF #xDestB1 OR
	                    #InOutCarrier.nDestination = "cDestLvl1B1"
	                THEN
	                    //RECHTS ABBIEGEN
	                    #nOutDirection := 2;
	                ELSIF #xDestB2 OR 
	                    #InOutCarrier.nDestination = "cDestLvl1B2"
	                THEN
	                    //LINKS ABBIEGEN
	                    #nOutDirection := 1;
	                ELSE
	                    ;//30000, 0, 300, xDestB3
	                    #nOutDirection := 2;
	                END_IF;
	            END_REGION
	        "cSwi315.1":
	            REGION Switch 315.1
	                IF #xDestB1 THEN
	                    //LINKS ABBIEGEN
	                    #nOutDirection := 3;
	                ELSE
	                    ;//30000, 0, 200, 300, xDestB2, xDestB3
	                    #nOutDirection := 3;
	                END_IF;
	            END_REGION
	        "cSwi316.1":
	            REGION Switch 316.1
	                IF #InOutCarrier.nDestination = 300 OR
	                    #xDestB3 THEN
	                    ;//RECHTS ABBIEGEN
	                ELSE
	                    ;//30000, 0, 200, 300, xDestB1, xDestB2
	                END_IF;
	            END_REGION
	        "cSwi317.1":
	            REGION Switch 317.1
	                IF (#InOutCarrier.nDestination = "cDestLvl1B1") OR #InOutCarrier.nDestination = 11000 THEN
	                    #nOutDirection := 2;
	                ELSIF #xDestB1 THEN
	                    #nOutDirection := 1;
	                ELSE
	                    #nOutDirection := 0;
	                END_IF;
	            END_REGION
	        "cSwi318.1":
	            REGION Switch 318.1 
	                IF #xDest211 OR #xDest212 THEN 
	                    //RECHTS ABBIEGEN
	                    #nOutDirection := 2;
	                ELSIF #xDest213 OR #xDest214 THEN
	                    //LINKS ABBIEGEN
	                    #nOutDirection := 1;
	                ELSE
	                    #nOutDirection := 0; // undefined, todo
	                END_IF;
	            END_REGION
	        "cSwi319.1":
	            REGION Switch 319.1
	                IF #xDest212 OR
	                    #InOutCarrier.nDestination = 21043 OR 
	                    #InOutCarrier.nDestination = 1 OR //AMR
	                    #InOutCarrier.nDestination = 2  //F2H
	                THEN
	                    #nOutDirection := 2; // GERADE/RECHTS ABBIEGEN, Block verlassen
	                ELSIF #xDest211
	                THEN
	                    #nOutDirection := 1; //LINKS ABBIEGEN, im Block bleiben    
	                ELSE
	                    #nOutDirection := 1;
	                END_IF;
	            END_REGION
	        "cSwi320.1":
	            REGION Switch 320.1
	                IF #InOutCarrier.nDestination = 21043 OR #InOutCarrier.nDestination = 1 OR #InOutCarrier.nDestination = 2
	                THEN //provisorisch den Jam-Namen vom Ziel genommen, todo
	                    #nOutDirection := 2;
	                    ;//GERADE/RECHTS ABBIEGEN, Block verlassen zu Ausfahrt
	                ELSIF #xDest211 OR #xDest212 THEN //#xDestB1
	                    #nOutDirection := 1;
	                    ;//LINKS ABBIEGEN, im Block bleiben    
	                ELSE
	                    #nOutDirection := 1; // undefined, todo
	                END_IF;
	            END_REGION
	        "cSwi321.1":
	            REGION Switch 321.1
	                IF #xDest214 THEN 
	                    #nOutDirection := 2; ; //RECHTS ABBIEGEN, im Block bleiben
	                ELSIF #xDest213 OR 
	                    #InOutCarrier.nDestination = 21043 OR 
	                    #InOutCarrier.nDestination = 1 OR #InOutCarrier.nDestination = 2 OR #InOutCarrier.nDestination = 3 OR #InOutCarrier.nDestination = 4
	                THEN
	                    #nOutDirection := 1; //GERADE/LINKS ABBIEGEN    
	                ELSE
	                    #nOutDirection := 0; //undefined, todo
	                END_IF;
	            END_REGION
	        "cSwi322.1":
	            REGION Switch 322.1
	                IF #xDest213 OR #xDest214 THEN //#xDestB1
	                    #nOutDirection := 2; //RECHTS ABBIEGEN, im Block bleiben
	                ELSIF #InOutCarrier.nDestination = 21043 OR #InOutCarrier.nDestination = 1 OR #InOutCarrier.nDestination = 2 OR #InOutCarrier.nDestination = 3 OR #InOutCarrier.nDestination = 4 THEN
	                    #nOutDirection := 1; //GERADE/LINKS ABBIEGEN, Block verlassen zu Ausfahrt    
	                ELSE
	                    #nOutDirection := 0; //undefined, todo
	                END_IF;
	            END_REGION
	        "cSwi339.1":
	            REGION Switch 339.1
	                IF #InOutCarrier.nDestination = "cDestLvl1B2" THEN
	                    #nOutDirection := 2;
	                    //TO LEVEL 1
	                    //RECHTS ABBIEGEN
	                ELSIF #xDestB2 THEN
	                    //TO SECTION 2.2
	                    //LINKS ABBIEGEN
	                    #nOutDirection := 1;
	                ELSE
	                    //Undefined
	                    #nOutDirection := 0;
	                END_IF;
	            END_REGION
	        "cSwi340.1":
	            REGION Switch 340.1
	                IF #xDest221 OR #xDest222 THEN
	                    //RECHTS ABBIEGEN
	                    #nOutDirection := 2;
	                ELSIF #xDest223 OR #xDest224 THEN
	                    //LINKS ABBIEGEN
	                    #nOutDirection := 1;
	                ELSE
	                    #nOutDirection := 0; // undefined, todo
	                END_IF;
	            END_REGION
	        "cSwi341.1":
	            REGION Switch 341.1
	                IF #xDest222 OR
	                    #InOutCarrier.nDestination = 1 OR
	                    #InOutCarrier.nDestination = 2
	                THEN
	                    #nOutDirection := 2; // GERADE/RECHTS ABBIEGEN, Block verlassen
	                ELSIF #xDest221
	                THEN
	                    #nOutDirection := 1; //LINKS ABBIEGEN, im Block bleiben    
	                ELSE
	                    #nOutDirection := 1;
	                END_IF;
	            END_REGION
	        "cSwi342.1":
	            REGION Switch 342.1 
	                IF #InOutCarrier.nDestination = 1 OR
	                    #InOutCarrier.nDestination = 2
	                THEN
	                    #nOutDirection := 2; //GERADE/RECHTS ABBIEGEN, Block verlassen zu Ausfahrt
	                ELSIF #xDest221 OR #xDest222 THEN //#xDestB1
	                    #nOutDirection := 1;
	                    ;//LINKS ABBIEGEN, im Block bleiben    
	                ELSE
	                    #nOutDirection := 1; 
	                END_IF;
	            END_REGION
	        "cSwi343.1":
	            REGION Switch 343.1
	                IF #xDest224 THEN
	                    #nOutDirection := 2;
	                    ; //RECHTS ABBIEGEN, im Block bleiben
	                ELSIF #xDest223 OR
	                    #InOutCarrier.nDestination = 22043 OR
	                    #InOutCarrier.nDestination = 1 OR
	                    #InOutCarrier.nDestination = 2 
	                THEN
	                    #nOutDirection := 1; //GERADE/LINKS ABBIEGEN    
	                ELSE
	                    #nOutDirection := 2; //undefined, todo
	                END_IF;
	            END_REGION
	            
	        "cSwi344.1":
	            REGION switch 344.1
	                IF #xDest223 OR #xDest224 THEN //#xDestB1
	                    #nOutDirection := 2; //RECHTS ABBIEGEN, im Block bleiben
	                ELSIF #InOutCarrier.nDestination = 22043 OR
	                    #InOutCarrier.nDestination = 1 OR
	                    #InOutCarrier.nDestination = 2
	                THEN
	                    #nOutDirection := 1; //GERADE/LINKS ABBIEGEN, Block verlassen zu Ausfahrt    
	                ELSE
	                    #nOutDirection := 2; //undefined, todo
	                END_IF;
	            END_REGION
	            
	        "cSwi361.1":
	            REGION Switch 361.1
	                IF #InOutCarrier.nDestination = "cDestLvl1B3" THEN // Level 1.3
	                    #nOutDirection := 1;
	                ELSIF #xDestB3 THEN
	                    #nOutDirection := 2;
	                ELSE
	                    #nOutDirection := 0;
	                END_IF;
	            END_REGION
	            
	        "cSwi362.1":
	            REGION Switch 362.1
	                IF #xDest231 OR #xDest232 THEN
	                    //LINKS ABBIEGEN
	                    #nOutDirection := 1;
	                ELSIF #xDest233 OR #xDest234 THEN
	                    //LINKS ABBIEGEN
	                    #nOutDirection := 2;
	                ELSE
	                    #nOutDirection := 0; // undefined, todo
	                END_IF;
	            END_REGION
	
	            
	        "cSwi363.1":
	            REGION Switch 363.1
	                IF #xDest232 OR
	                    #InOutCarrier.nDestination = 23023 OR
	                    #InOutCarrier.nDestination = "cDestF2HEmpty" OR
	                    #InOutCarrier.nDestination = "cDestInboundEmpty" OR
	                    #InOutCarrier.nDestination = "cDestAMRLoaded" OR
	                    #InOutCarrier.nDestination = "cDestF2HLoaded"
	                THEN
	                    #nOutDirection := 1; // Block verlassen
	                ELSIF #xDest231
	                THEN
	                    #nOutDirection := 2; //im Block bleiben    
	                ELSE
	                    #nOutDirection := 2;
	                END_IF;
	            END_REGION
	        "cSwi364.1":
	            REGION Switch 364.1
	                IF #InOutCarrier.nDestination = 23023 OR
	                    #InOutCarrier.nDestination = 2 OR
	                    #InOutCarrier.nDestination = "cDestF2HEmpty" OR
	                    #InOutCarrier.nDestination = "cDestInboundEmpty" OR
	                    #InOutCarrier.nDestination = "cDestAMRLoaded" OR
	                    #InOutCarrier.nDestination = "cDestF2HLoaded"
	                THEN //provisorisch den Jam-Namen vom Ziel genommen, todo
	                    #nOutDirection := 1;
	                    ;//Block verlassen zu Ausfahrt
	                ELSIF #xDest231 OR #xDest232 THEN
	                    #nOutDirection := 2;
	                    ;//LINKS ABBIEGEN, im Block bleiben    
	                ELSE
	                    #nOutDirection := 2; // undefined, todo
	                END_IF;
	            END_REGION
	            
	        "cSwi365.1":
	            REGION Switch 365.1 
	                IF #InOutCarrier.nDestination = 23023 OR #xDest233 OR 
	                    #InOutCarrier.nDestination = "cDestF2HEmpty" OR
	                    #InOutCarrier.nDestination = "cDestInboundEmpty" OR
	                    #InOutCarrier.nDestination = "cDestAMRLoaded" OR
	                    #InOutCarrier.nDestination = "cDestF2HLoaded"
	                THEN //provisorisch den Jam-Namen vom Ziel genommen, todo
	                    #nOutDirection := 2 
	                    ;//GERADE/RECHTS ABBIEGEN, Block verlassen zu Ausfahrt
	                ELSIF #xDest234 THEN
	                    #nOutDirection := 1;
	                    ;//LINKS ABBIEGEN, im Block bleiben    
	                ELSE
	                    #nOutDirection := 1; // undefined, todo
	                END_IF;
	            END_REGION
	            
	        "cSwi366.1":
	            REGION Switch 366.1 
	                IF #InOutCarrier.nDestination = 23023 OR
	                    #InOutCarrier.nDestination = 1 OR
	                    #InOutCarrier.nDestination = 2 OR 
	                    #InOutCarrier.nDestination = "cDestF2HEmpty" OR
	                    #InOutCarrier.nDestination = "cDestInboundEmpty" OR
	                    #InOutCarrier.nDestination = "cDestAMRLoaded" OR
	                    #InOutCarrier.nDestination = "cDestF2HLoaded"
	                THEN //provisorisch den Jam-Namen vom Ziel genommen, todo
	                    #nOutDirection := 2;
	                    ;//GERADE/RECHTS ABBIEGEN, Block verlassen zu Ausfahrt
	                ELSIF #xDest233 OR #xDest234 THEN
	                    #nOutDirection := 1;
	                    ;//LINKS ABBIEGEN, im Block bleiben    
	                ELSE
	                    #nOutDirection := 1; // undefined, todo
	                END_IF;
	            END_REGION
	        ELSE
	            ;
	    END_CASE;
	END_REGION
	
	
	
	
	
END_FUNCTION

