=== FB 276: MHMÜberlauf_VP  [STL] ===
INTERFACE:
  Input:
    VollPuffer_Nr : Int                                 // Aufruf für Voll-Puffer
    ErrQuit : Bool                                      // Ablaufstörung quittieren
    B_VollPufferEinfahrt : Bool                         // Sensor Trolley fährt in VollPuffer
    B_InSchleuse_IN : Bool                              // Sensor Trolley ist in Schleuse oben
    B_InSchleuse_OUT : Bool                             // Sensor Trolley ist in Schleuse unten
    B_AusSchleuse_OUT : Bool                            // Sensor Trolley hat Schleuse unten verlassen
    B_Stau_raus_Out : Bool                              // Sensor Stau im Bereich unten rausfahren
    B_QuerTrolley_Out : Bool                            // Crash-Trolley auf Crashkurs erkannt
    Antrieb_plus_aktiv : Bool                           // Kreisel-Antrieb plus aktiv
    Schleuse_geöffnet_IN : Bool                         // Schleuse oben hat geöffnet
    Schleuse_geöffnet_OUT : Bool                        // Schleuse unten hat geöffnet
  Output:
    Y_Schleuse_Auf_IN : Bool                            // Schleuse oben öffnen
    Y_Schleuse_Auf_OUT : Bool                           // Schleuse unten öffnen
    Error : Word                                        // Störungen übergeben
  InOut:
    Start_Ok : Bool                                     // Starten von ausserhalb ist erlaubt
    Antrieb_plus_start : Bool                           // Antrieb plus starten
    Antrieb_plus_stoppen : Bool                         // Antrieb plus stoppen
    hStOk : Bool                                        // Anzeige Start n. Störung aktivieren
    Ausfahr_Inks : Int                                  // Rest-Inks, wo sich Trolley befindet
  Static:
    Res16 : Array[1..2] of Int                          // Reserve
    SAVE : Struct
      Weichen_DB : Int                                  // Weichen-FIFO-DB
      Weichen_DW : Int                                  // Weichen-FIFO-DW
    Para : Struct                                       // Parameter
      VollPuffer_DL_DB : Int                            // Einsprung VollPuffer-Datenliste-DB
      VollPuffer_DL_DW : Int                            // Einsprung VollPuffer-Datenliste-DW
      Res1 : Array[1..2] of Int                         // Reserve
    Status2 : Struct
      Puffer_leer_IN : Bool                             // Puffer oben ist leer
      Puffer_hat Platz_IN : Bool                        // Puffer oben hat noch Kapazität
      Kein_neuer_Trolley_kommt_IN : Bool                // Puffer oben zeitlang ohne neuen Trolley
      Leer_Check_IN : Bool                              // VollPuffer oben wird auf leer gecheckt
      Reset_aktiv_IN : Bool                             // Reset oben aktiv
      Trolley_nicht_in_Schleuse_IN : Bool               // Trolley oben fährt nicht in Schleuse > Inilauf gestartet
      Puffer_nicht_leer_IN : Bool                       // Puffer oben nicht leer > Inilauf gestartet
      Puffer_initialisieren_IN : Bool                   // VollPuffer oben initialisieren 
      MindestZeit_ok_IN : Bool                          // Schleuse ist MindestZeit geöffnet
      Frei11 : Bool
      Frei12 : Bool
      Frei13 : Bool
      Alles_ausfahren_OUT : Bool                        // Alle Trolleys ausfahren
      Eintrag_DL_Leerliste_erfolgt : Bool               // Eintrag in DLVPPuffer_leer (DB100) erfolgt
      Eintrag_DL_Reinliste_erfolgt : Bool               // Eintrag in DLVPPuffer_ShopGroup rein (DB101) erfolgt
      Eintrag_DL_Abrufliste_erfolgt : Bool              // Eintrag in DLVPPuffer_ShopGroup raus (DB901) erfolgt
    Puffer : "UDLHMVollPuffer"                          // Statische VollPufferdaten (aus DL)
    Dyn : Struct                                        // Dynamische Daten
      Status : Struct
        Puffer_leer_OUT : Bool                          // Puffer oben ist leer
        Puffer_hat Platz_OUT : Bool                     // Puffer oben hat noch Kapazität
        Kein_neuer_Trolley_kommt_OUT : Bool             // Puffer unten zeitlang ohne neuen Trolley
        Leer_Check_OUT : Bool                           // VollPuffer unten wird auf leer gecheckt
        Reset_aktiv_OUT : Bool                          // Reset unten aktiv
        Trolley_nicht_in_Schleuse_OUT : Bool            // Trolley unten fährt nicht in Schleuse > Inilauf gestartet
        Puffer_nicht_leer_OUT : Bool                    // Puffer unten nicht leer > Inilauf gestartet
        Puffer_initialisieren_OUT : Bool                // VollPuffer unten initialisieren 
        MindestZeit_ok_OUT : Bool                       // Schleuse ist MindestZeit geöffnet
        Undef.Trolley_in_Schleuse_OUT : Bool            // Undefinierter Trolley in Schleuse unten erkannt
        Trolley_wartet_Auftrag : Bool                   // Trolley wartet auf Auftrag (unten)
        Trolley_wartet_Bereich+1 : Bool                 // Trolley wartet auf Bereich +1 (unten)
        Einen_VollTrolley_ausfahren_OUT : Bool          // Einen Voll-Trolley ausfahren
        Trolley_fährt_aus_OUT : Bool                    // Trolley fährt aus (unten)
        Trolley_draussen_Out : Bool                     // Trolley ist ausgefahren
        Error_aktiv : Bool                              // Störung vorhanden
      TrolleyID_Einfahrt : DInt                         // Trolley-Nr ist eingefahren
      TrolleyID_Schleuse_IN : DInt                      // Trolley-Nr in Schleuse oben (Daten)
      TrolleyID_Schleuse_Out : DInt                     // Trolley-Nr in Schleuse unten (Daten)
      ShopGroup_IN : DInt                               // Diese Shopgruppe ist im oberen VollPuffer 
      ShopGroup_OUT : DInt                              // Diese Shopgruppe ist im unteren VollPuffer 
      ShopGroup_Auftrag_zum_Ausfahren : DInt            // ShopGroup zum Ausfahren (FFFF = akt.Trolley ausfahren)
      HMI : Struct
        ShopGroup_IN : Int                              // ShopGroup im VollPuffer oben (IN:PLC, OUT:PLC)
        ShopGroup_OUT : Int                             // ShopGroup im VollPuffer unten (IN:PLC, OUT:PLC)
        Voll_Trolleys_IN : Int                          // Anzahl Trolleys oben (IN:PLC, OUT:PLC)
        Voll_Trolleys_OUT : Int                         // Anzahl Trolleys unten (IN:PLC, OUT:PLC)
        Res_Trolleys_IN : Int                           // Anzahl reservierte Trolleys oben (IN:PLC, OUT:PLC)
        Frei_Plätze_IN : Int                            // Freiplätze für Trolleys (IN:PLC, OUT:PLC)
        TrolleyID_Schleuse_IN : DInt                    // Trolley-Nr in Schleuse oben (IN:PLC, OUT:PLC)
        TrolleyID_Schleuse_OUT : DInt                   // Trolley-Nr in Schleuse unten (IN:PLC, OUT:PLC)
        Schleuse_resetten_IN : Bool                     // Schleuse resetten oben (IN:HMI, Out:PLC)
        Schleuse_resetten_OUT : Bool                    // Schleuse resetten unten (IN:HMI, Out:PLC)
        Puffer_initialisieren : Bool := 1               // VollPuffer initialisieren (IN:HMI, Out:PLC)
        Einlagern_gesperrt : Bool                       // Einlagern gesperrt (IN:HMI, OUT:HMI)
        AusLagern_gesperrt : Bool                       // AusLagern gesperrt (IN:HMI, OUT:HMI)
      Sk_IN : "USk_Omni"                                // Status der Schrittkette Schleuse IN (oben)
      Sk_OUT : "USk_Omni"                               // Status der Schrittkette Schleuse OUT (unten)
      TrolleyID_doppelt : DInt                          // TrolleyID doppelt (eingefahrener Trolley)
      TrolleyID_unbekannt_Einfahrt : DInt               // TrolleyID unbekannt (eingefahrener Trolley)
      TrolleyID_unbekannt_Schleuse_OUT : DInt           // TrolleyID unbekannt (Trolley in Schleuse unten)
      Rueckmld : Struct
        RET_VAL_BLKMOV_VollPuffer : Int                 // Rückmeldung nach BLKMOV-Aufruf
        RET_VAL_DL_VollPuffer : Byte                    // Rückmeldung nach DatenOut-Aufruf
        RET_VAL_DL_Res_OUT : Byte                       // Rückmeldung nach DatenOut-Aufruf
        RET_VAL_DL_VollPufferTrolley_IN : Byte          // Rückmeldung nach DatenIN-Aufruf
        RET_VAL_DL_VollPufferTrolley_OUT : Byte         // Rückmeldung nach DatenOut-Aufruf
      Error : "UErrHMVollpuffer"
      Stau_Zeit : Int                                   // Sensor B_Einfahrt ist belegt [1s]
      Mindest_Zeit_IN : Int                             // Sensor B_in_Schleuse oben ist frei [1s]
      Mindest_Zeit_OUT : Int                            // Sensor B_in_Schleuse unten ist frei [1s]
      Leer_Zeit_IN : Int                                // Puffer oben ist frei [1s]
      Leer_Zeit_OUT : Int                               // Puffer unten ist frei [1s]
      Stop_Ursache_IN : Word                            // Stop-Stelle: Nw + Position
      Stop_Ursache_OUT : Word                           // Stop-Stelle: Nw + Position
      Vereinzelungstakte_OUT : DInt                     // Anzahl der getätigten Vereinzelungstakte
      TrolleyID_ausgefahren : DInt                      // TrolleyID des ausgefahrenen Trolleys
      ShopGroup_EFL_Gespeichert : DInt                  // In EinfahrListe gespeicherte ShopGroup
      ShopGroup_AFL_Gespeichert : DInt                  // In AusfahrListe gespeicherte ShopGroup
      Reservierungs_DL : Struct                         // AB DW200: Liste der resevierter Trolleys
        Datenlistenkopf : Struct
          KOPF : Word := WORD#16#DA04                   // Datenliste-Kennnung (DA) / Datensatzlänge in Word (1 - 128)
          LAENGE : Int := 12                            // Länge der Datenliste (maximale Anzahl der Datensätze)
          STAMMDATEN : Int := 2                         // Stammdatenlänge in Word (1 - 9)
          INDDB : Int                                   // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!)
          LAENGEINDDB : Int                             // Länge des indizierten DB in Word (nur bei Stammdaten = 1 erlaubt !!!)
          INDDATEN_WANDEL_FC : Int                      // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!)
          LETZTERZUGRIFF : Int                          // Speicherung des letzten Zugriffs
          Belegt14 : Int                                // reserviert von Sort-Datenliste
          AnzahlEintraege : Int                         // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!)
          Reserve18 : Int                               // Reserve
        Res_Trolley : Array[1..12] of Struct            // Reservierter Trolley für VollPuffer
          Trolley_ID : DInt                             // Trolley_ID
          ShopGroup : DInt                              // Shop-Gruppe auf Trolley
        Endekennung : Word := WORD#16#DAEE              // Datensort-Ende-Kennung (DBEE)
      Res350 : Array[1..16] of Int
      Trolley_DL_Einfahrt : Struct                      // AB DW350: Liste der Trolleys im VollPuffer
        Datenlistenkopf : Struct
          KOPF : Word := WORD#16#DA04                   // Datenliste-Kennnung (DA) / Datensatzlänge in Word (1 - 128)
          LAENGE : Int := 12                            // Länge der Datenliste (maximale Anzahl der Datensätze)
          STAMMDATEN : Int := 2                         // Stammdatenlänge in Word (1 - 9)
          INDDB : Int                                   // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!)
          LAENGEINDDB : Int                             // Länge des indizierten DB in Word (nur bei Stammdaten = 1 erlaubt !!!)
          INDDATEN_WANDEL_FC : Int                      // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!)
          LETZTERZUGRIFF : Int                          // Speicherung des letzten Zugriffs
          Belegt14 : Int                                // reserviert von Sort-Datenliste
          AnzahlEintraege : Int                         // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!)
          Reserve18 : Int                               // Reserve
        VollPuffer_Trolley_IN : Array[1..12] of Struct  // Trolley im VollPuffer
          Trolley_ID : DInt                             // Trolley_ID
          Abruf_ShopGroup : DInt                        // Reserviert für Ausfahrt
        Endekennung : Word := WORD#16#DAEE              // Datensort-Ende-Kennung (DBEE)
      Res500 : Array[1..16] of Int
      Trolley_DL_Ausfahrt : Struct                      // AB DW350: Liste der Trolleys im VollPuffer
        Datenlistenkopf : Struct
          KOPF : Word := WORD#16#DA04                   // Datenliste-Kennnung (DA) / Datensatzlänge in Word (1 - 128)
          LAENGE : Int := 12                            // Länge der Datenliste (maximale Anzahl der Datensätze)
          STAMMDATEN : Int := 2                         // Stammdatenlänge in Word (1 - 9)
          INDDB : Int                                   // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!)
          LAENGEINDDB : Int                             // Länge des indizierten DB in Word (nur bei Stammdaten = 1 erlaubt !!!)
          INDDATEN_WANDEL_FC : Int                      // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!)
          LETZTERZUGRIFF : Int                          // Speicherung des letzten Zugriffs
          Belegt14 : Int                                // reserviert von Sort-Datenliste
          AnzahlEintraege : Int                         // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!)
          Reserve18 : Int                               // Reserve
        VollPuffer_Trolley_Out : Array[1..12] of Struct // Trolley im VollPuffer
          Trolley_ID : DInt                             // Trolley_ID
          Abruf_ShopGroup : DInt                        // Reserviert für Ausfahrt
        Endekennung : Word := WORD#16#DAEE              // Datensort-Ende-Kennung (DBEE)
      Res700 : Array[1..41] of Int                      // Reserve
  None:
    VollPuffer_Nr : Int                                 // Nummer der VollPuffer
    Puffer_Typ : Int                                    // VollPufferntyp = 276 (VollPuffer)
    Puffer_Position : Word                              // VollPuffer-Position (für Gesamt-TrolleyDatenliste)
    Puffer_Position_Inks : Int                          // VollPuffer-Position_Inks (für Ausfahrsteuerung)
  None:
    Reset : Bool := 1
  None:
    Reset : Bool := 1
  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
    1.Trolley_IN : Bool
    Neu_Trolley_in_Puffer_IN : Bool                     // Neuer Trolley in Puffer eingefahren
    1.Trolley_OUT : Bool
    Inks_Ok : Bool                                      // Starten aufgrund der Inks erlaubt
    Puffer_IN_ist_leer : Bool                           // VollPuffer zeitlang ohne Sensor
    Puffer_OUT_ist_leer : Bool                          // VollPuffer zeitlang ohne Sensor
    Abruf_Trolley_vorne : Bool                          // Abruf-Trolley ist in Schleuse
    Oberen_Puffer_Freigeben : Bool
    Oberen_Puffer_nichts_einfahren : Bool
    Puffer_B : Bool
    GesamtAnzahl : Int
    SSDW : Int
    Schleife : Word                                     // Loopzähler
    Trolley : Int
    Position : Int
    Akive_ShopGroup : DInt
  Constant:

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

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


