=== FB 176: MSepSorterRein  [STL] ===
INTERFACE:
  Input:
    Separator_Nr : Int                                  // Aufruf für Separator
    ErrQuit : Bool                                      // Ablaufstörung quittieren
    B_VorSep : Bool                                     // Sensor BT fährt in Bereich
    B_ImSep : Bool                                      // Sensor BT ist im Separator
    B_AusSep : Bool                                     // Sensor BT hat Separator verlassen
    B_Beladen_im_Sep : Bool                             // Sensor BT ist beladen im Sep
    B_Pinsensor : Bool                                  // Zustand Pinsensor
    B_Beladen_nach_Sep : Bool                           // Sensor BT ist beladen nach Sep
    Start_Ok : Bool                                     // Starten ist erlaubt
    Antrieb_aktiv : Bool                                // Kreisel-Antrieb aktiv
    Antrieb_plus_aktiv : Bool                           // Kreisel-Antrieb plus aktiv
  Output:
    Y_Sep_Auf : Bool                                    // Separator öffnen
    K_Sanner_triggern : Bool                            // Scanner triggern
    Sorter_Reset : Bool                                 // Sorterbereich resetten
    Error : Word                                        // Störungen übergeben
  InOut:
    Antrieb_start : Bool                                // Kreiselantrieb starten
    Antrieb_plus_start : Bool                           // Kreisel-Antrieb plus starten
    Antrieb_stoppen : Bool                              // Kreiselantrieb stoppen
    hStOk : Bool                                        // Anzeige Start n. Störung aktivieren
  Static:
    Res1 : Array[1..1] of Int                           // Reserve
    SAVE : Struct
      Frei : DInt
      Sensorfrei_Zeit : Int                             // Sensor B_imSep ist frei [10ms]
      Last_Ziel : Int                                   // Letztes angefahrenes Ziel
    Para : Struct                                       // Parameter
      Separator_DL_DB : Int                             // Einsprung Separator-Datenliste-DB
      Separator_DL_DW : Int                             // Einsprung Separator-Datenliste-DW
      Res1 : Array[1..3] of Int                         // Reserve
    Separator : "UDLSepSorterRein"                      // Fahrbereichs Daten
    Dyn : Struct                                        // Dynamische Daten
      Status : Struct
        Vereinzelungstakte : DInt                       // Anzahl der getätigten Vereinzelungstakte
        Stop_Ursache : Word                             // Stop-Stelle: Nw + Position
        Betriebsart_Art : Struct                        // Aktive Betriebsart
          Listen : Bool                                 // [SCTL=1] Meldung an PC, falls BT in Schleuse
          Rapidfire : Bool                              // [SCTL=2] Alle BTs austakten (ohne Ende)
          TillEmpty : Bool                              // [SCTL=3] Alle BTs austakten (Ende nach zeitlang kein BT)
          Job : Bool                                    // [SCTL=4] Anzahl von BTs austakten (Ende nach Anzahl)
          Job_TillEmpty : Bool                          // [SCTL=5] Anzahl von BTs austakten (Ende nach zeitlang kein BT)
          DestFull : Bool                               // [SCTL=6] Alle BTs austakten (bis Stau-Sensor aktiv)
          Scannen : Bool                                // [SCTL=7] Ausfahren über Scanner + PC-Rückmeldung
          Scannen_TillEmpty : Bool                      // [SCTL=8] wie oben [SCTL=7](Ende nach zeitlang kein BT)
          PC_Del : Bool                                 // Betriebsart aufgrund vom PC löschen
          Sack_Tel : Bool                               // Sack-Telegramm senden
          Res12 : Bool
          BT_leer : Bool                                // BT/MT ist leer
          BT_beladen : Bool                             // BT/MT ist beladen
          BT_kommt : Bool                               // BT/MT fährt zum Sep
          Stau_vor_Sep : Bool                           // Stau vor Separator-Einfahrt
          ErrBLKMov : Bool                              // Fehler bei Block kopieren
        Betriebsart_Ziel : Int                          // Ziel für BTs
        Betriebsart_Anzahl_Soll : Int                   // Anzahl der zu fahrenden BTs
        Betriebsart_Anzahl_Ist : Int                    // Anzahl der gefahrenden BTs
        Betriebsart_Quelle : Int := -1                  // Betriebsart: Partner, der Betriebart gestartet hat
      Sk : "USk_ILS"                                    // Status der Schrittkette
      Scanner : Struct
        Send_IDX : DInt                                 // IDX, welche mit DREQ zum PC gesendet wurde
        Rec_IDX : DInt                                  // Index
        Rec_DEST_Ziel : Int                             // 1...X Ziellinie
        Rec_DEST_Type : Byte                            // 0=fix, 1=fallback, ...
      Rueckmld : Struct
        RET_VAL_BLKMOV_Separator : Int                  // Rückmeldung nach BLKMOV-Aufruf
        RET_VAL_DL_SortRein : Byte                      // Rückmeldung nach DatenOut-Aufruf
        RET_VAL_TravelFIFO_In : Byte                    // Rückmeldung nach Aufruf
        RET_VAL_TravelFIFO_Out : Byte                   // Rückmeldung nach Aufruf
        RET_VAL_TravelFIFO_Reset : Byte                 // Rückmeldung nach Aufruf
        RET_VAL_SendFIFO : Byte                         // Rückmeldung nach SendPC_FIFO-Aufruf
        RET_VAL_Res : Byte
      Error : "UErrSepSorterRein"
      ohne_B_starten : Bool                             // 1.Vereinzelung auch ohne B_im_Sep
      Betriebsart_del : Bool                            // Betriebsart löschen
      Scannerdaten : Bool                               // Scannerdaten erhalten
      Dest0 : Bool                                      // PC-Antwort mit Ziel=0 erhalten
      BT_draussen : Bool                                // BT/MT hat Separator verlassen
      B_Beladen : Bool                                  // BT/MT ist beladen (über Sensor)
      BT_gestartet : Bool                               // BT ist aus Separator gestartet (nur 1 Zyklus)
      BT_draussen_erkannt : Bool                        // Sensor hat BT draussen erkannt
      Del_Last_Ziel_Flag : Bool                         // Bei diesem Flag letzes Ziel löschen
      SorterReset_Start_Flag : Bool                     // Bei diesem Flag Sorter-Reset starten
      GesamtSorterReset : Bool                          // Gesamten Sorterbereich resetten
      GesamtSorterReset_aktiv : Bool                    // Gesamten Sorterbereich resetten ist aktiv
      BT_beruhigt : Bool                                // 1. einfahrender BügelTräger ist im Sep
      Flanke_Pin : Bool                                 // Flankenmerker für Pin-Signal
      Gleiches_Ziel : Bool                              // BT hat gleiches Ziel
      BT_beladen : Bool                                 // BT ist beladen
      Del_Last_Ziel_Ink : DInt                          // Bei diesen Inks letztes Ziel löschen
      SorterReset_Start_Ink : DInt                      // Bei diesen Inks Sorter-Reset starten
      Max_Wert : DInt                                   // Maximal erlaubter Zählwert
      Stau_Zeit : Int                                   // Sensor B_VorSep ist belegt [10ms]
      Frei_Zeit : Int                                   // Sensor B_VorSep ist frei [10ms]
      Err_Zeit : Int                                    // BT fährt nicht in Sep [10ms]
      Stop_Ursache : Word                               // Stop-Stelle: Nw + Position
      Ursache_Anz : Int                                 // Anzeige Stop-Ursache [100ms]
      Leer_Zeit : Int
  Temp:
    Quelle : Any                                        // Zeiger, wo Rein-Daten sind
    Ziel : Any                                          // Zeiger, FIFO-Stelle
    Warte_neu : Bool                                    // Wartezeit
    Ueb_akt : Bool                                      // Überwachungszeit aktivieren
    Err_Uebzeit : Bool                                  // Überwachungzeit ist abgelaufen
    Weiter : Bool                                       // Weiterschaltbedingung ist erfüllt
    Warte_stop : Bool                                   // Wartezeit stoppen
    Lauf_Flag : Bool                                    // Zähl-Lauf mit Flag ist aktiv
    Flag_Lauf_fertig : Bool                             // Flag-Lauf wurde beendet
    Ohne_Lauf_fertig : Bool                             // Ohne Flag-Lauf wurde beendet
    Max_Uebergabe : Bool                                // MaxWert wird gerade übertragen !
    PinSignal : Bool
    IDX_Ok : Bool                                       // Send_IDX bekannt
    Ink_Wert : DInt                                     // Aktueller Inkrementalwert
    BT_State : Byte                                     // Beladezustand des BTs
    DatenDB : Int                                       // DB öffnen
    AR1Zeiger : DWord                                   // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
  Constant:

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

      L      "MW174"                                         // Einsprung Separator-DL
      T      Para.Separator_DL_DB                            // vor Aufruf übergeben!
      L      0
      T      Para.Separator_DL_DW


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

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

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

      L      Dyn.Sk.Akt_Schritt                              // Aktiver Schritt
w010: T      Dyn.Sk.OP_Schritt


--- NW 3: Out-Bits zum Zurücksetzen ---
      A      B_Pinsensor                                     // Zustand Pinsensor
      Rise   Dyn.Flanke_Pin                                  // Flankenmerker für Pin-Signal
      =      PinSignal

      SET
      R      K_Sanner_triggern                               // Scanner triggern
      R      Sorter_Reset                                    // Sorterbereich resetten
      R      Dyn.BT_gestartet                                // BT ist aus Separator gestartet (nur 1 Zyklus)

      CLR                                                    // Erst nach Err BT fährt nicht ein!
      R      Y_Sep_Auf                                       // Separator öffnen

// Antrieb anhalten:
      A      Dyn.Error.Err_BT_raus                           // BT/MT fährt nicht aus
      AN     ErrQuit
      S      Antrieb_stoppen                                 // Da auf PinBand vereinzelt wird!
      A      Dyn.Error.Err_BT_raus                           // BT/MT fährt nicht aus
      S      hStOk

// Stop-Ursache anzeigen:
      AN     "100ms-Impuls"
      JC     En03

      L      Dyn.Ursache_Anz                                 // Anzeige Stop-Ursache [100ms]
      +      1
      T      Dyn.Ursache_Anz
      L      5
      <I
      JC     En03

      L      Dyn.Stop_Ursache                                // gespeicherte Ursache von Zyklus -1
      T      Dyn.Status.Stop_Ursache                         // nach außen übergeben

      L      0
      T      Dyn.Ursache_Anz                                 // Anzeige Stop-Ursache [100ms]
      T      Dyn.Stop_Ursache                                // gespeicherte Ursache von Zyklus -1

En03: NOP 0


