=== FB 181: MAusfahrFreigabe  [STL] ===
INTERFACE:
  Input:
    Antrieb_aktiv : Bool
    Kommt_1 : Bool                                      // BM fährt aus Strecke ausgefahren
    Kommt_2 : Bool                                      // BM fährt aus Strecke ausgefahren
    Kommt_3 : Bool                                      // BM fährt aus Strecke ausgefahren
    Kommt_4 : Bool                                      // BM fährt aus Strecke ausgefahren
    Kommt_5 : Bool                                      // BM fährt aus Strecke ausgefahren
    Kommt_6 : Bool                                      // BM fährt aus Strecke ausgefahren
    Kommt_7 : Bool                                      // BM fährt aus Strecke ausgefahren
    Kommt_8 : Bool                                      // BM fährt aus Strecke ausgefahren
    Kommt_9 : Bool                                      // BM fährt aus Strecke ausgefahren
    Kommt_10 : Bool                                     // BM fährt aus Strecke ausgefahren
    Kommt_11 : Bool                                     // BM fährt aus Strecke ausgefahren
    Kommt_12 : Bool                                     // BM fährt aus Strecke ausgefahren
    Kommt_13 : Bool                                     // BM fährt aus Strecke ausgefahren
    Kommt_14 : Bool                                     // BM fährt aus Strecke ausgefahren
    Kommt_15 : Bool                                     // BM fährt aus Strecke ausgefahren
    Kommt_16 : Bool                                     // BM fährt aus Strecke ausgefahren
    Kommt_17 : Bool                                     // BM fährt aus Strecke ausgefahren
    Kommt_18 : Bool                                     // BM fährt aus Strecke ausgefahren
    Kommt_19 : Bool                                     // BM fährt aus Strecke ausgefahren
    Kommt_20 : Bool                                     // BM fährt aus Strecke ausgefahren
    Kommt_21 : Bool                                     // BM fährt aus Strecke ausgefahren
    Kommt_22 : Bool                                     // BM fährt aus Strecke ausgefahren
    Kommt_23 : Bool                                     // BM fährt aus Strecke ausgefahren
    Kommt_24 : Bool                                     // BM fährt aus Strecke ausgefahren
    Kommt_25 : Bool                                     // BM fährt aus Strecke ausgefahren
    Vorbei_1 : Bool                                     // BM ist an Sensor vorbeigefahren
    Vorbei_2 : Bool                                     // BM ist an Sensor vorbeigefahren
    Vorbei_3 : Bool                                     // BM ist an Sensor vorbeigefahren
    Vorbei_4 : Bool                                     // BM ist an Sensor vorbeigefahren
    Vorbei_5 : Bool                                     // BM ist an Sensor vorbeigefahren
    Nur_1 : Bool                                        // Nachtriggern nur bei Vorbei_1
  Output:
  InOut:
  Static:
    Para : Struct
      Sicherheit : Int := 60                            // Sicherheitszeit dazu[100ms]
      Abstand_Lines : Int := 20                         // Abstand zwischen 2 Linien [100ms]
      Position_Vorbei_1 : Int                           // Vorbei-Sensor in Höhe Linie X
      Position_Vorbei_2 : Int                           // Vorbei-Sensor in Höhe Linie X
      Position_Vorbei_3 : Int                           // Vorbei-Sensor in Höhe Linie X
      Position_Vorbei_4 : Int                           // Vorbei-Sensor in Höhe Linie X
      Position_Vorbei_5 : Int                           // Vorbei-Sensor in Höhe Linie X
    Dyn : Struct
      RestZeit : Int                                    // BM noch unterwegs [s]
      Aktiv_Line : Int                                  // Aktive Linie
      Last_Line : Int                                   // Letzte aktive Linie
      Nachtrigger_Freigabe : Int                        // Nachtriggern der Freigabe der ausfahrenden Linie
    Out : Struct
      Line_1_Ok : Bool
      Line_2_Ok : Bool
      Line_3_Ok : Bool
      Line_4_Ok : Bool
      Line_5_Ok : Bool
      Line_6_Ok : Bool
      Line_7_Ok : Bool
      Line_8_Ok : Bool
      Line_9_Ok : Bool
      Line_10_Ok : Bool
      Line_11_Ok : Bool
      Line_12_Ok : Bool
      Line_13_Ok : Bool
      Line_14_Ok : Bool
      Line_15_Ok : Bool
      Line_16_Ok : Bool
      Line_17_Ok : Bool
      Line_18_Ok : Bool
      Line_19_Ok : Bool
      Line_20_Ok : Bool
      Line_21_Ok : Bool
      Line_22_Ok : Bool
      Line_23_Ok : Bool
      Line_24_Ok : Bool
      Line_25_Ok : Bool
  Temp:
  Constant:

