=== FB 177: MStartSync  [STL] ===
INTERFACE:
  Input:
    Sync_Nr : Int                                       // Aufruf für Weiche
    ErrQuit : Bool                                      // Ablaufstörung quittieren
    B_BT_da : Bool                                      // Sensor BT ist an Sychronisierstelle
    B_RefPunkt : Bool                                   // Sensor RefHaken am Referenzpunkt erkannt
    B_TeachPunk : Bool                                  // Sensor RefHaken am Teachpunkt erkannt
    Antrieb_aktiv : Bool                                // Band ist aktiv
  Output:
    Error : Word                                        // Störungen übergeben
  InOut:
    Antrieb_start : Bool                                // Kreiselantrieb starten
    hStOk : Bool                                        // Anzeige Start n. Störung aktivieren
  Static:
    Teil_IDX_Old : Int                                  // BT/MT-IDX (wird bei Auslagerung gemeldet)
    Teil_Ziel_Old : Int                                 // BT/MT bei diesem Abwurf-Ziel ausfahren/entladen
    Res1 : Array[1..3] of Int                           // Reserve
    SAVE : Struct
      Ink_ohne_Zeit : Int                               // Zeit Inkremntalgeberwert ohne Änderung [100ms]
    Para : Struct                                       // Parameter
      Weichen_DL_DB : Int                               // Einsprung Weichen-Datenliste-DB
      Weichen_DL_DW : Int                               // Einsprung Weichen-Datenliste-DW
      Offset_RefPunkt : DInt                            // Offset Refpunkt zu TaschenPunkt (für Teachen)
      Res1 : Array[1..1] of Int                         // Reserve
    SyncPkt : "UDLStartSync"                            // Fahrbereichs Daten
    Dyn : Struct                                        // Dynamische Daten
      Status : Struct                                   // Status
        TeachModus_Aktiv : Bool                         // Teach-Modus ist aktiv
        MoreTeach : Bool                                // Nächsten Teachpunkt ohne neuen Refpunkt
        Res02 : Bool                                    // Reserve
        Res03 : Bool                                    // Reserve
        Res04 : Bool                                    // Reserve
        Res05 : Bool                                    // Reserve
        Res06 : Bool                                    // Reserve
        Res07 : Bool                                    // Reserve
        Res10 : Bool
        Res11 : Bool
        Res12 : Bool
        Res13 : Bool
        Res14 : Bool                                    // Reserve
        Res15 : Bool                                    // Reserve
        Res16 : Bool                                    // Reserve
        Res17 : Bool                                    // Reserve
      Rueckmld : Struct
        RET_VAL_BLKMOV_Sync : Int                       // Rückmeldung nach BLKMOV-Aufruf
        RET_VAL_DL_Weichen_Out : Byte                   // Rückmeldung nach DatenOut-Aufruf
        RET_VAL_Hauptstrang_In : Byte                   // Rückmeldung nach Hauptstrangdaten-In-Aufruf
        RET_VAL_TravelFIFO_In : Byte                    // Rückmeldung nach Aufruf
        RET_VAL_TravelFIFO_Out : Byte                   // Rückmeldung nach Aufruf
        RET_VAL_Teach_OUT : Byte                        // Rückmeldung bei Datenlisten-Zugriff
        RET_VAL_Teach_IN : Byte                         // Rückmeldung bei Datenlisten-Zugriff
      Error : "UErrStartSync"
      BT_ausgewertet : Bool                             // BT wurde schon ausgewertet
      TeachPunkt : Int                                  // Punkt zum Ein-Teachen
      Refpunkt_ausgewertet : Bool                       // Referenzpunkt ausgewertet
      Refpunkt_ok : Bool                                // Referenzpunkt erkannt
      Teachpunkt_ausgewertet : Bool                     // Teachpunkt ausgewertet
      Reset : Bool                                      // Bereich + FIFO resetten
      Ink_Flag : Bool                                   // Laufflag bei Speicherung
      Ref_Flag : Bool                                   // Lauf-Flag bei Ref-Inkremente
      Teach_Flag : Bool                                 // Lauf-Flag bei Teach-Inkremente
      Ende_Flag : Bool                                  // Lauf-Flag bei Synchron-Ende (MT)
      FIFO_Flag : Bool                                  // Lauf-Flag bei FIFO-Wechsel (sonst Err)
      Stop : Bool                                       // Rein-Separator stoppen
      Max_raus : Bool                                   // Max_Wert wurde schon übertragen
      InkZelle : DInt                                   // Inkzelle: Sync-Sensor dauernd aktiv
      Ref_Ink : DInt                                    // Inkremente bei Referenzpunkt
      Teach_Ink : DInt                                  // Inkremente bei Teachpunkt
      Ende_Ink : DInt                                   // Inkremente bei Synchron-Ende (MT)
      FIFO_Ink : DInt                                   // Inkremente bei FIFO-Wechsel (sonst Err)
    Daten : "UBT_Daten"
    Max_Wert : DInt                                     // Maximal erlaubter Zählwert
    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
    Ink_Wert : DInt                                     // Aktuelle Inkrementalwert
    Abstands_Ink : DInt                                 // Abstands-Inkremente nach Teachen
    Sich_Ink : DInt                                     // Übrige Inks, bevor dann gestoppt wird !
    Reserve : Array[1..1] of Int
  Temp:
    Quelle : Any                                        // Zeiger, wo Rein-Daten sind
    Adresse0 : DInt                                     // Für indirekte Adressierung (Offset 0)
    Adresse2 : DInt                                     // Für indirekte Adressierung (Offset 0)
    Adresse4 : DInt                                     // Für indirekte Adressierung (Offset 4)
    Adresse8 : DInt                                     // Für indirekte Adressierung (Offset 8)
    Abwurf_DB : Int                                     // Abwurf-DB für 1.Rückschaltung
    HaupstranglistenDB : Int                            // Aktueller Hauptstranglisten-DB
    Parameter : Word                                    // Parameter
    sB_BT_da : Bool                                     // Sensor BT ist an Sychronisierstelle
    ZSW2_ENC : Word
    G1_ZSW : Word
    G1_XIST1 : DWord
    G1_XIST2 : DWord                                    // Positionswert 2, Sensor 1
    STW2_ENC : Word                                     // Steuerwort 2, Encoder
    G1_STW : Word                                       // Steuerwort, Sensor 1
    tABS_Resolution : DInt
    tInk_Wert : DInt                                    // Aktueller Zählerwert
    tSpeicherung : DInt                                 // Speicherung des aktuellen Zählerwerts (für Neustart)
    tLastSingelturn_Wert : DInt                         // Speicherung des letzten Zählerwerts (für Neustart)
    tLauf_Flag : Bool                                   // Zähl-Lauf mit Flag ist aktiv
    tFlag_Lauf_fertig : Bool                            // Flag-Lauf wurde beendet
    tOhne_Lauf_fertig : Bool                            // Ohne Flag-Lauf wurde beendet
    tNull_laden : Bool                                  // Zähler mit 0000 laden
    tQuit : Bool
  Constant:

--- NW 1: Eingangsvariablen einlesen ---
      L      Sync_Nr

      A      B_BT_da
      =      sB_BT_da


--- NW 2: Parameter-Übergabe ---
      L      Sync_Nr

      L      "MW178"                                         // Einsprung Weichen-DL
      T      Para.Weichen_DL_DB                              // vor Aufruf übergeben!
      L      0
      T      Para.Weichen_DL_DW


