=== FB 5423: LP_Sorter  [STL] ===
INTERFACE:
  Input:
  Output:
  InOut:
  Static:
    Sorter_MB3305 : "MSepSorterRein"
    Sync_BG3306 : "MStartSync"
    Weiche_LP1 : "MWeiche_Sorter"
    Weiche_LP2 : "MWeiche_Sorter"
    Weiche_LP3 : "MWeiche_Sorter"
    Weiche_LP4 : "MWeiche_Sorter"
    Weiche_LP5 : "MWeiche_Sorter"
    Weiche_LP6 : "MWeiche_Sorter"
    Weiche_LP7 : "MWeiche_Sorter"
    Weiche_LP8 : "MWeiche_Sorter"
    Weiche_LP9 : "MWeiche_Sorter"
    Weiche_LP10 : "MWeiche_Sorter"
    Impuls_BG3374 : "MImpulsGeber"
    Pseudo_IDX : DInt                                   // Pseudo-Trolley-Nr. da kein Leser vor Sorter
    Ohne_PC_fahren : Bool
  Input:
  Output:
  InOut:
  Static:
    Dyn : Struct
      GesamtSorterReset : Bool := 1
  Temp:
    ErrQuit : Bool
    ErrAnz : Bool
    Antrieb : Bool
    Stau : Bool
    Start_Ok : Bool
    SorterReset : Bool
    Error_aktiv : Bool
    Leer : Bool
    Err_DW : DInt
    Err_Bits : Int
  Constant:

--- NW 1: Systemzeug ---
      A      "DOutbound_Bereich".A01_UH07.AnlageEin
      =      Sorter_MB3305.Dyn.Sk.Auto_akt

      AN     "DOutbound_Bereich".A01_UH07.BereichErr
      =      Sorter_MB3305.Dyn.Sk.Bereich_ok

// Bereichshalt:
      CLR                                                    // nicht verbaut
      R      Sorter_MB3305.Dyn.Sk.Bereich_ok

// Sonderbetriebsarten Weichen:
      CLR
      =      Weiche_LP1.Dyn.Status.Weichentest_aktiv
      =      Weiche_LP2.Dyn.Status.Weichentest_aktiv
      =      Weiche_LP3.Dyn.Status.Weichentest_aktiv
      =      Weiche_LP4.Dyn.Status.Weichentest_aktiv
      =      Weiche_LP5.Dyn.Status.Weichentest_aktiv
      =      Weiche_LP6.Dyn.Status.Weichentest_aktiv
      =      Weiche_LP7.Dyn.Status.Weichentest_aktiv
      =      Weiche_LP8.Dyn.Status.Weichentest_aktiv
      =      Weiche_LP9.Dyn.Status.Weichentest_aktiv
      =      Weiche_LP10.Dyn.Status.Weichentest_aktiv

      A      Sync_BG3306.Dyn.Status.TeachModus_Aktiv
      =      Weiche_LP1.Dyn.Status.TeachModus_aktiv
      =      Weiche_LP2.Dyn.Status.TeachModus_aktiv
      =      Weiche_LP3.Dyn.Status.TeachModus_aktiv
      =      Weiche_LP4.Dyn.Status.TeachModus_aktiv
      =      Weiche_LP5.Dyn.Status.TeachModus_aktiv
      =      Weiche_LP6.Dyn.Status.TeachModus_aktiv
      =      Weiche_LP7.Dyn.Status.TeachModus_aktiv
      =      Weiche_LP8.Dyn.Status.TeachModus_aktiv
      =      Weiche_LP9.Dyn.Status.TeachModus_aktiv
      =      Weiche_LP10.Dyn.Status.TeachModus_aktiv

      CLR
      =      Sorter_MB3305.Dyn.Error.Korrektur_Modus_aktiv

      L      5474                                            // DLSeps
      T      "MW174"
      L      5478                                            // DLWeichen
      T      "MW178"

// Nach neuen Daten suchen:
      A      "1s-Impuls"
      =      "Weiche_NewData"