--- NW 1: Erst mal ---
      SET
      R      Out.Line_1_Ok
      R      Out.Line_2_Ok
      R      Out.Line_3_Ok
      R      Out.Line_4_Ok
      R      Out.Line_5_Ok
      R      Out.Line_6_Ok
      R      Out.Line_7_Ok
      R      Out.Line_8_Ok
      R      Out.Line_9_Ok
      R      Out.Line_10_Ok
      R      Out.Line_11_Ok
      R      Out.Line_12_Ok
      R      Out.Line_13_Ok
      R      Out.Line_14_Ok
      R      Out.Line_15_Ok
      R      Out.Line_16_Ok
      R      Out.Line_17_Ok
      R      Out.Line_18_Ok
      R      Out.Line_19_Ok
      R      Out.Line_20_Ok
      R      Out.Line_21_Ok
      R      Out.Line_22_Ok
      R      Out.Line_23_Ok
      R      Out.Line_24_Ok
      R      Out.Line_25_Ok


--- NW 2: Vorbei.Sensoren auswerten ---
      AN     Vorbei_1
      JC     V002

      L      Para.Position_Vorbei_1
      L      Para.Abstand_Lines
      *I
      L      Para.Sicherheit
      +I                                                     // Neue RestZeit ermitteln
      L      Dyn.RestZeit                                    // Neuer Wert kleiner?
      <I                                                     // Ja !
      JC     V002                                            // Ohne Speicherung weiter

      CAC                                                    // Neuen Wert übernehmen
      T      Dyn.RestZeit                                    // Wert speichern

V002: AN     Vorbei_2
      O      Nur_1                                           // Nachtriggern nur bei Vorbei_1
      JC     V003

      L      Para.Position_Vorbei_2
      L      Para.Abstand_Lines
      *I
      L      Para.Sicherheit
      +I                                                     // Neue RestZeit ermitteln
      L      Dyn.RestZeit                                    // Neuer Wert kleiner?
      <I                                                     // Ja !
      JC     V003                                            // Ohne Speicherung weiter

      CAC                                                    // Neuen Wert übernehmen
      T      Dyn.RestZeit                                    // Wert speichern

V003: AN     Vorbei_3
      O      Nur_1                                           // Nachtriggern nur bei Vorbei_1
      JC     V004

      L      Para.Position_Vorbei_3
      L      Para.Abstand_Lines
      *I
      L      Para.Sicherheit
      +I                                                     // Neue RestZeit ermitteln
      L      Dyn.RestZeit                                    // Neuer Wert kleiner?
      <I                                                     // Ja !
      JC     V004                                            // Ohne Speicherung weiter

      CAC                                                    // Neuen Wert übernehmen
      T      Dyn.RestZeit                                    // Wert speichern

V004: AN     Vorbei_4
      O      Nur_1                                           // Nachtriggern nur bei Vorbei_1
      JC     V005

      L      Para.Position_Vorbei_4
      L      Para.Abstand_Lines
      *I
      L      Para.Sicherheit
      +I                                                     // Neue RestZeit ermitteln
      L      Dyn.RestZeit                                    // Neuer Wert kleiner?
      <I                                                     // Ja !
      JC     V005                                            // Ohne Speicherung weiter

      CAC                                                    // Neuen Wert übernehmen
      T      Dyn.RestZeit                                    // Wert speichern

