=== OB 1: Cycle Execution  [STL] ===
INTERFACE:
  Temp:
    OB1_EV_CLASS : Byte                                 // Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
    OB1_SCAN_1 : Byte                                   // 1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
    OB1_PRIORITY : Byte                                 // 1 (Priority of 1 is lowest)
    OB1_OB_NUMBR : Byte                                 // 1 (Organization block 1, OB1)
    OB1_RESERVED_1 : Byte                               // Reserved for system
    OB1_RESERVED_2 : Byte                               // Reserved for system
    OB1_PREV_CYCLE : Int                                // Cycle time of previous OB1 scan (milliseconds)
    OB1_MIN_CYCLE : Int                                 // Minimum cycle time of OB1 (milliseconds)
    OB1_MAX_CYCLE : Int                                 // Maximum cycle time of OB1 (milliseconds)
    OB1_DATE_TIME : "OB1-Date+Time"                     // Date and time OB1 started
  Constant:

--- NW 1: Version / Ersteller / letzter Bearbeiter, Datum ---
      L      'H&M'                                           // Projekt H&M in Cheb
      L      'Fort'                                          // Fortna
      L      'na'
      L      'Cheb'                                          // Cheb
      L      500592                                          // 500592
      L      'UH07'                                          // Outbound UH07
      L      'IBAE'                                          // Version

      L      'IBAE'                                          // Ersteller

      L      'IBAE'                                          // Letzter Bearbeiter
      L      '1106'                                          // Letzte Bearbeitung (Tag/Monat)
      L      '2026'                                          // Letzte Bearbeitung (Jahr)
      L      'Ja'                                            // Beim Kunden eingespielt
      L      'Ja'                                            // Internes EPROM


--- NW 2: Performance-Test ---
// Aktivieren:
      SET
      =      "FB_PerfTest_7_OB_Einfahrt".xTestActive
      =      "FB_PerfTest_7_VP_Sorter_Sync".xTestActive
      =      "FB_PerfTest_7_VP_Ausfahrt".xTestActive
      =      "FB_PerfTest_7_VP_Rück".xTestActive
      =      "FB_PerfTest_7_EP_Einfahrt".xTestActive
      =      "FB_PerfTest_7_EP_Ausfahrt".xTestActive
      =      "FB_PerfTest_7_LP_Einfahrt".xTestActive
      =      "FB_PerfTest_7_LT_Beladung".xTestActive
      =      "FB_PerfTest_7_VP_Rück".xTestActive

// Resetten:
      CLR
      =      "FB_PerfTest_7_OB_Einfahrt".xInReset
      =      "FB_PerfTest_7_VP_Sorter_Sync".xInReset
      =      "FB_PerfTest_7_VP_Ausfahrt".xInReset
      =      "FB_PerfTest_7_VP_Rück".xInReset
      =      "FB_PerfTest_7_EP_Einfahrt".xInReset
      =      "FB_PerfTest_7_EP_Ausfahrt".xInReset
      =      "FB_PerfTest_7_LP_Einfahrt".xInReset
      =      "FB_PerfTest_7_LT_Beladung".xInReset

// OB Einfahrt:
CALL FB "FB_PerfTest" ,  (nInSepNo:=3143, xInSepFlag:="MB3143", xInReset:=?, tInTimeMeasurement:=?, nInGoalFlags:=?)

// VP-Sorter-Sync:
CALL FB "FB_PerfTest" ,  (nInSepNo:=3120, xInSepFlag:="BG3120", xInReset:=?, tInTimeMeasurement:=?, nInGoalFlags:=?)

// VP_Ausfahrt:
CALL FB "FB_PerfTest" ,  (nInSepNo:=3244, xInSepFlag:="MB3244", xInReset:=?, tInTimeMeasurement:=?, nInGoalFlags:=?)

// VP_Rückschleßstrecke:
CALL FB "FB_PerfTest" ,  (nInSepNo:=3133, xInSepFlag:="MB3123", xInReset:=?, tInTimeMeasurement:=?, nInGoalFlags:=?)

// EP Einfahrt:
CALL FB "FB_PerfTest" ,  (nInSepNo:=4503, xInSepFlag:="MB4503", xInReset:=?, tInTimeMeasurement:=?, nInGoalFlags:=?)