--- NW 2: Linien mit PLC_Ziel anfahren ---
      A      Ohne_PC_fahren
      JCN    En03

      A      "MB3121"
      O      "MB3123"
      CU     "Z102"

      L      "Z102"
      L      1
      <I
      A(
      L      Sorter_MB3305.Separator.Default_Ziel
      L      0                                               // Bekannt ?
      >I                                                     // Ja !
      )
      JC     En03

      SET
      R      "Z102"

      L      Sorter_MB3305.Separator.Default_Ziel
      L      0                                               // unbekannt ?
      ==I
      L      5030                                            // Beginn mit Ausfahrziel 1.Puffer
      JC     X399

// Nächste Weiche suchen:
      L      Sorter_MB3305.Separator.Default_Ziel
      T      "MW200"

CALL FC "DatenOut" (SSDB:="MW178", SSDW:=0, PARA:=WORD#16#0E00, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M200.0, Position:="MW196")   // Nach angegeben Datenbyte suchen (Abzweig-Ziel)

      AN     "M199.7"                                        // Datensatz ist nicht vorhanden
      O      "M208.0"                                        // Letzte Weiche
      L      0                                               // Neubeginn
      JC     X400

X398: CALL FC "DatenOut" (SSDB:="MW178", SSDW:=0, PARA:=WORD#16#FF00, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M200.0, Position:="MW196")   // Nächsten Datensatz lesen

      L      "MW206"                                         // Weichentyp
      L      178                                             // Sorterweiche ?
      <>I                                                    // Nein!
      O      "M199.2"                                        // Ende erreicht
      L      0
      JC     X400

      A      "M208.5"                                        // Weiche für PLC-Ziel disabled !
      JC     X398

      L      "MW226"
      T      Sorter_MB3305.Separator.Default_Ziel

      JU     En03

// 1.Weiche checken:
X399: T      "MW200"

CALL FC "DatenOut" (SSDB:="MW178", SSDW:=0, PARA:=WORD#16#0E00, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M200.0, Position:="MW196")   // Nach angegeben Datenbyte suchen (Abzweig-Ziel)

      AN     "M199.7"                                        // Datensatz ist nicht vorhanden
      JC     En03

      A      "M208.5"                                        // Weiche für PLC-Ziel disabled !
      JC     X398

      L      "MW226"
X400: T      Sorter_MB3305.Separator.Default_Ziel

En03: NOP 0


--- NW 3: Störung vorhanden ? ---
CALL FC "Err_vorhanden" (Check_DB:=708, Anfangs_DW:=DINT#100, Ende_DW:=DINT#122, Stoerung:=Error_aktiv, ErrDW:=Err_DW, ErrBits:=Err_Bits)   // Störungsanzeige
      A      Error_aktiv                                     // s.o.
      =      Error_aktiv                                     // Sorter Lager Weichen-Störung (Sorter-Antrieb gestoppt!)

      A      "BG3306"                                        // Verlassen-Sensor
      L      S5T#250MS
      OffDelay "T540"


--- NW 4: Störung quittieren UH07 ---
      A      "DOutbound_Bereich".A01_UH07.StOk_aktiv
      =      ErrQuit


--- NW 5: Sorter-GesamtReset ---
// Sorter-Reset starten:
      A      "DLP_OmniFahren".Schleuse_3305.Dyn.Status.Reset_aktiv // Bei Schleusen-Reset -> Sorter mit resetten!
      AN     "DLP_Sorter".Sorter_MB3305.Dyn.GesamtSorterReset_aktiv
      S      "DLP_Sorter".Sorter_MB3305.Dyn.GesamtSorterReset


--- NW 6: Separator  3305 vor Sorter ---
      L      DB708.DBW102                                    // Err beim Synchronisieren
      L      0                                               // Störung vorhanden ?
      ==I                                                    // Nein !
      AN     Sync_BG3306.Dyn.Stop                            // Rein-Separator stoppen
      AN     Error_aktiv                                     // Sorter Batch Weichen-Störung (Sorter-Antrieb gestoppt!)
      AN     Sorter_MB3305.Dyn.GesamtSorterReset_aktiv
      =      Start_Ok

      SET                                                    // Da Leiste im Sep und Zusatz-Zylinder im Separator -> BT steht sofort sauber im Sep
      S      Sorter_MB3305.Dyn.BT_beruhigt                   // 1. einfahrender BügelTräger ist im Sep

      A      "T540"
      =      Sorter_MB3305.B_AusSep                          // Entprellung Verlassen-Sensor

// Triggern / Scanner-Auswertung über HW>VP_Omnifahren (FC128/27)
// Ziel über Default-Ziel (HW>VP_Ziel_FC, FC181)

CALL FB "None" ,  (Separator_Nr:=3305, ErrQuit:=ErrQuit, B_VorSep:=?, B_ImSep:="BG3305", B_AusSep:=?, B_Beladen_im_Sep:=?, B_Pinsensor:="BG3374", B_Beladen_nach_Sep:=?, Start_Ok:=Start_Ok, Antrieb_aktiv:="MA0064", Antrieb_plus_aktiv:="MA0064", Y_Sep_Auf:="DLP_Zylinder".Sorter_3305.Stat.Ast, K_Sanner_triggern:=?, Sorter_Reset:=SorterReset, Error:=DB708.DBW100, Antrieb_start:="DEPtoLP_Antriebe".MA0064.Stat.A_start, Antrieb_plus_start:="DEPtoLP_Antriebe".MA0064.Stat.A_vor, Antrieb_stoppen:="DEPtoLP_Antriebe".MA0064.Stat.Stop_vor, hStOk:=ErrAnz)

// Default-Ziel jeden Zyklus neu!:
      L      0
      T      Sorter_MB3305.Separator.Default_Ziel


--- NW 7: Reset ist aktiv ---
      A      Sorter_MB3305.Dyn.GesamtSorterReset_aktiv
      =      "7_HMI_Err_UH07_OB".Sorter_MB3305.Reset_aktiv

      A      Sorter_MB3305.Dyn.GesamtSorterReset_aktiv
      =      Weiche_LP1.Dyn.Ohne_VerklemmKontrolle
      =      Weiche_LP2.Dyn.Ohne_VerklemmKontrolle
      =      Weiche_LP3.Dyn.Ohne_VerklemmKontrolle
      =      Weiche_LP4.Dyn.Ohne_VerklemmKontrolle
      =      Weiche_LP5.Dyn.Ohne_VerklemmKontrolle
      =      Weiche_LP6.Dyn.Ohne_VerklemmKontrolle
      =      Weiche_LP7.Dyn.Ohne_VerklemmKontrolle
      =      Weiche_LP8.Dyn.Ohne_VerklemmKontrolle
      =      Weiche_LP9.Dyn.Ohne_VerklemmKontrolle
      =      Weiche_LP10.Dyn.Ohne_VerklemmKontrolle

// Diesen Sorterbereich zurücksetzen:
      A      SorterReset                                     // Ein Zyklus
      S      Sync_BG3306.Dyn.Reset
      S      Weiche_LP1.Dyn.Status.Reset
      S      Weiche_LP2.Dyn.Status.Reset
      S      Weiche_LP3.Dyn.Status.Reset
      S      Weiche_LP4.Dyn.Status.Reset
      S      Weiche_LP5.Dyn.Status.Reset
      S      Weiche_LP6.Dyn.Status.Reset
      S      Weiche_LP7.Dyn.Status.Reset
      S      Weiche_LP8.Dyn.Status.Reset
      S      Weiche_LP9.Dyn.Status.Reset
      S      Weiche_LP10.Dyn.Status.Reset


--- NW 8: Inkremente über Zahnrad-Sensor ---
CALL FB "None" ,  (Ink_DB:=5483, B_Zaehlen:="BG3374", Antrieb_aktiv:="MA0064", Quit:=ErrQuit, Zeit_Signal_zu_lang:=?, Zeit_Kein_Signal:=?, Signal:=?, Err_Kein_Signal:="7_HMI_Err_UH07_OB".Impulsgeber_3374.Kein_Signal, Err_Signal_zu_lang:="7_HMI_Err_UH07_OB".Impulsgeber_3374.Signal_zu_lang)

      A(
      O      "7_HMI_Err_UH07_OB".Impulsgeber_3374.Kein_Signal
      O      "7_HMI_Err_UH07_OB".Impulsgeber_3374.Signal_zu_lang
      )
      AN     ErrQuit
      S      "DEPtoLP_Antriebe".MA0064.Stat.Stop_vor

      A(
      O      "7_HMI_Err_UH07_OB".Impulsgeber_3374.Kein_Signal
      O      "7_HMI_Err_UH07_OB".Impulsgeber_3374.Signal_zu_lang
      )
      S      ErrAnz


--- NW 9: Trolley synchronisieren BG3306 ---
// Teachen: Ref-Sensor ueber Sync-Sensor
      A      "BG3306"
      AN     Sync_BG3306.Dyn.Refpunkt_ok                     // Nur eimalige Auswertung
      =      Sync_BG3306.B_RefPunkt                          // uebergabe fuer unten

      A      "MA0064"
      L      S5T#500ms
      OffDelay "T543"
      A      "T543"
      AN     Sync_BG3306.Dyn.Status.TeachModus_Aktiv         // sonst Probleme bei Doppelimpuls
      O
      A      "MA0064"
      A      Sync_BG3306.Dyn.Status.TeachModus_Aktiv         // sonst Probleme bei Doppelimpuls
      =      Antrieb

// Keine Hauptstrangdaten vorhanden ? (Fuer Sync-Pkt):
      L      "LP_HS_oF".Datensortkopf.AnzahlEintraege
      L      "LP_HS_mF".Datensortkopf.AnzahlEintraege
      +I
      L      0                                               // Daten vorhanden ?
      ==I                                                    // Nein !
      =      "Hauptstrang_leer"                              // Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen

      A      "BG3306"
      L      s5t#500ms                                       // Da trotz Entprellung Doppel-Impulse
      OffDelay "T544"
      A      "T544"
      =      Sync_BG3306.B_BT_da

CALL FB "None" ,  (Sync_Nr:=3306, ErrQuit:=ErrQuit, B_BT_da:=?, B_RefPunkt:=?, B_TeachPunk:=?, Antrieb_aktiv:=Antrieb, Error:=DB708.DBW102, Antrieb_start:="DEPtoLP_Antriebe".MA0064.Stat.A_start, hStOk:=ErrAnz)   // Teach-Sensor

      A      Sync_BG3306.Dyn.Error.Inkrementalgeber
      S      "DEPtoLP_Antriebe".MA0064.Stat.Stop_vor

// Keine Hauptstrangdaten vorhanden ?:
      L      "LP_HS_oF".Datensortkopf.AnzahlEintraege
      L      "LP_HS_mF".Datensortkopf.AnzahlEintraege
      +I
      L      0                                               // Daten vorhanden ?
      ==I                                                    // Nein !
      =      "Hauptstrang_leer"                              // Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen

// Spezial, da Sorter-Antrieb über SorterRein-Sep geht!: (Sonst Antriebs-Stop wegen PS)
      AN     "Hauptstrang_leer"                              // Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen
      O      "MB3305"                                        // Neuer Sort-Trolley kommt
      O      "BG3306"
      L      s5t#20s
      OffDelay "T541"

      A      "T541"                                          // Alle Sort-Trolleys sind ins Puffer ausgefahren
      S      "DEPtoLP_Antriebe".MA0064.Stat.A_vor


--- NW 10: Weiche 3320 / Leerpuffer LP1 ---
CALL FB "None" ,  (Weichen_Nr:=1, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DLP_Sensoren".Stau_LP1.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3320", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DLP_Zylinder".Weiche_LP1.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW104, Antrieb_start:="DEPtoLP_Antriebe".MA0064.Stat.A_start, Antrieb_stoppen:="DEPtoLP_Antriebe".MA0064.Stat.Stop_vor, hStOk:=ErrAnz)


--- NW 11: Weiche 3317 / Leerpuffer LP2 ---
CALL FB "None" ,  (Weichen_Nr:=2, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DLP_Sensoren".Stau_LP2.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3317", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DLP_Zylinder".Weiche_LP2.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW106, Antrieb_start:="DEPtoLP_Antriebe".MA0064.Stat.A_start, Antrieb_stoppen:="DEPtoLP_Antriebe".MA0064.Stat.Stop_vor, hStOk:=ErrAnz)


--- NW 12: Weiche 3316 / Leerpuffer LP3 ---
CALL FB "None" ,  (Weichen_Nr:=3, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DLP_Sensoren".Stau_LP3.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3316", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DLP_Zylinder".Weiche_LP3.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW108, Antrieb_start:="DEPtoLP_Antriebe".MA0064.Stat.A_start, Antrieb_stoppen:="DEPtoLP_Antriebe".MA0064.Stat.Stop_vor, hStOk:=ErrAnz)


--- NW 13: Weiche 3315 / Leerpuffer LP4 ---
CALL FB "None" ,  (Weichen_Nr:=4, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DLP_Sensoren".Stau_LP4.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3315", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DLP_Zylinder".Weiche_LP4.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW110, Antrieb_start:="DEPtoLP_Antriebe".MA0064.Stat.A_start, Antrieb_stoppen:="DEPtoLP_Antriebe".MA0064.Stat.Stop_vor, hStOk:=ErrAnz)


--- NW 14: Weiche 3314 / Leerpuffer LP5 ---
CALL FB "None" ,  (Weichen_Nr:=5, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DLP_Sensoren".Stau_LP5.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3314", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DLP_Zylinder".Weiche_LP5.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW112, Antrieb_start:="DEPtoLP_Antriebe".MA0064.Stat.A_start, Antrieb_stoppen:="DEPtoLP_Antriebe".MA0064.Stat.Stop_vor, hStOk:=ErrAnz)


--- NW 15: Weiche 3313 / Leerpuffer LP6 ---
CALL FB "None" ,  (Weichen_Nr:=6, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DLP_Sensoren".Stau_LP6.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3313", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DLP_Zylinder".Weiche_LP6.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW114, Antrieb_start:="DEPtoLP_Antriebe".MA0064.Stat.A_start, Antrieb_stoppen:="DEPtoLP_Antriebe".MA0064.Stat.Stop_vor, hStOk:=ErrAnz)


--- NW 16: Weiche 3312 / Leerpuffer LP7 ---
CALL FB "None" ,  (Weichen_Nr:=7, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DLP_Sensoren".Stau_LP7.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3312", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DLP_Zylinder".Weiche_LP7.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW116, Antrieb_start:="DEPtoLP_Antriebe".MA0064.Stat.A_start, Antrieb_stoppen:="DEPtoLP_Antriebe".MA0064.Stat.Stop_vor, hStOk:=ErrAnz)


--- NW 17: Weiche 3311 / Leerpuffer LP8 ---
CALL FB "None" ,  (Weichen_Nr:=8, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DLP_Sensoren".Stau_LP8.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3311", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DLP_Zylinder".Weiche_LP8.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW118, Antrieb_start:="DEPtoLP_Antriebe".MA0064.Stat.A_start, Antrieb_stoppen:="DEPtoLP_Antriebe".MA0064.Stat.Stop_vor, hStOk:=ErrAnz)


--- NW 18: Weiche 3310 / Leerpuffer LP9 ---
CALL FB "None" ,  (Weichen_Nr:=9, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DLP_Sensoren".Stau_LP9.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3310", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DLP_Zylinder".Weiche_LP9.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW120, Antrieb_start:="DEPtoLP_Antriebe".MA0064.Stat.A_start, Antrieb_stoppen:="DEPtoLP_Antriebe".MA0064.Stat.Stop_vor, hStOk:=ErrAnz)


--- NW 19: Pseudo-Weiche / Leerpuffer LP10 ---
CALL FB "None" ,  (Weichen_Nr:=10, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DLP_Sensoren".Stau_LP10.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3307", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DLP_Zylinder".Weiche_LP10.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW122, Antrieb_start:="DEPtoLP_Antriebe".MA0064.Stat.A_start, Antrieb_stoppen:="DEPtoLP_Antriebe".MA0064.Stat.Stop_vor, hStOk:=ErrAnz)


--- NW 20: Störungen anzeigen UH07 ---
      A      ErrAnz
      S      "DOutbound_Bereich".A01_UH07.StOk_blinken


--- NW 21: Ende ---
      BE

