FUNCTION_BLOCK "PS3_OmniFahren"
TITLE = Pick-Station 3
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
   VAR 
      Schleuse_vor_Einfahrt { S7_SetPoint := 'False'} : "MHMOmniSchleuse";
      Weiche_Einfahrt { S7_SetPoint := 'False'} : "MHMOmniWeiche";
      Schleuse_Vorstau { S7_SetPoint := 'False'} : "MHMOmniSchleuse";
      Sks_Arbeitsplatz { S7_SetPoint := 'False'} : "MHM_Arbeitsplatz";
      Schleuse_Platz_1 { S7_SetPoint := 'False'} : "MHMOmniSchleuse";
      Schleuse_Platz_2 { S7_SetPoint := 'False'} : "MHMOmniSchleuse";
      Schleuse_Platz_3 { S7_SetPoint := 'False'} : "MHMOmniSchleuse";
      Schleuse_Ausfahrt : "MHMOmniSchleuse";
      Schleuse_vor_Ausfahrt { S7_SetPoint := 'False'} : "MHMOmniSchleuse";
      Prio_Ausfahrt { S7_SetPoint := 'False'} : "MAusfahrPrio_ABP";
      Vorfahrt_Ausfahrweiche : Struct
         "Weiche_von_Haupt-Sep_belegt" : Bool;
         "Weiche_von_Ausfahr-Sep_belegt" : Bool;
         Haupstrecke_gefahren : Int;
         AMR_gefahren : Int;
      END_STRUCT;
   END_VAR

   VAR_TEMP 
      ErrQuit : Bool;
      ErrAnz : Bool;
      Stau_raus : Bool;
      Start_ok : Bool;
      B_aktiv : Bool;
      B_AusSchleuse : Bool;
      Antrieb_aktiv : Bool;
      Antrieb_vor : Bool;
      Antrieb_start : Bool;
      Antrieb_PS : Bool;
      Antrieb_stop : Bool;
      Fahren_Ok : Bool;
   END_VAR


BEGIN
NETWORK
TITLE = Systemzeug

//PS3-Bereich:
      U "DAMR_Bereich".A01_UH06.AnlageEin;
      = #Schleuse_vor_Einfahrt.Dyn.Sk.Auto_akt;
      = #Weiche_Einfahrt.Dyn.Status.Auto_akt;
      = #Sks_Arbeitsplatz.Dyn.Sk_zum_Beladeplatz.Auto_akt;
      = #Schleuse_Vorstau.Dyn.Sk.Auto_akt;
      = #Schleuse_Platz_1.Dyn.Sk.Auto_akt;
      = #Schleuse_Platz_2.Dyn.Sk.Auto_akt;
      = #Schleuse_Platz_3.Dyn.Sk.Auto_akt;
      = #Sks_Arbeitsplatz.Dyn.Sk_aus_Beladeplatz.Auto_akt;
      = #Schleuse_Ausfahrt.Dyn.Sk.Auto_akt;
      = #Schleuse_vor_Ausfahrt.Dyn.Sk.Auto_akt;

      UN "DAMR_Bereich".A01_UH06.BereichErr;
      = #Schleuse_vor_Einfahrt.Dyn.Sk.Bereich_ok;
      = #Weiche_Einfahrt.Dyn.Status.Bereich_ok;
      = #Sks_Arbeitsplatz.Dyn.Sk_zum_Beladeplatz.Bereich_ok;
      = #Schleuse_Vorstau.Dyn.Sk.Bereich_ok;
      = #Schleuse_Platz_1.Dyn.Sk.Bereich_ok;
      = #Schleuse_Platz_2.Dyn.Sk.Bereich_ok;
      = #Schleuse_Platz_3.Dyn.Sk.Bereich_ok;
      = #Sks_Arbeitsplatz.Dyn.Sk_aus_Beladeplatz.Bereich_ok;
      = #Schleuse_Ausfahrt.Dyn.Sk.Bereich_ok;
      = #Schleuse_vor_Ausfahrt.Dyn.Sk.Bereich_ok;