--- NW 3: Gesamt: Out-Bits zum Zurücksetzen / temp ---
      AN     Dyn.Max_raus                                    // Max_Wert wurde schon übertragen
      O      Dyn.BT_ausgewertet                              // BT wurde schon ausgewertet
      S      Antrieb_start                                   // Kreiselantrieb starten


      A      ErrQuit
      O      Dyn.Reset                                       // Bereich + FIFO resetten
      =      tQuit                                           // Für ABS-Modul


--- NW 4: Reset ---
// Reset oder Tastendruck:
      A      ErrQuit
      A      "Hauptstrang_leer"                              // Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen
      A      Dyn.Error.TravelFIFO_belegt                     // Travel-FIFO bleibt belegt
      S      Dyn.Reset                                       // Bereich + FIFO resetten

      A      "Hauptstrang_leer"                              // Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen
      A      Dyn.Error.TravelFIFO_leer                       // keine Daten im Travel-FIFO eingetragen (Auto-Reset!)
      AN     Dyn.BT_ausgewertet                              // BT wurde schon ausgewertet
      S      Dyn.Reset                                       // Bereich + FIFO resetten

      AN     Dyn.Reset                                       // Bereich + FIFO resetten
      JC     en02

      SET
      R      Dyn.Reset                                       // Bereich + FIFO resetten
      R      Dyn.Error.SyncPkt_DL_Err                        // Sync-Punkt-Datenliste fehlerhaft
      R      Dyn.Error.Undef_SyncPkt                         // undefinierter Synchronpunkt
      R      Dyn.Error.BLKMov                                // Fehler bei Block kopieren
      R      Dyn.Error.Sync_Sensor_aktiv                     // Sync-Sensor dauernd aktiv
      R      Dyn.Error.TravelFIFO_Err                        // Travel-FIFO fehlerhaft
      R      Dyn.Error.TravelFIFO_leer                       // keine Daten im Travel-FIFO eingetragen
      R      Dyn.Error.TravelFIFO_belegt                     // Travel-FIFO bleibt belegt
      R      Dyn.Error.Hauptstrangliste_Err                  // Hauptstrangliste fehlerhaft
      R      Dyn.Error.Hauptstrangliste_voll                 // Hauptstrangliste ist voll
      R      Dyn.Error.Inkgeber_Err                          // Übergabeliste fehlerhaft
      R      Dyn.Error.Keine_Hauptstrangliste                // Keine Hauptstrangliste zum Eintragen angegeben
      R      Dyn.Error.Keine_TeachPktdaten                   // Teach-Punkt in Datenliste nicht vorhanden !
      R      Dyn.Error.TeachPkt_Datenliste_Err               // Teachdatenliste fehlerhaft
      R      Dyn.Error.Kein_Parameter
      R      Dyn.Error.Err_Parameter
      R      Dyn.Error.Inkrementalgeber                      // Inkrementalgeberwert ohne Änderung

      SET
      R      Dyn.BT_ausgewertet                              // BT wurde schon ausgewertet
      R      Dyn.Status.TeachModus_Aktiv                     // Teach-Modus ist aktiv
      R      Dyn.Stop                                        // Rein-Separator stoppen

      L      0
      T      Dyn.InkZelle                                    // Inkzelle: Sync-Sensor dauernd aktiv
      L      0
      T      Dyn.FIFO_Ink                                    // Inkremente bei FIFO-Wechsel (sonst Err)
      T      Sich_Ink                                        // Übrige Inks, bevor dann gestoopt wird !

      L      0                                               // Damit statische Werte neu aus Datenbank geholt werden !
      T      SyncPkt.Sync_Nr                                 // Nummer des Sync-Punktes

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

      L      "MB199"
      T      Dyn.Rueckmld.RET_VAL_TravelFIFO_Out

      L      0                                               // Aufruf mit Fehler ?
      <>I                                                    // Ja !
      =      Dyn.Error.TravelFIFO_Err                        // Error bei FIFO-Zugriff

// Hauptstrang-Daten zurücksetzen:
CALL FC "DatenResetSort" (SSDB:=SyncPkt.Hauptstrang_DL_DB, SSDW:=SyncPkt.Hauptstrang_DL_DW, RE_VAL:="MB198")

      L      SyncPkt.Hauptstrang_DL_DB
      +      1
      T      HaupstranglistenDB

CALL FC "DatenResetSort" (SSDB:=HaupstranglistenDB, SSDW:=SyncPkt.Hauptstrang_DL_DW, RE_VAL:="MB199")

      L      "MB198"
      L      "MB199"
      L      0                                               // Aufruf mit Fehler ?
      <>I                                                    // Ja !
      =      Dyn.Error.Hauptstrangliste_Err                  // Hauptstrang-DL fehlerhaft

      BEU

en02: NOP 0


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

      A      Dyn.Error.SyncPkt_DL_Err                        // Sync-Punkt-Datenliste fehlerhaft
      =      "M200.0"
      A      Dyn.Error.Undef_SyncPkt                         // undefinierter Synchronpunkt
      =      "M200.1"
      A      Dyn.Error.BLKMov                                // Fehler bei Block kopieren
      =      "M200.2"
      A      Dyn.Error.Sync_Sensor_aktiv                     // Sync-Sensor dauernd aktiv
      =      "M200.3"
      A      Dyn.Error.TravelFIFO_Err                        // Travel-FIFO fehlerhaft
      =      "M200.4"
      A      Dyn.Error.TravelFIFO_leer                       // keine Daten im Travel-FIFO eingetragen
      =      "M200.5"
      A      Dyn.Error.TravelFIFO_belegt                     // Travel-FIFO bleibt belegt
      =      "M200.6"
      A      Dyn.Error.Hauptstrangliste_Err                  // Hauptstrangliste fehlerhaft
      =      "M200.7"
      A      Dyn.Error.Hauptstrangliste_voll                 // Hauptstrangliste ist voll
      =      "M201.0"
      A      Dyn.Error.Inkgeber_Err                          // Inkrementalgeber meldet Störung
      =      "M201.1"
      A      Dyn.Error.Keine_Hauptstrangliste                // Keine Hauptstrangliste zum Eintragen angegeben
      =      "M201.2"
      A      Dyn.Error.Keine_TeachPktdaten                   // Teach-Punkt in Datenliste nicht vorhanden !
      =      "M201.3"
      A      Dyn.Error.TeachPkt_Datenliste_Err               // Teachdatenliste fehlerhaft
      =      "M201.4"
      A      Dyn.Error.Kein_Parameter
      =      "M201.5"
      A      Dyn.Error.Err_Parameter
      =      "M201.6"
      A      Dyn.Error.Inkrementalgeber                      // Inkrementalgeberwert ohne Änderung
      =      "M201.7"

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

// Anzeige Start n. Störung aktivieren:
      A      "Hauptstrang_leer"                              // Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen
      A(
      O      Dyn.Error.TravelFIFO_leer                       // keine Daten im Travel-FIFO eingetragen
      O      Dyn.Error.TravelFIFO_belegt                     // Travel-FIFO bleibt belegt
      )
      O      Dyn.Error.Sync_Sensor_aktiv                     // Sync-Sensor dauernd aktiv
      O      Dyn.Error.Inkrementalgeber                      // Inkrementalgeberwert ohne Änderung
      S      hStOk