// EP Ausfahrt:
CALL FB "FB_PerfTest" ,  (nInSepNo:=4512, xInSepFlag:="MB4512", xInReset:=?, tInTimeMeasurement:=?, nInGoalFlags:=?)

// LP Einfahrt:
CALL FB "FB_PerfTest" ,  (nInSepNo:=3305, xInSepFlag:="MB3305", xInReset:=?, tInTimeMeasurement:=?, nInGoalFlags:=?)

// Leer-Trolley-Beladung:
CALL FB "FB_PerfTest" ,  (nInSepNo:=3323, xInSepFlag:="MB3323", xInReset:=?, tInTimeMeasurement:=?, nInGoalFlags:=?)



--- NW 3: Zum Suchen ---
      SET
// /      R     "SF0000"             ///Damit Anlage aus!
      A      "MB4522"
      A      "PF0237"
      A      "7_HMI_Err_UH07_OB".Logistik.Kein_Platz_im_VollLager
      A      "PF0046"

      A      "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3

      A      "7_HMI_Err_UH07_OB".RFID_Gate.Gate_ByPAss
      A      "7_HMI_Err_UH07_OB".Auslagerbereich_LeerPuffer."TrolleyStau BGXY"

      A      "BG4201"


      CLR


--- NW 4: Neustart ? ---
      A      "SGes".Neustart
      L      s5t#30s
      OnDelay "T0"
      A      "T0"
      A      "SF0000"                                        // Also haben Eingänge Verbindung
      R      "SGes".Neustart

      A      "SGes".Neustart
      =      "7_HMI_Err_UH07_OB".System.Bus_Anlauf
      BEC

      A      "M900.7"
      R      "DOutbound_Bereich".A01_UH07.Not_Aus.UH07
      R      "DOutbound_Bereich".A01_UH07.Not_Aus.UC071
      R      "DOutbound_Bereich".A01_UH07.Not_Aus.UC073
      R      "DOutbound_Bereich".A01_UH07.Not_Aus.UZ0701
      R      "DOutbound_Bereich".A01_UH07.Not_Aus.UZ0702
      R      "DOutbound_Bereich".A01_UH07.Not_Aus.UZ0703
      R      "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7101
      R      "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7102
      R      "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7103
      R      "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7104
      R      "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7105
      R      "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7106
      R      "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7107
      R      "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7301
      R      "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7302
      R      "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7303
      R      "DOutbound_Bereich".A01_UC072.Not_Aus.UC072
      R      "DOutbound_Bereich".A01_UC072.Not_Aus.UZ7201
      R      "DOutbound_Bereich".A01_UC072.Not_Aus.UZ7202
      R      "DOutbound_Bereich".A01_UC074.Not_Aus.UC074
      R      "DOutbound_Bereich".A01_UC074.Not_Aus.UZ7401
      R      "DOutbound_Bereich".A01_UC074.Not_Aus.UZ7402


--- NW 5: Simulation / Anlage blockieren ---
// SET: Anlage kann nicht eingeschaltet werden
// CLR: Anlage Normalbetrieb
      CLR
      R      "SF0000"

// Ohne PC fahren
      SET
      S      "SGes".Ohne_PC_Fahren

// Simulation ohne Hardware
      SET
      R      "SGes".Simulation_ohne_HW_aktiv

// Ohne andere Not-Aus-Bereiche:
      SET
      S      "DSchnittstelle_zu_Safety".ToSafety.Ohne_Partner

// Start nach Störung am UH07:
      A      "M900.7"
      R      "M900.7"
      S      "SF0002"                                        // UH07
      S      "SF0117"                                        // UC071
      S      "SF0177"                                        // UC072
      S      "SF0237"                                        // UC073
      S      "SF0297"                                        // UC074

// Feuer-/BST-Zeug:
      A      "DI0033"                                        // Meldezentrale (Halle4)
      A      "DI0034"                                        // Meldezentrale (Halle3)
      A      "DI0035"                                        // BST 1
      A      "DI0036"
      A      "DI0037"
      A      "DI0170"                                        // BST 2
      A      "DI0171"
      A      "DI0172"
      CLR

// SI:
      A      "DI0223"
      A      "DI0283"
      SET
      =      "DI0223"
      =      "DI0283"


