=== FB 1278: MHMEntnahmepuffer  [STL] ===
INTERFACE:
  Input:
    EntnahmePuffer_Nr : Int                             // Aufruf für Leer-Puffer
    B_LeerpufferEinfahrt : Bool                         // Sensor Trolley fährt in Leerpuffer
  Output:
    Error : Word                                        // Störungen übergeben
  InOut:
    hStOk : Bool                                        // Anzeige Start n. Störung aktivieren
  Static:
    Res16 : Array[1..4] of Int                          // Reserve
    SAVE : Struct
      Weichen_DB : Int                                  // Weichen-FIFO-DB
      Weichen_DW : Int                                  // Weichen-FIFO-DW
    Para : Struct                                       // Parameter
      Entnahmepuffer_DL_DB : Int                        // Einsprung Leerpuffer-Datenliste-DB
      Entnahmepuffer_DL_DW : Int                        // Einsprung Leerpuffer-Datenliste-DW
      Res1 : Array[1..2] of Int                         // Reserve
    Status2 : Struct
      Abruf_ist_möglich : Bool                          // Abruf ist möglich 
      Kein_Stop_mehr : Bool
      Eintrag_DL_Leerliste_erfolgt : Bool               // Eintrag in DLLPPuffer_leer (DB500) erfolgt
      Eintrag_DL_Reinliste_erfolgt : Bool               // Eintrag in DLLPPuffer_Einfahren (DB501) erfolgt
      Eintrag_Abrufliste_erfolgt : Bool                 // Eintrag in DLLPPuffer_Ausfahren (DB502) erfolgt
    Puffer : "UDLHMEntnahmePuffer"                      // Statische Leerpufferdaten (aus DL)
    Dyn : Struct                                        // Dynamische Daten
      Status : Struct
        Puffer_OUT_leer : Bool                          // Puffer ist leer
        Puffer_OUT_hat Platz : Bool                     // Puffer hat noch Kapazität
        Undef.Trolley_in_Schleuse_OUT : Bool            // Undefinierter Trolley in Schleuse unten erkannt
        Trolley_fährt_in_Schleuse_OUT : Bool            // Trolley fährt in Schleuse (unten)
        Trolley_wartet_Auftrag : Bool                   // Trolley wartet auf Auftrag (unten)
        Trolley_wartet_Bereich+1 : Bool                 // Trolley wartet auf Bereich +1 (unten)
        Trolley_fährt_aus_OUT : Bool                    // Trolley fährt aus (unten)
        MindestZeit_ok_OUT : Bool                       // Schleuse ist MindestZeit geöffnet
        Trolley_draussen_Out : Bool                     // Trolley ist ausgefahren
        Trolley_OUT_nicht_in_Schleuse : Bool            // Trolley fährt nicht in Schleuse
        Leer_Check_OUT : Bool                           // Leerpuffer wird auf leer gecheckt
        Alles_ausfahren : Bool                          // Alle Trolleys ausfahren
        Leerpuffer_initialisieren : Bool                // Leerpuffer initialisieren 
        Error_aktiv : Bool                              // Störung vorhanden
        Reset_aktiv_OUT : Bool                          // Reset aktiv
      TrolleyID_Einfahrt : DInt                         // Trolley-Nr ist eingefahren
      Rueckmld : Struct
        RET_VAL_BLKMOV_EntnahmePuffer : Int             // Rückmeldung nach BLKMOV-Aufruf
        RET_VAL_DL_EntnahmePuffer : Byte                // Rückmeldung nach DatenOut-Aufruf
        RET_VAL_DL_Res_OUT : Byte                       // Rückmeldung nach DatenOut-Aufruf
        RET_VAL_DL_EntnahmePufferTrolley_IN : Byte      // Rückmeldung nach DatenIN-Aufruf
        RET_VAL_DL_EntnahmePufferTrolley_OUT : Byte     // Rückmeldung nach DatenOut-Aufruf
      Error : "UErrHMEntnahmePuffer"
      Stau_Zeit : Int                                   // Sensor B_Einfahrt ist belegt [1s]
      Stop_Ursache : Word                               // Stop-Stelle: Nw + Position
      Res500 : Array[1..206] of Int
  Temp:
    Quelle : Any                                        // Zeiger, wo Rein-Daten sind
    Ziel : Any                                          // Zeiger, FIFO-Stelle
    Ueb_akt : Bool                                      // Überwachungszeit aktivieren
    Weiter : Bool                                       // Weiterschaltbedingung ist erfüllt
    Warte_neu : Bool                                    // Wartezeit neu triggern
    Warte_stop : Bool                                   // Wartezeit stoppen
    Inks_Ok : Bool                                      // Starten aufgrund der Inks erlaubt
    Puffer_ist_leer : Bool                              // Leerpuffer zeitlang ohne Sensor
    Abruf_Trolley_vorne : Bool                          // Abruf-Trolley ist in Schleuse
    Oberen_Puffer_Freigeben : Bool
    GesamtAnzahl : Int
    SSDW : Int
    Schleife : Word                                     // Loopzähler
    Trolley : Int
    Position : Int
  Constant:

--- NW 1: Parameter-Übergabe ---
      L      EntnahmePuffer_Nr

      L      275                                             // Einsprung Puffer-DL
      T      Para.Entnahmepuffer_DL_DB                       // vor Aufruf übergeben!
      L      0
      T      Para.Entnahmepuffer_DL_DW


