FUNCTION "EPtoLP_Ziel_FC" : Void
TITLE = Ziel-FC: EP>LP_OmniFahren
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : AE
FAMILY : Module
NAME : Ziel
//SCL-Portierung des AWL-Bausteins FC4181 "EPtoLP_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/DBs (MW190 = Schleusen-Nr vom Aufrufer, MB-/BG-Merker, Weichen-DBs) und
//gibt den globalen Merker M180.6 (Weiterfahrt-Freigabe) aus -> keine echte
//Registerabhaengigkeit. Als SCL-Baustein entfaellt die Option und er ist direkt aus
//SCL aufrufbar (CASE 4181 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 Zweig-Ende (RETURN nach Bausteinende)
//umgesetzt, 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!):
//  - Dispatch: AWL "L MW190 / L <n> / NE_I / JC <Ende>" -> CASE WORD_TO_INT("MW190")
//    mit dezimalen Int-Labels (4465, 4466). MW190 (Word) wird fuer den CASE nach Int
//    gewandelt (AWL: NE_I gegen dezimale Int-Konstante).
//  - Schleuse 4465 (NW2): AWL "SET / S M180.6 / BEU" -> bedingungslos M180.6 := TRUE.
//  - Schleuse 4466 (NW3): AWL-BEC ("Warten!") -> "IF <RLO> THEN RETURN;". Der Word-
//    Vergleich EQ_I gegen die Word-Konstante 16#4461 ist als direkter Word-Vergleich
//    (= W#16#4461) uebersetzt.
//  - "MB4445"/"MB4457" (im AWL als O/AN-Bitoperanden verwendet) werden - wie in der
//    Vorlage - als Bool-Symbole behandelt. Falls es sich real um Byte-Merker handelt,
//    Bitbreite bei Inbetriebnahme pruefen.
//  - DB-/Member-Namen mit Sonderzeichen sind einzeln gequotet (hier keine vorhanden).
//  - Die VAR_TEMP-Member aus dem XML-Interface sind 1:1 uebernommen, werden in diesem
//    Baustein jedoch nicht gelesen/geschrieben (keine uninitialisierten Zugriffe).
   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 (Reset)

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

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

      4466:   // Schleuse 4466: (Vor Einfahrt ByPass)
         // Quell-Steuerung:
         IF ("DVPtoEP_OmniFahren".Weiche_4445.Dyn.Weichen_Ziel = W#16#4461)   // Fahren Trolleys zu BG4461?
            OR "MB4445"   // Weiche ist auf Abzweig
            OR "DVPtoEP_OmniFahren".Weiche_4445.Dyn.Status.Reset_aktiv THEN
            RETURN;   // Warten !
         END_IF;
         IF     NOT "MB4445"   // Weiche Einfahrt ByPass
            AND NOT "MB4457"
            AND NOT "DEPtoLP_Sensoren".Stau_BG4461.Stat.B_Akt THEN
            "M180.6" := TRUE;   // Weiterfahrt ist erlaubt
         END_IF;

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