FUNCTION "VPtoEP_Ziel_FC" : Void
TITLE = Ziel-FC: VP>EP
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : AE
FAMILY : Module
NAME : Ziel
//SCL-Portierung des AWL-Bausteins FC2181 "VPtoEP_Ziel_FC" (verhaltensgleich).
//
//Der Baustein hatte im AWL-Original die Bausteineigenschaft "Parameterversorgung
//ueber Register" (ParameterPassing) aktiv und wurde per "UC FC[..]" indirekt aus
//AWL aufgerufen -> aus SCL nicht compilierbar. Er liest ausschliesslich globale
//Merker (MW190 = Schleusen-Nr, vom Aufrufer gesetzt) sowie Sensor-/Schleusen-DBs
//und gibt globale Merker aus (MW198 = Weichenziel, M180.6 = Weiterfahrt-Freigabe)
//-> keine echte Registerabhaengigkeit. Als SCL-Baustein entfaellt die Option und
//er ist direkt aus SCL aufrufbar (CASE 2181 in MHMOmniSchleuse).
//
//Der indirekte Dispatch (AWL: je Netzwerk "L MW190 / L <Schleuse> / NE_I / JC <Ende>")
//ist als CASE ueber die Schleusen-Nr (MW190) ausgefuehrt. Da die Schleusen-Nrn
//paarweise verschieden sind, kann pro Aufruf hoechstens ein Zweig zutreffen; ein
//AWL-BEU im getroffenen Zweig ist daher als Ende des CASE-Zweiges umgesetzt und ein
//AWL-BEC als "IF <RLO> THEN RETURN;" (verhaltensgleich, da nach dem Dispatch nur
//noch das Bausteinende folgt).
//
//ABWEICHUNGEN ZUM AWL-ORIGINAL (bei Inbetriebnahme pruefen!):
//  - MW190 wird fuer den CASE ueber WORD_TO_INT in Int gewandelt (AWL: NE_I gegen
//    dezimale Int-Konstante). Word-Merker (MW198) wird mit Word-Konstanten
//    (W#16#..) direkt versorgt (AWL: L 16#.. / T MW198).
//  - Schleuse 4443 (NW5): ShopGroup-Vergleich gegen TypedConstant DINT#-1 wird 1:1
//    als DINT#-1 uebernommen.
//  - Schleuse 4443 (NW5): Verzweigung "Abzweig fahren" (JC A4443) vs. "Rest gerade
//    fahren" (JU G4443) ist als IF/ELSE ausgefuehrt. Bedingung fuer Abzweig =
//    (Trolley_ShopGroup = DINT#-1) UND NICHT Sack_BG4444 erkannt.
//  - Globale DB-/Merker-Namen sind gequotet; keiner der hier verwendeten Namen
//    enthaelt Sonderzeichen.
//  - Alle VAR_TEMP-Member der AWL-Schnittstelle sind deklariert, werden aber im
//    Code nicht verwendet (kein uninitialisierter Temp-Zugriff im Baustein).
   VAR_TEMP
      Ziel_hex : Word;
      Ziel_int : Int;
      Zielebene : Word;
      Error : Byte;
      Position : Int;
      Lager_DB : Int;
      Lager_DW : Int;
      AR1Zeiger : DWord;   // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
      AR1Start : DInt;   // Startwert mit Offset 0
      SSDW : Int;
      EndZiel : Word;
      Variante : Int;
      AbrufID : DInt;
      Fahrlisten_TrolleyID : DInt;
      Fahrlisten_AbrufID : DInt;
      Fahrlisten_Lager : Int;
      Trolley_unbekannt : Bool;   // Trolley ist nicht in DL
      Express_Abruf : Bool;
   END_VAR

BEGIN
   // NW1 (Rueckmeldung): Rueckmeldungen erst mal resetten
   "M180.6" := FALSE;   // Weiterfahrt von Ziel-FC erlaubt

   // AWL: UC FC2181 dispatcht ueber MW190 (Schleusen-Nr, vom Aufrufer gesetzt)
   CASE WORD_TO_INT("MW190") OF

      3361:   // Bereich 3361: Weiterfahren erlaubt ? (Ende MA0060)
         IF NOT "DVPtoEP_Sensoren".Stau_BG3362.Stat.B_Akt THEN
            "M180.6" := TRUE;   // Weiterfahrt ist erlaubt
         END_IF;

      3366:   // Schleuse 3366: (BST 1)
         // AWL: SET / S M180.6 -> Weiterfahrt bedingungslos erlaubt
         "M180.6" := TRUE;   // Weiterfahrt ist erlaubt

      4441:   // Bereich 4441: Weiterfahren erlaubt ? (Ende MA0320)
         IF NOT "DVPtoEP_Sensoren".Stau_BG4442.Stat.B_Akt THEN
            "M180.6" := TRUE;   // Weiterfahrt ist erlaubt
         END_IF;

      4443:   // Schleuse 4443: (Vor ByPass zurück zu LP)
         // Ziel-Check:
         IF ("DVPtoEP_OmniFahren".Schleuse_4443.Dyn.Trolley_ShopGroup = DINT#-1)   // leerer Trolley ?
            AND NOT "DVPtoEP_Sensoren".Sack_BG4444.Stat.B_Akt THEN   // Kein Sack erkannt
            // A4443: Abzweig fahren
            "MW198" := W#16#4461;   // Weichenziel
            // Quell-Steuerung:
            IF ("DEPtoLP_OmniFahren".Schleuse_4466.Dyn.Raus_Trolleys > 0)   // Trolleys zur Weiche MB4210 unterwegs?
               OR "DEPtoLP_OmniFahren".Schleuse_4466.Dyn.Status.Reset_aktiv
               OR "MB4466" THEN   // Andere Quelle aktiv
               RETURN;
            END_IF;
            IF NOT "DEPtoLP_Sensoren".Stau_BG4461.Stat.B_Akt THEN
               "M180.6" := TRUE;   // Weiterfahrt ist erlaubt
            END_IF;
         ELSE
            // G4443: Rest Gerade fahren
            "MW198" := W#16#4447;   // Weichenziel
            IF NOT "DVPtoEP_Sensoren".Stau_BG4447.Stat.B_Akt THEN
               "M180.6" := TRUE;   // Weiterfahrt ist erlaubt
            END_IF;
         END_IF;

      ELSE
         ;   // unbekannte Schleusen-Nr -> nichts tun
   END_CASE;
END_FUNCTION
