=== FB 2275: MHMOmniBereich_Plus  [STL] ===
INTERFACE:
  Input:
    Bereichs_Nr : Int                                   // Aufruf für Bereich
    ErrQuit : Bool                                      // Ablaufstörung quittieren
    B_BereichsAnfang : Bool                             // Sensor Trolley fährt in Bereich
    B_BereichsEnde : Bool                               // Sensor Trolley istam BereichsEnde
    B_Zähl : Bool                                       // Sensor Trolley hat Bereich verlassen
    B_Stau_raus : Bool                                  // Sensor Stau im Bereich rausfahren
    Start_Ok : Bool                                     // Starten ist erlauTrolley
    Antrieb_Bereich_aktiv : Bool                        // Bereichs-Antrieb aktiv
    Antrieb_plus_aktiv : Bool                           // Antrieb plus aktiv
    RestZeit_Bereich_plus : Int := 999                  // Bereich +1: Restzeit bis AFS stoppt (s)
  Output:
    Antrieb_Bereich_vor : Bool                          // Bereichs-Antrieb einschalten
    Antrieb_Bereich_stop : Bool                         // Bereichs-Antrieb stoppen
    Error : Word                                        // Störungen übergeben
  InOut:
    Antrieb_Bereich_start : Bool                        // Bereichs-Antrieb mit Zeit starten
    Antrieb_plus_vor : Bool                             // Antrieb plus einschalten
    Antrieb_plus_start : Bool                           // Antrieb plus mit Zeit starten
    Antrieb_minus_vor : Bool                            // Antrieb minus einschalten
    hStOk : Bool                                        // Anzeige Start n. Störung aktivieren
  Static:
    Res20 : Array[1..4] of Int                          // Reserve
    Para : Struct                                       // Parameter
      Bereich_DL_DB : Int                               // Einsprung Bereich-Datenliste-DB
      Frei22 : Int
      Frei24 : Int
    Res30 : Array[1..2] of Int                          // Reserve
    Bereich : "UDLHMOmniBereich_Plus"                   // Statische Bereichdaten (aus DL)
    Dyn : Struct                                        // Dynamische Daten
      Status : Struct
        Trolley_kommt_in_Bereich : Bool                 // Trolley kommt in Bereich (Signal von Bereich-1)
        Trolley_ist_im_Bereich : Bool                   // Trolley fährt in Bereich
        Trolley_am_BereichsEnde : Bool                  // Trolley ist am BereichsEnde
        Trolley_wartet_auf_Ziel-FC : Bool
        Trolley_wartet_Bereich+1 : Bool                 // Trolley wartet auf Bereich +1
        Trolley_fährt_aus : Bool                        // Trolley fährt aus
        Trolley_draussen : Bool                         // Trolley ist ausgefahren
        Error_aktiv : Bool                              // Störung vorhanden
        Reset_aktiv : Bool := TRUE                      // Reset aktiv
        Anfangs-Sensor_ausgewertet : Bool
        Ende-Sensor_ausgewertet : Bool
        Inilauf_aktiv : Bool
        Trolley an Raus-Sensor : Bool                   // Trolley ist am Raus-Sensor
        Stau_an_Raus-Sensor : Bool                      // Stau an Raus-Sensor (kein Zählen mehr)
      HMI : Struct
        Bereich_resetten : Bool                         // Bereich resetten (IN:HMI, Out:PLC)
      Sk : "USk_ILS"                                    // Status der Schrittkette
      Rueckmld : Struct
        RET_VAL_BLKMOV_Bereich : Int                    // Rückmeldung nach BLKMOV-Aufruf
        RET_VAL_DL_Bereich : Byte
      Error : "UErrHMOmniBereich"
      Stau_Zeit : Int                                   // Sensor B_VorSep ist belegt [100ms]
      Leer_Zeit : Int
      Stop_Ursache : Word                               // Stop-Stelle: Nw + Position
      Gefahrene_Trolleys : DInt                         // Anzahl der getätigten Vereinzelungstakte
      Laufzähler : Int                                  // Laufzähler
      Wartezeit : Int                                   // Wartezeit (kein EInfahren erlaubt) [s]
      Trolley_DL : Struct                               // AB DW350: Liste der Trolleys im Lager
        Datenlistenkopf : Struct
          KOPF : Word := WORD#16#DA01                   // Datenliste-Kennnung (DA) / Datensatzlänge in Word (1 - 128)
          LAENGE : Int := 10                            // Länge der Datenliste (maximale Anzahl der Datensätze)
          STAMMDATEN : Int := 1                         // Stammdatenlänge in Word (1 - 9)
          INDDB : Int                                   // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!)
          LAENGEINDDB : Int                             // Länge des indizierten DB in Word (nur bei Stammdaten = 1 erlaubt !!!)
          INDDATEN_WANDEL_FC : Int                      // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!)
          LETZTERZUGRIFF : Int                          // Speicherung des letzten Zugriffs
          Belegt14 : Int                                // reserviert von Sort-Datenliste
          AnzahlEintraege : Int                         // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!)
          Reserve18 : Int                               // Reserve
        Trolley : Array[1..10] of Int                   // TrolleyZeit bis Ende (s) 
        Endekennung : Word := WORD#16#DAEE              // Datensort-Ende-Kennung (DBEE)
      Restzeit : Int                                    // Diese  Zeit hat Trolley noch zum Fahren (s)
      Timer_Rein : TON_TIME
      Timer_Raus : TON_TIME
      Zeit_Ohne_B_In_Schleuse : Int                     // Trolley nicht an B_In_Schleuse
      Zeit_Ohne_B_Zähl : Int                            // Trolley nicht an B_Zähl
      Zeit_Ausfahren_Ohne_B_Zähl : Int                  // Trolley fährt nicht zu B_Zähl
      Raus_Trolleys : Int                               // Anzahl der Trolleys zwischen Schleuse und Raus-Sensor
      Stau_Zeit_RausSensor : Int                        // Sensor B_AusSep ist belegt [1s]
      Res200 : Array[1..2] of Int                       // Reserve
  Temp:
    Quelle : Any                                        // Zeiger, wo Rein-Daten sind
    Ziel : Any                                          // Zeiger, FIFO-Stelle
    Ueb_akt : Bool                                      // Überwachungszeit aktivieren
    Weiter : Bool                                       // Weiterschaltbedingung ist erfüllt
    Warte_neu : Bool                                    // Wartezeit neu triggern
    Warte_stop : Bool                                   // Wartezeit stoppen
    ZielFC_vorhanden : Bool
    DraussenFC_vorhanden : Bool
    Trolley_draussen : Bool                             // Signal: Trolley ist draussen
    Antriebe_starten : Bool
    ZielFC : Word                                       // Ziel-FC
    DraussenFC : Word                                   // Draussen-FC
    AR1Start : DInt                                     // Startwert mit Offset 0
    AR1Zeiger : DWord                                   // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
    SSDW : Int
    SSDB : Int
    Restzeit_errechnet : Int
  Constant:

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

      L      274                                             // Einsprung Bereich-DL
      T      Para.Bereich_DL_DB                              // vor Aufruf übergeben!