NETWORK
TITLE = Störungen quittieren
      U "DAMR_Bereich".A01_UZ0613.StOk_aktiv;
      = #ErrQuit;
      S "DArbeitsplätze_Antriebe"."MA _Einfahrt_PS3".Stat.A_start;
      S "DArbeitsplätze_Antriebe"."MA _Nachstau1_PS3".Stat.A_start;
      S "DArbeitsplätze_Antriebe"."MA _Nachstau2_PS3".Stat.A_start;
      S "DArbeitsplätze_Antriebe"."MA _Ausfahrt_PS3".Stat.A_start;
      S "DArbeitsplätze_Antriebe".MA0082.Stat.A_start;
      S "DArbeitsplätze_Antriebe".MA0087.Stat.A_start;


NETWORK
TITLE = Schleuse vor Einfahrt
      CALL #Schleuse_vor_Einfahrt
      (  Schleusen_Nr                := 3293 , 
         ErrQuit                     := #ErrQuit , 
         B_VorSchleuse               := "BG3270" , 
         B_InSchleuse                := "BG3293" , 
         B_AusSchleuse               :=  , //Über Weiche_Einfahrt
         B_Stau_raus                 :=  , //Über Weiche_Einfahrt
         Start_Ok                    := 1 , 
         Antrieb_Schleuse_aktiv      := "MA0082" , 
         Antrieb_plus_aktiv          := 1 , //Über Weiche_Einfahrt
         Schleuse_geöffnet           := "MB3293" , 
         Y_Schleuse_Auf              := "DArbeitsplätze_Zylinder".Schleuse_Vor_Einfahrt_PS3.Stat.Ast , 
         Error                       := %DB608.DBW246 , 
         Antrieb_Schleuse_vor        := "DArbeitsplätze_Antriebe".MA0082.Stat.A_vor , 
         Antrieb_Schleuse_start      := "DArbeitsplätze_Antriebe".MA0082.Stat.A_start , 
         Antrieb_Schleuse_stop       := "DArbeitsplätze_Antriebe".MA0082.Stat.Stop_vor , 
         Antrieb_Schleuse_PS         := "DArbeitsplätze_Antriebe".MA0082.Stat.A_PS , 
         hStOk                       := #ErrAnz
      );

//Ausfahr-Weiche zurückschalten:
      U "MB3293";
      R "DArbeitsplätze_Zylinder".Weiche_Ausfahrt_PS4.Stat.Ast;

//Ausfahr-Weiche wieder freigeben:
      U #Schleuse_vor_Einfahrt.Dyn.Status.Trolley_draussen;
      R "DPS4_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Haupt-Sep_belegt";

NETWORK
TITLE = Weiche Einfahrt
      CALL #Weiche_Einfahrt
      (  Weichen_Nr                  := 3302 , 
         ErrQuit                     := #ErrQuit , 
         Fahren_Ok                   := 1 , 
         B_Ziel_gerade               := "DArbeitsplätze_Sensoren".Stau_nach_Ausfahrt_PS4.Stat.B_Akt , 
         B_Ziel_abzweig              := "DArbeitsplätze_Sensoren".Stau_Einfahrt_PS3.Stat.B_Akt , 
         Antrieb_Weiche_aktiv        := "MA0082" , 
         Antrieb_Gerade_aktiv        := "MA0082" , 
         Antrieb_Abzweig_aktiv       := "MA0076" , 
         Weiche_ist_AST              := "MB3302" , 
         Y_Weiche_abzweig            := "DArbeitsplätze_Zylinder".Weiche_Einfahrt_PS3.Stat.Ast , 
         Error                       := %DB608.DBW248 , 
         Antrieb_Weiche_vor          := "DArbeitsplätze_Antriebe".MA0082.Stat.A_vor , 
         Antrieb_Weiche_stop         := "DArbeitsplätze_Antriebe".MA0082.Stat.Stop_vor , 
         Antrieb_Weiche_gerade_vor   :=  , //s.o.
         Antrieb_Weiche_gerade_stop  :=  , //s.o.
         Antrieb_Weiche_abzweig_vor  := "DArbeitsplätze_Antriebe"."MA _Einfahrt_PS3".Stat.A_vor , 
         Antrieb_Weiche_abzweig_stop := "DArbeitsplätze_Antriebe"."MA _Einfahrt_PS3".Stat.Stop_vor , 
         hStOk                       := #ErrAnz
      );