V005: AN     Vorbei_5
      O      Nur_1                                           // Nachtriggern nur bei Vorbei_1
      JC     V00E

      L      Para.Position_Vorbei_5
      L      Para.Abstand_Lines
      *I
      L      Para.Sicherheit
      +I                                                     // Neue RestZeit ermitteln
      L      Dyn.RestZeit                                    // Neuer Wert kleiner?
      <I                                                     // Ja !
      JC     V00E                                            // Ohne Speicherung weiter

      CAC                                                    // Neuen Wert übernehmen
      T      Dyn.RestZeit                                    // Wert speichern

V00E: NOP 0


--- NW 3: Aus-/vorbeifahrendes BM -> Aktivzeit speichern ---
      L      25
      A      Kommt_25
      JC     Save
      L      24
      A      Kommt_24
      JC     Save
      L      23
      A      Kommt_23
      JC     Save
      L      22
      A      Kommt_22
      JC     Save
      L      21
      A      Kommt_21
      JC     Save
      L      20
      A      Kommt_20
      JC     Save
      L      19
      A      Kommt_19
      JC     Save
      L      18
      A      Kommt_18
      JC     Save
      L      17
      A      Kommt_17
      JC     Save
      L      16
      A      Kommt_16
      JC     Save
      L      15
      A      Kommt_15
      JC     Save
      L      14
      A      Kommt_14
      JC     Save
      L      13
      A      Kommt_13
      JC     Save
      L      12
      A      Kommt_12
      JC     Save
      L      11
      A      Kommt_11
      JC     Save
      L      10
      A      Kommt_10
      JC     Save
      L      9
      A      Kommt_9
      JC     Save
      L      8
      A      Kommt_8
      JC     Save
      L      7
      A      Kommt_7
      JC     Save
      L      6
      A      Kommt_6
      JC     Save
      L      5
      A      Kommt_5
      JC     Save
      L      4
      A      Kommt_4
      JC     Save
      L      3
      A      Kommt_3
      JC     Save
      L      2
      A      Kommt_2
      JC     Save
      L      1
      A      Kommt_1
      JC     Save

      JU     Zeit

Save: T      Dyn.Aktiv_Line                                  // Aktive Linie speichern

      L      Para.Abstand_Lines
      *I
      L      Para.Sicherheit
      +I                                                     // RestZeit ermitteln
      L      Dyn.RestZeit                                    // Neuer Wert größer?
      >=I                                                    // Ja !
      JC     Ok

// Ausgefahrene Stelle ist kleiner:
      L      0                                               // Löschen
      T      Dyn.Aktiv_Line                                  // Aktive Linie
      T      Dyn.Nachtrigger_Freigabe                        // Nachtriggern der Freigabe der ausfahrenden Linie

      BEU

Ok:   CAC                                                    // Neuen Wert übernehmen
      T      Dyn.RestZeit                                    // Wert speichern

// Freigabe aus aktiver Linie verlängern aktivieren:
      L      Para.Sicherheit
      L      Para.Abstand_Lines
      +I
      L      10
      /I
      L      2                                               // /Nach 2 Sekunden
      T      Dyn.Nachtrigger_Freigabe                        // Nachtriggern der Freigabe der ausfahrenden Linie


--- NW 4: Aktiv-/Nachtrigger-Zeit verändern ---
Zeit: AN     Antrieb_aktiv                                   // Antrieb aktiv
      ON     "1s-Impuls"                                     // 1s-Impuls
      JC     Chk

// BM ist unterwegs:
      L      Dyn.RestZeit
      +      -10                                             // 10*100ms = 1s
      T      Dyn.RestZeit

      L      0                                               // Minimum erreicht?
      >I                                                     // Nein !
      JC     Trig

      T      Dyn.RestZeit                                    // Minimum übergeben

// Freigabe nachtriggern:
Trig: L      Dyn.Nachtrigger_Freigabe                        // Nachtriggern der Freigabe der ausfahrenden Linie
      +      -1
      T      Dyn.Nachtrigger_Freigabe                        // Nachtriggern der Freigabe der ausfahrenden Linie

      L      0                                               // Minimum erreicht?
      >I                                                     // Nein !
      JC     Chk

      T      Dyn.Nachtrigger_Freigabe                        // Minimum übergeben
      T      Dyn.Aktiv_Line
      T      Dyn.Last_Line


