FUNCTION_BLOCK "MAusfahrPrio_ABP"
TITLE = Prio beim Ausfahren aus ABP
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      BG_Haupt_Schleuse : Bool;   // Trolley ist in Schleuse auf Hauptstrecke
      Haupt_Schleuse_geöffnet : Bool;   // Schleuse hat geöffnet
      BG_ABP_Schleuse : Bool;   // Trolley ist in Schleuse von ABP-Einfahrt
      ABP_Schleuse_geöffnet : Bool;   // Schleuse hat geöffnet
      Aktive_ABP : Int;
   END_VAR

   VAR 
      "OUT.Haupt_Schleuse_starten" : Bool;
      "Out.ABP_Schleuse_starten" : Bool;
      Dyn : Struct
         Anzahl_Haupt : Int;
         Wartezeit : Int;
      END_STRUCT;
   END_VAR

   VAR_TEMP 
      Check_ok : Bool;
      Partner : Int;
   END_VAR


BEGIN
NETWORK
TITLE = Haupt-Schleuse ist gestartet
      U #Haupt_Schleuse_geöffnet;
      U #"OUT.Haupt_Schleuse_starten";
      R #"OUT.Haupt_Schleuse_starten";
      SPBN En01;//Negierter Sprung

      L #Dyn.Anzahl_Haupt;
      + 1;
      T #Dyn.Anzahl_Haupt;

      L 8;
      <=I;
      SPB En01;

      T #Dyn.Anzahl_Haupt  ;//Maximum übergeben

En01:      NOP 0;

NETWORK
TITLE = ABP-Schleuse ist gestartet
      U #ABP_Schleuse_geöffnet;
      U #"Out.ABP_Schleuse_starten";
      R #"Out.ABP_Schleuse_starten";
      SPBN En02             ;//Negierter Sprung

      L 0;
      T #Dyn.Anzahl_Haupt;

En02:      NOP 0;

NETWORK
TITLE = Wartezeit, wenn beide Schleusen geschlossen
      UN #Haupt_Schleuse_geöffnet;
      UN #ABP_Schleuse_geöffnet;
      SPB Geschlossen;

      L 0;
      T #Dyn.Wartezeit;

      SET;
      R #Check_ok;

      SPA En03;

Geschlossen:      UN "1s-Impuls";
      SPB En03;

      L #Dyn.Wartezeit;
      + 1;
      T #Dyn.Wartezeit;

      L 5;
      >=I;
      S #Check_ok;
      SPBN En03;//Negierter Sprung

      T #Dyn.Wartezeit;//Zeit einfrieren

En03:      NOP 0;

NETWORK
TITLE = Check, wer dran ist

//Trolley nicht mehr in Schleuse:
      UN #BG_Haupt_Schleuse;
      R #"OUT.Haupt_Schleuse_starten";

      UN #BG_ABP_Schleuse;
      R #"Out.ABP_Schleuse_starten";

//Schon entschieden:
      U #"OUT.Haupt_Schleuse_starten";
      U #BG_Haupt_Schleuse;
      O;
      U #"Out.ABP_Schleuse_starten";
      U #BG_ABP_Schleuse;
      O #Haupt_Schleuse_geöffnet;
      O #ABP_Schleuse_geöffnet;
      BEB;

//Relevante Partner:
      L #Aktive_ABP;
      + -1 ;//sich selbst abziehen
      T #Partner;

      L 0;
      <=I                      ;//Kein weiterer Partner mehr!
      U #BG_ABP_Schleuse;
      S #"Out.ABP_Schleuse_starten";
      BEB;

//Check, wer dran ist:
      L #Dyn.Anzahl_Haupt;//Gefahrene Trolleys
      L #Partner;//Andere Partner, die fahren sollten
      <I;//noch nicht erreicht
      U #BG_Haupt_Schleuse;
      S #"OUT.Haupt_Schleuse_starten";
      BEB;

//Wartezeit vorbei?:
      UN #Check_ok;
      BEB;

      U #BG_ABP_Schleuse;
      S #"Out.ABP_Schleuse_starten";
      BEB;

      U #BG_Haupt_Schleuse;
      S #"OUT.Haupt_Schleuse_starten";

      BEA;
NETWORK
TITLE = Ende
      BE;

END_FUNCTION_BLOCK

