=== FC 1181: VP_Ziel_FC  [STL] ===
INTERFACE:
  Input:
  Output:
  InOut:
  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
    ZielGruppe : Word
    Trolley_unbekannt : Bool                            // Trolley ist nicht in DL
    Express_Abruf : Bool
    Error.Bit : Bool
  Constant:
  Return:
    Ret_Val : Void

--- NW 1: Rückmeldung ---
      SET                                                    // Rückmeldungen erst mal resetten
      R      "M180.6"                                        // Weiterfahrt von Ziel-FC erlaubt


--- NW 2: Schleuse 3121: Weiterfahren erlaubt ? (Sorter VP_A von KontrollPlatz) ---
      L      "MW190"
      L      3121                                            // Aufruf von Schleuse 3121 ?
      <>I                                                    // Nein!
      JC     X3121E

      L      "VP_TravelFIFO_A".Travel_FIFO_BG3120.FIFO.ANZAHL
      L      0                                               // Daten noch im Travel-FIFO?
      <>I                                                    // Ja !
      O      "MB3121"                                        // Trolley fährt schon
      O      "DVP_OmniFahren".Einfahrt_VP."3121_stop"
      BEC

      L      0
      T      Ziel_hex

      A      "SGes".Ohne_PC_Fahren                           // Also Ziel simulieren
      JC     Sim3121

      AN     "DVP_OmniFahren".Schleuse_3121.Status2.Telegramm_gesendet
      JC     T3121

// Shop-Group definiert ?
      L      "MD182"                                         // ShopGroup
      L      DINT#0                                          // bekannt?
      <>D                                                    // Ja !
      A(
      CAC
      L      DINT#0815                                       // bekannt?
      <>D                                                    // Ja !
      O      "SGes".Ohne_PC_Fahren                           // 815 nur ohne PC fahren Ok!
      )
      JC     VP3121

// Erneute Anfrage bei Host!
      A      "10s-Impuls"
      R      "DVP_OmniFahren".Schleuse_3121.Status2.Telegramm_gesendet

      BEU

// Voll-Puffer ermitteln oder Ziel schon fest?
VP3121: L      Ziel_hex                                      // Evtl. von Simulation
      L      16#0                                            // schon angegeben?
      <>I                                                    // Ja!
      JC     ZielFest3121

CALL FC "ShopGroup to Rein-Lager ermitteln" (ShopGroup:="MD182", Puffer:=Ziel_hex)

// Ziel = Voll-Lager?
ZielFest3121: L      Ziel_hex
      L      16#F000
      AW
      L      16#B000                                         // Ziel = VollLager ?
      ==I                                                    // Ja!
      R      "7_HMI_Err_UH07_OB".Logistik.Kein_Platz_im_VollLager
      JC     LagerOk_3121

      SET
      S      "7_HMI_Err_UH07_OB".Logistik.Kein_Platz_im_VollLager

      BEU                                                    // Nicht ins Lager fahren !

LagerOk_3121: L      Ziel_hex
      L      16#FFF
      AW
      BTI                                                    // Damit Int 101-151 als Ziel !
      T      Ziel_int

// Check, ob Ziel-Lager Inilauf aktiv hat:
      T      "MW220"

CALL FC "DatenOut" (SSDB:=275, SSDW:=0, PARA:=16#0000, SEARCHDATEN:=P#M220.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:=Position)   // Eintrag lesen

      L      "MB199"
      L      2#1111111                                       // Bit 7 ausblenden
      AW
      L      0                                               // Fehler vorhanden?
      <>I                                                    // Ja
      BEC

      L      "MW224"
      T      Lager_DB
      L      "MW226"
      T      Lager_DW
      ITD
      T      AR1Start                                        // Startwert mit Offset 0

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#28                                         // Offset Status2 (Bit 7: Inilauf)
      SLD    3
      L      7                                               // Damit DBX_Bit 7
      OD
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)

      OPN    DB[Lager_DB]                                    // Lager-DB öffnen

      A      DBX [AR1Zeiger]                                 // Lager hat Inilauf aktiv
      BEC                                                    // Sonst kann der Inilauf nie beendet werden!