NETWORK
TITLE = Schrittketten Arbeitsplätze ver-/entsorgen
      CALL #Sks_Arbeitsplatz
      (  Arbeitsplatz_Nr             := 16#A300 , //XY00: X=A(PS), X=B(MPS), Y= Nummer des Platzes
         ErrQuit                     := #ErrQuit , 
         B_In_Schleuse_Vorstau       := "BG3303" , 
         B_an_Platz_1                := "BG3305" , 
         B_an_Platz_2                := "BG3311" , 
         B_an_Platz_3                := "BG3315" , 
         B_Nachstau_Einfahrt         := "DArbeitsplätze_Sensoren".Stau_Ausfahrt_PS3.Stat.B_Akt , 
         B_Nachstau_Ausfahrt         := "BG3321" , 
         Y_Vorstau                   := "MB3303" , 
         Y_Platz_1                   := "MB3305" , 
         Y_Platz_2                   := "MB3311" , 
         Y_Platz_3                   := "MB3315" , 
         Antrieb_Vorstau_aktiv       := "MA0076" , 
         Antrieb_Nachstau_1_aktiv    := "MA0077" , 
         Antrieb_Nachstau_2_aktiv    := "MA0080" , 
         Antrieb_Nachstau_3_aktiv    := "MA0081" , 
         Y_Weiche_zu_Platz_1         := "DArbeitsplätze_Zylinder".Weiche_zu_Platz1_PS3.Stat.Ast , 
         Y_Weiche_zu_Platz_2         := "DArbeitsplätze_Zylinder".Weiche_zu_Platz2_PS3.Stat.Ast , 
         Y_Weiche_von_Platz_1        := "DArbeitsplätze_Zylinder".Weiche_von_Platz1_PS3.Stat.Ast , 
         Y_Weiche_von_Platz_2        := "DArbeitsplätze_Zylinder".Weiche_von_Platz2_PS3.Stat.Ast , 
         Antrieb_Nachstau_1_vor      := "DArbeitsplätze_Antriebe"."MA _Nachstau1_PS3".Stat.A_vor , 
         Antrieb_Nachstau_2_vor      := "DArbeitsplätze_Antriebe"."MA _Nachstau2_PS3".Stat.A_vor , 
         Trolley_hat_ABS_erreicht    := #Schleuse_Vorstau.B_AusSchleuse , 
         Reset_Vorstau_Schleuse      := #Schleuse_Vorstau.Dyn.Sk.Reset , 
         Reset_Platz_1_Stopper       := #Schleuse_Platz_1.Dyn.Sk.Reset , 
         Reset_Platz_2_Stopper       := #Schleuse_Platz_2.Dyn.Sk.Reset , 
         Reset_Platz_3_Stopper       := #Schleuse_Platz_3.Dyn.Sk.Reset , 
         Error                       := %DB608.DBW104 , 
         Antrieb_Vorstau_vor         := "DArbeitsplätze_Antriebe"."MA _Einfahrt_PS3".Stat.A_vor , 
         Antrieb_Nachstau_3_vor      := "DArbeitsplätze_Antriebe"."MA _Ausfahrt_PS3".Stat.A_vor , 
         hStOk                       := #ErrAnz
      );

//Anzeigen:
      U "DAMR_Bereich".A01_UH06.AnlageEin;
      U #Sks_Arbeitsplatz.Dyn.Status.Arbeitsplatz_aktiviert;
      = "PF0044";

      U #Sks_Arbeitsplatz.Dyn.SS.Externe_Anzeige;
      = "PF3300";