--- NW 6: Statische Sync-Parameter holen ---
      L      SyncPkt.Sync_Nr                                 // Nummer des Synchron-Puntes
      L      Sync_Nr                                         // Aufruf-Parameter
      ==I                                                    // Identisch ?
      R      Dyn.Error.SyncPkt_DL_Err                        // Sync-Punkt-Datenliste fehlerhaft
      R      Dyn.Error.Undef_SyncPkt                         // undefinierter Synchronpunkt
      JC     en03                                            // Ja !

      T      "MW200"                                         // Search-Daten

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

      JBI    G_Ok

      A      "M199.0"
      =      Dyn.Error.SyncPkt_DL_Err                        // Sync-Punkt-Datenliste fehlerhaft
      BEC

      SET
      S      Dyn.Error.Undef_SyncPkt                         // undefinierter Synchronpunkt

      BEU

// Kennung + Datenbytes
G_Ok: SET
      R      Dyn.Error.SyncPkt_DL_Err                        // Sync-Punkt-Datenliste fehlerhaft
      R      Dyn.Error.Undef_SyncPkt                         // undefinierter Synchronpunkt

      L      16#1004                                         // Kennung 10 + Word=04
      T      LW0                                             // Any-Kennung, Datentyp
      L      40                                              // 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_Sync, DSTBLK:=SyncPkt)   // Datenliste-Daten speichern | #Ziel

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

      L      SyncPkt.Sync_Typ                                // Synchron-Punkt-Typ = 177 (StartSync)
      L      177                                             // Dieser Aufruf-FB ?
      ==I                                                    // Ja !
      JC     en03

      SET
      S      Dyn.Error.Undef_SyncPkt                         // undefinierter Synchronpunkt

      L      0                                               // Synchronpunkt ungültig !
      T      SyncPkt.Sync_Nr                                 // Nummer des Synchron-Puntes

      BEU

en03: NOP 0


--- NW 7: Störungen quittieren ---
      AN     ErrQuit
      JC     en05

      SET
      R      Dyn.Error.Keine_TeachPktdaten                   // Teach-Punkt in Datenliste nicht vorhanden !
      R      Dyn.Error.Hauptstrangliste_voll                 // Hauptstrangliste ist voll
      R      Dyn.Error.Keine_Hauptstrangliste                // Keine Hauptstrangliste zum Eintragen angegeben
      R      Dyn.Error.TravelFIFO_leer                       // keine Daten im Travel-FIFO eingetragen
      R      Dyn.Error.Inkrementalgeber                      // Inkrementalgeberwert ohne Änderung

// Kann nur über Reset zurückgesetzt werden:
//     R     #Dyn.Error.SyncPkt_DL_Err   //Sync-Punkt-Datenliste fehlerhaft
//     R     #Dyn.Error.Undef_SyncPkt    //undefinierter Synchronpunkt
//     R     #Dyn.Error.BLKMov           //Fehler bei Block kopieren
//     R     #Dyn.Error.Sync_Sensor_aktiv    //Sync-Sensor dauernd aktiv
//     R     #Dyn.Error.TravelFIFO       //Travel-FIFO fehlerhaft
//     R     #Dyn.Error.TravelFIFO_belegt    //Travel-FIFO bleibt belegt
//     R     #Dyn.Error.Hauptstrangliste_Err //Hauptstrangliste fehlerhaft
//     R     #Dyn.Error.Uebergabeliste_Err   //Übergabeliste fehlerhaft
//     R     #Dyn.Error.TeachPkt_Datenliste_Err //Teachdatenliste fehlerhaft
//     R      #Dyn.Error.Keine_TeachPktdaten    //Keine Teachdaten in Datenliste vorhanden !
//     R     #Dyn.Error.Err16

// werden weiter unten quittiert:
//     R     #Dyn.Error.Sync_Sensor_aktiv    //Sync-Sensor dauernd aktiv

en05: NOP 0


--- NW 8: Auswahl der Wegerfassung ---
      L      SyncPkt.Ink_DB                                  // Zähler-DB
      L      0                                               // Sinnvolle Angabe ?
      <=I                                                    // Nein !
      S      Dyn.Error.Kein_Parameter                        // Kein Parameter zur Wegerfassung definiert
      JC     OK

      A      SyncPkt.Parameter.InkSim                        // Inkrementalgeber simulieren
      JC     ISim

      A      SyncPkt.Parameter.ET200                         // Inkremental-Geber mit Zähler-Baugruppe (ET200)
      JC     ET20

      A      SyncPkt.Parameter.Sick_ABS_single
      JC     ABS                                             // Inkremental-Geber mit Zähler-Baugruppe (FM350/FM450)

      JU     OK


--- NW 9: Inkremental-Geber über 10ms-Takte simulieren und Antrieb aktiv ---
ISim: L      SyncPkt.Ink_DB
      T      "MW200"
      OPN    DB["MW200"]                                     // Zähler-DB öffnen

      SET
      R      DBX74.1                                         // Überlauf
      R      DBX74.4                                         // Flag-Lauf wurde beendet
      R      DBX74.5                                         // Ohne Flag-Lauf wurde beendet

      AN     Antrieb_aktiv                                   // Antrieb ist aktiv
      JC     chk                                             // weitere Kontrollen

      L      "MW4"                                           // Anzahl der 10ms-Takte (letzter Zyklus)
      ITD
      L      DBD80
      +D                                                     // 10ms-Takte dazuaddieren
      T      DBD80

      JU     chk                                             // weitere Kontrollen

// Zähler auf 000 setzen ?:
chk:  AN     DBX74.6                                         // Zähler Zero-Load
      JC     new

      SET
      R      DBX74.6

      L      0
      T      DBD70                                           // Zählerwert zum Setzen

      JU     load

// Zähler neu setzen ?:
new:  A      DBX74.0                                         // Zähler Neustart
      R      DBX74.0
      JC     load

// Zähler-Überlauf ?:
      L      DBD80                                           // Aktueller Zählerwert
      A      DBX75.0                                         // Speicherung einfrieren
      JC     nos

      T      DBD70                                           // Speicherung

nos:  L      DBD76                                           // Max. Wert erreicht ?
      <=D                                                    // Nein !
      JC     OK

      -D                                                     // Restwert als Startwert nehmen !
      T      DBD70                                           // Zählerwert zum Setzen

      AN     DBX74.3                                         // Umschaltung Zähl-Lauf ohne-mit-ohne Flag
      =      DBX74.5                                         // Ohne Flag-Lauf wurde beendet
      A      DBX74.3                                         // Umschaltung Zähl-Lauf ohne-mit-ohne Flag
      =      DBX74.4                                         // Flag-Lauf wurde beendet

      AN     DBX74.3                                         // Umschaltung Zähl-Lauf ohne-mit-ohne Flag
      =      DBX74.3

      SET
      S      DBX74.1                                         // Überlauf

load: L      SyncPkt.Ink_DB
      T      "MW200"
      OPN    DB["MW200"]                                     // Zähler-DB öffnen

      L      DBD70                                           // Zählerwert zum Setzen
      T      DBD80

      JU     OK


--- NW 10: Inkremental-Geber mit Zähler-Baugruppe (ET200) ---
ET20: L      SyncPkt.Ink_DB
      T      "MW200"
      OPN    DB["MW200"]                                     // Zähler-DB öffnen

      L      SyncPkt.Ink_HW_Adress                           // Hardware-Adresse der ET200-Zählerbaugruppe
      L      0                                               // Adresse sinnvoll ? (also ohne Zählerbaugruppe !)
      <=I                                                    // Nein !
      S      Dyn.Error.Err_Parameter                         // Parameter für ET200 fehlerhaft
      JC     OK