// Check, ob Ziel-Lager Platz hat:
      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#28                                         // Offset Status2 (Bit 1: Piuffer hat Platz_IN)
      SLD    3
      L      1                                               // Damit DBX_Bit 1
      OD
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)

      OPN    DB[Lager_DB]                                    // Lager-DB öffnen

      AN     DBX [AR1Zeiger]                                 // Lager hat keinen Platz
      BEC

// Ziel übergeben:
      L      Ziel_int
      T      "DVP_Sorter_A".Sorter_MB3121.Separator.Default_Ziel
      T      "DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_DEST_Ziel

// Scanner-IDX übergeben:
      L      "DVP_OmniFahren".Schleuse_3121.Dyn.TrolleyID_Schleuse
      T      "DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_IDX // IDX

      CLR                                                    // Wird über MSorterRein (FB1423/5) gestartet!
      S      "M180.6"                                        // Weiterfahrt ist erlaubt

      BEU

// GOHDReqM an Host senden:
T3121: L      "DVP_OmniFahren".Schleuse_3121.Dyn.TrolleyID_Schleuse
      L      0                                               // Barcode bekannt?
      ==D                                                    // Nein!
      BEC                                                    // Warten!

CALL FB "Daten_in_SendFIFO_speichern" ,  (TelegrammKennung[1]:='G', TelegrammKennung[2]:='O', TelegrammKennung[3]:='H', TelegrammKennung[4]:='D', TelegrammKennung[5]:='R', TelegrammKennung[6]:='e', TelegrammKennung[7]:='q', TelegrammKennung[8]:='M', TelegrammKennung[9]:=?, TelegrammKennung[10]:=?, TrolleyID:="DVP_OmniFahren".Schleuse_3121.Dyn.TrolleyID_Schleuse, StationsNr:=3121, Puffer_LinienNr:=?, StoreGroup:=?, Status_1_Int:=?, Status_2_Bit[0]:=?, Status_2_Bit[1]:=?, Status_2_Bit[2]:=?, Status_2_Bit[3]:=?, Status_2_Bit[4]:=?, Status_2_Bit[5]:=?, Status_2_Bit[6]:=?, Status_2_Bit[7]:=?, Reserve[1]_Int:=?, Reserve[2]_Int:=?, Port:=2, Ret_Val_FIFO_IN:="MB199", Error:="Error.Bit")

      AN     "Error.Bit"
      S      "DVP_OmniFahren".Schleuse_3121.Status2.Telegramm_gesendet

      BEU

// /Zum Testen bei Inbetriebnahme:
Sim3121: L      "DVP_OmniFahren".Einfahrt_VP."3121_Ziel"
      T      Ziel_hex

// Shop-Group definiert ?
      L      "MD182"                                         // ShopGroup
      L      DINT#0                                          // bekannt?
      <>D                                                    // Ja !
      JC     VP3121