NETWORK
TITLE = Schleuse Vorstau
      CALL #Schleuse_Vorstau
      (  Schleusen_Nr                := 3303 , 
         ErrQuit                     := #ErrQuit , 
         B_VorSchleuse               := "BG3302" , 
         B_InSchleuse                := "BG3303" , 
         Start_Ok                    := 1 , 
         Antrieb_Schleuse_aktiv      := "MA0076" , 
         Antrieb_plus_aktiv          := 1 , 
         Schleuse_geöffnet           := "MB3303" , 
         Y_Schleuse_Auf              := "DArbeitsplätze_Zylinder".Schleuse_Vorstau_PS3.Stat.Ast , 
         Error                       := %DB608.DBW250 , 
         Antrieb_Schleuse_vor        := "DArbeitsplätze_Antriebe"."MA _Einfahrt_PS3".Stat.A_vor , 
         Antrieb_Schleuse_start      := "DArbeitsplätze_Antriebe"."MA _Einfahrt_PS3".Stat.A_start , 
         Antrieb_Schleuse_stop       := "DArbeitsplätze_Antriebe"."MA _Einfahrt_PS3".Stat.Stop_vor , 
         Antrieb_Schleuse_PS         := "DArbeitsplätze_Antriebe"."MA _Einfahrt_PS3".Stat.A_PS , 
         hStOk                       := #ErrAnz
      );

NETWORK
TITLE = Schleuse Platz 1
      CALL #Schleuse_Platz_1
      (  Schleusen_Nr                := 3305 , 
         ErrQuit                     := #ErrQuit , 
         B_InSchleuse                := "BG3305" , 
         Start_Ok                    := 1 , 
         Antrieb_Schleuse_aktiv      := 1 , 
         Antrieb_plus_aktiv          := "MA0077" , 
         Schleuse_geöffnet           := "MB3305" , 
         Y_Schleuse_Auf              := "DArbeitsplätze_Zylinder".Schleuse_Platz1_PS3.Stat.Ast , 
         Error                       := %DB608.DBW252 , 
         Antrieb_plus_vor            := "DArbeitsplätze_Antriebe"."MA _Nachstau1_PS3".Stat.A_vor , 
         hStOk                       := #ErrAnz
      );

      U #Schleuse_Platz_1.Dyn.Status.Trolley_draussen;
      S #Sks_Arbeitsplatz.Dyn.Platz_1.Trolley_hat_Arbeitsplatz_verlassen;
      SPBN P1D;

      L #Schleuse_Platz_1.Dyn.TrolleyID_ausgefahren;
      T #Sks_Arbeitsplatz.Dyn.Platz_1.TrolleyID_ausgefahren;

P1D:      NOP 0;

NETWORK
TITLE = Schleuse Platz 2
      CALL #Schleuse_Platz_2
      (  Schleusen_Nr                := 3311 , 
         ErrQuit                     := #ErrQuit , 
         B_InSchleuse                := "BG3311" , 
         Start_Ok                    := 1 , 
         Antrieb_Schleuse_aktiv      := 1 , 
         Antrieb_plus_aktiv          := "MA0080" , 
         Schleuse_geöffnet           := "MB3311" , 
         Y_Schleuse_Auf              := "DArbeitsplätze_Zylinder".Schleuse_Platz2_PS3.Stat.Ast , 
         Error                       := %DB608.DBW254 , 
         Antrieb_plus_vor            := "DArbeitsplätze_Antriebe"."MA _Nachstau2_PS3".Stat.A_vor , 
         hStOk                       := #ErrAnz
      );

      U #Schleuse_Platz_2.Dyn.Status.Trolley_draussen;
      S #Sks_Arbeitsplatz.Dyn.Platz_2.Trolley_hat_Arbeitsplatz_verlassen;
      SPBN P2D;

      L #Schleuse_Platz_2.Dyn.TrolleyID_ausgefahren;
      T #Sks_Arbeitsplatz.Dyn.Platz_2.TrolleyID_ausgefahren;

