=== FB 3423: EP_Sorter  [STL] ===
INTERFACE:
  Input:
  Output:
  InOut:
  Static:
    Sorter_MB4503 : "MSepSorterRein"
    Sync_BG4527 : "MStartSync"
    Weiche_EP1 : "MWeiche_Sorter_EP"
    Weiche_EP2 : "MWeiche_Sorter_EP"
    Weiche_EP3 : "MWeiche_Sorter_EP"
    Weiche_EP4 : "MWeiche_Sorter_EP"
    Impuls_BG4526 : "MImpulsGeber"
    Ohne_PC_fahren : Bool
    SorterReset : Bool
  Temp:
    ErrQuit : Bool
    ErrAnz : Bool
    Antrieb : Bool
    Stau : Bool
    Start_Ok : Bool
    Error_aktiv : Bool
    Leer : Bool
    Err_DW : DInt
    Err_Bits : Int
  Constant:

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

      AN     "DOutbound_Bereich".A01_UC074.BereichErr
      =      Sorter_MB4503.Dyn.Sk.Bereich_ok

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

// Sonderbetriebsarten Weichen:
      CLR
      =      Weiche_EP1.Dyn.Status.Weichentest_aktiv
      =      Weiche_EP2.Dyn.Status.Weichentest_aktiv
      =      Weiche_EP3.Dyn.Status.Weichentest_aktiv
      =      Weiche_EP4.Dyn.Status.Weichentest_aktiv

      A      Sync_BG4527.Dyn.Status.TeachModus_Aktiv
      =      Weiche_EP1.Dyn.Status.TeachModus_aktiv
      =      Weiche_EP2.Dyn.Status.TeachModus_aktiv
      =      Weiche_EP3.Dyn.Status.TeachModus_aktiv
      =      Weiche_EP4.Dyn.Status.TeachModus_aktiv

      CLR
      =      Sorter_MB4503.Dyn.Error.Korrektur_Modus_aktiv

      L      3474                                            // DLSeps
      T      "MW174"
      L      3478                                            // 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      "MB4503"
      CU     "Z102"

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

      SET
      R      "Z102"

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

// Nächste Weiche suchen:
      L      Sorter_MB4503.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_MB4503.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_MB4503.Separator.Default_Ziel

En03: NOP 0