// Zählerwert einlesen:
      L      SyncPkt.Ink_HW_Adress                           // Hardware-Adresse der ET200-Zählerbaugruppe
      SLW    3                                               // Pointer erzeugen
      T      Adresse0
      L      PeripheryInputD [Adresse0]
      T      DBD80

      L      SyncPkt.Ink_HW_Adress                           // Hardware-Adresse der ET200-Zählerbaugruppe
      +      4                                               // Offset 4 DWs
      SLW    3                                               // Pointer erzeugen
      T      Adresse4
      L      PeripheryInputD [Adresse4]
      T      DBD4

      L      SyncPkt.Ink_HW_Adress                           // Hardware-Adresse der ET200-Zählerbaugruppe
      +      8
      SLW    3                                               // Pointer erzeugen
      T      Adresse8
      L      PeripheryInputD [Adresse8]
      T      DBD8                                            // eigentlich doppelt

      L      DBD80                                           // Aktueller Zählerwert
      L      DBD70                                           // Speicherung (Zählerwert letzter Zyklus)
      <>D                                                    // ist verändert !
      JC     Ok_I

      AN     Antrieb_aktiv                                   // Antrieb ist aktiv
      O      ErrQuit                                         // Ablaufstörung quittieren
      JC     X_I

      L      SAVE.Ink_ohne_Zeit                              // Zeit Inkremntalgeberwert ohne Änderung [10ms]
      L      "MW4"                                           // Anzahl der 10ms-Takte (letzter Zyklus)
      +I                                                     // aufaddieren
      T      SAVE.Ink_ohne_Zeit                              // Zeit Inkremntalgeberwert ohne Änderung [10ms]

      L      50                                              // 500ms ohne Änderung ?
      >=I                                                    // Ja !
      S      Dyn.Error.Inkrementalgeber                      // Inkrementalgeberwert ohne Änderung

      JU     X_I

Ok_I: L      0
      T      SAVE.Ink_ohne_Zeit                              // Zeit Inkremntalgeberwert ohne Änderung [10ms]

// Software-Gate öffnen:
X_I:  SET
      S      DBX16.0                                         // SW-Gate öffnen

// Zähler setzen läuft:
      A      DBX74.2                                         // Zähler setzen
      O      DBX74.7                                         // Zähler laden ist aktiv
      R      DBX74.5                                         // Ohne Flag-Lauf wurde beendet
      R      DBX74.4                                         // Flag-Lauf wurde beendet
      JC     LOAD_Mig

// Zähler auf 000 setzen ?:
      L      0
      T      DBD12                                           // Zählerwert zum Setzen

      A      DBX74.6                                         // Zähler Zero-Load
      S      DBX74.2                                         // Zähler setzen
      JC     LOAD_Mig

// Zähler neu setzen ?:
      L      DBD70                                           // Speicherung
      T      DBD12                                           // Zählerwert zum Setzen

      A      DBX74.0                                         // Zähler Neustart
      S      DBX74.2                                         // Zähler setzen
      JC     LOAD_Mig

// Zähler-Überlauf ?:
      L      DBD80                                           // Aktueller Zählerwert
      L      DBD76                                           // Max. Wert erreicht ?
      <=D                                                    // Nein !
      JC     Ok_Mig

      -D                                                     // Restwert als Startwert nehmen !
      T      DBD12                                           // Zählerwert zum Setzen

      AN     DBX74.3                                         // Umschaltung Zähl-Lauf ohne-mit-ohne Flag
      =      DBX74.5                                         // Ohne Flag-Lauf wurde beendet
      A      DBX74.3                                         // Umschaltung Zähl-Lauf ohne-mit-ohne Flag
      =      DBX74.4                                         // Flag-Lauf wurde beendet

      AN     DBX74.3                                         // Umschaltung Zähl-Lauf ohne-mit-ohne Flag
      =      DBX74.3

      SET
      S      DBX74.1                                         // Überlauf
      S      DBX74.2                                         // Zähler setzen

LOAD_Mig: A      DBX74.2                                     // Zähler setzen
      =      DBX17.0                                         // Load_Val
      JCN    Ok_Mig

// Daten an Zähler senden:
      L      DBD12
      T      PeripheryOutputD [Adresse0]

Ok_Mig: L      DBW16
      T      PeripheryOutputW [Adresse4]

// Zählerstatus einlesen:
      L      SyncPkt.Ink_HW_Adress                           // Hardware-Adresse der ET200-Zählerbaugruppe
      +      4                                               // Offset 4 DWs
      SLW    3                                               // Pointer erzeugen
      T      Adresse4
      L      PeripheryInputD [Adresse4]
      T      DBD4

      L      SyncPkt.Ink_DB
      T      "MW200"
      OPN    DB["MW200"]                                     // Zähler-DB öffnen

      A      DBX74.2                                         // Zähler setzen
      A      DBX4.0                                          // Zähler wird geladen (Modul-Rückmeldung)
      S      DBX74.7                                         // Zähler laden ist aktiv
      R      DBX74.2                                         // Zähler setzen

      A      DBX74.7                                         // Zähler laden ist aktiv
      AN     DBX4.0                                          // Zähler wird geladen (Modul-Rückmeldung)
      R      DBX74.7                                         // Zähler laden ist aktiv
      R      DBX74.6                                         // Zähler Zero-Load
      R      DBX74.0                                         // Zähler Neustart
      R      DBX74.1                                         // Überlauf

      A      DBX74.2                                         // Zähler setzen
      O      DBX74.7                                         // Zähler laden ist aktiv
      O      DBX4.0                                          // Zähler wird geladen (Modul-Rückmeldung)
      JC     Fake

      L      DBD80                                           // Aktueller Zählerwert
      L      0                                               // Sinnvoller Wert ?
      <=D                                                    // Nein !
      O      DBX75.0                                         // Speicherung einfrieren
      JC     OK

      L      DBD80                                           // Aktueller Zählerwert
      T      DBD70                                           // Speicherung

      JU     OK

Fake: L      SyncPkt.Ink_DB
      T      "MW200"
      OPN    DB["MW200"]                                     // Zähler-DB öffnen

      L      DBD12                                           // Während Neusetzen Loadwert übergeben
      T      DBD80

      JU     OK


--- NW 11: Inkremental-Geber mit Zähler-Baugruppe (ABS single) ---
ABS:  L      SyncPkt.Ink_DB
      T      "MW200"
      OPN    DB["MW200"]                                     // Zähler-DB öffnen

      L      SyncPkt.Ink_HW_Adress                           // Hardware-Adresse der ET200-Zählerbaugruppe
      L      0                                               // Adresse sinnvoll ? (also ohne Zählerbaugruppe !)
      <=I                                                    // Nein !
      S      Dyn.Error.Err_Parameter                         // Parameter für ET200 fehlerhaft
      JC     OK

// Zählerwert einlesen:
      L      SyncPkt.Ink_HW_Adress                           // Hardware-Adresse der ET200-Zählerbaugruppe
      SLW    3                                               // Pointer erzeugen
      T      Adresse0

      L      IW [Adresse0]
      T      DBW0
      T      ZSW2_ENC

      L      SyncPkt.Ink_HW_Adress                           // Hardware-Adresse der ET200-Zählerbaugruppe
      +      2                                               // Offset 2 DWs
      SLW    3                                               // Pointer erzeugen
      T      Adresse2
      L      IW [Adresse2]
      T      DBW0
      T      G1_ZSW

      L      SyncPkt.Ink_HW_Adress                           // Hardware-Adresse der Zählerbaugruppe
      +      4                                               // Offset 4 DWs
      SLW    3                                               // Pointer erzeugen
      T      Adresse4

      L      ID [Adresse4]
      T      DBD4
      T      G1_XIST1

      L      SyncPkt.Ink_HW_Adress                           // Hardware-Adresse der Zählerbaugruppe
      +      8
      SLW    3                                               // Pointer erzeugen
      T      Adresse8
      L      ID [Adresse8]
      T      DBD8
      T      G1_XIST2