P2D:      NOP 0;

NETWORK
TITLE = Schleuse Platz 3
      CALL #Schleuse_Platz_3
      (  Schleusen_Nr                := 3315 , 
         ErrQuit                     := #ErrQuit , 
         B_InSchleuse                := "BG3315" , 
         Start_Ok                    := 1 , 
         Antrieb_Schleuse_aktiv      := 1 , 
         Antrieb_plus_aktiv          := "MA0081" , 
         Schleuse_geöffnet           := "MB3315" , 
         Y_Schleuse_Auf              := "DArbeitsplätze_Zylinder".Schleuse_Platz3_PS3.Stat.Ast , 
         Error                       := %DB608.DBW256 , 
         Antrieb_plus_vor            := "DArbeitsplätze_Antriebe"."MA _Ausfahrt_PS3".Stat.A_vor , 
         hStOk                       := #ErrAnz
      );

      U #Schleuse_Platz_3.Dyn.Status.Trolley_draussen;
      S #Sks_Arbeitsplatz.Dyn.Platz_3.Trolley_hat_Arbeitsplatz_verlassen;
      SPBN P3D;

      L #Schleuse_Platz_3.Dyn.TrolleyID_ausgefahren;
      T #Sks_Arbeitsplatz.Dyn.Platz_3.TrolleyID_ausgefahren;

P3D:      NOP 0;

NETWORK
TITLE = Schleuse Ausfahrt
      CALL #Schleuse_Ausfahrt
      (  Schleusen_Nr                := 3321 , 
         ErrQuit                     := #ErrQuit , 
         B_VorSchleuse               := "BG3320" , 
         B_InSchleuse                := "BG3321" , 
         B_AusSchleuse               := "BG3322" , 
         B_Stau_raus                 := "DArbeitsplätze_Sensoren".Stau_nach_Ausfahrt_PS3.Stat.B_Akt , 
         Start_Ok                    := 1 , 
         Antrieb_Schleuse_aktiv      := "MA0081" , 
         Antrieb_plus_aktiv          := "MA0087" , 
         Schleuse_geöffnet           := "MB3321" , 
         Y_Schleuse_Auf              := "DArbeitsplätze_Zylinder".Schleuse_Ausfahrt_PS3.Stat.Ast , 
         Error                       := %DB608.DBW258 , 
         Antrieb_Schleuse_vor        := "DArbeitsplätze_Antriebe"."MA _Ausfahrt_PS3".Stat.A_vor , 
         Antrieb_Schleuse_start      := "DArbeitsplätze_Antriebe"."MA _Ausfahrt_PS3".Stat.A_start , 
         Antrieb_Schleuse_stop       := "DArbeitsplätze_Antriebe"."MA _Ausfahrt_PS3".Stat.Stop_vor , 
         Antrieb_Schleuse_PS         := "DArbeitsplätze_Antriebe"."MA _Ausfahrt_PS3".Stat.A_PS , 
         Antrieb_plus_vor            := "DArbeitsplätze_Antriebe".MA0087.Stat.A_vor , 
         Antrieb_plus_start          := "DArbeitsplätze_Antriebe".MA0087.Stat.A_start , 
         hStOk                       := #ErrAnz
      );

//Ausfahr-Weiche schalten:
      U "MB3321";
      S "DArbeitsplätze_Zylinder".Weiche_Ausfahrt_PS3.Stat.Ast;

//Ausfahr-Weiche wieder freigeben:
      U #Schleuse_Ausfahrt.Dyn.Status.Trolley_draussen;
      R #Vorfahrt_Ausfahrweiche."Weiche_von_Ausfahr-Sep_belegt";