--- NW 2: Anzeige OP ---
      L      252                                             // Bereichsstop aktiv
      AN     Dyn.Sk_OUT.Bereich_ok                           // Also: Bereichsstop / Not-Aus
      JC     w010

      L      253
      AN     Dyn.Sk_OUT.Auto_akt                             // Keine Betriebsart
      AN     Dyn.Sk_OUT.Hand_akt
      JC     w010

      L      255                                             // Handbetrieb aktiv
      A      Dyn.Sk_OUT.Hand_akt
      JC     w010

      L      Dyn.Sk_IN.Akt_Schritt                           // Aktiver Schritt
      T      Dyn.Sk_IN.OP_Schritt
      L      Dyn.Sk_OUT.Akt_Schritt                          // Aktiver Schritt
      T      Dyn.Sk_OUT.OP_Schritt

      JU     OP_Ok

w010: T      Dyn.Sk_IN.OP_Schritt
      T      Dyn.Sk_OUT.OP_Schritt

OP_Ok: NOP 0


--- NW 3: Out-Bits zum Zurücksetzen / Antrieb plus starten ---
      SET
      R      Y_Schleuse_Auf_IN
      R      Y_Schleuse_Auf_OUT
      R      Puffer_IN_ist_leer
      R      Puffer_OUT_ist_leer

      SET                                                    // Jeden Zyklus neu
      R      Dyn.Status.Trolley_wartet_Auftrag
      R      Dyn.Status."Trolley_wartet_Bereich+1"
      R      Dyn.Status."Trolley_fährt_aus_OUT"
      R      Dyn.Status.Trolley_draussen_Out
      R      "1.Trolley_IN"
      R      "1.Trolley_OUT"
      R      Neu_Trolley_in_Puffer_IN

      A      Dyn.Sk_IN.Reset
      O      Dyn.Sk_IN.Reset_Akt
      =      Status2.Reset_aktiv_IN

      A      Dyn.Sk_OUT.Reset
      O      Dyn.Sk_OUT.Reset_Akt
      =      Dyn.Status.Reset_aktiv_OUT

      SET
      R      Inks_Ok

      A      Dyn.Sk_OUT.Auto_akt
      =      Dyn.Sk_IN.Auto_akt
      A      Dyn.Sk_OUT.Bereich_ok
      =      Dyn.Sk_IN.Bereich_ok