--- NW 5: Nachtriggern der Freigabe der ausfahrenden Linie ---
Chk:  L      Dyn.Aktiv_Line                                  // Aktive Linie
      L      Dyn.Last_Line
      <>I                                                    // Unterschiedlich !
      JC     More

      CAC
      JL     ENDE_Mig
      JU     ENDE_Mig                                        // Bei 0
      JU     Li01                                            // Linie 1 war aktiv
      JU     Li02
      JU     Li03
      JU     Li04
      JU     Li05
      JU     Li06
      JU     Li07
      JU     Li08
      JU     Li09
      JU     Li10
      JU     Li11
      JU     Li12
      JU     Li13
      JU     Li14
      JU     Li15
      JU     Li16
      JU     Li17
      JU     Li18
      JU     Li19
      JU     Li20
      JU     Li21
      JU     Li22
      JU     Li23
      JU     Li24
      JU     Li25                                            // Linie 25 war aktiv
ENDE_Mig: JU     More

Li01: SET
      S      Out.Line_1_Ok
      BEU
Li02: SET
      S      Out.Line_2_Ok
      BEU
Li03: SET
      S      Out.Line_3_Ok
      BEU
Li04: SET
      S      Out.Line_4_Ok
      BEU
Li05: SET
      S      Out.Line_5_Ok
      BEU
Li06: SET
      S      Out.Line_6_Ok
      BEU
Li07: SET
      S      Out.Line_7_Ok
      BEU
Li08: SET
      S      Out.Line_8_Ok
      BEU
Li09: SET
      S      Out.Line_9_Ok
      BEU
Li10: SET
      S      Out.Line_10_Ok
      BEU
Li11: SET
      S      Out.Line_11_Ok
      BEU
Li12: SET
      S      Out.Line_12_Ok
      BEU
Li13: SET
      S      Out.Line_13_Ok
      BEU
Li14: SET
      S      Out.Line_14_Ok
      BEU
Li15: SET
      S      Out.Line_15_Ok
      BEU
Li16: SET
      S      Out.Line_16_Ok
      BEU
Li17: SET
      S      Out.Line_17_Ok
      BEU
Li18: SET
      S      Out.Line_18_Ok
      BEU
Li19: SET
      S      Out.Line_19_Ok
      BEU
Li20: SET
      S      Out.Line_20_Ok
      BEU
Li21: SET
      S      Out.Line_21_Ok
      BEU
Li22: SET
      S      Out.Line_22_Ok
      BEU
Li23: SET
      S      Out.Line_23_Ok
      BEU
Li24: SET
      S      Out.Line_24_Ok
      BEU
Li25: SET
      S      Out.Line_25_Ok
      BEU

More: NOP 0


