FUNCTION "LPtoHW_Draussen_FC" : Void
TITLE = Draussen-FC: LP>HW
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : AE
FAMILY : Module
NAME : Draussen
//SCL-Portierung des AWL-Bausteins FC6182 "LPtoHW_Draussen_FC" (verhaltensgleich).
//
//Der Baustein hatte im AWL-Original die Bausteineigenschaft "Parameterversorgung
//ueber Register" (ParameterPassing) aktiv und konnte daher nur per UC/CC aus AWL
//aufgerufen werden. Da der Baustein ausschliesslich den globalen Merker MW190
//(Schleusen-Nr) liest und die Zielbausteine voll qualifiziert aufruft, gibt es
//keine echte Registerabhaengigkeit -> die Option entfaellt bei der SCL-Fassung,
//der Baustein ist damit direkt aus SCL aufrufbar (CASE 6182 in MHMOmniSchleuse).
//
//Der indirekte Dispatch (AWL: je Netzwerk "L MW190 / L <Schleuse> / NE_I / JC")
//ist als CASE ueber die Schleusen-Nr ausgefuehrt. Die Merker-Schnittstelle
//(MW190 vom Aufrufer gesetzt) bleibt erhalten.
//
//ABWEICHUNGEN ZUM AWL-ORIGINAL (bei Inbetriebnahme pruefen!):
//  - Der Vergleich "Weichen_Ziel EQ_I 16#4224" (Schleuse 4221) war im AWL ein
//    Int-Vergleich auf einem Word-Operanden; hier als direkte Word-Gleichheit
//    (= W#16#4224) uebernommen. Bitmuster identisch -> Verhalten gleich.
//  - Das AWL-Interface enthaelt keine Temp-Variablen -> kein VAR_TEMP.

BEGIN
   // NW1 Rückmeldung: Rückmeldungen erst mal resetten
   "M180.6" := FALSE;   // Weiterfahrt von Ziel-FC erlaubt

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

      3323:   // Schleuse 3323 (Trolley-Beladung): Ausgefahren?
         // Evtl. erkannten Sack löschen:
         "DLPtoHW_Sensoren".Sack_BG3324.Stat.B_Akt := FALSE;

         // Trolleydaten ändern:
         IF "DLeerPufferStrecken".DurchfahrModus.Aktiv THEN
            // Leer-Trolley für VP-Daten:
            "Trolleydaten_neu_anlegen"(
               Gesamt_Trolley_DL := 1000,
               TrolleyID         := "DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse,
               Endziel           := W#16#B000,   // Vollpuffer
               ShopGroup         := DINT#-1);    // ShopGroup = -1 bei Leertrolly für Vollpuffer!
            // Standort übermitteln:
            "Trolley_DL_Neue_Pos"(
               Gesamt_Trolley_DL := 1000,
               TrolleyID         := "DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse,
               Position          := W#16#7108,   // Leser 7108
               ShopGroup         := DINT#0,
               Err               => "M199.0");

            "DLeerPufferStrecken".DurchfahrModus.RestTrolleys := "DLeerPufferStrecken".DurchfahrModus.RestTrolleys - 1;
            // Noch Rest-Trolleys vorhanden?
            IF "DLeerPufferStrecken".DurchfahrModus.RestTrolleys > 0 THEN
               RETURN;   // Ja! -> beenden (AWL BEC)
            END_IF;

            "DLeerPufferStrecken".DurchfahrModus.Aktiv := FALSE;   // Erst mal beenden
            // AWL BEU -> Bausteinende
         ELSE
            // SackTrolley: Sack-Trolleydaten erzeugen
            "Trolleydaten_neu_anlegen"(
               Gesamt_Trolley_DL := 1000,
               TrolleyID         := "DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse,
               Endziel           := W#16#AAAA,   // AMR-Bereich
               ShopGroup         := DINT#0);
            // Standort übermitteln:
            "Trolley_DL_Neue_Pos"(
               Gesamt_Trolley_DL := 1000,
               TrolleyID         := "DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse,
               Position          := W#16#7108,   // Leser 7108
               ShopGroup         := DINT#0,
               Err               => "M199.0");

            // Umschalten auf Durchfahr-Modus:
            IF "DLeerPufferStrecken".DurchfahrModus.Anmelden THEN
               "DLeerPufferStrecken".DurchfahrModus.Anmelden := FALSE;
               "DLeerPufferStrecken".DurchfahrModus.Aktiv := TRUE;
            END_IF;
            // AWL BEU -> Bausteinende
         END_IF;

      4221:   // Schleuse 4221 (Vor ByPass zum VP): Ausgefahren?
         // Evtl. erkannten Sack löschen:
         "DLPtoHW_Sensoren".Sack_BG4222.Stat.B_Akt := FALSE;

         // Gerade? Also zum AMR-Bereich?
         IF "DLPtoHW_OmniFahren".Schleuse_4221.Dyn.Weichen_Ziel = W#16#4224 THEN
            // Trolley fährt zum AMR:
            // Trolleydaten in DB1000 löschen, da zum AMR fährt und danach kein Leser mehr!
            "Trolleydaten_löschen"(
               Gesamt_Trolley_DL := 1000,
               TrolleyID         := "DLPtoHW_OmniFahren".Schleuse_4221.Dyn.TrolleyID_Schleuse);
            // AWL BEU -> Bausteinende
         ELSE
            // Trolley fährt zu VP:
            // Bei Partner (Schleuse 4207) wieder mit Schritt 0 beginnen (erneuter Ziel-FC-Aufruf)
            "DHWtoVP_OmniFahren".Schleuse_4207.Dyn.Sk.Akt_Schritt := 0;
         END_IF;

      ELSE
         ;   // unbekannte Schleusen-Nr -> nichts tun
   END_CASE;
   // NW4 Ende (AWL BE)
END_FUNCTION