--- 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 ---
      SET                                                    // Jeden Zyklus neu
      R      Dyn.Status."Trolley_wartet_auf_Ziel-FC"
      R      Dyn.Status."Trolley_wartet_Bereich+1"
      R      Dyn.Status.Trolley_draussen
      R      Antrieb_Bereich_vor
      R      Antrieb_Bereich_stop

      L      0
      T      Restzeit_errechnet


--- NW 4: HMI-Zeug ---
// Von HMI:
      A      Dyn.HMI.Bereich_resetten
      R      Dyn.HMI.Bereich_resetten                        // von HMI
      S      Dyn.Sk.Reset                                    // SK zurücksetzen


--- NW 5: Sensoren entprellen ---
// Rein-Sensor entprellen:
      AN     B_BereichsAnfang
      A      Dyn.Status."Anfangs-Sensor_ausgewertet"
      A      Antrieb_Bereich_aktiv
      =      "M200.0"

CALL SYS "TON" (IN:="M200.0", PT:=t#7s, Q:=?, ET:=?)

      A      Dyn.Timer_Rein.Q
      R      Dyn.Status."Anfangs-Sensor_ausgewertet"

// Ende-Sensor entprellen:
      AN     B_BereichsEnde
      A      Dyn.Status."Ende-Sensor_ausgewertet"
      A      Antrieb_Bereich_aktiv
      A      Antrieb_plus_aktiv
      =      "M200.0"

CALL SYS "TON" (IN:="M200.0", PT:=t#6s, Q:=?, ET:=?)

      A      Dyn.Timer_Raus.Q
      R      Dyn.Status."Ende-Sensor_ausgewertet"


--- NW 6: Schrittkette zurücksetzen ---
      A      ErrQuit                                         // Überwachungszeit abgelaufen quittieren
      R      Dyn.Sk.Err_Uebzeit
      R      Dyn.Error.Err_Trolley_raus                      // Trolley fährt nicht aus
      R      Dyn.Error.Err_Raus_Sensor                       // Raus-Sensor wird nicht erreicht (oder dauernd aktiv)!

// Reset oder Trolley kommt am Ende nicht an:
      A      ErrQuit                                         // Überwachungszeit abgelaufen quittieren
      A(
      A      Dyn.Status.Trolley_am_BereichsEnde
      AN     B_BereichsEnde                                  // Aber kein Trolley mehr am Sensor
      O      Dyn.Error.Err_Trolley_nicht_am_Ende             // Trolley fährt nicht in Bereich
      )
      O      Dyn.Sk.Reset                                    // SK zurücksetzen
      JCN    en04                                            // Negierter Sprung!

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

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

      SET
      R      Dyn.Error.Err_BLKMov                            // Error bei Block kopieren
      R      Dyn.Sk.Reset                                    // SK zurücksetzen
      R      Dyn.Sk.Err_Schritt                              // Undefinierter Schritt
      R      Dyn.Sk.Err_Uebzeit                              // Sofort weiter !
      R      Dyn.Sk.Reset_Akt                                // Reset ist aktiv
      R      Dyn.Status.Trolley_am_BereichsEnde
      R      Dyn.Status."Trolley_wartet_auf_Ziel-FC"
      R      Dyn.Status."Trolley_wartet_Bereich+1"
      R      Dyn.Status."Trolley_fährt_aus"
      R      Dyn.Status.Inilauf_aktiv
      S      Dyn.Status.Reset_aktiv

      SET
      R      Dyn.Error.Bereich_DL                            // Bereich-Datenliste fehlerhaft
      R      Dyn.Error.Undef_Bereich                         // undefinierter Bereich
      R      Dyn.Error.Err_Trolley_nicht_am_Ende             // Trolley fährt nicht in Bereich
      R      Dyn.Error.Err_Uebzeit                           // Überwachungzeit ist abgelaufen
      R      Dyn.Error.Err_Schritt                           // Schritt-Nummer ist nicht definiert
      R      Dyn.Error.Err_Stau_Eingang
      R      Dyn.Error.Err_BLKMov
      R      Dyn.Error.Err_Trolley_raus                      // Trolley fährt nicht aus
      R      Dyn.Error.Err_Raus_Sensor                       // Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)!
      R      Dyn.Error.Err11                                 // kein Ziel angegeben
      R      Dyn.Error.Err12                                 // Weichen-Datenliste fehlerhaft
      R      Dyn.Error.Err13                                 // undefinierte Weiche
      R      Dyn.Error.Err14                                 // Weiche bleibt belegt
      R      Dyn.Error.Err15
      R      Dyn.Error.Err16

      L      0
      T      Dyn.Stau_Zeit                                   // Sensor B_VorSep ist belegt [10ms]

// Defaultwerte übergeben:
      L      0                                               // Damit statische Werte neu aus Datenbank geholt werden !
      T      Bereich.Bereichs_Nr                             // Nummer des Bereichs

      JU     RET

en04: NOP 0


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

      A      Dyn.Error.Bereich_DL                            // Bereich-Datenliste fehlerhaft
      =      "M200.0"
      A      Dyn.Error.Undef_Bereich                         // undefinierter Bereich
      =      "M200.1"
      A      Dyn.Error.Err_Trolley_nicht_am_Ende             // Trolley fährt nicht in Bereich
      =      "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_Stau_Eingang
      =      "M200.5"
      A      Dyn.Error.Err_BLKMov                            // Error bei Block kopieren
      =      "M200.6"
      A      Dyn.Error.Err_Trolley_raus                      // Trolley 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.Err11                                 // Trolley-Ziel nicht bekannt
      =      "M201.1"
      A      Dyn.Error.Err12                                 // Weichen-Datenliste fehlerhaft
      =      "M201.2"
      A      Dyn.Error.Err13                                 // undefinierte Weiche
      =      "M201.3"
      A      Dyn.Error.Err14                                 // Weiche bleibt belegt
      =      "M201.4"
      A      Dyn.Error.Err15
      =      "M201.5"
      A      Dyn.Error.Err16
      =      "M201.6"
      A      Dyn.Error.Err17
      =      "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

// Störung vorhanden:
      L      0
      <>I                                                    // Ja !
      =      Dyn.Status.Error_aktiv
      S      hStOk

// Antrieb stoppen:
      A(
      ON     Dyn.Sk.Auto_akt                                 // SystemVoraussetzungen fehlen
      O      Dyn.Sk.Hand_akt
      ON     Dyn.Sk.Bereich_ok
      )
      S      Antrieb_Bereich_stop                            // Antrieb stoppen

// Störungen pro Zyklus neu erzeugen:
      SET
      R      Dyn.Error.Bereich_DL                            // Bereich-Datenliste fehlerhaft
      R      Dyn.Error.Undef_Bereich                         // undefinierter Bereich
// /      R     #Dyn.Error.Err_Trolley_nicht_in_Bereich//Trolley fährt nicht in Bereich
// /      R     #Dyn.Error.Err_Uebzeit      //Überwachungzeit ist abgelaufen
      R      Dyn.Error.Err_Schritt                           // Schritt-Nummer ist nicht definiert
// /      R     #Dyn.Error.Err_Stau_Einfahrt//Betriebsart ist nicht möglich
      R      Dyn.Error.Err_BLKMov
// /      R     #Dyn.Error.Err_Trolley_raus//Trolley fährt nicht aus
// /      R     #Dyn.Error.Err_Raus_Sensor//Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)!
      R      Dyn.Error.Err11                                 // Trolley-Ziel nicht bekannt
      R      Dyn.Error.Err12                                 // Weichen-Datenliste fehlerhaft
      R      Dyn.Error.Err13                                 // undefinierte Weiche
      R      Dyn.Error.Err14                                 // Weiche bleibt belegt
      R      Dyn.Error.Err15                                 // undefinierte Weiche
      R      Dyn.Error.Err16                                 // Weiche bleibt belegt
      R      Dyn.Error.Err17


--- NW 8: Statische Bereich-Parameter holen ---
      L      Bereich.Bereichs_Nr                             // Nummer des Bereichs
      L      Bereichs_Nr                                     // Aufruf-Parameter
      ==I                                                    // Identisch ?
      R      Dyn.Error.Bereich_DL                            // Bereichdatenbank fehlerhaft
      R      Dyn.Error.Undef_Bereich                         // undefinierter Bereich
      JC     en06                                            // Ja !

      T      "MW200"                                         // Search-Daten

CALL FC "DatenOut" (SSDB:=Para.Bereich_DL_DB, SSDW:=0, 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_Bereich                 // Rückmeldung bei Datenbank-Zugriff (Gefälle-DL)

      JBI    G_Ok

      A      "M199.0"
      JCN    w060

      SET
      =      Dyn.Error.Bereich_DL                            // Bereichdatenbank fehlerhaft

      L      16#A061
      T      Dyn.Stop_Ursache

      JU     RET

w060: SET
      S      Dyn.Error.Undef_Bereich                         // undefinierter Bereich

      L      16#A062
      T      Dyn.Stop_Ursache

      JU     RET

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

      L      16#A063
      T      Dyn.Stop_Ursache

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

      L      Bereich.Bereichs_Typ                            // Bereichtyp = 174 (Normal)
      L      2275                                            // Dieser Aufruf-FB ?
      ==I                                                    // Ja !
      JC     w061

      SET
      S      Dyn.Error.Undef_Bereich                         // undefinierter Bereich

      L      0                                               // Bereich ungültig !
      T      Bereich.Bereichs_Nr                             // Nummer des Bereichs

      L      16#A064
      T      Dyn.Stop_Ursache

      JU     RET

// Defaultwerte übergeben:
w061: NOP 0

      JU     RET

en06: NOP 0


--- NW 9: Trolleydaten auf Förderer vorhanden ---
      L      Dyn.Trolley_DL.Datenlistenkopf.AnzahlEintraege
      L      0                                               // Trolleys im Bereich?
      >I                                                     // Ja!
      O      Dyn.Status.Inilauf_aktiv
      O      Dyn.Status.Reset_aktiv                          // Reset ist aktiv
      =      Dyn.Status.Trolley_ist_im_Bereich


--- NW 10: Antrieb zusätzlich starten / stoppen ---
// Antrieb -1:
      A(
      O      Dyn.Error.Err_Stau_Eingang                      // Stau bei Einfahrt
      O      Dyn.Status."Anfangs-Sensor_ausgewertet"
      )
      A      Antrieb_Bereich_aktiv
      S      Antrieb_minus_vor

// Bereichs-Antrieb starten:
      A      ErrQuit                                         // Überwachungszeit abgelaufen quittieren
      O
      A      B_BereichsAnfang
      AN     Dyn.Error.Err_Stau_Eingang                      // Stau bei Einfahrt (Quittierung oder Sensor=0, wegen Bürstenantrieb
      O      Dyn.Status.Trolley_kommt_in_Bereich             // Signal von Bereich-1
      O      Dyn.Status.Trolley_ist_im_Bereich
      O      Dyn.Status."Trolley_fährt_aus"
      O      Dyn.Status."Anfangs-Sensor_ausgewertet"
      O      Dyn.Status."Ende-Sensor_ausgewertet"
      O      Dyn.Status.Inilauf_aktiv
      O      Dyn.Status.Reset_aktiv
      S      Antrieb_Bereich_start                           // Antrieb starten

// Bereichsantrieb vor:
      A      Dyn.Status.Trolley_kommt_in_Bereich             // Signal von Bereich-1
      O      B_BereichsAnfang
      O      Dyn.Status."Trolley_fährt_aus"
      S      Antrieb_Bereich_vor
      R      Dyn.Status.Trolley_kommt_in_Bereich             // Signal von Bereich-1 (Zyklus)

// Bereichs-Antrieb stoppen:
      A      Dyn.Error.Err_Trolley_nicht_am_Ende
      O
      A      Dyn.Status.Trolley_am_BereichsEnde
      AN     Dyn.Status."Trolley_fährt_aus"
      O
      A      Dyn.Status."Trolley_fährt_aus"
      A      Bereich.Parameter_allg.Antrieb_Plus_vorhanden   // Bereich an weiterem Antrieb (Weiche)
      AN     Antrieb_plus_aktiv                              // //Antrieb plus aktiv
      S      Antrieb_Bereich_stop                            // Antrieb stoppen

// Antrieb +1:
      L      Dyn.Raus_Trolleys
      L      0                                               // Trolles unterwegs?
      >I                                                     // Ja!
      AN     Dyn.Status."Stau_an_Raus-Sensor"                // Stau an Raus-Sensor
      O      Dyn.Status."Trolley_fährt_aus"
      S      Antrieb_plus_start                              // Antrieb plus starten
      S      Antrieb_plus_vor                                // Antrieb plus einschalten


--- NW 11: Plus: Trolley ist an Zähl-/Stau-Sensor ---
      A      "B_Zähl"
      =      Trolley_draussen

      A      Trolley_draussen
      JC     B_Raus

      AN     Dyn.Status."Trolley an Raus-Sensor"
      AN     Dyn.Status."Stau_an_Raus-Sensor"
      ON     "100ms-Impuls"
      ON     Dyn.Sk.Bereich_ok
      JC     En10

      L      Dyn."Zeit_Ohne_B_Zähl"
      +      1                                               // Zeit ohne Sensor +100ms
      T      Dyn."Zeit_Ohne_B_Zähl"

// B-Raus lange genug frei?:
      L      10                                              // Nach ca. 1s
      >=I
      AN     Dyn.Status."Stau_an_Raus-Sensor"
      JC     RDel

      CAC
      L      200                                             // Nach ca. 20s
      >=I
      JC     RDel

      JU     En10

RDel: SET
      R      Dyn.Status."Trolley an Raus-Sensor"
      L      0
      T      Dyn."Zeit_Ohne_B_Zähl"
      T      Dyn.Stau_Zeit_RausSensor

// War Stau?:
      A      Dyn.Status."Stau_an_Raus-Sensor"
      R      Dyn.Status."Stau_an_Raus-Sensor"
      JCN    En10

      L      0                                               // Bisher gefahrene Trolleys löschen
      T      Dyn.Raus_Trolleys
      T      Dyn."Zeit_Ohne_B_Zähl"
      T      Dyn.Stau_Zeit_RausSensor

      JU     En10

B_Raus: L      0
      T      Dyn."Zeit_Ohne_B_Zähl"
      T      Dyn."Zeit_Ausfahren_Ohne_B_Zähl"

// Einmalig:
      AN     Dyn.Status."Trolley an Raus-Sensor"
      S      Dyn.Status."Trolley an Raus-Sensor"             // Raus-Sensor ausgewertet
      JCN    Xn10                                            // Negierter Sprung

      L      Dyn.Raus_Trolleys
      +      -1                                              // Ausgefahrene Trolleys -1
      T      Dyn.Raus_Trolleys

      L      0
      >=I
      JC     Xn10

      T      Dyn.Raus_Trolleys                               // Minimum übergeben

// Stau an B_Raus:
Xn10: AN     "100ms-Impuls"
      O      Dyn.Status."Stau_an_Raus-Sensor"
      JC     En10

      L      Dyn.Stau_Zeit_RausSensor
      +      1                                               // StauZeit +1
      T      Dyn.Stau_Zeit_RausSensor

      L      90                                              // Nach ca. 9s
      >=I
      JCN    En10                                            // Negierter Sprung

      L      0                                               // Zeit löschen
      T      Dyn.Stau_Zeit_RausSensor

      SET
      S      Dyn.Status."Stau_an_Raus-Sensor"

En10: NOP 0


--- NW 12: Plus: Trolley fährt nicht bis Zähl-Sensor ---
      L      Dyn.Raus_Trolleys
      L      0                                               // Trolles unterwegs?
      ==I                                                    // Nein!
      O      Trolley_draussen                                // Sensor wurde erreicht
      O      Dyn.Status.Reset_aktiv
      JC     RTTD

      AN     Antrieb_plus_aktiv
      A      Bereich.Parameter_allg.Antrieb_Plus_vorhanden
      ON     "1s-Impuls"
      O      Dyn.Error.Err_Raus_Sensor                       // Trolley fährt nicht aus
      JC     En12

      L      Dyn."Zeit_Ausfahren_Ohne_B_Zähl"
      +      1
      T      Dyn."Zeit_Ausfahren_Ohne_B_Zähl"

// Trolley fährt nicht bis Zähl-Sensor!:
      L      Bereich."Übzeit_aus_Bereich"
      >=I
      S      Dyn.Error.Err_Raus_Sensor                       // Trolley fährt nicht aus
      JCN    En12                                            // Negierter Sprung!

      L      Dyn.Raus_Trolleys
      +      -1
      T      Dyn.Raus_Trolleys

      JU     En12

RTTD: L      0
      T      Dyn."Zeit_Ausfahren_Ohne_B_Zähl"

      SET
      R      Dyn.Error.Err_Raus_Sensor                       // Trolley fährt nicht aus

En12: NOP 0


--- NW 13: Laufzähler ---
      AN     Antrieb_Bereich_aktiv
      ON     "1s-Impuls"
      JC     X900

      L      Dyn."Laufzähler"
      +      +1
      T      Dyn."Laufzähler"

// Laufzähler rücksetzen?:
      A      Dyn.Status.Trolley_ist_im_Bereich
      JC     Warte

      L      1                                               // Rücksetzen
      T      Dyn."Laufzähler"

Warte: L      Dyn.Wartezeit
      +      -1
      T      Dyn.Wartezeit

      L      0                                               // Minimum unterschritten?
      >=I                                                    // Nein!
      JC     X900

      T      Dyn.Wartezeit                                   // Minimum übergeben

X900: NOP 0


--- NW 14: Anfangs-Sensor auswerten ---
      L      Bereich.Bereich_Dyn_DB
      T      SSDB

      L      Bereich.Bereich_Dyn_DW
      L      110
      +I
      T      SSDW

      A      B_BereichsAnfang
      A      Antrieb_Bereich_aktiv
      AN     Dyn.Status."Anfangs-Sensor_ausgewertet"
      S      Dyn.Status."Anfangs-Sensor_ausgewertet"
      JCN    ReinEn                                          // Negierter Sprung

// Abstand schon gespeichert?:
      L      Bereich.Fahrzeit
      L      1                                               // Sinnvoller Wert?
      <=I                                                    // Nein !
      L      999                                             // Bei Inilauf
      T      "MW220"
      S      Dyn.Status.Inilauf_aktiv
      JC     Save

      L      Bereich.Fahrzeit
      L      Dyn."Laufzähler"
      +I                                                     // Abstand dazu addieren
      T      "MW220"

// Eintrag in Trolley-Bereichsliste
Save: CALL FC "DatenIn" (SSDB:=SSDB, SSDW:=SSDW, INDATEN:=P#M220.0, RE_VAL:="MB199")

// Wartezeit (Einlagern blöckieren) speichern:
      L      6                                               // 6s wegen nach 5s draussen
      T      Dyn.Wartezeit                                   // Damit genügend Abstand zwischen 2 Trolleys

ReinEn: NOP 0


--- NW 15: Ende-Sensor auswerten ---
      A      ErrQuit                                         // Überwachungszeit abgelaufen quittieren
      A      Dyn.Error.Err_Trolley_nicht_am_Ende             // Trolley fährt nicht in Bereich
      R      Dyn.Error.Err_Trolley_nicht_am_Ende             // Trolley fährt nicht in Bereich
      S      Antrieb_Bereich_start
      JC     Delete

      A      B_BereichsEnde
      A(
      O      Antrieb_Bereich_aktiv
      O      Dyn.Error.Err_Trolley_nicht_am_Ende
      )
      AN     Dyn.Status."Ende-Sensor_ausgewertet"
      S      Dyn.Status."Ende-Sensor_ausgewertet"
      JCN    EndeEn                                          // Negierter Sprung

      A      Dyn.Status.Inilauf_aktiv
      R      Dyn.Status.Inilauf_aktiv
      JCN    Delete                                          // Negierter Sprung

      L      Dyn."Laufzähler"
      +      -3                                              // damit mehr Sicherheit!
      T      Bereich.Fahrzeit                                // Abstand speichern

// /Austrag aus Trolley-Bereichsliste
Delete: CALL FC "DatenOut" (SSDB:=SSDB, SSDW:=SSDW, PARA:=16#F100, SEARCHDATEN:="MW220", RE_VAL:="MB199", OUTDATEN:="MW220", Position:="MW196")   // 1.Datensatz lesen

CALL FC "DatenOut" (SSDB:=SSDB, SSDW:=SSDW, PARA:=16#E100, SEARCHDATEN:="MW220", RE_VAL:="MB199", OUTDATEN:="MW220", Position:="MW196")   // Angegebenen Datensatz austragen

EndeEn: NOP 0


--- NW 16: Restzeit ermitteln ---
// Keine Daten gespeichert?:
      AN     Dyn.Status.Trolley_ist_im_Bereich
      L      999                                             // Einfahren erlaubt
      JU     Rest                                            // Aktuell ohne Berechnung

// Auswertung des nächsten Trolleys:
CALL FC "DatenOut" (SSDB:=SSDB, SSDW:=SSDW, PARA:=16#F100, SEARCHDATEN:="MW220", RE_VAL:="MB199", OUTDATEN:="MW220", Position:="MW196")   // 1.Datensatz lesen

      L      "MW220"                                         // Bei dieser Zeit wird Trolley am B_BereichsEnde erwartet
      L      Dyn."Laufzähler"
      -I
      T      Restzeit_errechnet
Rest: T      Dyn.Restzeit

// Restzeit nullen?:
// Laufzähler-Überlauf oder sonst Einfahrt blockieren:
      L      Dyn."Laufzähler"
      L      32000                                           // wird zu groß?
      >I                                                     // Ja !
      O      Dyn.Status.Inilauf_aktiv
      O      Dyn.Status.Reset_aktiv
      O      Dyn.Status.Error_aktiv
      O      Dyn.Status."Anfangs-Sensor_ausgewertet"
      O(
      L      Dyn.Sk.Akt_Schritt
      L      0                                               // Warten auf Trolley?
      <>I                                                    // //Nein, also am Ende, fährt aus,...!
      )
      O(
      L      Dyn.Wartezeit                                   // Damit genügend Abstand zwischen 2 Trolleys
      L      0                                               // Einfahren noch blockieren ?
      >I                                                     // Ja!
      )
      JC     KeinEinfahren                                   // Einfahren nicht erlaubt

      L      Dyn.Restzeit
      L      0                                               // sinnvoller Wert?
      >=I                                                    // Ja!
      A(
      L      Dyn.Trolley_DL.Datenlistenkopf.AnzahlEintraege
      L      Dyn.Trolley_DL.Datenlistenkopf.LAENGE
      <I                                                     // noch Platz vorhanden!
      )
      JC     RestOk

KeinEinfahren: L      0                                      // Kein Einfahren
      T      Dyn.Restzeit                                    // Minimum übrgeben

RestOk: NOP 0


--- NW 17: Spezial-FCs vorhanden? ---
      L      Bereich.Ziel_FC
      T      ZielFC
      L      0                                               // Parameter vorhanden ?
      >I                                                     // Ja!
      =      ZielFC_vorhanden

      L      Bereich.Draussen_FC
      T      DraussenFC
      L      0                                               // Parameter vorhanden ?
      >I                                                     // Ja!
      =      DraussenFC_vorhanden


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

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

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

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

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

Xn09: NOP 0


--- NW 19: Schrittkette anhalten ---
      A      Dyn.Sk.Auto_akt                                 // Automatik ist aktiv
      A      Dyn.Sk.Bereich_ok
      CLR

      JU     en08_Mig                                        // 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

      JU     RET

en08_Mig: NOP 0


--- NW 20: 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     s010                                            // Schritt 10
      JU     s011                                            // Schritt 11
      JU     s012                                            // Schritt 12
      JU     s013                                            // Schritt 13
      JU     s014                                            // Schritt 14
      JU     s015                                            // Schritt 15
      JU     s016                                            // Schritt 16
      JU     s017                                            // Schritt 17
      JU     s018                                            // Schritt 18
      JU     s019                                            // Schritt 19
      JU     s020                                            // Schritt 20
      JU     s021                                            // Schritt 21
      JU     s022                                            // Schritt 22
      JU     s023                                            // Schritt 23
      JU     s024                                            // Schritt 24
      JU     s025                                            // Schritt 25
      JU     s026                                            // Schritt 26
      JU     s027                                            // Schritt 27
      JU     s028                                            // Schritt 28
      JU     s029                                            // Schritt 29
      JU     s030                                            // Schritt 30
Ende: S      Dyn.Sk.Err_Schritt                              // Undefinierter Schritt

      L      16#A131
      T      Dyn.Stop_Ursache

      JU     RET

Neu_Mig: A      Dyn.Sk.Err_Uebzeit
      JCN    Sk

      L      16#A132
      T      Dyn.Stop_Ursache

      JU     RET

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: SPA   Ende
// s003: SPA   Ende
// s004: SPA   Ende
// s005: SPA   Ende
s006: JU     Ende
s007: JU     Ende
s008: JU     Ende
s009: JU     Ende
s010: JU     Ende
s011: JU     Ende
s012: JU     Ende
s013: JU     Ende
s014: JU     Ende
s015: JU     Ende
s016: JU     Ende
s017: JU     Ende
s018: JU     Ende
s019: JU     Ende
s020: JU     Ende
s021: JU     Ende
s022: JU     Ende
s023: JU     Ende
s024: JU     Ende
s025: JU     Ende
s026: JU     Ende
s027: JU     Ende
s028: JU     Ende
s029: JU     Ende
s030: JU     Ende


--- NW 21: 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 !
      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
      A      Dyn.Sk.Auto_akt                                 // Automatik ist aktiv
      A      Dyn.Sk.Bereich_ok
      =      Ueb_akt                                         // Überwachungszeit aktivieren
      L      50                                              // Angabe der Überwachungszeit (*1s)
      JU     tueb                                            // Überwachungszeit

      JU     RET


--- NW 22: Schritt 0: Warten auf Trolley am Bereichs-Ende ---
s000: SET                                                    // Weiterschaltbedingung
      A      B_BereichsEnde                                  // Trolley im Bereich erkannt
      A(
      O      Antrieb_Bereich_aktiv
      O      Dyn.Error.Err_Trolley_nicht_am_Ende
      )
      =      Weiter

// Schrittaktionen:
      SET
      R      Dyn.Error.Err_Trolley_raus

// Antriebe:
// siehe Nw10

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

      L      16#B001
      T      Dyn.Stop_Ursache

// Überwachungszeit starten:
      A      Dyn.Status.Trolley_ist_im_Bereich
      A      Antrieb_Bereich_aktiv
      =      Ueb_akt                                         // Überwachungszeit aktivieren

// Reset aktiv?
      A      Dyn.Status.Reset_aktiv
      A      Dyn.Sk.Err_Uebzeit
      R      Dyn.Sk.Err_Uebzeit
      JC     Reset_fertig

      L      Restzeit_errechnet
      L      -20                                             // Trolley schon 20s überfällig
      <I
      AN     Dyn.Status.Inilauf_aktiv
      AN     Dyn.Status.Reset_aktiv
      O      Dyn.Sk.Err_Uebzeit
      S      Dyn.Error.Err_Trolley_nicht_am_Ende

// Bei Üb.Zeit -> Kein Trolley drin!
      A      Dyn.Sk.Err_Uebzeit
      JCN    X000                                            // Negierter Sprung

      SET
      R      Dyn.Sk.Err_Uebzeit
      R      Dyn.Error.Err_Trolley_nicht_am_Ende

      JU     Delete                                          // Trolley aus Liste löschen

X000: L      Bereich."Übzeit_in_Bereich"
      JU     tueb                                            // Überwachungszeit

Reset_fertig: SET
      R      Dyn.Status.Reset_aktiv
      R      Dyn.Status.Inilauf_aktiv

      L      0
      T      Dyn.Raus_Trolleys

// Trolleydaen löschen:
CALL FC "DatenReset" (SSDB:=SSDB, SSDW:=SSDW, RE_VAL:="MB199")

      JU     ENDE_Mig


--- NW 23: Schritt 1: Trolley ist am Bereichsende ---
s001: NOP 0
// Schrittaktionen:
      SET
      =      Weiter
      R      Dyn.Error.Err_Trolley_nicht_am_Ende

      AN     Weiter
      JC     RET

      L      2                                               // Weiter mit Schritt 2 (Ziel-FC?)
      JU     Neu_Mig                                         // Bei diesem Schritt weiter


--- NW 24: Schritt 2: Ziel-FC ---
s002: NOP 0

// Schrittaktionen:
      SET
      S      Dyn.Status.Trolley_am_BereichsEnde
      S      Dyn.Status."Trolley_wartet_auf_Ziel-FC"

      AN     ZielFC_vorhanden
      R      Dyn.Status."Trolley_wartet_auf_Ziel-FC"
      L      3                                               // Weiter mit Schritt 3 (Ausfahren ok?)
      JC     Neu_Mig                                         // Bei diesem Schritt weiter

      SET                                                    // Rückmeldungen erst mal resetten
      R      "M180.6"                                        // Weiterfahrt von Ziel-FC erlaubt
      L      Bereichs_Nr                                     // Bereich-Nr.
      T      "MW190"                                         // übergeben
      L      0                                               // Erst mal nullen
      T      "MW194"                                         // übergeben
      T      "MW196"                                         // übergeben
      T      "MW198"                                         // Weichenziel

      UC     DB[ZielFC]                                      // Beeinflussung der Weiterfahrt

      L      16#B102
      T      Dyn.Stop_Ursache

      AN     "M180.6"                                        // Weiterfahrt von Ziel-FC erlaubt
      JC     RET

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


--- NW 25: Schritt 3: Start ok ? ---
s003: NOP 0

// Schrittaktionen:

// Anlage aus oder Störung:
      L      16#B031
      T      Dyn.Stop_Ursache

      AN     Dyn.Sk.Auto_akt                                 // Automatik ist aktiv
      ON     Dyn.Sk.Bereich_ok                               // Bereich ist gestört
      JC     X003

// Starten erlaut Trolley ?:
      L      16#B032
      T      Dyn.Stop_Ursache

      AN     Start_Ok                                        // Starten ist erlaubt
      JC     X003

// Stau im Bereich +1:
      L      16#B033
      T      Dyn.Stop_Ursache

      SET
      S      Dyn.Status."Trolley_wartet_Bereich+1"

      A      B_Stau_raus                                     // Sensor Stau im Bereich rausfahren
      JC     X003

// B_Aus_Bereich aktiv:
      L      16#B034
      T      Dyn.Stop_Ursache

      L      Dyn.Raus_Trolleys
      L      0                                               // Trolleys schon unterwegs?
      <>I                                                    // Ja!
      A      Dyn.Status."Trolley an Raus-Sensor"
      O      Dyn.Status."Stau_an_Raus-Sensor"
      =      Dyn.Error.Err_Raus_Sensor                       // Raus-Sensor wird nicht erreicht (oder dauernd aktiv)!
      JC     X003

// Zu viele Raus-Trolleys unterwegs:
      L      16#B027
      T      Dyn.Stop_Ursache

      L      Dyn.Raus_Trolleys                               // Gestartete Trolleys
      L      Bereich.MaxRausTrolleys                         // Erlaubte Anzahl gestarteter Trolleys
      >=I
      JC     X003

// Antriebe aktivieren / aktiv ?:
      A      Bereich.Parameter_allg.Antrieb_Plus_vorhanden   // Bereich an weiterem Antrieb (Weiche)
      S      Antrieb_plus_vor                                // Antrieb plus einschalten

      A(
      O      Antrieb_plus_aktiv                              // Antrieb plus aktiv
      ON     Bereich.Parameter_allg.Antrieb_Plus_vorhanden   // Bereich an weiterem Antrieb (Weiche)
      )
      S      Antrieb_Bereich_vor                             // Antrieb einschalten

      L      16#B036
      T      Dyn.Stop_Ursache

      AN     Antrieb_plus_aktiv                              // Antrieb plus aktiv
      A      Bereich.Parameter_allg.Antrieb_Plus_vorhanden   // Bereich an weiterem Antrieb (Weiche)
      JC     X003

      SET
      R      Dyn.Error.Err_Trolley_raus                      // Trolley fährt nicht aus

      L      Dyn.Raus_Trolleys
      +      1                                               // Gestartete Trolleys + 1
      T      Dyn.Raus_Trolleys

      L      4                                               // Weiter mit Schritt 4 (Trolley fährt aus)
      JU     Neu_Mig                                         // Bei diesem Schritt weiter

X003: L      2                                               // Beginn mit Schritt 2 (Ziel-FC?)
      T      Dyn.Sk.Neu_Schritt
      JU     RET


--- NW 26: Schritt 4: Trolley fährt aus ?      ---
s004: SET                                                    // Weiterschaltbedingung
      AN     B_BereichsEnde                                  // Sensor Trolley ist in Bereich
      A      Antrieb_Bereich_aktiv
      A(
      O      Antrieb_plus_aktiv                              // Antrieb plus aktiv
      ON     Bereich.Parameter_allg.Antrieb_Plus_vorhanden   // Bereich an weiterem Antrieb (Weiche)
      )
      =      Weiter

// Schrittaktionen:
      SET
      S      Dyn.Status."Trolley_fährt_aus"

// Antriebe:
// siehe Nw10

// 5 s ohne Trolley-Signal:
      A      Weiter                                          // Weiterschaltbedingung ist erfüllt
      R      Dyn.Sk.Err_Uebzeit                              // Sofort weiter !
      R      Dyn.Error.Err_Trolley_raus                      // Trolley fährt nicht aus
      L      500                                             // Angabe der Wartezeit (*10ms)
      JC     Plus                                            // Nächsten Schritt starten

// Trolley fährt nicht aus:
      A      Dyn.Sk.Err_Uebzeit
      S      Dyn.Error.Err_Trolley_raus                      // Trolley fährt nicht aus

// Automatisches löschen, falls Sensor spinnt:
      AN     B_BereichsEnde                                  // Sensor Trolley ist in Bereich
      A      Dyn.Error.Err_Trolley_raus                      // Trolley fährt nicht aus
      A      Dyn.Sk.Err_Uebzeit
      R      Dyn.Sk.Err_Uebzeit
      R      Dyn.Error.Err_Trolley_raus                      // Trolley fährt nicht aus

      L      16#B041
      T      Dyn.Stop_Ursache

      A      Antrieb_plus_aktiv
      =      Ueb_akt                                         // Überwachungszeit aktivieren
      L      20                                              // Angabe der Überwachungszeit (*1s)
      JU     tueb                                            // Überwachungszeit


--- NW 27: Schritt 5: Trolley ist draussen ---
s005: NOP 0

// Trolley hat Bereich verlassen:
      SET
      S      Dyn.Status.Trolley_draussen                     // 1 Zyklus
      R      Dyn.Status.Trolley_am_BereichsEnde
      R      Dyn.Status."Trolley_fährt_aus"

      L      Dyn.Gefahrene_Trolleys
      +      DINT#1                                          // Gefahrene Trolleys +1
      T      Dyn.Gefahrene_Trolleys

// Draussen-FC ?:
      AN     DraussenFC_vorhanden
      JC     NoFC                                            // Bei diesem Schritt weiter

      L      Bereichs_Nr                                     // Bereich-Nr.
      T      "MW190"

      L      0
      T      "MW198"

      UC     DB[DraussenFC]                                  // z.Bsp. Daten anpassen

NoFC: JU     ENDE_Mig


--- NW 28: 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

      JU     RET


--- NW 29: Nächsten Schritt aktivieren ---
Plus: T      Dyn.Sk.T_ok                                     // Wartezeit übergeben

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

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

      AN     Warte_neu                                       // Wartezeit neutriggern
      JC     W220_Mig

      L      0
      T      Dyn.Sk.Tok_Zelle                                // Wartezeit

W220_Mig: A      Warte_stop                                  // Wartezeit stoppen
      JC     RET

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

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

      JU     RET


--- NW 30: Ü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

      JU     RET

en24: NOP 0

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

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

      JU     RET


--- NW 32: Return ---
RET:  NOP 0


--- NW 33: Ende ---
      BE