--- NW 4: Schrittkette zurücksetzen ---
      AN     Dyn.Sk.Reset                                    // SK zurücksetzen
      AN     Dyn.GesamtSorterReset
      JC     en04

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

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

      SET
      R      Dyn.Sk.Err_Schritt                              // Undefinierter Schritt
      R      Dyn.Sk.Err_Uebzeit                              // Sofort weiter !

      A      Dyn.GesamtSorterReset                           // Gesamten Sorterbereich resetten
      R      Dyn.GesamtSorterReset
      S      Dyn.GesamtSorterReset_aktiv                     // Gesamten Sorterbereich resetten ist aktiv

      A      Dyn.GesamtSorterReset_aktiv                     // Gesamten Sorterbereich resetten ist aktiv
      CLR                                                    // //
      JC     en04

      A      Dyn.Sk.Reset                                    // SK zurücksetzen
      R      Dyn.Sk.Reset
      S      Dyn.Sk.Reset_Akt                                // Reset ist aktiv

      SET
      R      Dyn.Status.Betriebsart_Art.ErrBLKMov            // Error bei Block kopieren
      R      Dyn.Error.Separator_DL                          // Separator-Datenliste fehlerhaft
      R      Dyn.Error.Undef_Separator                       // undefinierter Separator
      R      Dyn.Error.Err_BT_rein                           // BT/MT fährt nicht in Separator
      R      Dyn.Error.Err_Uebzeit                           // Überwachungzeit ist abgelaufen
      R      Dyn.Error.Err_Schritt                           // Schritt-Nummer ist nicht definiert
      R      Dyn.Error.Err_PinSignal                         // Es kommt kein Pin-Signal
      R      Dyn.Error.Err_BT_raus                           // BT/MT fährt nicht aus
      R      Dyn.Error.Err_Raus_Sensor                       // Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)!
      R      Dyn.Error.Travel_FIFO                           // Travel-FIFO fehlerhaft
      R      Dyn.Error.Daten_out                             // Letzte Carrier-Daten konnten nicht an FIFO übergeben werden
      R      Dyn.Error.BC_doppelt                            // Wieder gleichen BC von PC erhalten
//     R     #Dyn.Error.Korrektur_Modus_aktiv    //Korrektur-Modus nach Crash aktiviert (wird vor Aufruf gesetzt!)
      R      Dyn.Error.Send_FIFO_fehlerhaft                  // Send-FIFO zum PC ist fehlerhaft
      R      Dyn.Error.Send_FIFO_voll                        // Send-FIFO zu PC ist voll

      SET
      R      Dyn.ohne_B_starten                              // 1.Vereinzelung auch ohne B_im_Sep
      R      Dyn.Scannerdaten                                // Scannerdaten erhalten
      R      Dyn.BT_gestartet                                // BT ist aus Separator gestartet (nur 1 Zyklus)
      R      Dyn.BT_draussen_erkannt                         // Sensor hat BT draussen erkannt
      R      Dyn.BT_draussen                                 // BT/MT hat Separator verlassen
      R      Dyn.B_Beladen                                   // BT/MT ist beladen (über Sensor)
      R      Dyn.Dest0
      R      Dyn.Status.Betriebsart_Art.BT_kommt             // BT/MT fährt zum Sep
      S      Dyn.Status.Betriebsart_Art.Stau_vor_Sep         // Stau vor Separator-Einfahrt (damit Einfahrt erst mal blockiert ist)
      R      Dyn.SorterReset_Start_Flag                      // Bei diesem Flag Sorter-Reset starten

      L      0
      T      Dyn.Scanner.Send_IDX                            // damit neue IDX geholt wird
      T      Dyn.Scanner.Rec_IDX
      T      Dyn.Scanner.Rec_DEST_Ziel
      T      Dyn.Scanner.Rec_DEST_Type

      L      0
      T      Dyn.Stau_Zeit                                   // Sensor B_VorSep ist belegt [10ms]
      T      Dyn.Frei_Zeit                                   // Sensor B_VorSep ist frei [10ms]
      T      Dyn.Err_Zeit                                    // BT fährt nicht in Sep [10ms]
      L      0
      T      Dyn.SorterReset_Start_Ink                       // Bei diesen Inks Sorter-Reset starten

// Defaultwerte übergeben:
      A      Separator.Default_Betriebsart.Listen            // Betriebart nach Urlöschen/Reset
      =      Dyn.Status.Betriebsart_Art.Listen
      A      Separator.Default_Betriebsart.Rapidfire
      =      Dyn.Status.Betriebsart_Art.Rapidfire
      A      Separator.Default_Betriebsart.TillEmpty
      =      Dyn.Status.Betriebsart_Art.TillEmpty
      A      Separator.Default_Betriebsart.Job
      =      Dyn.Status.Betriebsart_Art.Job
      A      Separator.Default_Betriebsart.Job_TillEmpty
      =      Dyn.Status.Betriebsart_Art.Job_TillEmpty
      A      Separator.Default_Betriebsart.DestFull
      =      Dyn.Status.Betriebsart_Art.DestFull
      A      Separator.Default_Betriebsart.Scannen
      =      Dyn.Status.Betriebsart_Art.Scannen

      L      Separator.Default_Ziel                          // Ziel nach Urlöschen/Reset
      T      Dyn.Status.Betriebsart_Ziel                     // Ziel für BTs

      L      0                                               // Damit statische Werte neu aus Datenbank geholt werden !
      T      Separator.Separator_Nr                          // Nummer des Separators