--- NW 3: Störung aktiv? ---
CALL FC "Err_vorhanden" (Check_DB:=708, Anfangs_DW:=DINT#154, Ende_DW:=DINT#162, 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      "BG4527"                                        // Verlassen-Sensor
      L      S5T#250MS
      OffDelay "T340"


--- NW 4: Störung quittieren UZ7402 ---
      A      "DOutbound_Bereich".A01_UZ7402.StOk_aktiv
      =      ErrQuit


--- NW 5: Sorter-GesamtReset ---
// Sorter-Reset starten:
      A      "DEP_OmniFahren".Schleuse_4503.Dyn.Status.Reset_aktiv // Bei Schleusen-Reset -> Sorter mit resetten!
      S      "DEP_Sorter".Sorter_MB4503.Dyn.GesamtSorterReset


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

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

      A      "T340"
      =      Sorter_MB4503.B_AusSep                          // Entprellung Verlassen-Sensor

// Triggern / Scanner-Auswertung über EP_Omnifahren (FC3128/3)
// Ziel über Default-Ziel (EP_Ziel_FC, FC3181)

CALL FB "None" ,  (Separator_Nr:=4503, ErrQuit:=ErrQuit, B_VorSep:=?, B_ImSep:="BG4503", B_AusSep:=?, B_Beladen_im_Sep:=?, B_Pinsensor:="BG4526", B_Beladen_nach_Sep:=?, Start_Ok:=Start_Ok, Antrieb_aktiv:="MA0325", Antrieb_plus_aktiv:="MA0325", Y_Sep_Auf:="DEP_Zylinder".Sorter_4503.Stat.Ast, K_Sanner_triggern:=?, Sorter_Reset:=SorterReset, Error:=DB708.DBW150, Antrieb_start:="DVPtoEP_Antriebe".MA0325.Stat.A_vor, Antrieb_plus_start:=?, Antrieb_stoppen:="DVPtoEP_Antriebe".MA0325.Stat.Stop_vor, hStOk:=ErrAnz)

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


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

      A      Sorter_MB4503.Dyn.GesamtSorterReset_aktiv
      =      Weiche_EP1.Dyn.Ohne_VerklemmKontrolle
      =      Weiche_EP2.Dyn.Ohne_VerklemmKontrolle
      =      Weiche_EP3.Dyn.Ohne_VerklemmKontrolle
      =      Weiche_EP4.Dyn.Ohne_VerklemmKontrolle

// Diesen Sorterbereich zurücksetzen:
      A      SorterReset                                     // Ein Zyklus
      S      Sync_BG4527.Dyn.Reset
      S      Weiche_EP1.Dyn.Status.Reset
      S      Weiche_EP2.Dyn.Status.Reset
      S      Weiche_EP3.Dyn.Status.Reset
      S      Weiche_EP4.Dyn.Status.Reset


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

      A(
      O      "7_HMI_Err_UH07_OB".Impulsgeber_4526.Kein_Signal
      O      "7_HMI_Err_UH07_OB".Impulsgeber_4526.Signal_zu_lang
      )
      AN     ErrQuit
      S      "DVPtoEP_Antriebe".MA0325.Stat.Stop_vor

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


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

      A      "MA0325"
      L      S5T#500ms
      OffDelay "T343"
      A      "T343"
      AN     Sync_BG4527.Dyn.Status.TeachModus_Aktiv         // sonst Probleme bei Doppelimpuls
      O
      A      "MA0325"
      A      Sync_BG4527.Dyn.Status.TeachModus_Aktiv         // sonst Probleme bei Doppelimpuls
      =      Antrieb

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

      A      "BG4527"
      L      s5t#500ms                                       // Da trotz Entprellung Doppel-Impulse
      OffDelay "T344"
      A      "T344"
      =      Sync_BG4527.B_BT_da

CALL FB "None" ,  (Sync_Nr:=4527, ErrQuit:=ErrQuit, B_BT_da:=?, B_RefPunkt:=?, B_TeachPunk:="BG4504", Antrieb_aktiv:=Antrieb, Error:=DB708.DBW152, Antrieb_start:="DVPtoEP_Antriebe".MA0325.Stat.A_start, hStOk:=ErrAnz)   // Teach-Sensor

      A      Sync_BG4527.Dyn.Error.Inkrementalgeber
      S      "DVPtoEP_Antriebe".MA0325.Stat.Stop_vor

// Keine Hauptstrangdaten vorhanden ?:
      L      "EP_HS_oF".Datensortkopf.AnzahlEintraege
      L      "EP_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      "MB4503"                                        // Neuer Sort-Trolley kommt
      O      "BG4527"
      L      s5t#20s
      OffDelay "T341"

      A      "T341"                                          // Alle Sort-Trolleys sind ins Puffer ausgefahren
      S      "DVPtoEP_Antriebe".MA0325.Stat.A_vor


--- NW 10: Weiche 4504 / EntnahmePuffer EP1 ---
CALL FB "None" ,  (Weichen_Nr:=1, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:=0, B_Gerade:=?, B_Ausfahrt:="BG4504", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DEP_Zylinder".Weiche_EP1.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW154, Antrieb_start:="DVPtoEP_Antriebe".MA0325.Stat.A_start, Antrieb_stoppen:="DVPtoEP_Antriebe".MA0325.Stat.Stop_vor, hStOk:=ErrAnz)   // "DEP_Sensoren".Stau_EP1.Stat.B_Akt


--- NW 11: Weiche 4505 / EntnahmePuffer EP2 ---
CALL FB "None" ,  (Weichen_Nr:=2, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:=0, B_Gerade:=?, B_Ausfahrt:="BG4505", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DEP_Zylinder".Weiche_EP2.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW156, Antrieb_start:="DVPtoEP_Antriebe".MA0325.Stat.A_start, Antrieb_stoppen:="DVPtoEP_Antriebe".MA0325.Stat.Stop_vor, hStOk:=ErrAnz)   // "DEP_Sensoren".Stau_EP2.Stat.B_Akt


--- NW 12: Weiche 4506 / EntnahmePuffer EP3 ---
CALL FB "None" ,  (Weichen_Nr:=3, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:=0, B_Gerade:=?, B_Ausfahrt:="BG4506", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DEP_Zylinder".Weiche_EP3.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW158, Antrieb_start:="DVPtoEP_Antriebe".MA0325.Stat.A_start, Antrieb_stoppen:="DVPtoEP_Antriebe".MA0325.Stat.Stop_vor, hStOk:=ErrAnz)   // "DEP_Sensoren".Stau_EP3.Stat.B_Akt


--- NW 13: Pseudo-Weiche / EntnahmePuffer EP4 ---
CALL FB "None" ,  (Weichen_Nr:=4, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:=0, B_Gerade:=?, B_Ausfahrt:="BG4507", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DEP_Zylinder".Weiche_EP4.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW160, Antrieb_start:="DVPtoEP_Antriebe".MA0325.Stat.A_start, Antrieb_stoppen:="DVPtoEP_Antriebe".MA0325.Stat.Stop_vor, hStOk:=ErrAnz)   // "DEP_Sensoren".Stau_EP4.Stat.B_Akt


--- NW 14: Störungen anzeigen UZ7102/7103 ---
      A      ErrAnz
      S      "DOutbound_Bereich".A01_UZ7102.StOk_blinken
      S      "DOutbound_Bereich".A01_UZ7103.StOk_blinken


--- NW 15: Ende ---
      BE