--- NW 6: Eingang ansteuern ---
CALL FC "Set_Input" (Enable:="M2000.1", Status:="M2000.0", InByte:="MD2002", InBit:="MW2006")

      A      "SF0002"                                        // UH07
//       S     "SF0117" //sollen nur von ihren Unterverteilern quittiert werden können
//       S     "SF0177"
//       S     "SF0237"
//       S     "SF0297"
      S      "SF0041"
      S      "SF0043"
      S      "SF0045"

      A      "SF0117"                                        // UC071
      S      "SF0121"
      S      "SF0123"
      S      "SF0125"
      S      "SF0127"
      S      "SF0131"
      S      "SF0133"
      S      "SF0135"

      A      "SF0177"                                        // UC072
      S      "SF0181"
      S      "SF0183"

      A      "SF0237"                                        // UC073
      S      "SF0241"
      S      "SF0243"
      S      "SF0245"

      A      "SF0297"                                        // UC074
      S      "SF0301"
      S      "SF0303"
      S      "SF0305"


--- NW 7: Daten von Host empfangen ---
CALL FB "Daten_von_Host_empfangen" , 


--- NW 8: Daten von UH06/AMR holen ---
      A      "INTERFACE_FROM_UH06_Byte2.x0"
      =      "DSchnittstelle_zu_AMR".From_UH06.MA0200_A_vor
      A      "INTERFACE_FROM_UH06_Byte2.x1"
      =      "DSchnittstelle_zu_AMR".From_UH06.MA0200_A_start
      A      "INTERFACE_FROM_UH06_Byte2.x2"
      =      "DSchnittstelle_zu_AMR".From_UH06.MA0203_kein_Stau
      A      "INTERFACE_FROM_UH06_Byte2.x3"
      =      "DSchnittstelle_zu_AMR".From_UH06.MA0203_aktiv


--- NW 9: 100ms Impuls Takt erzeugen / Taktanzahl übergeben ---
      A      "M35.0"                                         // von OB35 (100ms Zeitinterrupt)
      R      "M35.0"
      =      "100ms-Impuls"                                  // nur als Impuls
      L      "MW36"                                          // Anzahl der 100ms-Takte
      T      "MW2"                                           // übernehmen

      L      0
      T      "MW36"                                          // Takte neu aufaddieren

      L      "MW38"                                          // Anzahl der 10ms-Takte
      T      "MW4"                                           // übernehmen

      L      0
      T      "MW38"                                          // Takte neu aufaddieren

// Old-Takt erzeugen:
      L      "Clock_Byte"
      T      "Old_Takt"

      A      "1s-Takt"
      Rise   "Fp-1s-Impuls"
      =      "1s-Impuls"                                     // 1s-Impuls

      AN     "10s-Impuls"
      L      S5T#10S
      OnDelay "T10"
      A      "T10"
      =      "10s-Impuls"


--- NW 10: Systemzeit übergeben ---
      L      OB1_DATE_TIME.Jahr
      T      "SGes".DATE_TIME.Jahr

      L      OB1_DATE_TIME.Monat
      T      "SGes".DATE_TIME.Monat

      L      OB1_DATE_TIME.Tag
      T      "SGes".DATE_TIME.Tag

      L      OB1_DATE_TIME.Stunde
      BTI                                                    // Wandeln in
      +      2                                               // CPU-Systemzeit ist 1h zu wenig (keine Ahnung warum)
      ITB
      T      "SGes".DATE_TIME.Stunde

      L      OB1_DATE_TIME.Minute
      T      "SGes".DATE_TIME.Minute

      L      OB1_DATE_TIME.Sekunde
      T      "SGes".DATE_TIME.Sekunde


--- NW 11: System ---
CALL FB "OutBound_Bereich" , 


--- NW 12: Kamera-Leser ---
CALL FB "FB_BarcodeReader" , 

CALL FB "FB_CommunicationWCSBL" ,  (fbInOutSendFIFO:="DB_LGF_FIFO_CommWCSBL", arFifoSendBuffer:="DB_Buffer_CommunicationWCSBL".BUFFER)

CALL FB "FB_CommunicationLogger" ,  (fbInOutSendFIFO:="DB_LGF_FIFO_CommLogger", arFifoSendBuffer:="DB_Buffer_CommunicationLogger".BUFFER)




--- NW 13: 0_Highway > Vollpuffer ---
CALL FC "HWtoOB_Bereich"