CALL FC "Trolleydaten_neu_anlegen" (Gesamt_Trolley_DL:="DVP_OmniFahren".Schleuse_3121.Schleuse.Gesamt_Trolley_DL, TrolleyID:="DVP_OmniFahren".Schleuse_3121.Dyn.TrolleyID_Schleuse, Endziel:=16#0000, ShopGroup:=DINT#815)   // /

      BEU

X3121E: NOP 0


--- NW 3: Schleuse 3123: Weiterfahren erlaubt ? (Sorter VP_A von RückführStrecke) ---
      L      "MW190"
      L      3123                                            // Aufruf von Schleuse 3123 ?
      <>I                                                    // Nein!
      JC     X3123E

      L      "VP_TravelFIFO_A".Travel_FIFO_BG3120.FIFO.ANZAHL
      L      0                                               // Daten noch im Travel-FIFO?
      <>I                                                    // Ja !
      O      "MB3123"                                        // Trolley fährt schon
      O      "DVP_OmniFahren".Einfahrt_VP."3123_stop"
      BEC

      L      0
      T      Ziel_hex

      A      "SGes".Ohne_PC_Fahren                           // Also Ziel simulieren
      JC     Sim3123

      AN     "DVP_OmniFahren".Schleuse_3123.Status2.Telegramm_gesendet
      JC     T3123

// Shop-Group definiert ?
      L      "MD182"                                         // ShopGroup
      L      DINT#0                                          // bekannt?
      <>D                                                    // Ja !
      A(
      CAC
      L      DINT#0815                                       // bekannt?
      <>D                                                    // Ja !
      O      "SGes".Ohne_PC_Fahren                           // 815 nur ohne PC fahren Ok!
      )
      JC     VP3123

// Erneute Anfrage bei Host!
      A      "10s-Impuls"
      R      "DVP_OmniFahren".Schleuse_3123.Status2.Telegramm_gesendet

      BEU

// Voll-Puffer ermitteln oder Ziel schon fest?
VP3123: L      Ziel_hex                                      // Evtl. von Simulation
      L      16#0                                            // schon angegeben?
      <>I                                                    // Ja!
      JC     ZielFest3123

CALL FC "ShopGroup to Rein-Lager ermitteln" (ShopGroup:="MD182", Puffer:=Ziel_hex)

// Ziel = Voll-Lager?
ZielFest3123: L      Ziel_hex
      L      16#F000
      AW
      L      16#B000                                         // Ziel = VollLager ?
      ==I                                                    // Ja!
      R      "7_HMI_Err_UH07_OB".Logistik.Kein_Platz_im_VollLager
      JC     LagerOk_3123

      SET
      S      "7_HMI_Err_UH07_OB".Logistik.Kein_Platz_im_VollLager

// Im Kreis nur fahren, falls Stau in Rückführstrecke:
      AN     "DVP_Sensoren".Stau_BG3243.Stat.B_Akt
      BEC                                                    // Nicht ins Lager fahren !

      L      16#B151                                         // /Vorerst immer Lager 51 fahren
      T      Ziel_hex

LagerOk_3123: L      Ziel_hex
      L      16#FFF
      AW
      BTI                                                    // Damit Int101-151 als Ziel !
      T      Ziel_int

// Check, ob Ziel-Lager Inilauf aktiv hat:
      T      "MW220"

CALL FC "DatenOut" (SSDB:=275, SSDW:=0, PARA:=16#0000, SEARCHDATEN:=P#M220.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:=Position)   // Eintrag lesen

      L      "MB199"
      L      2#1111111                                       // Bit 7 ausblenden
      AW
      L      0                                               // Fehler vorhanden?
      <>I                                                    // Ja
      BEC

      L      "MW224"
      T      Lager_DB
      L      "MW226"
      T      Lager_DW
      ITD
      T      AR1Start                                        // Startwert mit Offset 0

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#28                                         // Offset Status2 (Bit 7: Inilauf)
      SLD    3
      L      7                                               // Damit DBX_Bit 7
      OD
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)

      OPN    DB[Lager_DB]                                    // Lager-DB öffnen

      A      DBX [AR1Zeiger]                                 // Lager hat Inilauf aktiv
      BEC                                                    // Sonst kann der Inilauf nie beendet werden!

// Check, ob Ziel-Lager Platz hat:
      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#28                                         // Offset Status2 (Bit 1: Puffer hat Platz_IN)
      SLD    3
      L      1                                               // Damit DBX_Bit 1
      OD
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)

      OPN    DB[Lager_DB]                                    // Lager-DB öffnen

      AN     DBX [AR1Zeiger]                                 // Lager hat keinen Platz
      BEC                                                    // Sonst kann der Inilauf nie beendet werden!

// Ziel übergeben:
      L      Ziel_int
      T      "DVP_Sorter_A".Sorter_MB3123.Separator.Default_Ziel
      T      "DVP_Sorter_A".Sorter_MB3123.Dyn.Scanner.Rec_DEST_Ziel

// Scanner-IDX übergeben:
      L      "DVP_OmniFahren".Schleuse_3123.Dyn.TrolleyID_Schleuse
      T      "DVP_Sorter_A".Sorter_MB3123.Dyn.Scanner.Rec_IDX // IDX

      CLR                                                    // Wird über MSorterRein (FB1423/5) gestartet!
      S      "M180.6"                                        // Weiterfahrt ist erlaubt

      BEU

// GOHDReqM an Host senden:
T3123: L      "DVP_OmniFahren".Schleuse_3123.Dyn.TrolleyID_Schleuse
      L      0                                               // Barcode bekannt?
      ==D                                                    // Nein!
      BEC                                                    // Warten!

