FUNCTION "LPtoHW_Ziel_FC" : Void
TITLE = Ziel-FC: LP>HW
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : AE
FAMILY : Module
NAME : Ziel
//SCL-Portierung des AWL-Bausteins FC6181 "LPtoHW_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, MW194 = angefordertes Weichen-Ziel, MB-/BG-Merker)
//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 6181 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/BEC im getroffenen Zweig ist daher als RETURN bzw. "IF <RLO> THEN RETURN;"
//umgesetzt (verhaltensgleich, da nach dem Dispatch nur noch das Bausteinende folgt).
//Die Merker-Schnittstelle (MW190 vom Aufrufer gelesen, MW198 = Weichenziel
//ausgegeben, M180.6 = Weiterfahrt-Freigabe) bleibt erhalten.
//
//ABWEICHUNGEN ZUM AWL-ORIGINAL (bei Inbetriebnahme pruefen!):
//  - Schleuse 4221 (NW4): das AWL prueft "Vollpuffer" ueber den DB-Wort-Wert
//    "DLPtoHW_OmniFahren".Schleuse_4221.Dyn.Trolley_EndZiel = W#16#B000 (EQ_I) und
//    routet danach ueber MW198 (Abzweig W#16#4211 / Gerade W#16#4224). Die
//    AWL-Sprungfolge "JC A4221 / JC G4221 / JU G4221" ist als IF/ELSE umgesetzt:
//    das zweite "JC G4221" ist im AWL wirkungslos (RLO=0 nach nicht genommenem
//    JC A4221) -> beide Nicht-Abzweig-Pfade fuehren nach G4221 (Gerade). Das
//    "BEC" (Quell-Steuerung) ist als "IF <RLO> THEN RETURN; END_IF;" umgesetzt.
//  - Vergleiche: Wort-DB-Wert gegen Wort-Konstante als direkte Gleichheit (AWL EQ_I),
//    Int-DB-Wert (Raus_Trolleys) mit "> 0" (AWL GT_I gegen 0). MW190 wird fuer den
//    CASE ueber WORD_TO_INT in Int gewandelt (AWL: NE_I gegen dezimale Konstante).
//  - Word-Transfers "L 16#.. / T MW198" sind als "MW198" := W#16#..; umgesetzt.
//  - DB-Namen sind als Symbol gequotet (z.B. "DLeerPufferStrecken"); Member-Pfade
//    aus den Symbol-Components.
//  - Der Baustein ruft KEINE Fremd-FCs auf (reine Merker-/DB-Auswertung).
//  - Die VAR_TEMP-Member aus der AWL-Schnittstelle sind 1:1 uebernommen, werden in
//    diesem Baustein aber nicht verwendet -> keine uninitialisierten Temp-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 (Weiterfahrt von Ziel-FC erlaubt)
   "M180.6" := FALSE;

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

      3342:   // Schleuse 3342: Weiterfahren erlaubt ? (Vor Trolley-Beladung)
         // AWL: SET / S M180.6 -> Weiterfahrt bedingungslos erlaubt
         "M180.6" := TRUE;

      3323:   // Schleuse 3323: Weiterfahren erlaubt ? (Trolley-Beladung)
         // Umschalten auf Durchfahr-Modus:
         IF "DLeerPufferStrecken".DurchfahrModus.Anmelden
            AND NOT "DLPtoHW_Sensoren".Sack_BG3324.Stat.B_Akt THEN   // Noch kein Sack behängt
            "DLeerPufferStrecken".DurchfahrModus.Anmelden := FALSE;
            "DLeerPufferStrecken".DurchfahrModus.Aktiv := TRUE;
         END_IF;

         // Trolley-Err-Anzeige (blau):
         "PF0033" := "BG3323"   // Trolley ist in Schleuse
            AND ( ("DLeerPufferStrecken".DurchfahrModus.Aktiv
                     AND "DLPtoHW_Sensoren".Sack_BG3324.Stat.B_Akt)   // Aber Sack behängt
                  OR (NOT "DLeerPufferStrecken".DurchfahrModus.Aktiv
                     AND NOT "DLPtoHW_Sensoren".Sack_BG3324.Stat.B_Akt) );   // Noch kein Sack behängt

         // Trolley kann gestartet werden:
         "PF0044" := "BG3323"   // Trolley ist in Schleuse
            AND NOT "DLeerPufferStrecken".DurchfahrModus.Aktiv
            AND "DLPtoHW_Sensoren".Sack_BG3324.Stat.B_Akt   // Sack behängt
            AND "Clock_2Hz";

         // Bestätigung durch Bediener:
         IF "BG3323"   // Trolley ist in Schleuse
            AND ( ("SF0044"   // Bestätigung mit Taster
                     AND NOT "DLeerPufferStrecken".DurchfahrModus.Aktiv
                     AND "DLPtoHW_Sensoren".Sack_BG3324.Stat.B_Akt)   // Sack behängt
                  // Durchfahr-Modus aktiv:
                  OR ("DLeerPufferStrecken".DurchfahrModus.Aktiv
                     AND NOT "DLPtoHW_Sensoren".Sack_BG3324.Stat.B_Akt) ) THEN   // Aber Sack behängt
            "M180.6" := TRUE;   // Weiterfahrt ist erlaubt
         END_IF;

      4221:   // Schleuse 4221: (Vor ByPass zum VP)
         // Ziel-Check:
         IF ("DLPtoHW_OmniFahren".Schleuse_4221.Dyn.Trolley_EndZiel = W#16#B000)   // Vollpuffer ?
            AND NOT "DLPtoHW_Sensoren".Sack_BG4222.Stat.B_Akt THEN   // Kein Sack erkannt
            // A4221: Abzweig fahren
            "MW198" := W#16#4211;   // Weichenziel
            // Quell-Steuerung:
            IF ("DHWtoVP_OmniFahren".Schleuse_4207.Dyn.Raus_Trolleys > 0)   // Trolleys zur Weiche MB4210 unterwegs?
               OR "DHWtoVP_OmniFahren".Schleuse_4207.Dyn.Status.Reset_aktiv
               OR "MB4207" THEN   // Andere Quelle aktiv
               RETURN;
            END_IF;
            IF NOT "DHWtoVP_Sensoren".Stau_BG4210.Stat.B_Akt
               AND NOT "DHWtoVP_Sensoren".Stau_BG4211.Stat.B_Akt THEN
               "M180.6" := TRUE;   // Weiterfahrt ist erlaubt
            END_IF;
         ELSE
            // G4221: Gerade fahren (Rest Gerade fahren)
            "MW198" := W#16#4224;   // Weichenziel
            IF NOT "DLPtoHW_Sensoren".Stau_BG4224.Stat.B_Akt THEN
               "M180.6" := TRUE;   // Weiterfahrt ist erlaubt
            END_IF;
         END_IF;

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

      3722:   // Schleuse 3722: Übergabe an UH06/AMR
         // AWL: SET / S M180.6 -> Weiterfahrt bedingungslos erlaubt
         "M180.6" := TRUE;

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