// Antrieb zusätlich starten:
      A      ErrQuit                                         // Überwachungszeit abgelaufen quittieren
      S      Antrieb_plus_start                              // Kreisel-Antrieb plus starten


--- NW 4: HMI-Zeug ---
// Von HMI:
      A      Dyn.HMI.Schleuse_resetten_IN
      R      Dyn.HMI.Schleuse_resetten_IN
      S      Dyn.Sk_IN.Reset                                 // SK zurücksetzen

      A      Dyn.HMI.Schleuse_resetten_OUT
      R      Dyn.HMI.Schleuse_resetten_OUT
      S      Dyn.Sk_OUT.Reset                                // SK zurücksetzen

      A      Dyn.HMI.Puffer_initialisieren
      R      Dyn.HMI.Puffer_initialisieren                   // Ohne Reaktion, da keine Daten

      A      Dyn.HMI.Einlagern_gesperrt                      // Wird unten direkt verarbeitet

      A      Dyn.HMI.AusLagern_gesperrt                      // Wird unten direkt verarbeitet

      CLR

// An HMI:
      L      0
      T      Dyn.HMI.ShopGroup_IN
      T      Dyn.HMI.ShopGroup_OUT
      T      Dyn.HMI.Voll_Trolleys_IN
      T      Dyn.HMI.Voll_Trolleys_OUT
      T      Dyn.HMI.Res_Trolleys_IN
      T      Dyn.HMI."Frei_Plätze_IN"

      L      DINT#0
      T      Dyn.HMI.TrolleyID_Schleuse_IN
      T      Dyn.HMI.TrolleyID_Schleuse_OUT


--- NW 5: Schrittkette OUT zurücksetzen ---
      AN     Dyn.Sk_OUT.Reset                                // SK zurücksetzen
      JC     en04