// Gespeicherte Werte einlesen:
      L      DBD80
      T      tInk_Wert

      L      DBD70
      T      tSpeicherung

      L      DBD16
      T      tLastSingelturn_Wert

      L      DBD20
      T      tABS_Resolution

      A      DBX74.3
      =      tLauf_Flag
      A      DBX74.4
      =      tFlag_Lauf_fertig
      A      DBX74.5
      =      tOhne_Lauf_fertig
      A      DBX74.6
      =      tNull_laden

CALL FC "Sick_ABS_single" (ZSW2_ENC:=ZSW2_ENC, G1_ZSW:=G1_ZSW, G1_XIST1:=G1_XIST1, G1_XIST2:=G1_XIST2, Resolution:=tABS_Resolution, MaxValue:=Max_Wert, Error_Quit:=tQuit, STW2_ENC:=STW2_ENC, G1_STW:=G1_STW, Inkgeber_Err:=Dyn.Error.Inkgeber_Err, Ink_Wert:=tInk_Wert, Last_Singelturn_Wert:=tLastSingelturn_Wert, Lauf_Flag:=tLauf_Flag, Flag_Lauf_fertig:=tFlag_Lauf_fertig, Ohne_Lauf_fertig:=tOhne_Lauf_fertig, Null_laden:=tNull_laden)

// Steuerwerte übergeben:
      L      SyncPkt.Ink_DB
      T      "MW200"
      OPN    DB["MW200"]                                     // Zähler-DB öffnen

      L      STW2_ENC
      T      PeripheryOutputW [Adresse0]
      T      DBW12

      L      G1_STW
      T      PeripheryOutputW [Adresse2]
      T      DBW14

// Werte speichern:
      L      tInk_Wert
      T      DBD80
      T      DBD70

      L      tLastSingelturn_Wert
      T      DBD16

      A      tLauf_Flag
      =      DBX74.3
      A      tFlag_Lauf_fertig
      =      DBX74.4
      A      tOhne_Lauf_fertig
      =      DBX74.5
      A      tNull_laden
      =      DBX74.6

// Ändert sich der Inkwert ?:
      L      DBD80                                           // Aktueller Zählerwert
      L      tSpeicherung                                    // Speicherung (Zählerwert letzter Zyklus)
      <>D                                                    // ist verändert !
      JC     ok_I_Mig

      AN     Antrieb_aktiv                                   // Antrieb ist aktiv
      O      ErrQuit                                         // Ablaufstörung quittieren
      JC     OK

      L      SAVE.Ink_ohne_Zeit                              // Zeit Inkremntalgeberwert ohne Änderung [10ms]
      L      "MW4"                                           // Anzahl der 10ms-Takte (letzter Zyklus)
      +I                                                     // aufaddieren
      T      SAVE.Ink_ohne_Zeit                              // Zeit Inkremntalgeberwert ohne Änderung [10ms]

      L      50                                              // 500ms ohne Änderung ?
      >=I                                                    // Ja !
      S      Dyn.Error.Inkrementalgeber                      // Inkrementalgeberwert ohne Änderung

      JU     OK

ok_I_Mig: L      0
      T      SAVE.Ink_ohne_Zeit                              // Zeit Inkremntalgeberwert ohne Änderung [10ms]


--- NW 12: Inkwerte holen ---
// Daten des Inktremental-Gebers übergeben:
OK:   L      SyncPkt.Ink_DB
      T      "MW200"
      OPN    DB["MW200"]                                     // Zähler-DB öffnen
      L      DBD80
      T      Ink_Wert
      L      DBD76
      T      Max_Wert
      A      DBX74.3
      =      Lauf_Flag
      A      DBX74.4
      =      Flag_Lauf_fertig
      A      DBX74.5
      =      Ohne_Lauf_fertig


--- NW 13: Zusatz-DWs an Travel-FIFO übergeben ---
      L      SyncPkt.TravelFIFO_DB                           // Travel-FIFO: DB-Nr.
      L      0                                               // sinnvolle Angabe ?
      <=I                                                    // Nein !
      O(
      L      SyncPkt.TravelFIFO_DW                           // Einfahr-FIFO: DW-Nr.
      L      0                                               // Sinnvolle Angabe ?
      <I                                                     // Nein !
      )
      JC     en13

      L      16#0224                                         // 2-4.Zusatz-DWs schreiben
      T      Parameter

// Inkwerte übergeben:
      L      Ink_Wert
      T      "MD242"                                         // Inkwert

      L      0
      T      "MW246"
      A      Lauf_Flag
      =      "M246.3"                                        // Flag-Info
      A      Flag_Lauf_fertig
      =      "M246.4"                                        // Fertig-Info
      A      Ohne_Lauf_fertig
      =      "M246.5"                                        // Fertig-Info

      A      "10s-Impuls"
      =      "M247.7"                                        // Übergabe MaxWert aktiv
      S      Dyn.Max_raus                                    // Max_Wert wurde schon übertragen
      JCN    w041

      L      Max_Wert
      T      "MD242"                                         // MaxWert übergeben