--- NW 14: 1_Vollpuffer ---
CALL FC "VP_Bereich"


--- NW 15: 2_Vollpuffer > Entnahmepuffer ---
CALL FC "VPtoEP_Bereich"


--- NW 16: 3_Entnahmepuffer ---
CALL FC "EP_Bereich"


--- NW 17: 4_ Entnahmepuffer > Leerpuffer ---
CALL FC "EPtoLP_Bereich"


--- NW 18: 5_Leerpuffer ---
      L      "DLLeerPuffer_ausfahren".Datenlistenkopf.AnzahlEintraege
      L      4                                               // Falls mehr oder gleich Puffer zum Ausfahren, dann kein Saugmodus
      T      "DLeerPufferStrecken".SaugModus.Ok_Anzahl

      L      "DLLeerPuffer_leer".Datenlistenkopf.AnzahlEintraege
      L      1                                               // Falls mehr oder gleich Leerpuffer, dann kein Durchfahrmodus
      T      "DLeerPufferStrecken".DurchfahrModus.Ok_Anzahl

CALL FC "LP_Bereich"


--- NW 19: 6_Leerpuffer > Highway ---
CALL FC "LPtoHW_Bereich"


--- NW 20: Visu-Zeug ---
CALL FB "Visu_Sorter_Rein" , 

CALL FB "Visu_Weiche_Sorter" , 

CALL FB "Visu_StartSync_Visu" , 

CALL FB "Visu_HMOmniSchleuse" , 

CALL FB "Visu_HMOmniSchleuse_Plus" , 

CALL FB "Visu_HMOmniBereich_Plus" , 

CALL FB "Visu_HMOmniWeiche_Plus" , 

CALL FB "Visu_HMVollPuffer" , 

CALL FB "Visu_HMLeerPuffer" , 

CALL FB "Visu_CheckTrolley" , 


--- NW 21: Lampentest ---
CALL FC "LTest"


--- NW 22: Ausgang ansteuern ---
      A      "Clock_0.5Hz"
      =      "M1000.0"

CALL FC "Set_Output" (Enable:="M1000.1", Status:="M1000.0", OutByte:="MD1002", OutBit:="MW1006")


--- NW 23: Daten an UH06/AMR senden ---
      A      "DSchnittstelle_zu_AMR".To_UH06.MA0203_A_vor
      =      "INTERFACE_TO_UH06_Byte1.x0"
      A      "DSchnittstelle_zu_AMR".To_UH06.MA0203_A_start
      =      "INTERFACE_TO_UH06_Byte1.x1"
      A      "DSchnittstelle_zu_AMR".To_UH06.MA0200_kein_Stau
      =      "INTERFACE_TO_UH06_Byte1.x2"
      A      "DSchnittstelle_zu_AMR".To_UH06.MA0200_aktiv
      =      "INTERFACE_TO_UH06_Byte1.x3"
      A      "DSchnittstelle_zu_AMR".To_UH06.BG3724_aktiv
      =      "INTERFACE_TO_UH06_Byte1.x4"


--- NW 24: Daten an Host senden ---
CALL FB "Daten_Host_senden" , 


--- NW 25: Ende ---
      BE


--- NW 26: Daten in SendFifo schreiben ---
      A      "M83.1"
      R      "M83.1"
      JCN    nix