// Schrittkette zurücksetzen:
      L      0                                               // Schritt 0: Warten
      T      Dyn.Sk_OUT.Akt_Schritt

      L      0                                               // Zeitwert löschen
      T      Dyn.Sk_OUT.Terr_Zelle
      T      Dyn.Sk_OUT.Tok_Zelle
      T      Dyn.Leer_Zeit_OUT

      SET
      R      Status2.Alles_ausfahren_OUT
      R      Dyn.Error.Err_BLKMov                            // Error bei Block kopieren
      R      Dyn.Sk_OUT.Reset                                // SK zurücksetzen
      R      Dyn.Sk_OUT.Err_Schritt                          // Undefinierter Schritt
      R      Dyn.Sk_OUT.Err_Uebzeit                          // Sofort weiter !
      S      Dyn.Sk_OUT.Reset_Akt                            // Reset ist aktiv

      SET
      R      Dyn.Error.Puffer_DL                             // VollPuffer-Datenliste fehlerhaft
      R      Dyn.Error.Undef_Puffer                          // undefiniertes VollPuffer
      R      Dyn.Status.Trolley_nicht_in_Schleuse_OUT        // Trolley fährt nicht in Schleuse
      R      Dyn.Status.Puffer_nicht_leer_OUT                // Puffer unten nicht leer
      R      Dyn.Error.Err_Uebzeit                           // Überwachungzeit ist abgelaufen
      R      Dyn.Error.Err_Schritt                           // Schritt-Nummer ist nicht definiert
      R      Dyn.Error.Err_Stau_Einfahrt                     // Stau am VollPuffer-Eingang
      R      Dyn.Error.Err_BLKMov

      L      0
      T      Dyn.Stau_Zeit                                   // Sensor B_VorSep ist belegt [1s]
      T      Dyn.Mindest_Zeit_OUT                            // Sensor B_VorSep ist frei [1s]
      T      SAVE.Weichen_DB
      T      SAVE.Weichen_DW

// Defaultwerte übergeben:
      L      0                                               // Damit statische Werte neu aus Datenbank geholt werden !
      T      Puffer.VollPuffer_Nr                            // Nummer des VollPuffers

      BEU

en04: NOP 0


--- NW 6: Störungen nach Außen übergeben ---
      L      0
      T      "MW200"

      A      Dyn.Error.Puffer_DL                             // VollPuffer-Datenliste fehlerhaft
      =      "M200.0"
      A      Dyn.Error.Undef_Puffer                          // undefiniertes VollPuffer
      =      "M200.1"
      A      Dyn.Error.Err_Trolley_nicht_in_Schleuse_OUT     // Trolley fährt nicht in untere Schleuse
      =      "M200.2"
      A      Dyn.Sk_IN.Err_Uebzeit
      O      Dyn.Sk_OUT.Err_Uebzeit
      =      Dyn.Error.Err_Uebzeit                           // Überwachungzeit ist abgelaufen
      =      "M200.3"
      NEG
      R      Dyn.Sk_OUT.Err_Uebzeit_AnzOk
      A      Dyn.Sk_OUT.Err_Schritt
      =      Dyn.Error.Err_Schritt                           // Schritt-Nummer ist nicht definiert
      =      "M200.4"
      A      Dyn.Error.Err_Stau_Einfahrt                     // Stau am VollPuffer-Eingang
      =      "M200.5"
      A      Dyn.Error.Err_BLKMov                            // Error bei Block kopieren
      =      "M200.6"
      A      Dyn.Error.Err_Trolley_raus_OUT                  // Trolley fährt nicht aus unterer Schleuse
      =      "M200.7"
      A      Dyn.Error.Err_Puffer_nicht_leer_OUT             // Trolley unten in Schleuse, obwohl keine Daten! Initialisieren hat gestartet!
      =      "M201.0"
      A      Dyn.Error.Err_Trolley_nicht_in_Schleuse_IN      // Trolley fährt nicht in mittlere Schleuse
      =      "M201.1"
      A      Dyn.Error.Err_Trolley_raus_IN                   // Trolley fährt nicht aus mittlere Schleuse
      =      "M201.2"
      A      Dyn.Error.Err_Puffer_nicht_leer_IN              // Trolley mittig in Schleuse, obwohl keine Daten! Initialisieren hat gestartet!
      =      "M201.3"
      CLR
      =      "M201.4"
      A      Dyn.Error.Err_Raus_Sensor
      =      "M201.5"
      CLR
      =      "M201.6"
      A      Dyn.Sk_OUT.Reset_Akt                            // Reset ist aktiv
      =      Dyn.Error.Reset_aktiv
      =      "M201.7"

// Andere Meldung als Überwachungszeit aktiv ?:
      L      "MW200"
      L      2#1111_0111_1111_1111
      AW
      L      2#0000_0000_0000_0000                           // Andere Meldung als Üb.zeit aktiv ?
      <>I                                                    // Ja !
      ON     Dyn.Sk_OUT.Err_Uebzeit_AnzOk                    // Störung anzeigen ok, da 2.Zyklus aktiv !
      R      "M200.3"                                        // Üb.Zeit-Meldung nicht an PC senden

      A      Dyn.Sk_OUT.Err_Uebzeit
      S      Dyn.Sk_OUT.Err_Uebzeit_AnzOk                    // Störung anzeigen ok, da 2.Zyklus aktiv !

      L      "MW200"
      T      Error                                           // Schnittstelle nach Außen

// Störung vorhanden:
      L      0
      <>I                                                    // Ja !
      =      Dyn.Status.Error_aktiv
      CLR                                                    // Es gibt keine Quittier-Störung!
      A      Dyn.Error.Err_Uebzeit                           // Überwachungzeit ist abgelaufen
      S      hStOk

// Störungen pro Zyklus neu erzeugen:
      SET
      R      Dyn.Error.Puffer_DL                             // VollPuffer-Datenliste fehlerhaft
      R      Dyn.Error.Undef_Puffer                          // undefiniertes VollPuffer
      R      Dyn.Error.Err_Schritt                           // Schritt-Nummer ist nicht definiert
      R      Dyn.Error.Err_BLKMov
      R      Dyn.Error.Err_Puffer_nicht_leer_OUT             // Trolley unten in Schleuse, obwohl keine Daten! Initialisieren hat gestartet!
      R      Dyn.Error.Err_Trolley_nicht_in_Schleuse_OUT     // Trolley fährt nicht in unterer Schleuse
      R      Dyn.Error.Err_Trolley_raus_OUT                  // Trolley fährt nicht aus unterer Schleuse
      R      Dyn.Error.Err_Puffer_nicht_leer_IN              // Trolley mittig in Schleuse, obwohl keine Daten! Initialisieren hat gestartet!
      R      Dyn.Error.Err_Trolley_nicht_in_Schleuse_IN      // Trolley fährt nicht in mittlere Schleuse
      R      Dyn.Error.Err_Trolley_raus_IN                   // Trolley fährt nicht aus mittlere Schleuse
      R      Dyn.Error.Err_Raus_Sensor