w041: CALL FC "FifoIn" (SSDB:=SyncPkt.TravelFIFO_DB, SSDW:=SyncPkt.TravelFIFO_DW, PARA:=Parameter, INDATEN:=P#M200.0, RE_VAL:="MB199")   // Zusatz-DWs schreiben (s.o.)

      L      "MB199"
      T      Dyn.Rueckmld.RET_VAL_TravelFIFO_In
      T      Dyn.Rueckmld.RET_VAL_TravelFIFO_In

      JBI    en13

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

en13: NOP 0


--- NW 14: Kein Sync-Sensor vorhanden ---
      AN     SyncPkt.Parameter.Kein_Sync_B                   // Kein Sync-Sensor eingebaut (Daten-Sync)
      JC     En04                                            // Also Sensor verbaut !

CALL FC "FifoOut" (SSDB:=SyncPkt.TravelFIFO_DB, SSDW:=SyncPkt.TravelFIFO_DW, PARA:=WORD#16#0000, OUTDATEN:=P#M220.0, RE_VAL:="MB199")   // Daten lesen

      L      "MB199"
      T      Dyn.Rueckmld.RET_VAL_TravelFIFO_Out
      L      0                                               // Aufruf mit Fehler ? (Bit2 = FIFO ist leer auch nicht!)
      ==I                                                    // Nein !
      A      Antrieb_aktiv
      =      sB_BT_da                                        // Sensor BT ist an Sychronisierstelle

      JU     En06                                            // Überwachungen überspringen

En04: NOP 0


--- NW 15: BT ist wieder weg ---
      AN     Dyn.BT_ausgewertet                              // BT wurde schon ausgewertet
      JC     en04_Mig

      L      Dyn.Ende_Ink                                    // Inkremente bei Synchron-Ende (MT)
      L      0                                               // angegeben ?
      <=D                                                    // Nein !
      O      sB_BT_da                                        // Sensor BT ist an Sychronisierstelle
      JC     Save

      A      Dyn.Ende_Flag                                   // Lauf-Flag bei Synchron-Ende (MT)
      A      Flag_Lauf_fertig                                // Flag-Lauf wurde beendet
      O
      AN     Dyn.Ende_Flag                                   // Lauf-Flag bei Synchron-Ende (MT)
      A      Ohne_Lauf_fertig                                // Flag-Lauf wurde beendet
      JC     w040                                            // beim Ende des Lauf sind Inkremente uninteressant

      A      Dyn.Ende_Flag                                   // Lauf-Flag bei Synchron-Ende (MT)
      A      Lauf_Flag                                       // Zähl-Lauf mit Flag ist aktiv
      O
      AN     Dyn.Ende_Flag                                   // Lauf-Flag bei Synchron-Ende (MT)
      AN     Lauf_Flag                                       // Zähl-Lauf mit Flag ist aktiv
      JCN    en04_Mig

      L      Ink_Wert                                        // Aktuelle Inkrementalwert
      L      Dyn.Ende_Ink                                    // Inkremente bei Synchron-Ende (MT)
      <D
      JC     en04_Mig

w040: SET
      R      Dyn.BT_ausgewertet                              // BT wurde schon ausgewertet
      R      Dyn.Ende_Flag                                   // Lauf-Flag bei Synchron-Ende (MT)

      L      0
      T      Dyn.Ende_Ink                                    // Inkremente bei Synchron-Ende (MT)

      JU     en04_Mig

// End-Punkt der Synchronisation speichern: (wegen Entprelling)
Save: L      Ink_Wert                                        // Aktueller Ink-Wert
      L      SyncPkt.Entprellung_B_Sync                      // Entprellung Snyc-Sensor (in Inkremente)
      +D
      T      Dyn.Ende_Ink                                    // Inkremente bei Synchron-Ende (MT)
      A      Lauf_Flag
      =      Dyn.Ende_Flag                                   // Lauf-Flag bei Synchron-Ende (MT)
      L      Max_Wert                                        // Maximal erlaubter Zählwert
      >D
      JCN    en04_Mig

      -D                                                     // Restwert übernehmen
      T      Dyn.Ende_Ink                                    // Inkremente bei Synchron-Ende (MT)

      AN     Lauf_Flag                                       // Zähl-Lauf mit Flag ist aktiv
      =      Dyn.Ende_Flag                                   // Lauf-Flag bei Synchron-Ende (MT)

en04_Mig: NOP 0


--- NW 16: Error: Sync-Sensor dauernd aktiv ---
      AN     sB_BT_da                                        // Sensor Sync ist an Sychronisierstelle
      O
      A      Lauf_Flag                                       // Neuspeicherung nötig
      AN     Dyn.Ink_Flag
      O
      AN     Lauf_Flag                                       // Neuspeicherung nötig
      A      Dyn.Ink_Flag
      O      ErrQuit                                         // Störung quittieren
      O      Dyn.Reset                                       // Bereich resetten
      JC     W030

      A      Dyn.Error.Sync_Sensor_aktiv                     // Sync-Sensor dauernd aktiv
      JC     En03_Mig

      L      Dyn.InkZelle                                    // Speicherung Sensor frei
      L      0                                               // Speicherung vorhanden ?
      ==D                                                    // Nein !
      JC     En03_Mig

      L      Ink_Wert                                        // Aktueller Ink-Wert
      L      Dyn.InkZelle                                    // Speicherung Sensor frei
      -D                                                     // Differenz bilden
      L      10                                              // davon 10%
      /D
      L      SyncPkt.Entprellung_B_Sync                      // Falls also 10mal Entprellwert, dann
      >=D
      S      Dyn.Error.Sync_Sensor_aktiv                     // Sync-Sensor dauernd aktiv

      JU     En03_Mig

W030: L      Ink_Wert                                        // Aktueller Ink-Wert
      T      Dyn.InkZelle                                    // Speicherung Sensor frei
      A      Lauf_Flag
      =      Dyn.Ink_Flag                                    // Speicherung Laufflag
      SET
      R      Dyn.Error.Sync_Sensor_aktiv                     // Sync-Sensor dauernd aktiv

En03_Mig: NOP 0


--- NW 17: Error: Travel-FIFO bleibt voll ---
      L      Dyn.FIFO_Ink                                    // Inkremente bei FIFO-Wechsel (sonst Stop/Err)
      L      0                                               // sinnvolle Angabe ?
      <=D                                                    // Nein !
      O      Dyn.Status.TeachModus_Aktiv                     // Teach-Modus ist aktiv
      O      Dyn.Error.TravelFIFO_belegt                     // Travel-FIFO bleibt belegt
      JC     w061

      A      Dyn.FIFO_Flag                                   // Flag bei FIFO-Wechsel (sonst Stop/Err)
      A      Flag_Lauf_fertig                                // Flag-Lauf wurde beendet
      O
      AN     Dyn.FIFO_Flag                                   // Flag bei FIFO-Wechsel (sonst Stop/Err)
      A      Ohne_Lauf_fertig                                // Flag-Lauf wurde beendet
      JC     w060                                            // beim Ende des Lauf sind Inkremente uninteressant

      A      Dyn.FIFO_Flag                                   // Flag bei FIFO-Wechsel (sonst Stop/Err)
      A      Lauf_Flag                                       // Zähl-Lauf mit Flag ist aktiv
      O
      AN     Dyn.FIFO_Flag                                   // Flag bei FIFO-Wechsel (sonst Stop/Err)
      AN     Lauf_Flag                                       // Zähl-Lauf mit Flag ist aktiv
      JCN    En06

      L      Ink_Wert                                        // Aktuelle Inkrementalwert
      L      Dyn.FIFO_Ink                                    // Inkremente bei FIFO-Wechsel (sonst Stop/Err)
      <D
      S      Antrieb_start                                   // Kreiselantrieb starten
      JC     En06

w060: AN     Dyn.Stop                                        // Falls noch nicht gestoppt
      S      Dyn.Stop                                        // Rein-Separator stoppen
      JC     w063

      L      SyncPkt.Abstand_StartSep                        // Abstand Start-Separator <-> Sync-Sensor (in Inkremente)
      L      0                                               // sinnvoller Wert ?
      >D                                                     // Nein !
      S      Dyn.Error.TravelFIFO_belegt                     // Travel-FIFO bleibt belegt

w061: L      0
      T      Dyn.FIFO_Ink                                    // Inkremente bei FIFO-Wechsel (sonst Err)
      SET
      R      Dyn.FIFO_Flag                                   // Flag bei FIFO-Wechsel (sonst Err)

// Kontrolle, ob Daten im Travel-FIFO vorhanden:
CALL FC "FifoOut" (SSDB:=SyncPkt.TravelFIFO_DB, SSDW:=SyncPkt.TravelFIFO_DW, PARA:=WORD#16#0000, OUTDATEN:=P#M220.0, RE_VAL:="MB199")   // Daten lesen

      L      "MB199"
      L      0                                               // Aufruf mit Fehler ?
      ==I                                                    // Nein !
      R      Dyn.Error.TravelFIFO_Err                        // Travel-FIFO fehlerhaft
      JC     w062

      A      "M199.2"                                        // FIFO ist leer
      R      Dyn.Error.TravelFIFO_Err                        // Travel-FIFO fehlerhaft
      R      Dyn.Stop                                        // Rein-Separator stoppen
      R      Dyn.Error.TravelFIFO_belegt                     // Travel-FIFO bleibt belegt
      JC     En06

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

      JU     En06

// Inkremente speichern, bei denen spätestens FIFO-Zugriff erfolgen muss (sonst Stop)!
w062: L      SyncPkt.Abstand_StartSep                        // Abstand Start-Separator <-> Sync-Sensor (in Inkremente)
      L      0                                               // sinnvoller Wert ?
      <=D                                                    // Nein !
      JC     En06

      CAC
// /      L     MD   220                    //Ink-Wert des nächsten BTs beim Vereinzeln
      L      Ink_Wert                                        // Aktueller Ink-Wert
      +D
      T      Dyn.FIFO_Ink                                    // Inkremente bei FIFO-Wechsel (sonst Stop)
// /      U     M    224.0                  //Lauf-Flag des nächsten BTs beim Vereinzeln
      A      Lauf_Flag
      =      Dyn.FIFO_Flag                                   // Lauf-Flag bei FIFO-Wechsel (sonst Stop)
      L      Max_Wert                                        // Maximal erlaubter Zählwert
      >D
      JCN    En06

      -D                                                     // Restwert übernehmen
      T      Dyn.FIFO_Ink                                    // Inkremente bei FIFO-Wechsel (sonst Stop)

      AN     "M224.0"                                        // Lauf-Flag des nächsten BTs beim Vereinzeln (unvertieren)
      =      Dyn.FIFO_Flag                                   // Lauf-Flag bei FIFO-Wechsel (sonst Stop)

      JU     En06

// Inkremente speichern, bei denen spätestens FIFO leer (sonst Err)
w063: L      SyncPkt.Abstand_StartSep                        // Abstand Start-Separator <-> Sync-Sensor (in Inkremente)
      L      Ink_Wert                                        // Aktueller Ink-Wert
      +D
      T      Dyn.FIFO_Ink                                    // Inkremente bei FIFO-Wechsel (sonst Err)
      A      Lauf_Flag
      =      Dyn.FIFO_Flag                                   // Lauf-Flag bei FIFO-Wechsel (sonst Err)
      L      Max_Wert                                        // Maximal erlaubter Zählwert
      >D
      JCN    En06

      -D                                                     // Restwert übernehmen
      T      Dyn.FIFO_Ink                                    // Inkremente bei FIFO-Wechsel (sonst Err)

      AN     Lauf_Flag                                       // Zähl-Lauf mit Flag ist aktiv
      =      Dyn.FIFO_Flag                                   // Lauf-Flag bei FIFO-Wechsel (sonst Err)

En06: NOP 0


--- NW 18: Sync-Sensor ist aktiv ---
      A      sB_BT_da                                        // BT ist an Sychronisierstelle
      A      Antrieb_aktiv                                   // /bei H&M
      AN     Dyn.BT_ausgewertet                              // BT wurde schon ausgewertet
      AN     Dyn.Error.Sync_Sensor_aktiv                     // Sync-Sensor dauernd aktiv
      AN     Dyn.Status.TeachModus_Aktiv                     // Teach-Modus ist aktiv
      S      Dyn.BT_ausgewertet                              // BT wurde schon ausgewertet
      JC     Sync

      JU     Teac


--- NW 19: Daten aus Travel-FIFO holen ---
Sync: CALL FC "FifoOut" (SSDB:=SyncPkt.TravelFIFO_DB, SSDW:=SyncPkt.TravelFIFO_DW, PARA:=WORD#16#E100, OUTDATEN:=Daten, RE_VAL:="MB199")   // Daten lesen + austragen

      L      "MB199"
      T      Dyn.Rueckmld.RET_VAL_TravelFIFO_Out
      L      0                                               // Aufruf mit Fehler ?
      ==I                                                    // Nein !
      R      Dyn.Error.TravelFIFO_leer                       // keine Daten im Travel-FIFO eingetragen
      JC     X081

      A      "M199.2"                                        // FIFO ist leer
      S      Dyn.Error.TravelFIFO_leer                       // keine Daten im Travel-FIFO eingetragen
      JC     X080

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

X080: JU     En18                                            // Keine Reaktion ist am Besten !

      L      -1                                              // Null-Daten übergeben
      T      Daten.Sort_Info.Teil_IDX
      L      -1                                              // in nächsten Bereich fahren
      T      Daten.Sort_Info.Teil_Ziel

      JU     X082

      L      Teil_IDX_Old                                    // Letzte gültige Daten übergeben
      T      Daten.Sort_Info.Teil_IDX                        // nicht mehr, da nur Ärger!
      L      Teil_Ziel_Old
      T      Daten.Sort_Info.Teil_Ziel

      JU     X082

// IDX und Ziel speichern (für Travel-FIFO leer,...)
X081: L      Daten.Sort_Info.Teil_IDX
      T      Teil_IDX_Old
      L      Daten.Sort_Info.Teil_Ziel
      T      Teil_Ziel_Old

// Travel-FIFO-Daten übergeben:
X082: A      Dyn.Stop                                        // Rein-Separator stoppen
      JC     X083

      L      Dyn.FIFO_Ink                                    // Inkremente bei FIFO-Wechsel (sonst Stop)
      L      Ink_Wert                                        // Aktueller Ink-Wert
      -D
      T      Sich_Ink                                        // Übrige Inks, bevor dann gestoppt wird !

X083: L      0
      T      Dyn.FIFO_Ink                                    // Inkremente bei FIFO-Wechsel (sonst Stop)

      A      SyncPkt.Parameter.Kein_Sync_B
      R      Dyn.BT_ausgewertet                              // BT wurde schon ausgewertet


--- NW 20: Daten für Haupstrangdaten aufbereiten ---
// Sync-Info:
      L      Ink_Wert                                        // Aktuelle Inkrementalwert (Start-Sync-Zähler)
      T      Daten.Start_Ink

      A      Lauf_Flag                                       // Start-Flag übergeben (für evtl. Fahrsync)
      =      Daten.Start_Flag

// Sort-Info werden von Travel-FIFO übernommen

// Quell_Info:
      L      SyncPkt.Sync_Nr                                 // Identifikation des Synchron-Punktes
      T      Daten.Quelle
      T      Daten.letzte_Position


--- NW 21: Daten in Haupstrangdaten eintragen ---
      L      SyncPkt.Hauptstrang_DL_DB                       // Hauptstrang-DB
      T      HaupstranglistenDB                              // Aktueller Hauptstrang-DB
      L      0                                               // angegeben ?
      ==I                                                    // Nein !
      S      Dyn.Error.Keine_Hauptstrangliste                // Keine Hauptstrangliste zum Eintragen angegeben
      JC     En18

      AN     Lauf_Flag                                       // Start-Flag
      JC     w180

      L      SyncPkt.Hauptstrang_DL_DB                       // Hauptstrang-DB
      +      1                                               // DB+1 bei Flaglauf !
      T      HaupstranglistenDB                              // Aktueller Hauptstrang-DB

w180: CALL FC "DatenInSort" (SSDB:=HaupstranglistenDB, SSDW:=SyncPkt.Hauptstrang_DL_DW, INDATEN:=Daten, RE_VAL:="MB199")   // Hauptstrangliste mit Lauf-Flag | Aktueller Hauptstrang-DB

      L      "MB199"
      T      Dyn.Rueckmld.RET_VAL_Hauptstrang_In

      A      "M199.2"                                        // Hauptstrangliste ist voll
      S      Dyn.Error.Hauptstrangliste_voll                 // Hauptstrangliste ist voll
      JC     En18

      A      "M199.7"                                        // Eintrag richtig erfolgt
      JC     En18

      SET
      S      Dyn.Error.Hauptstrangliste_Err                  // Error bei Hauptstrang-Zugriff

En18: NOP 0


--- NW 22: Teach-Modus aktiv ? ---
Teac: L      Dyn.TeachPunkt                                  // Punkt zum Ein-Teachen
      L      0                                               // bekannt ?
      <>I                                                    // Ja !
      A      Dyn.Status.TeachModus_Aktiv                     // Teach-Modus ist aktiv
      JC     en20

      L      0
      T      Dyn.Ref_Ink                                     // Inkremente bei Referenzpunkt
      T      Dyn.Teach_Ink                                   // Inkremente bei Teachpunkt
      T      Abstands_Ink                                    // Abstands-Inkremente nach Teachen

      SET
      R      Dyn.Status.TeachModus_Aktiv                     // Teach-Modus ist aktiv
      R      Dyn.Ref_Flag                                    // Lauf-Flag bei Ref-Inkremente
      R      Dyn.Teach_Flag                                  // Lauf-Flag bei Teach-Inkremente
      R      Dyn.Refpunkt_ausgewertet                        // Referenzpunkt ausgewertet
      R      Dyn.Teachpunkt_ausgewertet                      // Teachpunkt ausgewertet
      R      Dyn.Refpunkt_ok                                 // Referenzpunkt erkannt

      BEU

en20: NOP 0


--- NW 23: Ref-Inkremente speichern ---
      AN     B_RefPunkt                                      // Sensor RefBT am Referenzpunkt erkannt
      R      Dyn.Refpunkt_ausgewertet                        // Referenzpunkt ausgewertet

      A      B_RefPunkt                                      // Sensor RefBT am Referenzpunkt erkannt
      AN     Dyn.Refpunkt_ausgewertet                        // Referenzpunkt ausgewertet
      JCN    en21

      L      Ink_Wert                                        // Aktuelle Inkrementalwert
      T      Dyn.Ref_Ink                                     // Inkremente bei Referenzpunkt
      A      Lauf_Flag
      =      Dyn.Ref_Flag                                    // Lauf-Flag bei Ref-Inkremente

      SET
      S      Dyn.Refpunkt_ausgewertet                        // Referenzpunkt ausgewertet
      S      Dyn.Refpunkt_ok                                 // Referenzpunkt erkannt

      L      0
      T      Dyn.Teach_Ink                                   // Inkremente bei Teachpunkt
      T      Abstands_Ink                                    // Abstands-Inkremente nach Teachen
      SET
      R      Dyn.Teachpunkt_ausgewertet                      // Teachpunkt ausgewertet
      R      Dyn.Teach_Flag                                  // Lauf-Flag bei Teach-Inkremente

en21: NOP 0


--- NW 24: Teach-Inkremente speichern ---
      AN     B_TeachPunk                                     // Sensor RefHaken am Teachpunkt erkannt
      A      Antrieb_aktiv                                   // Antrieb aktiv
      R      Dyn.Teachpunkt_ausgewertet                      // Teachpunkt ausgewertet

      AN     B_TeachPunk                                     // Sensor RefHaken am Teachpunkt erkannt
      O      Dyn.Teachpunkt_ausgewertet                      // Teachpunkt ausgewertet
      ON     Dyn.Refpunkt_ok                                 // Referenzpunkt erkannt
      ON     Antrieb_aktiv                                   // Antrieb aktiv
      BEC

      L      Ink_Wert                                        // Aktuelle Inkrementalwert
      T      Dyn.Teach_Ink                                   // Inkremente bei Teachpunkt
      A      Lauf_Flag
      =      Dyn.Teach_Flag                                  // Lauf-Flag bei Teach-Inkremente

      SET
      S      Dyn.Teachpunkt_ausgewertet                      // Teachpunkt ausgewertet


--- NW 25: Abstand ermitteln ---
      AN     Dyn.Ref_Flag                                    // Lauf-Flag bei Ref-Inkremente
      AN     Dyn.Teach_Flag                                  // Lauf-Flag bei Teach-Inkremente
      O
      A      Dyn.Ref_Flag                                    // Lauf-Flag bei Ref-Inkremente
      A      Dyn.Teach_Flag                                  // Lauf-Flag bei Teach-Inkremente
      JCN    w230

// Inkremente im gleichem Lauf:
      L      Dyn.Teach_Ink                                   // Inkremente bei Teachpunkt
      L      Dyn.Ref_Ink                                     // Inkremente bei Referenzpunkt
      -D
      T      Abstands_Ink                                    // Abstands-Inkremente nach Teachen

      JU     en23

w230: L      Max_Wert                                        // Max. Wert beim Zähler
      L      Dyn.Ref_Ink                                     // Inkremente bei Referenzpunkt
      -D
      L      Dyn.Teach_Ink                                   // Inkremente bei Teachpunkt
      +D
      T      Abstands_Ink

en23: NOP 0


--- NW 26: Teach-Inkremente in Datenbank abspeichern ---
      L      Dyn.TeachPunkt                                  // Punkt zum Ein-Teachen
      T      "MW200"

CALL FC "DatenOut" (SSDB:=Para.Weichen_DL_DB, SSDW:=Para.Weichen_DL_DW, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M200.0, Position:="MW196")   // Nach angegeben Datensatz suchen

      L      "MB199"
      T      Dyn.Rueckmld.RET_VAL_Teach_OUT

      A      "M199.7"                                        // Datensatz ist vorhanden
      JC     w240

      A      "M199.6"                                        // Datensatz ist nicht vorhanden
      =      Dyn.Error.Keine_TeachPktdaten                   // Teach-Punkt in Datenliste nicht vorhanden !
      R      Dyn.Status.TeachModus_Aktiv                     // Teach-Modus ist aktiv
      BEC

      SET
      R      Dyn.Status.TeachModus_Aktiv                     // Teach-Modus ist aktiv
      S      Dyn.Error.TeachPkt_Datenliste_Err

      BEU

w240: L      Abstands_Ink
      L      Para.Offset_RefPunkt                            // Offset Refpunkt zu SyncPunkt (für Teachen)
      +D
      T      "MD218"

CALL FC "DatenIn" (SSDB:=Para.Weichen_DL_DB, SSDW:=Para.Weichen_DL_DW, INDATEN:=P#M200.0, RE_VAL:="MB199")
      AN     Dyn.Status.MoreTeach                            // Nächsten Teachpunkt ohne neuen Refpunkt
      R      Dyn.Refpunkt_ok                                 // Referenzpunkt erkannt

      L      "MB199"
      T      Dyn.Rueckmld.RET_VAL_Teach_IN

      A      "M199.7"                                        // Datensatz ist vorhanden
      JC     MORE

      A      "M199.6"                                        // Datensatz ist nicht vorhanden
      =      Dyn.Error.Keine_TeachPktdaten                   // Teach-Punkt in Datenliste nicht vorhanden !
      R      Dyn.Status.TeachModus_Aktiv                     // Teach-Modus ist aktiv
      BEC

      SET
      R      Dyn.Status.TeachModus_Aktiv                     // Teach-Modus ist aktiv
      S      Dyn.Error.TeachPkt_Datenliste_Err

      BEU

MORE: AN     Dyn.Status.MoreTeach                            // Nächsten Teachpunkt ohne neuen Refpunkt
      BEC

CALL FC "DatenOut" (SSDB:=Para.Weichen_DL_DB, SSDW:=Para.Weichen_DL_DW, PARA:=WORD#16#FF00, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M200.0, Position:="MW196")   // Nach nächsten Datensatz suchen

      L      "MW206"                                         // Weichentyp
      L      178                                             // Sorterweiche ?
      <>I                                                    // Nein!
      O      "M199.2"                                        // Listenende erreicht!
      JC     TEND

      L      "MW200"
      T      Dyn.TeachPunkt                                  // Punkt zum Ein-Teachen

      BEU

TEND: L      0
      T      Dyn.TeachPunkt

      BEU


--- NW 27: 
 ---
      BE