--- NW 2: Statische Entnahmepuffer-Parameter holen ---
      L      Puffer.EntnahmePuffer_Nr                        // Nummer des EntnahmePuffers
      L      EntnahmePuffer_Nr                               // Aufruf-Parameter
      ==I                                                    // Identisch ?
      R      Dyn.Error.Entnahmepuffer_DL                     // EntnahmePufferdatenbank fehlerhaft
      R      Dyn.Error.Undef_Entnahmepuffer                  // undefiniertes EntnahmePuffer
      JC     en06                                            // Ja !

      T      "MW200"                                         // Search-Daten

CALL FC "DatenOut" (SSDB:=Para.Entnahmepuffer_DL_DB, SSDW:=Para.Entnahmepuffer_DL_DW, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:=Dyn.Rueckmld.RET_VAL_DL_EntnahmePuffer, OUTDATEN:=P#M220.0, Position:="MW196")

      JBI    G_Ok

      A      "M199.0"
      JCN    w060

      SET
      =      Dyn.Error.Entnahmepuffer_DL                     // EntnahmePufferdatenbank fehlerhaft

      L      16#A061
      T      Dyn.Stop_Ursache

      BEU

w060: SET
      S      Dyn.Error.Undef_Entnahmepuffer                  // undefinierter EntnahmePuffer

      L      16#0062
      T      Dyn.Stop_Ursache

      BEU

// Kennung + Datenbytes
G_Ok: SET
      R      Dyn.Error.Entnahmepuffer_DL                     // Gefälledatenbank fehlerhaft
      R      Dyn.Error.Undef_Entnahmepuffer                  // undefinierte Gefällestrecke

      L      16#1004                                         // Kennung 10 + Word=04
      T      LW0                                             // Any-Kennung, Datentyp
      L      20                                              // Datenwords speichern
      T      LW2                                             // Wiederholungen

// Quelle-Pointer erzeugen:
      L      0                                               // Bei Merker = 0 !
      T      LW4                                             // DB_Nummer
      L      220                                             // Adresse
      SLD    3
      L      16#8300_0000                                    // Kennung: Merker
      OD
      T      LD6                                             // Kennung, Adresse

CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=Dyn.Rueckmld.RET_VAL_BLKMOV_EntnahmePuffer, DSTBLK:=Puffer)   // Datenliste-Daten speichern | #Ziel

      L      16#0063
      T      Dyn.Stop_Ursache

      L      Dyn.Rueckmld.RET_VAL_BLKMOV_EntnahmePuffer      // Rückmeldung
      L      0                                               // Fehler vorhanden ?
      <>I                                                    // Ja !
      =      Dyn.Error.Err_BLKMov                            // Error bei Block kopieren
      BEC

      L      Puffer.Puffer_Typ                               // Puffertyp = 1278 (EntnahmePuffer)
      L      1278                                            // Dieser Aufruf-FB ?
      ==I                                                    // Ja !
      JC     w061

      SET
      S      Dyn.Error.Undef_Entnahmepuffer                  // undefinierter EntnahmePuffer

      L      0                                               // EntnahmePuffer ungültig !
      T      Puffer.EntnahmePuffer_Nr                        // Nummer des EntnahmePuffers

      L      16#0064
      T      Dyn.Stop_Ursache

      BEU

// Defaultwerte übergeben:
w061: NOP 0

      BEU

en06: NOP 0


--- NW 3: Einfahrenden Trolley verarbeiten ---
      L      Dyn.TrolleyID_Einfahrt
      T      "MD220"
      L      DINT#0
      ==I
      JC     NoNewT

// Neue Position an Gesamt-Trolley-DL übergeben:
CALL FC "Trolley_DL_Neue_Pos" (Gesamt_Trolley_DL:=Puffer.Gesamt_Trolley_DL, TrolleyID:=Dyn.TrolleyID_Einfahrt, Position:=Puffer.Puffer_Position, ShopGroup:=Dint#0, Err:="M199.0")

NoNewT: NOP 0


--- NW 4: Error: Stau Bereich-Eingang ---
// Sensor bei Bereichs-Einfahrt bleibt belegt?:
      AN     B_LeerpufferEinfahrt                            // Sensor Trolley fährt in Bereich (kein Stau !)
      R      Dyn.Error.Err_Stau_Einfahrt                     // Stau bei Einfahrt
      JC     X090                                            // StauZeit neu aufziehen

      AN     "1s-Impuls"
      O      Dyn.Error.Err_Stau_Einfahrt                     // Zeit bereits abgelaufen
      JC     Xn09

      L      Dyn.Stau_Zeit                                   // Sensor B_VorSep ist belegt [1s]
      +      +1
      T      Dyn.Stau_Zeit                                   // Sensor B_VorSep ist belegt [1s]

      L      25                                              // Stau-Zeit erreicht ?
      >=I                                                    // Ja !
      S      Dyn.Error.Err_Stau_Einfahrt                     // Stau bei Einfahrt (Quittierung oder Sensor=0, wegen Bürstenantrieb
      JCN    Xn09

X090: L      0                                               // Zeiten löschen
      T      Dyn.Stau_Zeit                                   // Sensor B_VorSep ist belegt [1s]

Xn09: NOP 0


--- NW 5: Ende ---
      BE