--- NW 7: Statische VollPuffer-Parameter holen ---
      L      Puffer.VollPuffer_Nr                            // Nummer des VollPuffers
      L      VollPuffer_Nr                                   // Aufruf-Parameter
      ==I                                                    // Identisch ?
      R      Dyn.Error.Puffer_DL                             // VollPufferdatenbank fehlerhaft
      R      Dyn.Error.Undef_Puffer                          // undefiniertes VollPuffer
      JC     en06                                            // Ja !

      T      "MW200"                                         // Search-Daten

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

      JBI    G_Ok

      A      "M199.0"
      JCN    w060

      SET
      =      Dyn.Error.Puffer_DL                             // VollPufferdatenbank fehlerhaft

      L      16#A061
      T      Dyn.Stop_Ursache_OUT

      BEU

w060: SET
      S      Dyn.Error.Undef_Puffer                          // undefinierter VollPuffer

      L      16#0062
      T      Dyn.Stop_Ursache_IN
      T      Dyn.Stop_Ursache_OUT

      BEU

// Kennung + Datenbytes
G_Ok: SET
      R      Dyn.Error.Puffer_DL                             // Gefälledatenbank fehlerhaft
      R      Dyn.Error.Undef_Puffer                          // 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_VollPuffer, DSTBLK:=Puffer)   // Datenliste-Daten speichern | #Ziel

      L      16#0063
      T      Dyn.Stop_Ursache_IN
      T      Dyn.Stop_Ursache_OUT

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

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

      SET
      S      Dyn.Error.Undef_Puffer                          // undefinierter VollPuffer

      L      0                                               // VollPuffer ungültig !
      T      Puffer.VollPuffer_Nr                            // Nummer des VollPuffers

      L      16#0064
      T      Dyn.Stop_Ursache_IN
      T      Dyn.Stop_Ursache_OUT

      BEU

// Defaultwerte übergeben:
w061: NOP 0

      BEU

en06: NOP 0


--- NW 8: Störungen quittieren ---
      A      ErrQuit                                         // Überwachungszeit abgelaufen quittieren
      R      Dyn.Sk_IN.Err_Uebzeit
      R      Dyn.Sk_OUT.Err_Uebzeit


--- NW 9: Einfahrenden Trolley aus Reservierungliste austragen ---
      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")

// Austrag aus Trolley-Reservierungsliste
      L      Dyn.TrolleyID_Einfahrt                          // Eintrag ist erfolgt
      T      "MD220"

ResOut: L      Puffer.Puffer_Dyn_DW
      L      Puffer.PufferReservierungsliste_DW
      +I
      T      SSDW

