FUNCTION "HWtoVP_Draussen" : Void
TITLE = Draussen-FC: HW > VP
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : AE
FAMILY : Module
NAME : Draussen
//SCL-Portierung des AWL-Bausteins FC182 "HWtoVP_Draussen" (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 globale Merker (MW190 =
//Schleusen-Nr, MD182 = ShopGroup, M180.6) 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 182 in MHMOmniSchleuse).
//
//Der indirekte Dispatch (AWL: je Netzwerk "L MW190 / L <Schleuse> / NE_I / JC")
//ist als CASE ueber die Schleusen-Nr ausgefuehrt. BEC/BEU je Zweig = nach dem
//CASE folgt nur noch das Bausteinende; BEC (bedingtes Bausteinende) ist als
//RETURN, das leere Netzwerkende als Fallthrough des CASE abgebildet. Die
//Merker-Schnittstelle (MW190/MD182/M180.6 vom Aufrufer) bleibt erhalten.
//
//ABWEICHUNGEN ZUM AWL-ORIGINAL (bei Inbetriebnahme pruefen!):
//  - NW3: "L MD182 / L DINT#-1 / EQ_D" ist als DWORD_TO_DINT("MD182") = DINT#-1
//    ausgefuehrt (bit-genau verhaltensgleich zu EQ_D; MD182 ist ein DWORD-Merker
//    und wird andernorts via DINT_TO_DWORD beschrieben).
//  - NW3: "L Weichen_Ziel / BTI / T Puffer_LinienNr" (BCD-Wort -> Int) ist ueber
//    den Projekt-FC "BCD (4stellig)_to_INT" ausgefuehrt. Ergebnis identisch;
//    das Fehlerverhalten bei ungueltiger BCD kann abweichen (BTI setzt BIE).
//  - NW2: EQ_I-Vergleich Weichen_Ziel gegen die Wort-Konstante 16#4224 ist als
//    direkte Wort-Gleichheit (= W#16#4224) abgebildet.
//  - Word-Konstante 0 (Parameter "Endziel") als W#16#0 uebernommen.
//  - Der FB "Daten_in_SendFIFO_speichern" wird ueber seinen globalen Instanz-DB
//    "Daten_für_SendFIFO" aufgerufen; nicht versorgte Parameter behalten (wie im
//    AWL) ihren Instanz-DB-Wert. Puffer_LinienNr wird zuvor direkt im Instanz-DB
//    gesetzt (entspricht dem AWL-Transfer vor dem CALL).
   VAR_TEMP
      "Error.Bit" : Bool;
   END_VAR

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

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

      4207:   // NW2: Schleuse 4207 (Vor ByPass vom LP): Ausgefahren ?  -- Aufruf von Schleuse 4207?
         // Gerade ? Also zum AMR-Bereich? -> dann Bausteinende (AWL: EQ_I / BEC)
         IF "DLPtoHW_OmniFahren".Schleuse_4221.Dyn.Weichen_Ziel = W#16#4224 THEN
            RETURN;   // Ja !
         END_IF;
         // Partner-Trolley will zu VP fahren:
         // Bei Partner (Schleuse 4221) wieder mit Schritt 0 beginnen (erneuter Ziel-FC-Aufruf)
         "DLPtoHW_OmniFahren".Schleuse_4221.Dyn.Sk.Akt_Schritt := 0;

      3141:   // NW3: Schleuse 3141: (Vor Einfahrt Kontrollplatz)  -- Aufruf von Schleuse 3141 ?
         // Bei Partner (Schleuse 3136) wieder mit Schritt 0 beginnen (erneuter Ziel-FC-Aufruf)
         "DHWtoVP_OmniFahren".Schleuse_3136.Dyn.Sk.Akt_Schritt := 0;
         // Leerer Trolley vom Leerpuffer? (ShopGroup = Leer-Trolley?)  (AWL: L MD182 / L DINT#-1 / EQ_D / BEC)
         IF DWORD_TO_DINT("MD182") = DINT#-1 THEN
            RETURN;   // Ja ! -> Kein Telegramm!
         END_IF;
         // GOHDUM an Host senden:
         // AWL: L Weichen_Ziel / BTI / T Puffer_LinienNr  (BCD-Wort -> Int)
         "BCD (4stellig)_to_INT"(
            BCD_Wert := "DHWtoVP_OmniFahren".Schleuse_3141.Dyn.Weichen_Ziel,
            Int_Wert => "Daten_für_SendFIFO".Puffer_LinienNr);
         "Daten_für_SendFIFO"(
            TelegrammKennung[1] := 'G',
            TelegrammKennung[2] := 'O',
            TelegrammKennung[3] := 'H',
            TelegrammKennung[4] := 'D',
            TelegrammKennung[5] := 'U',
            TelegrammKennung[6] := 'M',
            TrolleyID           := "DHWtoVP_OmniFahren".Schleuse_3141.Dyn.TrolleyID_Schleuse,
            StationsNr          := 3141,
            Port                := 2,
            Ret_Val_FIFO_IN     => "MB199",
            Error               => #"Error.Bit");
         // Endziel wieder nullen:
         "Trolleydaten_ändern"(
            Gesamt_Trolley_DL := 1000,
            TrolleyID         := "DHWtoVP_OmniFahren".Schleuse_3141.Dyn.TrolleyID_Schleuse,
            Endziel           := W#16#0,
            ShopGroup         := DINT#0);
         // AWL: BEU -> Bausteinende (CASE-Zweig endet)

      3136:   // NW4: Schleuse 3136: (Vor Einfahrt Kontrollplatz)  -- Aufruf von Schleuse 3136 ?
         // Bei Partner (Schleuse 3141) wieder mit Schritt 0 beginnen (erneuter Ziel-FC-Aufruf)
         "DHWtoVP_OmniFahren".Schleuse_3141.Dyn.Sk.Akt_Schritt := 0;
         // AWL: BEU -> Bausteinende (CASE-Zweig endet)

      ELSE
         ;   // unbekannte Schleusen-Nr -> nichts tun (AWL: JC ans Netzwerkende)
   END_CASE;
   // NW5: Ende (AWL: BE)
END_FUNCTION