CALL FB "Daten_in_SendFIFO_speichern" ,  (TelegrammKennung[1]:='B', TelegrammKennung[2]:='2', TelegrammKennung[3]:='C', TelegrammKennung[4]:='D', TelegrammKennung[5]:='E', TelegrammKennung[6]:='F', TelegrammKennung[7]:='G', TelegrammKennung[8]:='I', TelegrammKennung[9]:='J', TelegrammKennung[10]:='K', TrolleyID:=DINT#4711, StationsNr:=13, Puffer_LinienNr:=7, StoreGroup:=DINT#0815, Status_1_Int:=83, Status_2_Bit[0]:=1, Status_2_Bit[1]:=0, Status_2_Bit[2]:=1, Status_2_Bit[3]:=0, Status_2_Bit[4]:=1, Status_2_Bit[5]:=0, Status_2_Bit[6]:=1, Status_2_Bit[7]:=1, Reserve[1]_Int:=62, Reserve[2]_Int:=63, Port:=2, Ret_Val_FIFO_IN:="MB199", Error:="M83.0")

nix:  NOP 0


--- NW 27: Test mit DL1000 ---
      L      "DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse

      A      "M83.0"
      R      "M83.0"
      JCN    more

CALL FC "Trolleydaten_löschen" (Gesamt_Trolley_DL:=1000, TrolleyID:="DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse)

more: A      "M83.1"
      R      "M83.1"
      JCN    ready

CALL FC "Trolleydaten_neu_anlegen" (Gesamt_Trolley_DL:=1000, TrolleyID:="DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse, Endziel:=16#B000, ShopGroup:=DINT#-1)

CALL FC "Trolley_DL_Neue_Pos" (Gesamt_Trolley_DL:=1000, TrolleyID:="DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse, Position:=16#3323, ShopGroup:=-1, Err:="M199.0")


ready: NOP 0


      BEU


--- NW 28: Eingang ansteuern ---
CALL FC "Set_Input" (Enable:="M2000.1", Status:="M2000.0", InByte:="MD2002", InBit:="MW2006")


--- NW 29: Ausgang ansteuern ---
      A      "Clock_1Hz"
      =      "M1000.0"

CALL FC "Set_Output" (Enable:="M1000.1", Status:="M1000.0", OutByte:="MD1002", OutBit:="MW1006")


--- NW 30: Teachen Sorter LP ---
// Nach Teach-Ergebnis anhalten !:
      L      "DLP_Sorter".Sync_BG3306.Abstands_Ink
      L      DINT#0
      <>D
      A      "DLP_Sorter".Sync_BG3306.Dyn.Status.TeachModus_Aktiv
      A      "DLP_Sorter".Sync_BG3306.Dyn.Status.MoreTeach
      A      "M900.0"
      R      "M900.0"

      A      "M900.0"
      AN     "DLP_Sorter".Sync_BG3306.Dyn.Error.Keine_TeachPktdaten
      =      "MB3305"
      =      "MA0064"                                        // Zusätzlich im Lastbaustein EP>LP_Antriebe, da Aufruf vor Sorter-FB


--- NW 31: Teachen Sorter EP ---
// Nach Teach-Ergebnis anhalten !:
      L      "DEP_Sorter".Sync_BG4527.Abstands_Ink
      L      DINT#0
      <>D
      A      "DEP_Sorter".Sync_BG4527.Dyn.Status.TeachModus_Aktiv
      A      "DEP_Sorter".Sync_BG4527.Dyn.Status.MoreTeach
      A      "M902.0"
      R      "M902.0"

      A      "M902.0"
      AN     "DEP_Sorter".Sync_BG4527.Dyn.Error.Keine_TeachPktdaten
      =      "MB4503"
      =      "MA0325"                                        // Zusätzlich im Lastbaustein VP>EP_Antriebe, da Aufruf vor Sorter-FB


--- NW 32: Teachen Sorter VP A ---
// Nach Teach-Ergebnis anhalten !:
      L      "DVP_Sorter_A".Sync_BG3120.Abstands_Ink
      L      DINT#0
      <>D
      A      "DVP_Sorter_A".Sync_BG3120.Dyn.Status.TeachModus_Aktiv
      A      "DVP_Sorter_A".Sync_BG3120.Dyn.Status.MoreTeach
      A      "M901.1"
      R      "M901.1"

      A      "M901.1"
      AN     "DVP_Sorter_A".Sync_BG3120.Dyn.Error.Keine_TeachPktdaten
      =      "MB3121"
      =      "MA0144"
      =      "MA0145"
      =      "MA0152"


--- NW 33: Teachen Sorter VP B ---
// Nach Teach-Ergebnis anhalten !:
      L      "DVP_Sorter_B".Sync_BG3003.Abstands_Ink
      L      DINT#0
      <>D
      A      "DVP_Sorter_B".Sync_BG3003.Dyn.Status.TeachModus_Aktiv
      A      "DVP_Sorter_B".Sync_BG3003.Dyn.Status.MoreTeach
      A      "M901.2"
      R      "M901.2"

      A      "M901.2"
      AN     "DVP_Sorter_B".Sync_BG3003.Dyn.Error.Keine_TeachPktdaten
      =      "MA0146"
      =      "MA0145"