CALL FC "DatenOut" (SSDB:=Puffer.Puffer_Dyn_DB, SSDW:=SSDW, PARA:=16#E100, SEARCHDATEN:=P#M220.0, RE_VAL:=Dyn.Rueckmld.RET_VAL_DL_Res_OUT, OUTDATEN:=P#M220.0, Position:="MW196")   // Eintrag löschen | Nicht relevant

      L      DINT#0
      T      Dyn.TrolleyID_Einfahrt

NoNewT: NOP 0


--- NW 10: Error: Stau Bereich-Eingang ---
// Sensor bei Bereichs-Einfahrt bleibt belegt?:
      AN     B_VollPufferEinfahrt                            // 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 11: Schleuse OUT: Mindestzeit geöffnet/frei, Position-Inks übergeben ---
      L      Dyn.Sk_OUT.Akt_Schritt
      L      6                                               // Mindestzeit ok?
      <>I                                                    // Nein!
      O      B_InSchleuse_OUT                                // Sensor Trolley in Schleuse vorhanden
      ON     "Schleuse_geöffnet_OUT"                         // Schleuse hat geöffnet
      R      Dyn.Status.MindestZeit_ok_OUT
      JC     X100                                            // FreiZeit neu aufziehen

      AN     "1s-Impuls"
      O
      A      Puffer.Parameter_allg.Antrieb_Plus_vorhanden
      AN     Antrieb_plus_aktiv
      O      Dyn.Status.MindestZeit_ok_OUT                   // Zeit bereits abgelaufen
      JC     Xn10

      L      Dyn.Mindest_Zeit_OUT                            // Sensor B_im_Sep ist frei [1s]
      +      +1
      T      Dyn.Mindest_Zeit_OUT                            // Sensor B_im_Sep ist frei [1s]

      L      Puffer.Mindeszeit_Schleuse_geoeffnet            // Mindest-Zeit erreicht ?
      >=I                                                    // Ja !
      S      Dyn.Status.MindestZeit_ok_OUT
      JCN    Xn10

X100: L      0                                               // Zeiten löschen
      T      Dyn.Mindest_Zeit_OUT                            // Sensor B_im_Sep ist frei [1s]

// Schleuse geöffnet: (Position-Inks übergeben)
Xn10: AN     "Schleuse_geöffnet_OUT"                         // Schleuse hat geöffnet
      JC     X10E

      L      Ausfahr_Inks
      L      Puffer.Puffer_Position_Inks
      >I                                                     // Rest-Inks-Wert ist größer!
      JC     X10E

      L      Puffer.Puffer_Position_Inks
      T      Ausfahr_Inks

X10E: NOP 0


--- NW 12: Reservierungs-Check ---
      L      Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege
      L      0
      ==I
      JC     NoResCheck                                      // Später -> Hauptstrangdaten checken!

      L      VollPuffer_Nr
      L      126
      >=I
      =      Puffer_B                                        // Puffer gehört zu Bereich B

// Keine Trolleydaten in Sorter A?
      A      "DVP_Sorter_A".Sorter_A_leer
      AN     Puffer_B                                        // Puffer gehört zu Bereich B
      JC     ResDel

// Keine Trolleydaten in Sorter A+B?
      A      "DVP_Sorter_A".Sorter_A_leer
      A      "DVP_Sorter_B".Sorter_B_leer
      A      Puffer_B                                        // Puffer gehört zu Bereich B
      JC     ResDel

// Ansonsten über Ziel-Check
// Daten vom 1.Reservierungs-Trolley holen:
      L      Dyn.Reservierungs_DL.Res_Trolley[1].Trolley_ID
      T      "TrolleyDL_SearchDaten".SEARCHDaten.TrolleyID

// Trolleydaten lesen:
CALL FC "DatenOut" (SSDB:=1000, SSDW:=0, PARA:=16#0000, SEARCHDATEN:=DB1012.DBX0.0, RE_VAL:="MB198", OUTDATEN:=DB1011.DBX0.0, Position:="MW200")   // Eintrag lesen

      L      "MB198"
      L      2#10000000                                      // Datensatz vorhanden?
      <>I                                                    // Nein!
      JC     NoResCheck

      L      "TrolleyDL_OutDaten".OUTDaten.EndZiel
      L      101                                             // VollPuffer ?
      >=I                                                    // Ja!
      A(
      CAC
      L      151                                             // VollPuffer ?
      <=I                                                    // Ja!
      )
      JC     NoResCheck                                      // Warten, Trolley kommt noch!

ResDel: L      Dyn.Reservierungs_DL.Res_Trolley[1].Trolley_ID
      T      "MD220"

      JU     ResOut

NoResCheck: NOP 0


--- NW 13: Puffer oben hat Platz / ist frei  ---
// Puffer hat Platz:
      L      Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege
      L      Puffer.MaxAnzahl_Einfahrt
      <I
      AN     Dyn.Error.Err_Stau_Einfahrt
      =      Status2."Puffer_hat Platz_IN"


--- NW 14: Starten aus VollPuffer aufgrund von Ausfahrsituation ok ---
      L      Puffer.Puffer_Position_Inks
      L      0                                               // Undefiniert ?
      ==I                                                    // Ja!
      JC     X14E

      L      Ausfahr_Inks                                    // Trolles auf Förderer vorbei?
      L      0                                               // Undefiniert ?
      ==I                                                    // Ja!
      JC     X14E

      L      Puffer.Puffer_Position_Inks
      L      20                                              // damit vorbeifahrender Trolley größeren Abstand bekommt
      -I
      L      Ausfahr_Inks                                    // Trolleys auf Förderer vorbei?
      >I                                                     // Ja!
      O(
      L      1                                               // Minimalwert ?
      ==I                                                    // Ja !
      )
      =      Inks_Ok

X14E: NOP 0


--- NW 15: OUT-Sprungverteiler  ---
OUT_Sk: L      Dyn.Sk_OUT.Neu_Schritt                        // Schritt, der im nächsten Zyklus aktiv werden soll
      L      -1                                              // angegeben ?
      ==I                                                    // Nein !
      JC     NEU

      CAC                                                    // Neuen Schritt übergeben
      T      Dyn.Sk_OUT.Akt_Schritt

      L      -1                                              // Urzustand
      T      Dyn.Sk_OUT.Neu_Schritt                          // Schritt, der im nächsten Zyklus aktiv werden soll

NEU:  SET
      R      Ueb_akt                                         // Überwachungszeit aktivieren
      R      Warte_neu                                       // Wartezeit neutriggern
      R      Warte_stop                                      // Wartezeit stoppen

      L      Dyn.Sk_OUT.Akt_Schritt
      JL     Ende
      JU     s000                                            // Schritt 0
      JU     s001                                            // Schritt 1
      JU     s002                                            // Schritt 2
      JU     s003                                            // Schritt 3
      JU     s004                                            // Schritt 4
      JU     s005                                            // Schritt 5
      JU     s006                                            // Schritt 6
      JU     s007                                            // Schritt 7
      JU     s008                                            // Schritt 8
      JU     s009                                            // Schritt 9
      JU     s010                                            // Schritt 10
      JU     s011                                            // Schritt 11
      JU     s012                                            // Schritt 12
      JU     s013                                            // Schritt 13
      JU     s014                                            // Schritt 14
      JU     s015                                            // Schritt 15
      JU     s016                                            // Schritt 16
      JU     s017                                            // Schritt 17
      JU     s018                                            // Schritt 18
      JU     s019                                            // Schritt 19
      JU     s020                                            // Schritt 20
      JU     s021                                            // Schritt 21
      JU     s022                                            // Schritt 22
      JU     s023                                            // Schritt 23
      JU     s024                                            // Schritt 24
      JU     s025                                            // Schritt 25
      JU     s026                                            // Schritt 26
      JU     s027                                            // Schritt 27
      JU     s028                                            // Schritt 28
      JU     s029                                            // Schritt 29
      JU     s030                                            // Schritt 30
Ende: S      Dyn.Sk_OUT.Err_Schritt                          // Undefinierter Schritt

      L      16#A131
      T      Dyn.Stop_Ursache_OUT

      JU     RET

Neu_Mig: A      Dyn.Sk_OUT.Err_Uebzeit
      JCN    Sk

      L      16#A132
      T      Dyn.Stop_Ursache_OUT

      JU     RET

Sk:   T      Dyn.Sk_OUT.Akt_Schritt

      L      0                                               // Zeitwerte löschen
      T      Dyn.Sk_OUT.Terr_Zelle
      T      Dyn.Sk_OUT.Tok_Zelle

      JU     NEU

// Nicht programmierte Schritte:
// s000: SPA   Ende
// s001: SPA   Ende
// s002: SPA   Ende
s003: JU     Ende
s004: JU     Ende
// s005: SPA   Ende
// s006: SPA   Ende
// s007: SPA   Ende
s008: JU     Ende
s009: JU     Ende
s010: JU     Ende
s011: JU     Ende
s012: JU     Ende
s013: JU     Ende
s014: JU     Ende
s015: JU     Ende
s016: JU     Ende
s017: JU     Ende
s018: JU     Ende
s019: JU     Ende
// s020: SPA   Ende
// s021: SPA   Ende
s022: JU     Ende
s023: JU     Ende
s024: JU     Ende
s025: JU     Ende
s026: JU     Ende
s027: JU     Ende
s028: JU     Ende
s029: JU     Ende
s030: JU     Ende


--- NW 16: OUT-Schritt X: Reserve            ---
      SET                                                    // Weiterschaltbedingung
      =      Weiter

// Schrittaktionen:
      SET

      L      16#B001
      T      Dyn.Stop_Ursache_OUT

      A      Dyn.Sk_OUT.Reset_Akt                            // Reset ist aktiv
      L      20                                              // Weiter mit Schritt 20
      JC     Neu_Mig                                         // Bei diesem Schritt weiter

      A      Weiter                                          // Weiterschaltbedingung ist erfüllt
      R      Dyn.Sk_OUT.Err_Uebzeit                          // Sofort weiter !
      L      0                                               // Angabe der Wartezeit (*10ms)
      JC     Plus                                            // Nächsten Schritt starten

      L      1                                               // Weiter mit Schritt 1
      JC     Neu_Mig                                         // Bei diesem Schritt weiter

      T      Dyn.Sk_OUT.Neu_Schritt                          // Schritt, der im nächsten Zyklus aktiv werden soll

      SET
      A      Dyn.Sk_OUT.Auto_akt                             // Automatik ist aktiv
      A      Dyn.Sk_OUT.Bereich_ok
      =      Ueb_akt                                         // Überwachungszeit aktivieren
      L      50                                              // Angabe der Überwachungszeit (*1s)
      JU     tueb                                            // Überwachungszeit

      JU     RET


--- NW 17: OUT-Schritt 0: Warten auf Trolley ---
s000: SET                                                    // Weiterschaltbedingung
      A      B_InSchleuse_OUT                                // Trolley im Schleuse erkannt
      A      Dyn.Sk_OUT.Auto_akt                             // Automatik ist aktiv
      A      Dyn.Sk_OUT.Bereich_ok
      =      Weiter

// Schrittaktionen:
      SET
      R      Dyn.Error.Err_Puffer_nicht_leer_OUT

      A      Dyn.Sk_OUT.Reset_Akt                            // Reset ist aktiv
      L      20                                              // Weiter mit Schritt 20
      JC     Neu_Mig                                         // Bei diesem Schritt weiter

      L      0
      T      Dyn.TrolleyID_Schleuse_Out

      A      Weiter                                          // Weiterschaltbedingung ist erfüllt
      R      Dyn.Sk_OUT.Err_Uebzeit                          // Sofort weiter !
      L      100                                             // Angabe der Wartezeit (*10ms)
      JC     Plus                                            // Nächsten Schritt starten

      L      16#B001
      T      Dyn.Stop_Ursache_OUT

      JU     RET


--- NW 18: OUT-Schritt 1: Trolley ist in Schleuse ---
s001: NOP 0

// Schrittaktionen:
      AN     B_InSchleuse_OUT                                // Trolley im Schleuse erkannt
      L      0                                               // Weiter mit Schritt 0
      JC     Neu_Mig                                         // Bei diesem Schritt weiter

      L      2                                               // Weiter mit Schritt 2
      JU     Neu_Mig                                         // Bei diesem Schritt weiter


--- NW 19: OUT-Schritt 2: Ausfahren ok ? ---
s002: NOP 0

// Schrittaktionen:
      AN     B_InSchleuse_OUT                                // Trolley im Schleuse erkannt
      L      0                                               // Weiter mit Schritt 0
      JC     Neu_Mig                                         // Bei diesem Schritt weiter

      SET
      S      Dyn.Status."Trolley_wartet_Bereich+1"

// Anlage aus oder Störung:
      L      16#B020
      T      Dyn.Stop_Ursache_OUT

      AN     Dyn.Sk_OUT.Auto_akt                             // Automatik ist aktiv
      ON     Dyn.Sk_OUT.Bereich_ok                           // Bereich ist gestört
      JC     X002

// Starten erlaut Trolley ?:
      L      16#B021
      T      Dyn.Stop_Ursache_OUT

      AN     Start_Ok                                        // Starten ist erlaubt
      JC     X002

// Inks ok ?:
      L      16#B022
      T      Dyn.Stop_Ursache_OUT

      AN     Inks_Ok                                         // Starten ist erlaubt
      JC     X002

// Stau im Bereich +1:
      L      16#B023
      T      Dyn.Stop_Ursache_OUT

      A      B_Stau_raus_Out
      JC     X002                                            // Stau

// B_Aus_Schleuse aktiv:
      L      16#B024
      T      Dyn.Stop_Ursache_OUT

      A      Puffer.Parameter_allg.B_AusSep_vorhanden
      A      B_AusSchleuse_OUT
      =      Dyn.Error.Err_Raus_Sensor                       // Raus-Sensor wird nicht erreicht (oder dauernd aktiv)!
      JC     X002

// Antriebe aktivieren / aktiv ?:
      A      Puffer.Parameter_allg.Antrieb_Plus_vorhanden    // Schleuse an weiterem Antrieb (Weiche)
      S      Antrieb_plus_start                              // Kreisel-Antrieb plus starten

      L      16#B025
      T      Dyn.Stop_Ursache_OUT

      AN     Antrieb_plus_aktiv                              // Kreisel-Antrieb plus aktiv
      A      Puffer.Parameter_allg.Antrieb_Plus_vorhanden    // Schleuse an weiterem Antrieb (Weiche)
      ON     Dyn.Sk_OUT.Auto_akt                             // Automatik ist aktiv
      ON     Dyn.Sk_OUT.Bereich_ok
      JC     RET

      L      5                                               // Nur 1 langes Signal!
      JU     Neu_Mig                                         // Bei diesem Schritt weiter

X002: L      1                                               // Auftrag checken
      T      Dyn.Sk_OUT.Neu_Schritt                          // Schritt, der im nächsten Zyklus aktiv werden soll
      JU     RET


--- NW 20: OUT-Schritt 5: Trolley fährt aus/ausgefahren ?    ---
s005: SET                                                    // Weiterschaltbedingung
      AN     B_InSchleuse_OUT                                // Sensor Trolley ist in Schleuse
      A(
      O      B_AusSchleuse_OUT                               // Sensor Trolley aus Schleuse gefahren
      ON     Puffer.Parameter_allg.B_AusSep_vorhanden
      )
      A      Antrieb_plus_aktiv
      =      Weiter

// Schrittaktionen:
      SET
      R      Start_Ok                                        // Damit kein weiterer Puffer ausfährt
      S      Y_Schleuse_Auf_OUT                              // Schleuse öffnen
      S      Dyn.Status."Trolley_fährt_aus_OUT"
      S      Antrieb_plus_start                              // Kreisel-Antrieb plus starten

// Trolley ist draussen:
      A(
      O      B_AusSchleuse_OUT                               // Sensor Trolley aus Schleuse gefahren
      ON     Puffer.Parameter_allg.B_AusSep_vorhanden
      )
      R      Dyn.Sk_OUT.Err_Uebzeit                          // Sofort weiter !
      R      Dyn.Error.Err_Trolley_raus_OUT                  // Trolley fährt nicht aus
      L      0
      JC     Plus                                            // Nächsten Schritt starten

      A      Weiter                                          // Weiterschaltbedingung ist erfüllt
      R      Dyn.Sk_OUT.Err_Uebzeit                          // Sofort weiter !
      R      Dyn.Error.Err_Trolley_raus_OUT                  // Trolley fährt nicht aus
      L      50                                              // Falls nur mit Sensor gefahren wird, dann Wartezeit!
      JC     Plus                                            // Nächsten Schritt starten

// Trolley fährt nicht raus!:
      A      Dyn.Sk_OUT.Err_Uebzeit
      O      B_QuerTrolley_Out                               // QuerTrolley auf Crashkurs
      S      Dyn.Error.Err_Trolley_raus_OUT                  // Trolley fährt nicht aus

      L      16#B051
      T      Dyn.Stop_Ursache_OUT

      AN     B_AusSchleuse_OUT                               // Sensor Trolley aus Schleuse gefahren
      JC     x052

      L      16#B052
      T      Dyn.Stop_Ursache_OUT

x052: A      Antrieb_plus_aktiv
      =      Ueb_akt                                         // Überwachungszeit aktivieren
      L      Puffer."Übzeit_aus_Schleuse"                    // Angabe der Überwachungszeit (*1s)
      JU     tueb                                            // Überwachungszeit


--- NW 21: OUT-Schritt 6: Schleuse Mindestzeit geöffnet ?       ---
s006: SET                                                    // Weiterschaltbedingung
      A      Dyn.Status.MindestZeit_ok_OUT
      O
      A      Puffer.Parameter_allg.B_AusSep_vorhanden
      A      B_AusSchleuse_OUT                               // Sensor Trolley aus Schleuse gefahren
      =      Weiter

// Schrittaktionen:
      A      B_QuerTrolley_Out                               // QuerTrolley auf Crashkurs
      S      Dyn.Error.Err_Trolley_raus_OUT                  // Trolley fährt nicht aus

      SET
      R      Start_Ok                                        // Damit kein weiterer Puffer ausfährt
      S      Y_Schleuse_Auf_OUT                              // Schleuse öffnen
      S      Antrieb_plus_start                              // Kreisel-Antrieb plus starten
      S      Dyn.Status."Trolley_fährt_aus_OUT"

      A      B_InSchleuse_OUT                                // Trolley wieder erkannt
      L      5                                               // Weiter mit Schritt 5
      JC     Neu_Mig                                         // Bei diesem Schritt weiter

      A      Weiter
      L      0
      JC     Plus                                            // Nächsten Schritt starten

      L      16#B061
      T      Dyn.Stop_Ursache_OUT

      JU     RET

--- NW 22: OUT-Schritt 7: Trolleydaten ändern            ---
s007: SET                                                    // Weiterschaltbedingung
      =      Weiter

// Schrittaktionen:
      SET
      R      Dyn.Status.Einen_VollTrolley_ausfahren_OUT
      S      Dyn.Status.Trolley_draussen_Out                 // 1 Zyklus

      L      Dyn.Vereinzelungstakte_OUT
      +      DINT#1                                          // Vereinzelungen +1
      T      Dyn.Vereinzelungstakte_OUT

      JU     ENDE_Mig


--- NW 23: OUT-Schritt 20: Schleuse resetten ---
s020: SET                                                    // Weiterschaltbedingung
      =      Weiter                                          // Weiterschaltbedingung ist erfüllt

// Schrittaktionen:
      A      "Schleuse_geöffnet_OUT"
      R      Start_Ok                                        // Damit kein weiterer Puffer ausfährt

      L      16#B201
      T      Dyn.Stop_Ursache_OUT

      A      Weiter                                          // Weiterschaltbedingung ist erfüllt
      L      300                                             // Angabe der Wartezeit (*10ms)
      JC     Plus                                            // Nächsten Schritt starten

      SET
      =      Ueb_akt                                         // Überwachungszeit aktivieren
      L      30                                              // Angabe der Überwachungszeit (*100ms)
      JU     tueb                                            // Überwachungszeit


--- NW 24: OUT-Schritt 21: Reset ist zu Ende ---
s021: SET
      R      Dyn.Sk_OUT.Reset_Akt                            // Reset ist aktiv
      R      Dyn.HMI.Schleuse_resetten_OUT

      JU     ENDE_Mig                                        // Neubeginn


--- NW 25: OUT-Schrittkette beenden ---
ENDE_Mig: L      0                                           // Schritt 0: Warten
      T      Dyn.Sk_OUT.Akt_Schritt

      L      0                                               // Zeitwert löschen
      T      Dyn.Sk_OUT.Terr_Zelle
      T      Dyn.Sk_OUT.Tok_Zelle

      SET
      R      Dyn.Sk_OUT.Err_Uebzeit

      JU     RET


--- NW 26: OUT-Nächsten Schritt aktivieren ---
Plus: T      Dyn.Sk_OUT.T_ok                                 // Wartezeit übergeben

      A      Dyn.Sk_OUT.Err_Uebzeit                          // Störung noch nicht quittiert
      JC     RET

      L      0                                               // keine Wartezeit ?
      ==I                                                    // Ja ! -> sofort weiter
      JC     w220

      AN     Warte_neu                                       // Wartezeit neutriggern
      JC     W220_Mig

      L      0
      T      Dyn.Sk_OUT.Tok_Zelle                            // Wartezeit

W220_Mig: A      Warte_stop                                  // Wartezeit stoppen
      JC     RET

      L      Dyn.Sk_OUT.Tok_Zelle
      L      "MW4"                                           // Wartezeit +10ms
      +I
      T      Dyn.Sk_OUT.Tok_Zelle                            // Wartezeit
      L      Dyn.Sk_OUT.T_ok                                 // abgelaufen ?
      <I                                                     // Nein !
      JC     RET

w220: L      Dyn.Sk_OUT.Akt_Schritt
      +      1                                               // Schritt +1
      T      Dyn.Sk_OUT.Akt_Schritt

      L      0                                               // Zeitwerte löschen
      T      Dyn.Sk_OUT.Terr_Zelle
      T      Dyn.Sk_OUT.Tok_Zelle

      JU     RET


--- NW 27: OUT-Überwachungszeit kontrollieren ---
tueb: A      Ueb_akt
      =      Dyn.Sk_OUT.Ueb_akt                              // Für Statuskontrolle

      T      Dyn.Sk_OUT.T_Err                                // Für Statuskontrolle
      L      Dyn.Sk_OUT.Terr_Zelle                           // Maximalzeit
      >I                                                     // abgelaufen ?
      AN     Dyn.Sk_OUT.Err_Uebzeit
      JC     en24                                            // Nein !

      A      Ueb_akt                                         // Überwachungszeit aktivieren
      S      Dyn.Sk_OUT.Err_Uebzeit

      L      0                                               // Zeitwert löschen
      T      Dyn.Sk_OUT.Terr_Zelle

      JU     RET

en24: NOP 0

--- NW 28: OUT-Überwachungszeit +1 ---
      AN     Dyn.Sk_OUT.Ueb_akt                              // Schrittaktion ist aktiv
      ON     "1s-Impuls"
      JC     RET

      L      Dyn.Sk_OUT.Terr_Zelle
      +      1                                               // Üb.zeit +1s
      T      Dyn.Sk_OUT.Terr_Zelle

      JU     RET


--- NW 29: Ende ---
RET:  NOP 0

      BE