//Ausfahr-Förderer mit einschalten:
      U "MB3322";//Weiche ist auf Abzweig
      U "BG3322";//Trolley auf Stauklappe
      UN "BG3331";//aber nicht in Schleuse
      S "DArbeitsplätze_Antriebe"."MA _Ausfahrt_PS3".Stat.A_vor;//ABP-Ausfahr-Förderer mit einschalten

NETWORK
TITLE = Schleuse Hauptstrecke vor Ausfahrt

//Antrieb -1 mit einschalten:
      U #Schleuse_vor_Ausfahrt.Dyn.Status.Trolley_fährt_in_Schleuse;
      UN "BG3323";//Ist in Schleuse
      S "DArbeitsplätze_Antriebe".MA0082.Stat.A_vor;

      SET;
      R #Antrieb_vor;//wegen unten IN/OUT und temp
      R #Antrieb_start;
      R #Antrieb_PS;

      CALL #Schleuse_vor_Ausfahrt
      (  Schleusen_Nr                := 3323 , 
         ErrQuit                     := #ErrQuit , 
         B_VorSchleuse               := "BG3294" , 
         B_InSchleuse                := "BG3323" , 
         B_AusSchleuse               := "BG3322" , 
         B_Stau_raus                 := "DArbeitsplätze_Sensoren".Stau_nach_Ausfahrt_PS3.Stat.B_Akt , 
         Start_Ok                    := 1 , 
         Antrieb_Schleuse_aktiv      := "MA0087" , 
         Antrieb_plus_aktiv          := "MA0087" , 
         Schleuse_geöffnet           := "MB3323" , 
         Y_Schleuse_Auf              := "DArbeitsplätze_Zylinder".Schleuse_Vor_Ausfahrt_PS3.Stat.Ast , 
         Error                       := %DB608.DBW260 , 
         Antrieb_Schleuse_vor        := #Antrieb_vor , 
         Antrieb_Schleuse_start      := #Antrieb_start , 
         Antrieb_Schleuse_stop       := "DArbeitsplätze_Antriebe".MA0087.Stat.Stop_vor , 
         Antrieb_Schleuse_PS         := #Antrieb_PS , 
         Antrieb_plus_vor            :=  , //s.o.
         Antrieb_plus_start          :=  , //s.o.
         hStOk                       := #ErrAnz
      );

      U #Antrieb_vor;
      S "DArbeitsplätze_Antriebe".MA0087.Stat.A_vor;
      S "DArbeitsplätze_Antriebe".MA0082.Stat.A_vor;
      U #Antrieb_start;
      S "DArbeitsplätze_Antriebe".MA0087.Stat.A_start;
      S "DArbeitsplätze_Antriebe".MA0082.Stat.A_start;
      U #Antrieb_PS;
      S "DArbeitsplätze_Antriebe".MA0087.Stat.A_PS;
      S "DArbeitsplätze_Antriebe".MA0082.Stat.A_PS;

//Ausfahr-Weiche zurückschalten:
      U "MB3323";
      R "DArbeitsplätze_Zylinder".Weiche_Ausfahrt_PS3.Stat.Ast;

//Ausfahr-Weiche wieder freigeben:
      U #Schleuse_vor_Ausfahrt.Dyn.Status.Trolley_draussen;
      R #Vorfahrt_Ausfahrweiche."Weiche_von_Haupt-Sep_belegt";

NETWORK
TITLE = Ausfahr-Priorität
      CALL #Prio_Ausfahrt
      (  BG_Haupt_Schleuse           := "BG3323" , 
         Haupt_Schleuse_geöffnet     := "MB3323" , 
         BG_ABP_Schleuse             := "BG3321" , 
         ABP_Schleuse_geöffnet       := "MB3321" , 
         Aktive_ABP                  := "DPS5_OmniFahren".Aktivierte_ABPs
      );

NETWORK
TITLE = Störungen anzeigen
      U #ErrAnz;
      R #ErrAnz;
      S "DAMR_Bereich".A01_UZ0613.StOk_blinken;

NETWORK
TITLE = Ende
      BE;

END_FUNCTION_BLOCK