// Travel-FIFO zurücksetzen:
CALL FC "FifoReset" (SSDB:=Separator.Parameter_SorterRein.TravelFIFO_DB, SSDW:=Separator.Parameter_SorterRein.TravelFIFO_DW, PARA:=WORD#16#0000, RE_VAL:="MB199")   // normaler FIFO

      L      "MB199"
      T      Dyn.Rueckmld.RET_VAL_TravelFIFO_Reset
      L      0                                               // Aufruf mit Fehler ?
      <>I                                                    // Ja !
      S      Dyn.Error.Travel_FIFO                           // Travel-FIFO fehlerhaft

      L      0
      T      SAVE.Last_Ziel                                  // Letztes angefahrenes Ziel speichern

      BEU

en04: NOP 0

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

      A      Dyn.Error.Separator_DL                          // Separator-Datenliste fehlerhaft
      =      "M200.0"
      A      Dyn.Error.Undef_Separator                       // undefinierter Separator
      =      "M200.1"
      A      Dyn.Error.Err_BT_rein                           // BT/MT fährt nicht in Separator
      =      "M200.2"
      A      Dyn.Sk.Err_Uebzeit
      =      Dyn.Error.Err_Uebzeit                           // Überwachungzeit ist abgelaufen
      =      "M200.3"
      NEG
      R      Dyn.Sk.Err_Uebzeit_AnzOk
      A      Dyn.Sk.Err_Schritt
      =      Dyn.Error.Err_Schritt                           // Schritt-Nummer ist nicht definiert
      =      "M200.4"
      A      Dyn.Error.Err_Betriebsart                       // Betriebsart ist nicht möglich
      =      "M200.5"
      A      Dyn.Error.Err_PinSignal                         // Es kommt kein Pin-Signal
      =      "M200.6"
      A      Dyn.Error.Err_BT_raus                           // BT/MT fährt nicht aus
      =      "M200.7"
      A      Dyn.Error.Err_Raus_Sensor                       // Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)!
      =      "M201.0"
      A      Dyn.Error.Travel_FIFO                           // Travel-FIFO fehlerhaft
      =      "M201.1"
      A      Dyn.Error.Daten_out                             // Letzte Carrier-Daten konnten nicht an Travel-FIFO übergeben werden
      =      "M201.2"
      A      Dyn.Error.BC_doppelt                            // Wieder gleichen BC von PC erhalten
      =      "M201.3"
      A      Dyn.Error.Korrektur_Modus_aktiv                 // Korrektur-Modus nach Crash aktiviert (wird vor Aufruf gesetzt!)
      =      "M201.4"
      A      Dyn.Error.Send_FIFO_fehlerhaft                  // Send-FIFO zum PC ist fehlerhaft
      =      "M201.5"
      A      Dyn.Error.Send_FIFO_voll                        // Send-FIFO zu PC ist voll
      =      "M201.6"
      A      Dyn.Sk.Reset_Akt                                // Reset ist aktiv
      O      Dyn.GesamtSorterReset_aktiv                     // Gesamten Sorterbereich resetten 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.Err_Uebzeit_AnzOk                        // Störung anzeigen ok, da 2.Zyklus aktiv !
      R      "M200.3"                                        // Üb.Zeit-Meldung nicht an PC senden

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

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


--- NW 6: Statische Separator-Parameter holen ---
      L      Separator.Separator_Nr                          // Nummer des Separators
      L      Separator_Nr                                    // Aufruf-Parameter
      ==I                                                    // Identisch ?
      R      Dyn.Error.Separator_DL                          // Separatordatenbank fehlerhaft
      R      Dyn.Error.Undef_Separator                       // undefinierter Separator
      JC     en06                                            // Ja !

      T      "MW200"                                         // Search-Daten

CALL FC "DatenOut" (SSDB:=Para.Separator_DL_DB, SSDW:=Para.Separator_DL_DW, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196")

      L      "MB199"
      T      Dyn.Rueckmld.RET_VAL_DL_SortRein                // Rückmeldung bei Datenbank-Zugriff (Gefälle-DL)

      JBI    G_Ok

      A      "M199.0"
      JCN    w060

      SET
      =      Dyn.Error.Separator_DL                          // Separatordatenbank fehlerhaft

      L      16#A061
      T      Dyn.Stop_Ursache

      BEU

w060: SET
      S      Dyn.Error.Undef_Separator                       // undefinierter Separator

      L      16#A062
      T      Dyn.Stop_Ursache

      BEU

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

      L      16#A063
      T      Dyn.Stop_Ursache

      L      Dyn.Rueckmld.RET_VAL_BLKMOV_Separator           // Rückmeldung
      L      0                                               // Fehler vorhanden ?
      <>I                                                    // Ja !
      =      Dyn.Status.Betriebsart_Art.ErrBLKMov            // Error bei Block kopieren
      BEC

      L      Separator.Separator_Typ                         // Separatortyp = 176 (SorterRein)
      L      176                                             // Dieser Aufruf-FB ?
      ==I                                                    // Ja !
      JC     w061

      SET
      S      Dyn.Error.Undef_Separator                       // undefinierter Separator

      L      0                                               // Separator ungültig !
      T      Separator.Separator_Nr                          // Nummer des Separators

      L      16#A064
      T      Dyn.Stop_Ursache

      BEU

// Defaultwerte übergeben:
w061: A      Separator.Default_Betriebsart.Listen            // Betriebart nach Urlöschen/Reset
      =      Dyn.Status.Betriebsart_Art.Listen
      A      Separator.Default_Betriebsart.Rapidfire
      =      Dyn.Status.Betriebsart_Art.Rapidfire
      A      Separator.Default_Betriebsart.TillEmpty
      =      Dyn.Status.Betriebsart_Art.TillEmpty
      A      Separator.Default_Betriebsart.Job
      =      Dyn.Status.Betriebsart_Art.Job
      A      Separator.Default_Betriebsart.Job_TillEmpty
      =      Dyn.Status.Betriebsart_Art.Job_TillEmpty
      A      Separator.Default_Betriebsart.DestFull
      =      Dyn.Status.Betriebsart_Art.DestFull
      A      Separator.Default_Betriebsart.Scannen
      =      Dyn.Status.Betriebsart_Art.Scannen
      A      Separator.Default_Betriebsart.Scannen_TillEmpty
      =      Dyn.Status.Betriebsart_Art.Scannen_TillEmpty

      L      Separator.Default_Ziel                          // Ziel nach Urlöschen/Reset
      T      Dyn.Status.Betriebsart_Ziel                     // Ziel für BTs

      BEU

en06: NOP 0


--- NW 7: Indirekt adressierte Daten in temporäre Daten übergeben ---
      A      Dyn.Sk.Err_Uebzeit                              // Wegen Speicherbedarf und Zykluszeit !
      =      Err_Uebzeit

      A      ErrQuit                                         // Überwachungszeit abgelaufen quittieren
      R      Dyn.Sk.Err_Uebzeit
      S      Antrieb_start                                   // Kreiselantrieb starten
      S      Antrieb_plus_start                              // Kreisel-Antrieb plus starten

      A      B_AusSep                                        // Sensor BT hat Separator verlassen
      A      Y_Sep_Auf
      S      Dyn.BT_draussen_erkannt                         // Sensor hat BT draussen erkannt

      A      B_Beladen_nach_Sep                              // Sensor BT ist beladen nach Sep
      A      Y_Sep_Auf
      S      Dyn.BT_beladen                                  // BT ist beladen

      AN     Separator.Parameter_allg.Belade_Kontrolle_im_Sep // Keine Belade-Kontrolle vorhanden (B-Erkennung)
      O      B_Beladen_im_Sep                                // Sensor BT ist beladen
      S      Dyn.B_Beladen                                   // 0=leerer, 1= beladcenener BT

      A      Y_Sep_Auf                                       // Separator geöffnet
      R      Dyn.B_Beladen                                   // 0=leerer, 1= beladcenener BT

      A      ErrQuit
      R      Dyn.Error.Daten_out                             // Letzte Carrier-Daten konnten nicht an Travel-FIFO übergeben werden


--- NW 8: Stau vor / Err fährt nicht in Separator  ---
      A      Dyn.Status.Betriebsart_Art.Stau_vor_Sep         // Stau vor Separator-Einfahrt (FreiZeit ermitteln)
      JC     W072

// StauZeit ermitteln:
      AN     B_VorSep                                        // Sensor BT fährt in Bereich (kein Stau !)
      JC     W070                                            // StauZeit neu aufziehen

      AN     "100ms-Impuls"
      JC     Xn08

      L      Dyn.Stau_Zeit                                   // Sensor B_VorSep ist belegt [100ms]
      L      "MW2"                                           // Stauzeit +100ms
      +I
      T      Dyn.Stau_Zeit                                   // Sensor B_VorSep ist belegt [100ms]

      JU     W071

W070: L      0
      T      Dyn.Stau_Zeit                                   // Sensor B_VorSep ist belegt [100ms]

W071: L      Dyn.Stau_Zeit                                   // Sensor B_VorSep ist belegt [100ms]
      L      10                                              // Stau-Zeit erreicht ?
      >=I                                                    // Ja !
      S      Dyn.Status.Betriebsart_Art.Stau_vor_Sep         // Stau vor Separator-Einfahrt
      JCN    Xn08

      L      0                                               // Zeiten löschen
      T      Dyn.Stau_Zeit                                   // Sensor B_VorSep ist belegt [100ms]

// FreiZeit ermitteln:
W072: A      B_VorSep                                        // Sensor BT fährt in Bereich (immer noch Stau !)
      ON     Dyn.Status.Betriebsart_Art.Stau_vor_Sep         // Stau vor Separator-Einfahrt
      JC     X070                                            // FreiZeit neu aufziehen

      AN     "100ms-Impuls"
      JC     Xn08

      L      Dyn.Frei_Zeit                                   // Sensor B_VorSep ist frei [100ms]
      L      "MW2"                                           // FreiZeit +100ms
      +I
      T      Dyn.Frei_Zeit                                   // Sensor B_VorSep ist frei [100ms]

      JU     X071

X070: L      0
      T      Dyn.Frei_Zeit                                   // Sensor B_VorSep ist frei [100ms]

X071: L      Dyn.Frei_Zeit                                   // Sensor B_VorSep ist frei [100ms]
      L      20                                              // Frei-Zeit erreicht ?
      >=I                                                    // Ja !
      R      Dyn.Status.Betriebsart_Art.Stau_vor_Sep         // Stau vor Separator-Einfahrt
      JCN    Xn08

      L      0                                               // Zeiten löschen
      T      Dyn.Frei_Zeit                                   // Sensor B_VorSep ist frei [100ms]

// ErrorZeit ermitteln:
Xn08: A      B_VorSep                                        // Sensor BT fährt in Bereich (kein Stau !)
      A      Antrieb_aktiv                                   // nur bei laufendem Antrieb !
      S      Dyn.Status.Betriebsart_Art.BT_kommt             // BT/MT fährt zum Sep
      A      B_ImSep
      O      ErrQuit                                         // Ablaufstörung quittieren (sonst dauerhaft Err, falls BT entnommen)
      R      Dyn.Status.Betriebsart_Art.BT_kommt             // BT/MT fährt zum Sep

      A      Dyn.Status.Betriebsart_Art.BT_kommt             // BT/MT fährt zum Sep
      AN     B_ImSep                                         // aber noch nicht im Sep !
      S      Antrieb_start                                   // Kreisel-Antrieb starten
      R      Antrieb_stoppen

      AN     Dyn.Status.Betriebsart_Art.BT_kommt             // BT/MT fährt zum Sep
      O      B_ImSep
      O      Y_Sep_Auf
      JC     W090                                            // ErrZeit neu aufziehen

      AN     "100ms-Impuls"
      O      Dyn.Error.Err_BT_rein                           // BT/MT fährt nicht in Separator
      ON     Antrieb_aktiv                                   // Kreisel-Antrieb aktiv
      JC     W091

      L      Dyn.Err_Zeit                                    // BT fährt nicht in Sep [100ms]
      L      "MW2"                                           // ErrZeit +100ms
      +I
      T      Dyn.Err_Zeit                                    // BT fährt nicht in Sep [100ms]

      JU     W091

W090: L      0
      T      Dyn.Err_Zeit                                    // BT fährt nicht in Sep [100ms]

W091: L      Dyn.Err_Zeit                                    // BT fährt nicht in Sep [100ms]
      L      300                                             // Err-Zeit erreicht ?
      >=I                                                    // Ja !
      =      Dyn.Error.Err_BT_rein                           // BT/MT fährt nicht in Separator
      JCN    W09E

      T      Dyn.Err_Zeit                                    // BT fährt nicht in Sep [100ms]

W09E: SET
      R      Y_Sep_Auf                                       // Separator öffnen


--- NW 9: BT hat Separator verlassen ---
      L      Dyn.Sk.Akt_Schritt                              // Aktueller Schritt
      L      14                                              // Beim Vereinzeln ?
      <>I                                                    // Nein !
      A(
      CAC
      L      15                                              // Beim Vereinzeln ?
      <>I                                                    // Nein !
      )
      O      B_ImSep                                         // Sensor BT ist im Separator
// /      ON    #Antrieb_aktiv       //Kreisel-Antrieb aktiv
      JC     w070_Mig                                        // Freizeit neu aufziehen

      A      Dyn.BT_draussen                                 // BT/MT hat Separator verlassen
      JC     w071_Mig

      L      SAVE.Sensorfrei_Zeit                            // Sensor B_imSep ist frei [10ms]
      L      "MW4"                                           // Freizeit +10ms
      +I
      T      SAVE.Sensorfrei_Zeit                            // Sensor B_imSep ist frei [10ms]

      L      Separator.Wartezeit_bis_draussen                // Nach dieser Zeit hat BT den Sep. verlassen [10ms]
      <=I                                                    // Maximum erreicht ?
      JC     w071_Mig                                        // Nein !

      T      SAVE.Sensorfrei_Zeit                            // Maximum übergeben

      JU     w071_Mig

w070_Mig: L      0
      T      SAVE.Sensorfrei_Zeit                            // Sensor B_imSep ist frei [10ms]

w071_Mig: L      SAVE.Sensorfrei_Zeit                        // Sensor B_imSep ist frei [10ms]
      L      Separator.Wartezeit_bis_draussen                // Nach dieser Zeit hat BT den Sep. verlassen [10ms]
      >=I
      AN     B_ImSep                                         // Sensor BT ist im Separator
      A(
      O      Dyn.BT_draussen_erkannt                         // Sensor hat BT draussen erkannt
      ON     Separator.Parameter_allg.B_AusSep_vorhanden     // Sensor BT hat Separator verlassen ist eingebaut (Konrolle kann erfolgen)
      )
      =      Dyn.BT_draussen                                 // BT/MT hat Separator verlassen


--- NW 10: Daten des Inkremental-Gebers holen  ---
      L      0
      T      Ink_Wert
      CLR
      =      Flag_Lauf_fertig
      =      Ohne_Lauf_fertig
      =      Lauf_Flag

// Weichendaten auslesen:
CALL FC "FifoOut" (SSDB:=Separator.Parameter_SorterRein.TravelFIFO_DB, SSDW:=Separator.Parameter_SorterRein.TravelFIFO_DW, PARA:=WORD#16#E214, OUTDATEN:=P#M220.0, RE_VAL:="MB199")   // Alle Zusatzdaten lesen

      L      "MB199"
      T      Dyn.Rueckmld.RET_VAL_TravelFIFO_Out             // Rückmeldung bei FIFO-Zugriff (Travel-FIFO)
      SET                                                    // alw
      R      Dyn.Error.Travel_FIFO                           // Travel-FIFO fehlerhaft
      JBI    Z_Ok

      SET
      S      Dyn.Error.Travel_FIFO                           // Weichen-FIFO fehlerhaft

      JU     En08

// Zähler-Daten übergeben:
Z_Ok: A      "M247.7"                                        // Übergabe MaxWert aktiv
      =      Max_Uebergabe                                   // MaxWert wird gerade übertragen !
      JC     w080

      L      "MD242"                                         // Inkwert
      T      Ink_Wert
      A      "M246.3"                                        // Flag-Info
      =      Lauf_Flag
      A      "M246.4"                                        // Fertig-Info
      =      Flag_Lauf_fertig
      A      "M246.5"                                        // Fertig-Info
      =      Ohne_Lauf_fertig

      JU     En08

w080: L      "MD242"                                         // MaxWert übergeben
      T      Dyn.Max_Wert

En08: NOP 0


--- NW 11: Letzter BT mit anderem Ziel genügend Abstand ? ---
      A      Max_Uebergabe                                   // MaxWert wird gerade übertragen !
      JC     En10

      L      Dyn.Del_Last_Ziel_Ink                           // Bei diesen Inks letztes Ziel löschen
      L      0                                               // sinnvolle Angabe ?
      <=D                                                    // Nein !
      SET                                                    // /Hier egal, da großer Trolley-Abstand + Stauklappe zum Synchronisieren!
      JC     W100

      A      Dyn.Del_Last_Ziel_Flag                          // Bei diesem Flag letzes Ziel löschen
      A      Flag_Lauf_fertig                                // Flag-Lauf wurde beendet
      O
      AN     Dyn.Del_Last_Ziel_Flag                          // Bei diesem Flag letzes Ziel löschen
      A      Ohne_Lauf_fertig                                // Flag-Lauf wurde beendet
      JC     W100                                            // beim Ende des Lauf sind Inkremente uninteressant

      A      Dyn.Del_Last_Ziel_Flag                          // Bei diesem Flag letzes Ziel löschen
      A      Lauf_Flag                                       // Zähl-Lauf mit Flag ist aktiv
      O
      AN     Dyn.Del_Last_Ziel_Flag                          // Bei diesem Flag letzes Ziel löschen
      AN     Lauf_Flag                                       // Zähl-Lauf mit Flag ist aktiv
      JCN    En10

      L      Ink_Wert                                        // Aktuelle Inkrementalwert
      L      Dyn.Del_Last_Ziel_Ink                           // Bei diesen Inks letztes Ziel löschen
      <D
      JC     En10

W100: L      0
      T      Dyn.Del_Last_Ziel_Ink                           // Bei diesen Inks letztes Ziel löschen
      L      0
      T      SAVE.Last_Ziel                                  // Letztes angefahrenes Ziel

En10: NOP 0


--- NW 12: Schrittkette anhalten ---
      A      Dyn.Sk.Auto_akt                                 // Automatik ist aktiv
      A      Dyn.Sk.Bereich_ok
      JU     en09                                            // Schrittkette nicht anhalten !

      SET
      R      Dyn.Sk.Err_Uebzeit                              // Störungen löschen
      R      Dyn.Sk.Err_Schritt

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

      BEU

en09: NOP 0


--- NW 13: Sprungverteiler  ---
      L      Dyn.Sk.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.Akt_Schritt

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

NEU:  SET
      R      Warte_neu                                       // Wartezeit neutriggern
      R      Warte_stop                                      // Wartezeit stoppen

      L      Dyn.Sk.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     sk10                                            // 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.Err_Schritt                              // Undefinierter Schritt

      L      16#A131
      T      Dyn.Stop_Ursache

      BEU

Neu_Mig: A      Err_Uebzeit
      JCN    Sk

      L      16#A132
      T      Dyn.Stop_Ursache

      BEU

Sk:   T      Dyn.Sk.Akt_Schritt

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

      JU     NEU

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


--- NW 14: Schritt X: Reserve            ---
      SET                                                    // Weiterschaltbedingung
      =      Weiter

// Schrittaktionen:
      SET

      L      16#B001
      T      Dyn.Stop_Ursache

      A      Weiter                                          // Weiterschaltbedingung ist erfüllt
      R      Dyn.Sk.Err_Uebzeit                              // Sofort weiter !
      R      Err_Uebzeit
      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

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

      BEU


--- NW 15: Schritt 0: Warten auf BT ---
s000: SET                                                    // Weiterschaltbedingung
      A(
      O      B_ImSep                                         // BT im Separator erkannt
      O      Dyn.ohne_B_starten                              // 1.Vereinzelung auch ohne B_im_Sep
      )
      A      Dyn.Sk.Auto_akt                                 // Automatik ist aktiv
      A      Dyn.Sk.Bereich_ok
      =      Weiter

// Betriebsart checken:
      L      Dyn.Status.Betriebsart_Anzahl_Soll              // Anzahl der zu fahrenden BTs
      L      0                                               // Sinnvolle Angabe ?
      <=I                                                    // Nein !
      A(
      O      Dyn.Status.Betriebsart_Art.Job                  // Aber Betriebsart mit Anzahl !
      O      Dyn.Status.Betriebsart_Art.Job_TillEmpty
      )
      O
      A(
      O      Dyn.Status.Betriebsart_Art.Scannen
      O      Dyn.Status.Betriebsart_Art.Scannen_TillEmpty
      )
      AN     Separator.Parameter_allg.Scanner_eingebaut
      =      Dyn.Error.Err_Betriebsart                       // Betriebsart ist nicht möglich

// Neu einfahrender BT ?:
      AN     Dyn.BT_beruhigt                                 // 1. einfahrender BügelTräger ist im Sep
      O      B_ImSep
      JC     X001

      L      Dyn.Leer_Zeit
      L      "MW4"                                           // Wartezeit +10ms
      +I
      T      Dyn.Leer_Zeit

      L      30                                              // 0,3 ohne BT ?
      <I                                                     // Nein !
      JC     X002

      SET
      R      Dyn.BT_beruhigt                                 // 1. einfahrender BügelTräger ist im Sep

X001: L      0
      T      Dyn.Leer_Zeit

// Betriebsart checken:
X002: A      Dyn.GesamtSorterReset_aktiv                     // Gesamten Sorterbereich resetten ist aktiv
      R      Dyn.Sk.Err_Uebzeit                              // Sofort weiter !
      R      Err_Uebzeit
      L      23                                              // Weiter mit Schritt 23
      JC     Neu_Mig                                         // Bei diesem Schritt weiter

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

      A      Dyn.Status.Betriebsart_Art.Sack_Tel             // Sack-Telegramm senden
      JC     Sack                                            // Sendung noch nicht geschickt !

// Betriebsart löschen ?:
      A      Dyn.Status.Betriebsart_Art.PC_Del               // Betriebsart aufgrund vom PC löschen
      R      Dyn.Status.Betriebsart_Art.PC_Del               // Betriebsart aufgrund vom PC löschen
      S      Dyn.Betriebsart_del                             // Betriebsart löschen
      S      Dyn.Status.Betriebsart_Art.Sack_Tel             // Sack-Telegramm senden
      JC     Sack

      A      Dyn.Betriebsart_del                             // Betriebsart löschen
      R      Dyn.Betriebsart_del
      JCN    x100

      SET
      R      Dyn.Status.Betriebsart_Art.Rapidfire
      R      Dyn.Status.Betriebsart_Art.TillEmpty
      R      Dyn.Status.Betriebsart_Art.Job
      R      Dyn.Status.Betriebsart_Art.Job_TillEmpty
      R      Dyn.Status.Betriebsart_Art.DestFull
      R      Dyn.Status.Betriebsart_Art.Scannen
      R      Dyn.Status.Betriebsart_Art.Scannen_TillEmpty

      L      0
      T      Dyn.Status.Betriebsart_Anzahl_Ist               // Job-Vorgaben löschen
      T      Dyn.Status.Betriebsart_Anzahl_Soll

      JU     ENDE_Mig

// Job erledigt ?:
x100: L      Dyn.Status.Betriebsart_Anzahl_Ist
      L      Dyn.Status.Betriebsart_Anzahl_Soll              // Soll-Anzahl erreicht ?
      >=I                                                    // Ja !
      A(
      L      0                                               // Sinnvolle Angabe ?
      >I                                                     // Ja !
      )
      A(
      O      Dyn.Status.Betriebsart_Art.Job
      O      Dyn.Status.Betriebsart_Art.Job_TillEmpty
      )
      R      Dyn.Status.Betriebsart_Art.Job                  // Betriebsarten beenden
      R      Dyn.Status.Betriebsart_Art.Job_TillEmpty
      S      Dyn.Betriebsart_del                             // Betriebsart löschen
      S      Dyn.Status.Betriebsart_Art.Sack_Tel             // Sack-Telegramm senden
      JC     Sack

      AN     Weiter                                          // Weiterschaltbedingung ist erfüllt
      JC     w100_Mig

      SET
      R      Dyn.Sk.Err_Uebzeit                              // sofort weiter
      R      Err_Uebzeit

      A      Dyn.BT_beruhigt                                 // 1. einfahrender BügelTräger ist im Sep
// /      O     #Separator.Parameter_allg.Antrieb_vorhanden
      L      15                                              // Angabe der Wartezeit (*10ms) [kurz]
      JU     Plus                                            // Nächsten Schritt starten

// Überwachungszeit abgelaufen ?:
w100_Mig: AN     Err_Uebzeit
      JC     x101

      SET
      R      Dyn.Sk.Err_Uebzeit                              // Einmalige Auswertung
      R      Err_Uebzeit

      JU     w101

// Überwachungszeit starten:
x101: AN     B_ImSep                                         // BT im Separator erkannt
      A(
      O      Dyn.Status.Betriebsart_Art.TillEmpty
      O      Dyn.Status.Betriebsart_Art.Job_TillEmpty
      O      Dyn.Status.Betriebsart_Art.Scannen_TillEmpty
      )
      A      Dyn.Sk.Auto_akt                                 // Automatik ist aktiv
      A      Dyn.Sk.Bereich_ok
      =      Ueb_akt                                         // Überwachungszeit aktivieren

      L      16#B001
      T      Dyn.Stop_Ursache

      AN     Dyn.Sk.Auto_akt                                 // Automatik ist aktiv
      JC     x001_Mig

      L      16#B002
      T      Dyn.Stop_Ursache

      AN     Dyn.Sk.Bereich_ok
      JC     x001_Mig

      L      16#B003
      T      Dyn.Stop_Ursache

      AN     B_ImSep
      JC     x001_Mig

x001_Mig: L      Separator.Wartezeit_bis_leer                // Angabe der Überwachungszeit (*100ms)
      JU     tueb                                            // Überwachungszeit

// Folgende Betriebsarten beenden ?:
w101: A      Dyn.Status.Betriebsart_Art.TillEmpty
      R      Dyn.Status.Betriebsart_Art.TillEmpty
      S      Dyn.Betriebsart_del                             // Betriebsart löschen
      S      Dyn.Status.Betriebsart_Art.Sack_Tel             // Sack-Telegramm senden
      JC     Sack                                            // Sack-Telegramm senden

      A      Dyn.Status.Betriebsart_Art.Job_TillEmpty
      R      Dyn.Status.Betriebsart_Art.Job_TillEmpty
      S      Dyn.Betriebsart_del                             // Betriebsart löschen
      S      Dyn.Status.Betriebsart_Art.Sack_Tel             // Sack-Telegramm senden
      JC     Sack                                            // Sack-Telegramm senden

      A      Dyn.Status.Betriebsart_Art.Scannen_TillEmpty
      R      Dyn.Status.Betriebsart_Art.Scannen_TillEmpty
      S      Dyn.Betriebsart_del                             // Betriebsart löschen
      S      Dyn.Status.Betriebsart_Art.Sack_Tel             // Sack-Telegramm senden
      JC     Sack                                            // Sack-Telegramm senden

      BEU

Sack: AN     Separator.Parameter_allg.PC_Komm_aktiv
      R      Dyn.Error.Send_FIFO_voll                        // Send-FIFO zu PC ist voll
      JC     w102

// Daten aufbereiten:
      L      'SACK'
      T      "MD214"                                         // Telegramm-Kennung
      L      30
      T      "MW218"                                         // Anzahl Bytes
      L      Separator_Nr
      T      "MD220"                                         // Sep-ID
      L      0
      T      "MB224"                                         // State
      L      Dyn.Status.Betriebsart_Anzahl_Soll
      T      "MW225"                                         // Target-Counts
      L      Dyn.Status.Betriebsart_Anzahl_Ist
      T      "MW227"                                         // Actual-Counts
      L      16#0003
      T      "MB229"                                         // ETX

      L      0                                               // Rest nullen
      T      "MB230"
      T      "MB231"
      T      "MB232"
      T      "MB233"
      T      "MB234"
      T      "MB235"
      T      "MB236"
      T      "MB237"
      T      "MB238"
      T      "MB239"
      T      Dyn.Status.Betriebsart_Anzahl_Ist

      L      Dyn.Status.Betriebsart_Quelle                   // SendFIFO des PC, der Betriebart gestartet hat
      L      0                                               // bekannt ?
      >I                                                     // Ja !
      JC     sack_Mig

      L      Separator.PC_Send_FIFO                          // Send-FIFO für PC-Sendungen
      T      Dyn.Status.Betriebsart_Quelle

sack_Mig: SET
      R      Dyn.Error.Send_FIFO_voll                        // Send-FIFO zu PC ist voll
      R      Dyn.Error.Send_FIFO_fehlerhaft                  // Send-FIFO fehlerhaft

CALL FC "FifoIn" (SSDB:=Dyn.Status.Betriebsart_Quelle, SSDW:=0, PARA:=WORD#16#0000, INDATEN:=P#M214.0, RE_VAL:="MB199")

      L      "MB199"
      T      Dyn.Rueckmld.RET_VAL_SendFIFO

      JBI    w102

      A      "M199.2"
      JCN    x002_Mig

      SET
      S      Dyn.Error.Send_FIFO_voll                        // Send-FIFO zu PC ist voll

      L      16#B005
      T      Dyn.Stop_Ursache

      BEU                                                    // Warten

x002_Mig: SET
      S      Dyn.Error.Send_FIFO_fehlerhaft                  // Send-FIFO fehlerhaft

      L      16#B006
      T      Dyn.Stop_Ursache

      BEU                                                    // Warten

w102: L      0                                               // unbekannt
      T      Dyn.Status.Betriebsart_Quelle                   // SendFIFO des PC, der Betriebart gestartet hat

      SET
      R      Dyn.Status.Betriebsart_Art.Sack_Tel             // Sack-Telegramm senden

      JU     ENDE_Mig                                        // Neubeginn


--- NW 16: Schritt 1: Betriebsart ok/angegeben? ---
s001: SET                                                    // Weiterschaltbedingung
// Schrittaktionen:
      S      Dyn.BT_beruhigt                                 // 1. einfahrender BügelTräger ist im Sep

      A      Dyn.Status.Betriebsart_Art.PC_Del               // Betriebsart aufgrund vom PC löschen
      L      0                                               // Weiter mit Schritt 0
      JC     Neu_Mig                                         // Bei diesem Schritt weiter

      AN     Dyn.Error.Korrektur_Modus_aktiv                 // Korrektur-Modus nach Crash aktiviert (wird vor Aufruf gesetzt!)
      JC     W108

      L      16#B010
      T      Dyn.Stop_Ursache

      BEU

// Betriebsart checken:
W108: L      Dyn.Status.Betriebsart_Anzahl_Soll              // Anzahl der zu fahrenden BTs
      L      0                                               // Sinnvolle Angabe ?
      <=I                                                    // Nein !
      A(
      O      Dyn.Status.Betriebsart_Art.Job                  // Aber Betriebsart mit Anzahl !
      O      Dyn.Status.Betriebsart_Art.Job_TillEmpty
      )
      O
      A(
      O      Dyn.Status.Betriebsart_Art.Scannen
      O      Dyn.Status.Betriebsart_Art.Scannen_TillEmpty
      )
      AN     Separator.Parameter_allg.Scanner_eingebaut
      =      Dyn.Error.Err_Betriebsart                       // Betriebsart ist nicht möglich
      JCN    w108_Mig

      L      16#B011
      T      Dyn.Stop_Ursache

      BEU

w108_Mig: A      B_ImSep                                     // BT im Separator erkannt
      O      Dyn.ohne_B_starten                              // 1.Vereinzelung auch ohne B_im_Sep
      JC     w109

      L      16#B012
      T      Dyn.Stop_Ursache

      L      0                                               // Nächsten Zyklus Schritt 0 (Warten auf BT)
      T      Dyn.Sk.Neu_Schritt                              // Schritt, der im nächsten Zyklus aktiv werden soll

      BEU

w109: A      Dyn.Status.Betriebsart_Art.Scannen
      O      Dyn.Status.Betriebsart_Art.Scannen_TillEmpty
      JC     W110

      SET
      R      Dyn.Scannerdaten                                // Scannerdaten erhalten
      R      Dyn.Dest0                                       // PC-Antwort mit Ziel=0 erhalten

      L      Dyn.Status.Betriebsart_Ziel                     // Ziel für BTs (ohne PC)
      L      0                                               // Ziel mit angegeben ?
      <>I                                                    // Ja !
      A      Dyn.Status.Betriebsart_Art.Listen
      O      Dyn.Status.Betriebsart_Art.Rapidfire
      O      Dyn.Status.Betriebsart_Art.TillEmpty
      O      Dyn.Status.Betriebsart_Art.Job
      O      Dyn.Status.Betriebsart_Art.Job_TillEmpty
      O      Dyn.Status.Betriebsart_Art.DestFull
      JC     W111

      L      0                                               // Betriebsart löschen
      T      Dyn.Status.Betriebsart_Ziel

      L      0                                               // Nächsten Zyklus Schritt 0 (Warten auf BT)
      T      Dyn.Sk.Neu_Schritt                              // Schritt, der im nächsten Zyklus aktiv werden soll
      T      Dyn.Status.Betriebsart_Anzahl_Ist

      L      16#B013
      T      Dyn.Stop_Ursache

      BEU

W111: L      0                                               // Ziel mit angegeben ?
      L      Dyn.Status.Betriebsart_Ziel                     // Fest-Ziel für BTs (ohne PC)
      <>I                                                    // Ja !
      JC     W112

      L      Separator.Default_Ziel                          // Ziel nach Urlöschen/Reset
W112: T      Dyn.Scanner.Rec_DEST_Ziel                       // 1...X Ziellinie

      L      11                                              // Weiter mit Schritt 11 (Ausfahren ok?)
      JU     Neu_Mig                                         // Bei diesem Schritt weiter

// Betriebsart mit Scannen:
W110: A      Dyn.ohne_B_starten                              // 1.Vereinzelung auch ohne B_im_Sep
      R      Dyn.ohne_B_starten                              // nicht erlaubt !
      BEC

      L      5                                               // Weiter mit Schritt 5 (Default-Ziel ?)
      JU     Neu_Mig                                         // Bei diesem Schritt weiter


--- NW 17: Schritt 5: Mit Scanner fahren: Defaultziel ? ---
s005: SET                                                    // Weiterschaltbedingung
      L      Separator.Default_Ziel
      L      0                                               // angegeben ?
      ==I                                                    // Nein !
      =      Weiter

// Schrittaktionen:
      A      Weiter                                          // Weiterschaltbedingung ist erfüllt
      A      Separator.Parameter_allg.Scanner_eingebaut
      A      Separator.Parameter_allg.PC_Komm_aktiv
      L      6                                               // Weiter mit Schritt 6 (Scanner triggern)
      JC     Neu_Mig                                         // Bei diesem Schritt weiter

      L      16#B051
      T      Dyn.Stop_Ursache

      A      Weiter
      BEC

// Ohne Scannen/PC-Daten fahren:
      L      0
      T      Dyn.Scanner.Rec_IDX                             // IDX
      L      Separator.Default_Ziel
      T      Dyn.Scanner.Rec_DEST_Ziel                       // Ziel

      L      11                                              // Weiter mit Schritt 11 (Ausfahren ok?)
      JU     Neu_Mig                                         // Bei diesem Schritt weiter


--- NW 18: Schritt 6: Scanner triggern ---
s006: SET                                                    // Weiterschaltbedingung
      =      Weiter                                          // Weiterschaltbedingung ist erfüllt

// Schrittaktionen:
      A      Dyn.Scannerdaten                                // Scannerdaten erhalten
      L      8                                               // Weiter mit Schritt 8 (Warten auf PC-Daten)
      JC     Neu_Mig                                         // Bei diesem Schritt weiter

      A      Weiter                                          // Weiterschaltbedingung ist erfüllt
      S      K_Sanner_triggern                               // Scanner triggern

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

      L      16#B061
      T      Dyn.Stop_Ursache

      L      0                                               // Nächsten Zyklus Schritt 0 (Warten auf BT)
      T      Dyn.Sk.Neu_Schritt                              // Schritt, der im nächsten Zyklus aktiv werden soll

      BEU


--- NW 19: Schritt 7: "DREQ" an PC senden ---
s007: SET                                                    // Weiterschaltbedingung
      =      Weiter                                          // Weiterschaltbedingung ist erfüllt

// Schrittaktionen:
      SET
      S      K_Sanner_triggern                               // Scanner triggern

      L      Dyn.Scanner.Send_IDX                            // IDX noch vorhanden, da BT nicht vereinzelt wurde
      L      0
      >I
      =      IDX_Ok                                          // Send_IDX bekannt
      JC     w110_Mig

      L      "SGes".IDX
      +      1
      T      "SGes".IDX
      T      Dyn.Scanner.Send_IDX

      L      0                                               // positiv ?
      >I                                                     // Ja !
      A(
      CAC
      L      32000                                           // unterhalb Maximum ?
      <=I                                                    // Ja !
      )
      JC     w110_Mig

      L      1                                               // Start-IDX
      T      "SGes".IDX
      T      Dyn.Scanner.Send_IDX

// BT-Belade-Info an PC mitsenden:
w110_Mig: A      Dyn.B_Beladen                               // 0=leerer, 1= beladenener BT
      L      6                                               // beladen
      JC     X110

      L      5                                               // Leerer/Escort BT

X110: T      BT_State                                        // Beladezustand des BTs

      L      'DREQ'
      T      "MD214"                                         // Telegramm-Kennung
      L      33
      T      "MW218"                                         // Anzahl Bytes
      L      Separator_Nr
      T      "MD220"                                         // Sep-ID
      L      Dyn.Scanner.Send_IDX
      T      "MW224"                                         // Carrier-IDX
      L      BT_State                                        // Beladezustand des BTs
      T      "MB226"                                         // Carrier-Type
      L      0
      T      "MB227"                                         // Scan-State
      L      0
      T      "MD228"                                         // Barcode
      L      16#0003
      T      "MB232"                                         // ETX

      L      0                                               // Rest nullen
      T      "MB233"
      T      "MB234"
      T      "MB235"
      T      "MB236"
      T      "MB237"
      T      "MB238"
      T      "MB239"

      SET
      R      Dyn.Error.Send_FIFO_voll                        // Send-FIFO zu PC ist voll
      R      Dyn.Error.Send_FIFO_fehlerhaft                  // Send-FIFO fehlerhaft

CALL FC "FifoIn" (SSDB:=Separator.PC_Send_FIFO, SSDW:=0, PARA:=WORD#16#0000, INDATEN:=P#M214.0, RE_VAL:="MB199")   // Send-FIFO für PC-Sndungen

      L      "MB199"
      T      Dyn.Rueckmld.RET_VAL_SendFIFO

      JBI    w111_Mig

      SET                                                    // Bei Problem
      R      K_Sanner_triggern                               // Scanner triggern ausschalten

      A      "M199.2"
      JCN    x070_Mig

      SET
      S      Dyn.Error.Send_FIFO_voll                        // Send-FIFO zu PC ist voll

      L      16#B071
      T      Dyn.Stop_Ursache

      BEU                                                    // Warten

x070_Mig: SET
      S      Dyn.Error.Send_FIFO_fehlerhaft                  // Send-FIFO fehlerhaft

      L      16#B072
      T      Dyn.Stop_Ursache

      BEU

//  Empfangsfach leeren...
w111_Mig: A      IDX_Ok                                      // Send_IDX bekannt
      JC     w112_Mig

      L      0
      T      Dyn.Scanner.Rec_IDX                             // IDX
      T      Dyn.Scanner.Rec_DEST_Type                       // Ziel-Typ
      T      Dyn.Scanner.Rec_DEST_Ziel                       // Ziel

      SET
      R      Dyn.Dest0

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

      BEU


--- NW 20: Schritt 8: Warten auf PC-Antwort            ---
s008: SET                                                    // Weiterschaltbedingung
      L      Dyn.Scanner.Send_IDX
      L      Dyn.Scanner.Rec_IDX                             // Daten für gesendete IDX empfangen ?
      ==I                                                    // Ja !
      =      Weiter

// Schrittaktionen:
      A      Dyn.Sk.Err_Uebzeit
      AN     Weiter
      R      Dyn.Sk.Err_Uebzeit                              // Sofort weiter !
      R      Err_Uebzeit
      R      Dyn.Scannerdaten                                // Scannerdaten erhalten
      JC     ENDE_Mig                                        // Neustart

      A      Weiter                                          // Weiterschaltbedingung ist erfüllt
      R      Dyn.Sk.Err_Uebzeit                              // Sofort weiter !
      R      Err_Uebzeit
      S      Dyn.Scannerdaten                                // Scannerdaten erhalten
      L      9                                               // Weiter mit Schritt
      JC     Neu_Mig                                         // Bei diesem Schritt weiter

      L      16#B081
      T      Dyn.Stop_Ursache

      L      Dyn.Scanner.Rec_IDX                             // Daten empfangen ?
      L      0
      ==I                                                    // Nein !
      JCN    x080

      L      16#B082
      T      Dyn.Stop_Ursache

x080: SET
      =      Ueb_akt                                         // Überwachungszeit aktivieren

      L      300                                             // Angabe der Überwachungszeit (*100ms)
      A      Dyn.Dest0                                       // PC-Antwort mit Ziel=0 erhalten, dann lange Wartezeit !
      JC     tueb                                            // Überwachungszeit

      L      30                                              // Angabe der Überwachungszeit (*100ms)
      JU     tueb                                            // Überwachungszeit

      BEU


--- NW 21: Schritt 9: PC-Antwort auswerten            ---
s009: SET                                                    // Weiterschaltbedingung
      =      Weiter

// Schrittaktionen:
      L      Dyn.Scanner.Rec_DEST_Ziel                       // Ziel
      L      0
      ==I
      =      Dyn.Dest0                                       // PC-Antwort mit Ziel=0 erhalten, dann Type auswerten (s.u.)
      JCN    w130                                            // negierter Sprung !

      L      0                                               // weiteres Telegramm nötig !
      T      Dyn.Scanner.Rec_IDX                             // IDX

      L      8                                               // Weiter mit Schritt 8 (Warten auf PC-Daten)
      JU     Neu_Mig                                         // Bei diesem Schritt weiter

w130: L      Dyn.Scanner.Rec_DEST_Type                       // Ziel-Typ
      L      9                                               // Entladen per Hand ?
      <>I                                                    // Nein !
      JC     w131

      L      16#B092
      T      Dyn.Stop_Ursache

      BEU

w131: CAC
      L      1                                               // Ist BT leer?
      ==I                                                    // Ja !
      A      Separator.Parameter_allg.Belade_Kontrolle_nachSep
      =      Dyn.Status.Betriebsart_Art.BT_leer

      CAC
      L      2                                               // Ist BT beladen?
      ==I                                                    // Ja !
      A      Separator.Parameter_allg.Belade_Kontrolle_nachSep
      =      Dyn.Status.Betriebsart_Art.BT_beladen

      A      Weiter                                          // Weiterschaltbedingung ist erfüllt
      L      11                                              // Weiter mit Schritt 11 (Ausfahren ok?)
      JC     Neu_Mig                                         // Bei diesem Schritt weiter

      BEU

// Wartezeit bei gleichem BC:
      A      Err_Uebzeit                                     // Weiterschaltbedingung ist erfüllt
      R      Dyn.Sk.Err_Uebzeit                              // Sofort weiter !
      R      Err_Uebzeit
      JC     ENDE_Mig

      SET
      =      Ueb_akt                                         // Überwachungszeit aktivieren
      S      Antrieb_start                                   // Kreiselantrieb starten (damit AutoDel funktioniert)
      R      Antrieb_stoppen

      L      30                                              // Angabe der Überwachungszeit (*100ms)
      JU     tueb                                            // Überwachungszeit

      BEU


--- NW 22: Schritt 11: Ausfahren ok ? ---
// Schrittaktionen:
s011: AN     B_ImSep                                         // Sensor BT ist im Separator
      JC     ENDE_Mig                                        // Neustart

// Anlage aus oder Störung:
      AN     Dyn.Sk.Auto_akt                                 // Automatik ist aktiv
      ON     Dyn.Sk.Bereich_ok                               // Bereich ist gestört
      L      16#B111
      T      Dyn.Stop_Ursache
      JC     ENDE_Mig                                        // Neustart

// Neues Ziel ?
      L      Dyn.Scanner.Rec_DEST_Ziel                       // Ziel
      L      SAVE.Last_Ziel                                  // Letztes angefahrenes Ziel
      <>I                                                    // unterschiedlich !
      A(
      L      0                                               // noch gespeichert ?
      <>I                                                    // Ja !
      )
      L      16#B112
      T      Dyn.Stop_Ursache
      R      Dyn.Error.Err_PinSignal                         // Es kommt kein Pin-Signal
      BEC                                                    // Warten !

// Gleiches Ziel ?
      L      Dyn.Scanner.Rec_DEST_Ziel                       // Ziel
      L      SAVE.Last_Ziel                                  // Letztes angefahrenes Ziel
      ==I                                                    // identisch !
      A(
      L      0                                               // noch gespeichert ?
      <>I                                                    // Ja !
      )
      =      Dyn.Gleiches_Ziel                               // BT hat gleiches Ziel
      JC     X180                                            // Sofort weiter !

// Genügend Abstand bei Ziel-Wechsel:
      L      SAVE.Last_Ziel                                  // Letztes angefahrenes Ziel
      L      0                                               // gelöscht ? (nach Zielwechsel-Abstand)
      <>I                                                    // Nein !
      L      16#B11A
      T      Dyn.Stop_Ursache
      R      Dyn.Error.Err_PinSignal                         // Es kommt kein Pin-Signal
      BEC

      AN     Separator.Parameter_allg.Wechsel_bei_Travel_leer // Zielwechsel nur bei Travel-FIFO leer
      JC     X180                                            // Sofort weiter !

// Travel-Fifo leer ? 
      L      Separator.Parameter_SorterRein.TravelFIFO_DB
      T      DatenDB

      OPN    DB[DatenDB]

      L      Separator.Parameter_SorterRein.TravelFIFO_DW
      +      8                                               // Anzahl der Datensätze (eingetragene)
      ITD
      SLD    3
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)

      L      DBW [AR1Zeiger]                                 // Anzahl der Datensätze (eingetragene)
      L      0
      ==I
      JC     X180                                            // Sofort weiter !

      L      16#B11B
      T      Dyn.Stop_Ursache
      SET
      R      Dyn.Error.Err_PinSignal                         // Es kommt kein Pin-Signal
      BEU                                                    // Warten !

// BT noch beim Ausfahren ?:
X180: A      Dyn.Error.Err_Raus_Sensor                       // Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)! Störung schon erkannt !
      A(
      A      B_AusSep                                        // Sensor BT hat Separator verlassen
      A      Separator.Parameter_allg.B_AusSep_vorhanden     // Sensor BT hat Separator verlassen ist eingebaut
      O
      A      B_Beladen_nach_Sep                              // Sensor BT ist beladen nach Sep
      A      Separator.Parameter_allg.Belade_Kontrolle_nachSep // Belade-Kontrolle vorhanden nach Separator
      )
      S      Antrieb_start                                   // Kreiselantrieb starten
      R      Antrieb_stoppen
      L      16#B115
      T      Dyn.Stop_Ursache
      R      Dyn.Error.Err_PinSignal                         // Es kommt kein Pin-Signal
      BEC                                                    // Warten !

      A      B_AusSep                                        // Sensor BT hat Separator verlassen
      A      Separator.Parameter_allg.B_AusSep_vorhanden     // Sensor BT hat Separator verlassen ist eingebaut
      O
      A      B_Beladen_nach_Sep                              // Sensor BT ist beladen nach Sep
      A      Separator.Parameter_allg.Belade_Kontrolle_nachSep // Belade-Kontrolle vorhanden nach Separator
      S      Antrieb_start                                   // Kreiselantrieb starten
      R      Antrieb_stoppen
      JC     w181

      SET
      R      Dyn.Sk.Err_Uebzeit                              // Sofort weiter !
      R      Err_Uebzeit
      R      Dyn.Error.Err_Raus_Sensor                       // Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)!

// Starten erlaubt ?:
      AN     Start_Ok                                        // Starten ist erlaubt
      L      16#B116
      T      Dyn.Stop_Ursache
      R      Dyn.Error.Err_PinSignal                         // Es kommt kein Pin-Signal
      BEC                                                    // Warten !

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

      A(
      O      Antrieb_plus_aktiv                              // Kreisel-Antrieb plus aktiv
      ON     Separator.Parameter_allg.Antrieb_Plus_vorhanden // Separator an weiterem Antrieb (Weiche)
      )
      S      Antrieb_start                                   // Kreiselantrieb starten
      R      Antrieb_stoppen

      A      Antrieb_aktiv                                   // Kreisel-Antrieb aktiv
      A(
      O      Antrieb_plus_aktiv                              // Kreisel-Antrieb plus aktiv
      ON     Separator.Parameter_allg.Antrieb_Plus_vorhanden // Separator an weiterem Antrieb (Weiche)
      )
      L      12                                              // Weiter mit Schritt (Warten auf Pin-Signal)
      JC     Neu_Mig                                         // Bei diesem Schritt weiter

      L      16#B117
      T      Dyn.Stop_Ursache

      SET
      R      Dyn.Error.Err_PinSignal                         // Es kommt kein Pin-Signal
      BEU

// Störung Verlassen-Sensor:
w181: A      Err_Uebzeit
      S      Dyn.Error.Err_Raus_Sensor                       // Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)!

      SET
      R      Dyn.Error.Err_PinSignal                         // Es kommt kein Pin-Signal

      L      16#B118
      T      Dyn.Stop_Ursache

      A      Antrieb_aktiv
      =      Ueb_akt                                         // Überwachungszeit aktivieren
      L      150                                             // Angabe der Überwachungszeit (*100ms)
      JU     tueb                                            // Überwachungszeit


--- NW 23: Schritt 12: Warten auf Pin-Signal           ---
s012: SET                                                    // Weiterschaltbedingung
      A(
      A      B_Pinsensor                                     // Zustand Pinsensor (eventl. verlängert)
      A      Dyn.Gleiches_Ziel                               // BT hat gleiches Ziel
      O      PinSignal                                       // Impuls
      ON     Separator.Parameter_allg.PinSignal              // Pin-Signal bei Ausfahrt beachten
      )
      A      Antrieb_aktiv                                   // Kreisel-Antrieb aktiv
      A(
      O      Antrieb_plus_aktiv                              // Kreisel-Antrieb plus aktiv
      ON     Separator.Parameter_allg.Antrieb_Plus_vorhanden // Separator an weiterem Antrieb (Weiche)
      )
      A      Start_Ok                                        // Starten ist erlaubt
      =      Weiter

// Schrittaktionen:
      SET
      R      Dyn.BT_draussen
      R      Dyn.BT_draussen_erkannt
      R      Dyn.BT_beladen                                  // BT ist beladen

      A      Separator.Parameter_allg.Antrieb_Plus_vorhanden // Separator an weiterem Antrieb (Weiche)
      S      Antrieb_plus_start                              // Kreisel-Antrieb plus starten

      A(
      O      Antrieb_plus_aktiv                              // Kreisel-Antrieb plus aktiv
      ON     Separator.Parameter_allg.Antrieb_Plus_vorhanden // Separator an weiterem Antrieb (Weiche)
      )
      S      Antrieb_start                                   // Kreiselantrieb starten
      R      Antrieb_stoppen

      A      Weiter                                          // Weiterschaltbedingung ist erfüllt
      R      Dyn.Sk.Err_Uebzeit                              // Sofort weiter !
      R      Err_Uebzeit
      R      Dyn.Error.Err_PinSignal                         // Es kommt kein Pin-Signal
      L      13                                              // Weiter mit Schritt 13 (Weiche raus bereit ?)
      JC     Neu_Mig                                         // Bei diesem Schritt weiter

      AN     Start_Ok                                        // Starten ist erlaubt
      ON     Antrieb_aktiv
      O
      AN     Antrieb_plus_aktiv                              // Kreisel-Antrieb plus aktiv
      A      Separator.Parameter_allg.Antrieb_Plus_vorhanden // Separator an weiterem Antrieb (Weiche)
      JC     X012                                            // Abbruch

      A      Err_Uebzeit
      S      Dyn.Error.Err_PinSignal                         // Es kommt kein Pin-Signal

      L      16#B121
      T      Dyn.Stop_Ursache

      A      Antrieb_aktiv
      =      Ueb_akt                                         // Überwachungszeit aktivieren
      L      50                                              // Angabe der Überwachungszeit (*100ms)
      JU     tueb                                            // Überwachungszeit

X012: L      11                                              // Nächsten Zyklus Schritt 0 (Ausfahren ok?)
      T      Dyn.Sk.Neu_Schritt                              // Schritt, der im nächsten Zyklus aktiv werden soll

      BEU


--- NW 24: Schritt 13: Travel-Buffer ok ? ---
s013: NOP 0

// Schrittaktionen:
      SET
      S      Antrieb_start                                   // Kreiselantrieb starten
      R      Antrieb_stoppen

      AN     B_ImSep                                         // Sensor BT ist im Separator
      JC     ENDE_Mig                                        // Neustart

      L      Dyn.Max_Wert                                    // Max.Wert
      L      0                                               // schon bekannt ?
      <=D                                                    // Nein !
      L      16#B131
      T      Dyn.Stop_Ursache
      JC     w151

CALL FC "FifoIn" (SSDB:=Separator.Parameter_SorterRein.TravelFIFO_DB, SSDW:=Separator.Parameter_SorterRein.TravelFIFO_DW, PARA:=WORD#16#FF00, INDATEN:=P#M220.0, RE_VAL:="MB199")   // Testsendung

      L      "MB199"
      T      Dyn.Rueckmld.RET_VAL_TravelFIFO_In
      L      0                                               // Aufruf mit Fehler ?
      ==I                                                    // Nein !
      R      Dyn.Error.Travel_FIFO                           // Travel-FIFO fehlerhaft
      JC     w150

      A      "M199.2"                                        // FIFO ist voll
      L      16#B132
      T      Dyn.Stop_Ursache
      JC     w151

      SET
      S      Dyn.Error.Travel_FIFO                           // Travel-FIFO fehlerhaft

      L      16#B133
      T      Dyn.Stop_Ursache

      JU     w151

w150: L      17                                              // Weiter mit Schritt 17 (Daten an Travel-FIFO)
      JU     Neu_Mig                                         // Bei diesem Schritt weiter

w151: L      11                                              // Nächsten Zyklus Schritt 0 (Ausfahren ok?)
      T      Dyn.Sk.Neu_Schritt                              // Schritt, der im nächsten Zyklus aktiv werden soll

      BEU


--- NW 25: Schritt 14: Separator Mindestzeit öffnen          ---
s014: SET                                                    // Weiterschaltbedingung
      A      Antrieb_aktiv                                   // Kreisel-Antrieb aktiv
      =      Weiter

// Schrittaktionen:
      SET
      S      Y_Sep_Auf                                       // Separator öffnen
      S      Antrieb_start                                   // Kreiselantrieb starten
      R      Antrieb_stoppen
      S      Antrieb_plus_start                              // Kreisel-Antrieb plus starten

      AN     Weiter
      =      Warte_neu                                       // Wartezeit neutriggern
      JC     w251

      L      16#B142
      T      Dyn.Stop_Ursache

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

w251: L      16#B143
      T      Dyn.Stop_Ursache

      BEU


--- NW 26: Schritt 15: BT ausgefahren ? (Wartezeit bis draussen)       ---
s015: SET                                                    // Weiterschaltbedingung
      A      Dyn.BT_draussen                                 // BT/MT hat Separator verlassen
// /      U     #Antrieb_aktiv       //Kreisel-Antrieb aktiv
      =      Weiter

// Schrittaktionen:
      SET
      S      Y_Sep_Auf                                       // Separator öffnen
      S      Antrieb_start                                   // Kreiselantrieb starten
      R      Antrieb_stoppen
      S      Antrieb_plus_start                              // Kreisel-Antrieb plus starten

      A      Weiter                                          // Weiterschaltbedingung ist erfüllt
      R      Dyn.Sk.Err_Uebzeit                              // Sofort weiter !
      R      Err_Uebzeit
      R      Dyn.Error.Err_BT_raus                           // BT/MT fährt nicht aus
      L      16                                              // Weiter mit Schritt 16 (MT 1.Achse,...)
      JC     Neu_Mig                                         // Bei diesem Schritt weiter

      A      Err_Uebzeit
      S      Dyn.Error.Err_BT_raus                           // BT/MT fährt nicht aus

      L      16#B152
      T      Dyn.Stop_Ursache

      AN     Antrieb_aktiv                                   // Kreisel-Antrieb aktiv
      JC     x150

      L      16#B153
      T      Dyn.Stop_Ursache

      AN     Dyn.BT_draussen                                 // BT/MT hat Separator verlassen
      JC     x150

      L      16#B154
      T      Dyn.Stop_Ursache

      AN     Antrieb_aktiv                                   // Kreisel-Antrieb aktiv
      JC     x150

x150: A      Antrieb_aktiv
      =      Ueb_akt                                         // Überwachungszeit aktivieren
      L      150                                             // Angabe der Überwachungszeit (*100ms)
      JU     tueb                                            // Überwachungszeit


--- NW 27: Schritt 16: BT ist draussen          ---
s016: SET                                                    // Weiterschaltbedingung
      =      Weiter

// Schrittaktionen:
      SET
      S      Dyn.BT_gestartet                                // BT ist aus Separator gestartet (nur 1 Zyklus)

// Belade-Check nach Sep?:
      A      Separator.Parameter_allg.Belade_Kontrolle_nachSep // Belade-Kontrolle vorhanden nach Separator
      A(
      O      Dyn.Status.Betriebsart_Art.BT_leer              // BT/MT ist leer
      O      Dyn.Status.Betriebsart_Art.BT_beladen
      )
      L      19                                              // Weiter mit Schritt 19
      JC     Neu_Mig                                         // Bei diesem Schritt weiter

// Scannerdaten löschen:
      SET
      R      Dyn.Scannerdaten                                // Scannerdaten erhalten

      L      0                                               // IDX löschen, da BT vereinzelt wurde
      T      Dyn.Scanner.Send_IDX                            // damit neue IDX geholt wird
      T      Dyn.Scanner.Rec_IDX
      T      Dyn.Scanner.Rec_DEST_Ziel
      T      Dyn.Scanner.Rec_DEST_Type

      JU     ENDE_Mig


--- NW 28: Schritt 17: Daten in FIFO eintragen ---
s017: L      16#B171
      T      Dyn.Stop_Ursache

      A      Max_Uebergabe                                   // MaxWert wird gerade übertragen !
      BEC

// Vereinzelungstakte +1:
      L      Dyn.Status.Vereinzelungstakte
      L      1
      +D
      T      Dyn.Status.Vereinzelungstakte

      L      0                                               // negativer Wert ?
      >=D                                                    // Nein !
      JC     W230

      L      Dyn.Status.Vereinzelungstakte
      L      1
      -D                                                     // damit wieder pos.Wert !
      T      Dyn.Status.Vereinzelungstakte

// Letztes angefahrnes Ziel speichern/Rücksetz-Inks speichern:
W230: L      0
      T      SAVE.Last_Ziel                                  // Letztes angefahrenes Ziel erst mal löschen

      L      Separator.Abstand_Zielwechsel                   // Abstand bei Zielwechsel [inc]
      L      0                                               // sinnvolle Angabe ?
      <=I                                                    // Nein !
      JC     W231

      L      Dyn.Scanner.Rec_DEST_Ziel                       // Ziel
      T      SAVE.Last_Ziel                                  // Letztes angefahrenes Ziel speichern

      L      Separator.Abstand_Zielwechsel                   // Abstand bei Zielwechsel [inc]
      ITD
      L      Ink_Wert                                        // Aktuelle Inkrementalwert
      +D
      T      Dyn.Del_Last_Ziel_Ink                           // Bei diesen Inks letztes Ziel löschen
      A      Lauf_Flag
      =      Dyn.Del_Last_Ziel_Flag                          // Bei diesem Flag letzes Ziel löschen
      L      Dyn.Max_Wert                                    // Maximal erlaubter Zählwert
      >D
      JCN    W231

      -D                                                     // Restwert übernehmen
      T      Dyn.Del_Last_Ziel_Ink                           // Bei diesen Inks letztes Ziel löschen
      AN     Lauf_Flag                                       // Aktuelles Lauf-Flag invertieren, da Überlauf !
      =      Dyn.Del_Last_Ziel_Flag                          // Bei diesem Flag letzes Ziel löschen

// Daten für Eintrag vorbereiten:
W231: L      Ink_Wert                                        // Aktueller Ink-Wert
      T      "MD210"                                         // Start-Ink (für Rückkontrolle)
      L      0
      T      "MW214"
      A      Lauf_Flag
      =      "M214.0"
      L      Dyn.Scanner.Rec_DEST_Type                       // Ziel-Typ
      L      3                                               // Letztes Teil vom Block ?
      ==I                                                    // Ja !
      =      "M214.2"                                        // Letztes Teil vom Block gestartet

      L      Dyn.Scanner.Rec_IDX                             // IDX
      T      "MD216"
      L      0                                               // angegeben ?
      <>I                                                    // Ja !
      JC     u233

// z.Bsp. bei Default-Ziel:
      L      "SGes".IDX
      +      DINT#1
      T      "SGes".IDX
      T      "MD216"

u233: L      Dyn.Scanner.Rec_DEST_Ziel                       // Ziel
      T      "MW220"

      L      Dyn.Status.Betriebsart_Ziel                     // Fest-Ziel für BTs (ohne PC)
      L      0                                               // vorgegeben ? (dann keine Einlagermeldung an PC)
      ==I                                                    // Nein !
      L      Separator.PC_Komm_SorterID                      // ID für PC-Kommunikation
      JC     w233

      L      0                                               // Keine Angabe

w233: T      "MW222"

      L      0                                               // Restliche Daten löschen
      T      "MW224"
      T      "MW226"
      T      "MW228"
      T      "MW230"

CALL FC "FifoIn" (SSDB:=Separator.Parameter_SorterRein.TravelFIFO_DB, SSDW:=Separator.Parameter_SorterRein.TravelFIFO_DW, PARA:=WORD#16#0000, INDATEN:=P#M210.0, RE_VAL:="MB199")   // Daten speichern

      L      "MB199"
      T      Dyn.Rueckmld.RET_VAL_TravelFIFO_In

      JBI    w232

      SET
      S      Dyn.Error.Daten_out                             // Letzte Carrier-Daten konnten nicht an Travel-FIFO übergeben werden

      L      16#B172
      T      Dyn.Stop_Ursache

      BEU

w232: L      14                                              // Weiter mit Schritt 14
      JU     Neu_Mig                                         // Bei diesem Schritt weiter


--- NW 29: Schritt 19: Belade-Check ---
s019: SET
      S      Antrieb_start
      R      Antrieb_stoppen
      A      Separator.Parameter_allg.Antrieb_Plus_vorhanden // Separator an weiterem Antrieb (Weiche)
      S      Antrieb_plus_start                              // Kreisel-Antrieb plus starten

      A      Dyn.Status.Betriebsart_Art.BT_beladen           // BT/MT ist beladen
      A      Dyn.BT_beladen                                  // BT ist beladen
      JC     X199                                            // Alles ok!

      A      Dyn.Status.Betriebsart_Art.BT_leer              // BT/MT ist leer
      A      Dyn.BT_beladen                                  // BT ist beladen
      JC     X19E                                            // Leerer BT ist beladen!

      A      Err_Uebzeit                                     // Ohne Verlassen-Sensor nach 1 s
      O      Separator.Parameter_allg.B_AusSep_vorhanden     // Sensor BT hat Separator verlassen ist eingebaut
      R      Dyn.Sk.Err_Uebzeit                              // Sofort weiter !
      R      Err_Uebzeit
      JC     X190

      A      Antrieb_aktiv
      =      Ueb_akt                                         // Überwachungszeit aktivieren
      L      10                                              // Angabe der Überwachungszeit (*100ms)
      JU     tueb                                            // Überwachungszeit

// BT am Belade-Sensor vorbei:
X190: A      Dyn.Status.Betriebsart_Art.BT_leer              // BT/MT ist leer
      JC     X199                                            // Alles ok!

// Also Beladener BT ist leer!
// Fehler-Telegramm an PC:
X19E: NOP 0
// BT-Belade-Info an PC mitsenden:
      A      Dyn.Status.Betriebsart_Art.BT_leer              // BT/MT ist leer (also bei Error beladen!)
      L      6                                               // beladen
      JC     X191

      L      4                                               // Leerer BT

X191: T      BT_State                                        // Beladezustand des BTs

      L      'LERR'
      T      "MD214"                                         // Telegramm-Kennung
      L      33
      T      "MW218"                                         // Anzahl Bytes
      L      Separator_Nr
      T      "MD220"                                         // Sep-ID
      L      Dyn.Scanner.Send_IDX
      T      "MW224"                                         // Carrier-IDX
      L      BT_State                                        // Beladezustand des BTs
      T      "MB226"                                         // Carrier-Type
      L      0
      T      "MB227"                                         // Scan-State
      L      0
      T      "MD228"                                         // Barcode
      L      16#0003
      T      "MB232"                                         // ETX

      L      0                                               // Rest nullen
      T      "MB233"
      T      "MB234"
      T      "MB235"
      T      "MB236"
      T      "MB237"
      T      "MB238"
      T      "MB239"

      SET
      R      Dyn.Error.Send_FIFO_voll                        // Send-FIFO zu PC ist voll
      R      Dyn.Error.Send_FIFO_fehlerhaft                  // Send-FIFO fehlerhaft

CALL FC "FifoIn" (SSDB:=Separator.PC_Send_FIFO, SSDW:=0, PARA:=WORD#16#0000, INDATEN:=P#M214.0, RE_VAL:="MB199")   // Send-FIFO für PC-Sendungen

      L      "MB199"
      T      Dyn.Rueckmld.RET_VAL_SendFIFO

      JBI    X199

      SET                                                    // Bei Problem
      R      K_Sanner_triggern                               // Scanner triggern ausschalten

      A      "M199.2"
      JCN    X192

      SET
      S      Dyn.Error.Send_FIFO_voll                        // Send-FIFO zu PC ist voll

      L      16#B191
      T      Dyn.Stop_Ursache

      BEU                                                    // Warten

X192: SET
      S      Dyn.Error.Send_FIFO_fehlerhaft                  // Send-FIFO fehlerhaft

      L      16#B192
      T      Dyn.Stop_Ursache

      BEU

// Scannerdaten löschen:
X199: SET
      R      Dyn.Scannerdaten                                // Scannerdaten erhalten
      R      Dyn.Status.Betriebsart_Art.BT_leer              // BT/MT ist leer
      R      Dyn.Status.Betriebsart_Art.BT_beladen           // BT/MT ist beladen

      L      0                                               // IDX löschen, da BT vereinzelt wurde
      T      Dyn.Scanner.Rec_IDX                             // Daten für gesendete IDX empfangen ?
      T      Dyn.Scanner.Send_IDX                            // IDX noch vorhanden, da BT nicht vereinzelt wurde

      JU     ENDE_Mig


--- NW 30: Schritt 20: Separator resetten ---
s020: SET                                                    // Weiterschaltbedingung
      =      Weiter                                          // Weiterschaltbedingung ist erfüllt

// Schrittaktionen:
      SET                                                    // ELS in Grundstellung fahren
      S      Antrieb_start                                   // Kreiselantrieb starten
      R      Antrieb_stoppen

      L      16#B201
      T      Dyn.Stop_Ursache

      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 31: Schritt 21: Reset ist zu Ende ---
s021: SET
      R      Dyn.Sk.Reset_Akt                                // Reset ist aktiv

      JU     ENDE_Mig                                        // Neubeginn


--- NW 32: Schritt 23: GesamtSorter-Reset: Start-Ink speichern            ---
s023: SET                                                    // Weiterschaltbedingung
      =      Weiter

// Schrittaktionen:
      L      Dyn.Max_Wert
      L      DINT#0
      <=D
      O      Max_Uebergabe                                   // MaxWert wird gerade übertragen !
      BEC

      L      Separator.Parameter_SorterRein.Abstand_Reset_Start // Nach diesen Abstand kann Gesamt-Reset gestartet werden [*10inc]
      ITD
      L      Ink_Wert                                        // Aktuelle Inkrementalwert
      +D
      T      Dyn.SorterReset_Start_Ink                       // Bei diesen Inks Sorter-Reset starten
      A      Lauf_Flag
      =      Dyn.SorterReset_Start_Flag                      // Bei diesem Flag Sorter-Reset starten
      L      Dyn.Max_Wert                                    // Maximal erlaubter Zählwert
      >D
      JCN    W291

      -D                                                     // Restwert übernehmen
      T      Dyn.SorterReset_Start_Ink                       // Bei diesen Inks Sorter-Reset starten
      AN     Lauf_Flag                                       // Aktuelles Lauf-Flag invertieren, da Überlauf !
      =      Dyn.SorterReset_Start_Flag                      // Bei diesem Flag Sorter-Reset starten

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

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

      BEU


--- NW 33: Schritt 24: GesamtSorter-Reset: Start-Ink erreicht ?           ---
// Schrittaktionen:
s024: L      16#B241
      T      Dyn.Stop_Ursache

      SET
      S      Antrieb_start                                   // Kreiselantrieb starten
      R      Antrieb_stoppen
      S      Antrieb_plus_start

      A      ErrQuit
      R      Dyn.Error.Err_BT_raus                           // BT/MT fährt nicht aus

      A      Max_Uebergabe                                   // MaxWert wird gerade übertragen !
      BEC

      A      Dyn.SorterReset_Start_Flag                      // Bei diesem Flag Sorter-Reset starten
      A      Flag_Lauf_fertig                                // Flag-Lauf wurde beendet
      O
      AN     Dyn.SorterReset_Start_Flag                      // Bei diesem Flag Sorter-Reset starten
      A      Ohne_Lauf_fertig                                // Flag-Lauf wurde beendet
      JC     W300                                            // beim Ende des Lauf sind Inkremente uninteressant

      A      Dyn.SorterReset_Start_Flag                      // Bei diesem Flag Sorter-Reset starten
      AN     Lauf_Flag                                       // Zähl-Lauf mit Flag ist aktiv
      O
      AN     Dyn.SorterReset_Start_Flag                      // Bei diesem Flag Sorter-Reset starten
      A      Lauf_Flag                                       // Zähl-Lauf mit Flag ist aktiv
      L      16#B242
      T      Dyn.Stop_Ursache
      BEC

      L      Ink_Wert                                        // Aktuelle Inkrementalwert
      L      Dyn.SorterReset_Start_Ink                       // Bei diesen Inks Sorter-Reset starten
      <D
      L      16#B243
      T      Dyn.Stop_Ursache
      BEC

      L      0                                               // Angabe der Wartezeit (*10ms)
      JU     Plus                                            // Nächsten Schritt starten


--- NW 34: Schritt 25: GesamtSorter-Reset starten           ---
// Schrittaktionen:
s025: SET
      R      Dyn.GesamtSorterReset_aktiv                     // Gesamten Sorterbereich resetten ist aktiv
      S      Dyn.Sk.Reset                                    // SK zurücksetzen
      S      Sorter_Reset                                    // Sorterbereich resetten (damit außen Partner zurückgesetzt werden können!)

      JU     ENDE_Mig


--- NW 35: Schrittkette beenden ---
ENDE_Mig: L      0                                           // Schritt 0: Warten
      T      Dyn.Sk.Akt_Schritt

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

      SET
      R      Dyn.Sk.Err_Uebzeit

      BEU


--- NW 36: Nächsten Schritt aktivieren ---
Plus: T      Dyn.Sk.T_ok                                     // Wartezeit übergeben
W300: T      Dyn.Sk.T_ok                                     // Wartezeit übergeben  //alwwwww
      A      Err_Uebzeit                                     // Störung noch nicht quittiert
      BEC

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

      AN     Warte_neu                                       // Wartezeit neutriggern
      JC     W220_Mig

      L      0
      T      Dyn.Sk.Tok_Zelle                                // Wartezeit

W220_Mig: A      Warte_stop                                  // Wartezeit stoppen
      BEC

      L      Dyn.Sk.Tok_Zelle
      L      "MW4"                                           // Wartezeit +10ms
      +I
      T      Dyn.Sk.Tok_Zelle                                // Wartezeit
      L      Dyn.Sk.T_ok                                     // abgelaufen ?
      <I                                                     // Nein !
      BEC

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

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

      BEU


--- NW 37: Überwachungszeit kontrollieren ---
tueb: A      Ueb_akt
      =      Dyn.Sk.Ueb_akt                                  // Für Statuskontrolle

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

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

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

      BEU

en24: NOP 0

--- NW 38: Überwachungszeit +1 ---
      AN     Dyn.Sk.Ueb_akt                                  // Schrittaktion ist aktiv
      ON     "100ms-Impuls"
      BEC

      L      Dyn.Sk.Terr_Zelle
      L      "MW2"
      +I
      T      Dyn.Sk.Terr_Zelle

      BEU


--- NW 39: Ende ---
      BE

