Files

99 lines
5.0 KiB
Plaintext

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