CALL FB "Daten_in_SendFIFO_speichern" ,  (TelegrammKennung[1]:='G', TelegrammKennung[2]:='O', TelegrammKennung[3]:='H', TelegrammKennung[4]:='D', TelegrammKennung[5]:='R', TelegrammKennung[6]:='e', TelegrammKennung[7]:='q', TelegrammKennung[8]:='M', TelegrammKennung[9]:=?, TelegrammKennung[10]:=?, TrolleyID:="DVP_OmniFahren".Schleuse_3123.Dyn.TrolleyID_Schleuse, StationsNr:=3123, Puffer_LinienNr:=?, StoreGroup:=?, Status_1_Int:=?, Status_2_Bit[0]:=?, Status_2_Bit[1]:=?, Status_2_Bit[2]:=?, Status_2_Bit[3]:=?, Status_2_Bit[4]:=?, Status_2_Bit[5]:=?, Status_2_Bit[6]:=?, Status_2_Bit[7]:=?, Reserve[1]_Int:=?, Reserve[2]_Int:=?, Port:=2, Ret_Val_FIFO_IN:="MB199", Error:="Error.Bit")

      AN     "Error.Bit"
      S      "DVP_OmniFahren".Schleuse_3123.Status2.Telegramm_gesendet

      BEU

// /Zum Testen bei Inbetriebnahme:
Sim3123: L      "DVP_OmniFahren".Einfahrt_VP."3123_Ziel"
      T      Ziel_hex

// Shop-Group definiert ?
      L      "MD182"                                         // ShopGroup
      L      DINT#0                                          // bekannt?
      <>D                                                    // Ja !
      JC     VP3123

CALL FC "Trolleydaten_neu_anlegen" (Gesamt_Trolley_DL:="DVP_OmniFahren".Schleuse_3123.Schleuse.Gesamt_Trolley_DL, TrolleyID:="DVP_OmniFahren".Schleuse_3123.Dyn.TrolleyID_Schleuse, Endziel:=16#0000, ShopGroup:=DINT#815)   // /

      BEU

X3123E: NOP 0


--- NW 4: Schleuse 3244: (Nach LagerAusfahrt) ---
      L      "MW190"
      L      3244                                            // Aufruf von Schleuse XXXX?
      <>I                                                    // Nein!
      JC     PS5E

      A      "DVP_OmniFahren".Ausfahrt_VP."3244_stop"
      BEC

      L      "DVP_OmniFahren".Ausfahrt_VP."3244_Ziel"
      L      16#0                                            // Vorgabe?
      ==I                                                    // Nein!
      JC     N3244

      CAC
      L      16#B000                                         // Vollpuffer
      ==I                                                    // Ja!
      JC     A3244

      CAC
      L      16#E000                                         // Entnahmepuffer
      ==I                                                    // Ja!
      JC     G3244

      BEU

// Aufgrund der Daten fahren:
N3244: NOP 0
// EndZiel = Entnahmepuffer?
      L      "MW194"                                         // EndZiel
      L      16#F000
      AW
      T      ZielGruppe
      L      16#E000                                         // Entnahme-Puffer
      ==I                                                    // Ja !
      JC     G3244                                           // Gerade fahren

// Leer-Trolley?:
      L      "DVP_OmniFahren".Schleuse_3244.Dyn.Trolley_ShopGroup
      L      DINT#-1                                         // leerer Trolley ?
      ==D                                                    // Ja !
      A(
      L      "DLLeerPuffer_leer".Datenlistenkopf.AnzahlEintraege
      L      5                                               // Genügend Platz vorhanden ?
      >=I                                                    // Ja !
      )
      JC     G3244                                           // Gerade fahren

      JU     A3244                                           // Rest Abzweig fahren

A3244: L      16#3243
      T      "MW198"                                         // Weichenziel

      AN     "DVP_Sensoren".Stau_BG3243.Stat.B_Akt
      S      "M180.6"                                        // Weiterfahrt ist erlaubt

      BEU

G3244: L      16#3246
      T      "MW198"                                         // Weichenziel

      AN     "DVP_Sensoren".Stau_BG3246.Stat.B_Akt
      S      "M180.6"                                        // Weiterfahrt ist erlaubt

      BEU

PS5E: NOP 0


--- NW 5: Ende ---
      BE