--- NW 6: Freigaben an Pufferstrecken aufgrund der fahrenden BM ---
      L      Dyn.RestZeit
      L      10
      /I
      JL     Ende
      JU     Ok01                                            // Restzeit in 0 Sekunden
      JU     Ok01                                            // Restzeit in 1 Sekunden
      JU     Ok02                                            // Restzeit in 2 Sekunden
      JU     Ok02                                            // Restzeit in 3 Sekunden
      JU     Ok03                                            // Restzeit in 4 Sekunden
      JU     Ok03                                            // Restzeit in 5 Sekunden
      JU     Ok04                                            // Restzeit in 6 Sekunden
      JU     Ok04                                            // Restzeit in 7 Sekunden
      JU     Ok05                                            // Restzeit in 8 Sekunden
      JU     Ok05                                            // Restzeit in 9 Sekunden
      JU     Ok06                                            // Restzeit in 10 Sekunden
      JU     Ok06                                            // Restzeit in 11 Sekunden
      JU     Ok07                                            // Restzeit in 12 Sekunden
      JU     Ok07                                            // Restzeit in 13 Sekunden
      JU     Ok08                                            // Restzeit in 14 Sekunden
      JU     Ok08                                            // Restzeit in 15 Sekunden
      JU     Ok09                                            // Restzeit in 16 Sekunden
      JU     Ok09                                            // Restzeit in 17 Sekunden
      JU     Ok10                                            // Restzeit in 18 Sekunden
      JU     Ok10                                            // Restzeit in 19 Sekunden
      JU     Ok11                                            // Restzeit in 20 Sekunden
      JU     Ok11                                            // Restzeit in 21 Sekunden
      JU     Ok12                                            // Restzeit in 22 Sekunden
      JU     Ok12                                            // Restzeit in 23 Sekunden
      JU     Ok13                                            // Restzeit in 24 Sekunden
      JU     Ok13                                            // Restzeit in 25 Sekunden
      JU     Ok14                                            // Restzeit in 26 Sekunden
      JU     Ok14                                            // Restzeit in 27 Sekunden
      JU     Ok15                                            // Restzeit in 28 Sekunden
      JU     Ok15                                            // Restzeit in 29 Sekunden
      JU     Ok16                                            // Restzeit in 30 Sekunden
      JU     Ok16                                            // Restzeit in 31 Sekunden
      JU     Ok17                                            // Restzeit in 32 Sekunden
      JU     Ok17                                            // Restzeit in 33 Sekunden
      JU     Ok18                                            // Restzeit in 34 Sekunden
      JU     Ok18                                            // Restzeit in 35 Sekunden
      JU     Ok19                                            // Restzeit in 36 Sekunden
      JU     Ok19                                            // Restzeit in 33 Sekunden
      JU     Ok20                                            // Restzeit in 38 Sekunden
      JU     Ok20                                            // Restzeit in 39 Sekunden
      JU     Ok21                                            // Restzeit in 40 Sekunden
      JU     Ok21                                            // Restzeit in 41 Sekunden
      JU     Ok22                                            // Restzeit in 42 Sekunden
      JU     Ok22                                            // Restzeit in 43 Sekunden
      JU     Ok23                                            // Restzeit in 44 Sekunden
      JU     Ok23                                            // Restzeit in 45 Sekunden
      JU     Ok24                                            // Restzeit in 46 Sekunden
      JU     Ok24                                            // Restzeit in 43 Sekunden
      JU     Ok25                                            // Restzeit in 48 Sekunden
      JU     Ok25                                            // Restzeit in 49 Sekunden
Ende: JU     En04

Ok01: SET
      S      Out.Line_1_Ok
Ok02: SET
      S      Out.Line_2_Ok
Ok03: SET
      S      Out.Line_3_Ok
Ok04: SET
      S      Out.Line_4_Ok
Ok05: SET
      S      Out.Line_5_Ok
Ok06: SET
      S      Out.Line_6_Ok
Ok07: SET
      S      Out.Line_7_Ok
Ok08: SET
      S      Out.Line_8_Ok
Ok09: SET
      S      Out.Line_9_Ok
Ok10: SET
      S      Out.Line_10_Ok
Ok11: SET
      S      Out.Line_11_Ok
Ok12: SET
      S      Out.Line_12_Ok
Ok13: SET
      S      Out.Line_13_Ok
Ok14: SET
      S      Out.Line_14_Ok
Ok15: SET
      S      Out.Line_15_Ok
Ok16: SET
      S      Out.Line_16_Ok
Ok17: SET
      S      Out.Line_17_Ok
Ok18: SET
      S      Out.Line_18_Ok
Ok19: SET
      S      Out.Line_19_Ok
Ok20: SET
      S      Out.Line_20_Ok
Ok21: SET
      S      Out.Line_21_Ok
Ok22: SET
      S      Out.Line_22_Ok
Ok23: SET
      S      Out.Line_23_Ok
Ok24: SET
      S      Out.Line_24_Ok
Ok25: SET
      S      Out.Line_25_Ok

En04: NOP 0


--- NW 7: Letzten aktiven Puffer speichern ---
      L      Dyn.Aktiv_Line                                  // Aktive Linie
      T      Dyn.Last_Line                                   // speichern


--- NW 8: Ende ---
      BE

