=== FB 159: Visu_HMLeerPuffer  [STL] ===
INTERFACE:
  Input:
  Output:
  InOut:
  Static:
    LeerPuffer_Visu : "MHMLeerpuffer"                   // Lager-Bereich für Visualisierung
    LeerPuffer_Visu_old : "MHMLeerpuffer"               // COPYRIGHT by Ingenieurbüro A.EmmertOrtsstr.33, D-869925 Fuchstal (Germany)Tel.: 0049(0)8243-960629Version: Omniflow 2100 / 10.2024Schritt 0: Warten auf TrolleySchritt 1: Betriebsart ok/angegeben?Schritt 5: Mit Scanner fahren: Defaultziel ?Schritt 6: Scanner triggernSchritt 7: "DREQ" an PC sendenSchritt 8: Warten auf PC-Antwort   Schritt 9: PC-Antwort auswerten    Schritt 10: Fahrtrichtung ermittelnSchritt 11: Ausfahren ok ?Schritt 12: Warten auf Pin-Signal     Schritt 13: Weichenbereich raus bereit ?  Schritt 14: Daten an Rausweiche übergebenSchritt 15: Lager Mindestzeit öffnen   Schritt 16: Trolley ausgefahren ?    Schritt 17: Trolley ist draussen    Schritt 18: BM wurde vereinzeltSchritt 19: Beladezustand checkenSchritt 20: Schleuse resettenSchritt 21: Reset ist zu Ende
    Empty_Visu : Array[1..250] of Int                   // Bereich für Daten-Löschung
    DL_DB : Int                                         // Datenlisten-DB
    LeerPuffer_Nr_from_PC : Int                         // PC>PLC: Für diesen Lager Daten bereitstellen
    LeerPuffer_Nr_from_PLC : Int                        // PLC>PC: Daten von diesem Lagere aktiv
    LeerPuffer_Nr_from_VAR : Int                        // VAR>PLC: Für diesen Lager Daten bereitstellen
    VAR_old : Int                                       // VAR>PLC: Für diesen Lager Daten bereitstellen
    VAR_Timer : Int                                     // VAR>PLC: Für diesen Lager Daten bereitstellen
    RET_VAL_Datenbank : Byte
    RET_VAL_BLKMOV : Int
    Durchlauf1 : Bool                                   // 1.Durchlauf hat stattgefunden
    Error : Struct
      Datenbank : Bool
      Undef_LeerPuffer : Bool
      BLKMOV : Bool
  Input:
  Output:
  InOut:
  Static:
    Puffer : "UDLHMLeerPuffer"
    Dyn : Struct
      Anzahl_LeerTrolleys : Int                         // AB DW250: Liste der Trolleys im Leerpuffer
  None:
    PufferTrolleyliste_DW : Int := 250
  Input:
  Output:
  InOut:
  Static:
    Puffer : "UDLHMLeerPuffer"
    Dyn : Struct
      Anzahl_LeerTrolleys : Int                         // AB DW250: Liste der Trolleys im Leerpuffer
  None:
    PufferTrolleyliste_DW : Int := 250
  Temp:
    Quelle : Any                                        // Zeiger, wo Quell-Daten sind
    Ziel : Any                                          // Zeiger, wo Ziel-Daten sind
    Lager_DB : Int                                      // Lager-DB
    Lager_DW : Int                                      // Lager-DW
    AR1Zeiger : DWord                                   // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
    AR1Start : DInt                                     // Startwert mit Offset 0
    Lager_Nr_aktiv : Int                                // Intern: Für diesen Lager Daten bereitstellen
  Constant:

--- NW 1: 
 ---
      L      LeerPuffer_Nr_from_VAR                          // Anforderung von Variablentabelle ?
      L      0
      >I                                                     // Ja !
      JC     X010

      L      LeerPuffer_Nr_from_PC                           // Anfoderung von Visualisierung?
      L      0
      >I                                                     // Ja !
      JC     X011

      L      0
      T      LeerPuffer_Nr_from_PLC
      T      VAR_old
      T      VAR_Timer

      SET
      R      Error.Datenbank
      R      Error.Undef_LeerPuffer
      R      Error.BLKMOV

      A      Durchlauf1
      R      Durchlauf1                                      // 1.Durchlauf hat stattgefunden
      JC     D010

      BEU

// Daten löschen:
// Kennung + Datenbytes
D010: L      16#1004                                         // Kennung 10 + Word=04
      T      LW0
      T      LW10                                            // Any-Kennung, Datentyp
      L      250                                             // Datenwords speichern
      T      LW2
      T      LW12                                            // Wiederholungen

// Quelle-Pointer erzeugen: (Empty-Visu)
      L      159
      T      LW4                                             // DB_Nummer
      L      1000                                            // Adresse
      SLD    3
      L      16#8400_0000                                    // Kennung: Daten
      OD
      T      LD6                                             // Kennung, Adresse

// Ziel-Pointer erzeugen: (Lager_Visu_Daten)
      L      159
      T      LW14                                            // DB_Nummer
      L      0                                               // Adresse
      SLD    3
      L      16#8400_0000                                    // Kennung: Daten
      OD
      T      LD16                                            // Kennung, Adresse

CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel)   // Datenliste-Daten speichern

// Ziel-Pointer erzeugen: (Lager_Visu_old-Daten)
      L      159
      T      LW14                                            // DB_Nummer
      L      500                                             // Adresse
      SLD    3
      L      16#8400_0000                                    // Kennung: Daten
      OD
      T      LD16                                            // Kennung, Adresse

CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel)   // Datenliste-Daten speichern

      L      0
      T      RET_VAL_Datenbank
      T      RET_VAL_BLKMOV

      BEU

X010: CAC
      T      Lager_Nr_aktiv

      L      0                                               // Anforderung von PC löschen
      T      LeerPuffer_Nr_from_PC                           // Visualisierung

// Automatisches Deaktivieren:
      L      LeerPuffer_Nr_from_VAR
      L      VAR_old                                         // Noch diesselbe VAR-Nr. ?
      ==I                                                    // Ja !
      A      Durchlauf1
      JC     Y010

// NeuBeginn:
      L      3600                                            // 1 Stunde
      T      VAR_Timer                                       // Timer neu laden

      L      LeerPuffer_Nr_from_VAR
      T      VAR_old                                         // VAR-Nr. speichern

      JU     En01

// Timer aktiv:
Y010: AN     "1s-Impuls"                                     // 1s-Impuls
      JC     En01

      L      VAR_Timer                                       // Timer
      +      -1                                              // 1s von Restzeit abziehen
      T      VAR_Timer                                       // Timer

      L      0                                               // abgelaufen ?
      >I                                                     // Nein !
      JC     En01

// Timer abgelaufen:
      L      0                                               // Automatisch beaktivieren
      T      LeerPuffer_Nr_from_VAR
      T      VAR_old
      T      VAR_Timer                                       // Timer

      JU     En01

X011: CAC
      T      Lager_Nr_aktiv

      L      0                                               // Anforderung von VAR löschen
      T      LeerPuffer_Nr_from_VAR                          // Visualisierung
      T      VAR_old
      T      VAR_Timer

En01: NOP 0


--- NW 2: Zeiger von gewolltem Lager ermitteln ---
      L      Lager_Nr_aktiv
      T      "MW200"                                         // Search-Daten

CALL FC "DatenOut" (SSDB:=DL_DB, SSDW:=0, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB219", OUTDATEN:=P#M220.0, Position:="MW298")   // Datenlisten-DB

      L      "MB219"
      T      RET_VAL_Datenbank                               // Rückmeldung bei Datenbank-Zugriff (Vorstau-DL)

      JBI    ok2

      A      "M219.0"
      S      Error.Datenbank

No:   SET
      S      Error.Undef_LeerPuffer

      L      0
      T      LeerPuffer_Nr_from_PLC                          // Aktiv-Lager

      JU     D010

ok2:  SET
      R      Error.Datenbank
      R      Error.Undef_LeerPuffer

      L      "MW222"
      L      1277                                            // HM-Leerpuffer ?
      ==I                                                    // Ja!
      JC     Ok2_Mig

      JU     No

Ok2_Mig: L      "MW224"
      T      Lager_DB
      L      "MW226"
      T      Lager_DW


--- NW 3: Neue Datenübergabe an PC ? ---
      AN     Durchlauf1                                      // 1.Durchlauf hat stattgefunden
      JC     En03

// Ziel-Pointer erzeugen: (PLC-Daten)
      L      Lager_DW
      ITD
      T      AR1Start                                        // Startwert mit Offset 0

// Anzahl Leertrolleys:
      L      LeerPuffer_Visu.Dyn.Anzahl_LeerTrolleys
      L      LeerPuffer_Visu_old.Dyn.Anzahl_LeerTrolleys
      ==D                                                    // Keine Änderung !
      JC     X309

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#350                                        // Offset für Anzahl Leer-Trolleys
      SLD    3
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
      L      LeerPuffer_Visu.Dyn.Anzahl_LeerTrolleys
      OPN    DB[Lager_DB]                                    // Lager-DB öffnen
      T      DBW [AR1Zeiger]

// HMI TrolleyID-Einfahrt:
X309: L      LeerPuffer_Visu.Dyn.TrolleyID_Einfahrt
      L      LeerPuffer_Visu_old.Dyn.TrolleyID_Einfahrt
      ==D                                                    // Keine Änderung !
      JC     X310

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#72                                         // Offset für TrolleyID Einfahrt
      SLD    3
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
      L      LeerPuffer_Visu.Dyn.TrolleyID_Einfahrt
      OPN    DB[Lager_DB]                                    // Lager-DB öffnen
      T      DBD [AR1Zeiger]

// Lagern.Sk-Reset:
X310: A      LeerPuffer_Visu.Dyn.Sk.Reset
      A      LeerPuffer_Visu_old.Dyn.Sk.Reset
      O
      AN     LeerPuffer_Visu.Dyn.Sk.Reset
      AN     LeerPuffer_Visu_old.Dyn.Sk.Reset
      JC     X311                                            // Keine Änderung !

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#98                                         // Offset für SK-Zeug
      SLD    3
      L      3                                               // Damit DBX_Bit 3
      OD
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
      A      LeerPuffer_Visu.Dyn.Sk.Reset
      OPN    DB[Lager_DB]                                    // Lager-DB öffnen
      =      DBX [AR1Zeiger]                                 // Lager-SK-Reset

// HMI-Schleuse-Reset:
X311: A      LeerPuffer_Visu.Dyn.HMI.Schleuse_resetten_Leerpuffer
      A      LeerPuffer_Visu_old.Dyn.HMI.Schleuse_resetten_Leerpuffer
      O
      AN     LeerPuffer_Visu.Dyn.HMI.Schleuse_resetten_Leerpuffer
      AN     LeerPuffer_Visu_old.Dyn.HMI.Schleuse_resetten_Leerpuffer
      JC     X312                                            // Keine Änderung !

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#82                                         // Offset für HMI-Zeug
      SLD    3
      L      0                                               // Damit DBX_Bit 0
      OD
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
      A      LeerPuffer_Visu.Dyn.HMI.Schleuse_resetten_Leerpuffer
      OPN    DB[Lager_DB]                                    // Weiche-DB öffnen
      =      DBX [AR1Zeiger]                                 // Weiche-SK-Reset

// HMI-Lager initialisieren:
X312: A      LeerPuffer_Visu.Dyn.HMI.LeerPuffer_initialisieren
      A      LeerPuffer_Visu_old.Dyn.HMI.LeerPuffer_initialisieren
      O
      AN     LeerPuffer_Visu.Dyn.HMI.LeerPuffer_initialisieren
      AN     LeerPuffer_Visu_old.Dyn.HMI.LeerPuffer_initialisieren
      JC     X313                                            // Keine Änderung !

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#82                                         // Offset für HMI-Zeug
      SLD    3
      L      1                                               // Damit DBX_Bit 1
      OD
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
      A      LeerPuffer_Visu.Dyn.HMI.LeerPuffer_initialisieren
      OPN    DB[Lager_DB]                                    // Weiche-DB öffnen
      =      DBX [AR1Zeiger]                                 // Weiche-SK-Reset

// HMI-Lager Einlagern sperren:
X313: A      LeerPuffer_Visu.Dyn.HMI.Einlagern_gesperrt
      A      LeerPuffer_Visu_old.Dyn.HMI.Einlagern_gesperrt
      O
      AN     LeerPuffer_Visu.Dyn.HMI.Einlagern_gesperrt
      AN     LeerPuffer_Visu_old.Dyn.HMI.Einlagern_gesperrt
      JC     X314                                            // Keine Änderung !

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#82                                         // Offset für HMI-Zeug
      SLD    3
      L      2                                               // Damit DBX_Bit 2
      OD
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
      A      LeerPuffer_Visu.Dyn.HMI.Einlagern_gesperrt
      OPN    DB[Lager_DB]                                    // Weiche-DB öffnen
      =      DBX [AR1Zeiger]                                 // Weiche-SK-Reset

// HMI-Lager Auslagern sperren:
X314: A      LeerPuffer_Visu.Dyn.HMI.AusLagern_gesperrt
      A      LeerPuffer_Visu_old.Dyn.HMI.AusLagern_gesperrt
      O
      AN     LeerPuffer_Visu.Dyn.HMI.AusLagern_gesperrt
      AN     LeerPuffer_Visu_old.Dyn.HMI.AusLagern_gesperrt
      JC     X315                                            // Keine Änderung !

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#82                                         // Offset für HMI-Zeug
      SLD    3
      L      3                                               // Damit DBX_Bit 3
      OD
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
      A      LeerPuffer_Visu.Dyn.HMI.AusLagern_gesperrt
      OPN    DB[Lager_DB]                                    // Weiche-DB öffnen
      =      DBX [AR1Zeiger]                                 // Weiche-SK-Reset

// Einen Leertrolley ausfahren:
X315: A      LeerPuffer_Visu.Dyn.Status.Einen_LeerTrolley_ausfahren
      A      LeerPuffer_Visu_old.Dyn.Status.Einen_LeerTrolley_ausfahren
      O
      AN     LeerPuffer_Visu.Dyn.Status.Einen_LeerTrolley_ausfahren
      AN     LeerPuffer_Visu_old.Dyn.Status.Einen_LeerTrolley_ausfahren
      JC     En03                                            // Keine Änderung !

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#71                                         // Offset für Weichen-Zeug
      SLD    3
      L      4                                               // Damit DBX_Bit 4
      OD
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
      A      LeerPuffer_Visu.Dyn.Status.Einen_LeerTrolley_ausfahren
      OPN    DB[Lager_DB]                                    // Weiche-DB öffnen
      =      DBX [AR1Zeiger]                                 // Weiche-SK-Reset

En03: NOP 0


--- NW 4: Datenübernahme vom PC ---
// Kennung + Datenbytes
      L      16#1004                                         // Kennung 10 + Word=04
      T      LW0
      T      LW10                                            // Any-Kennung, Datentyp
      L      250                                             // Datenwords speichern
      T      LW2
      T      LW12                                            // Wiederholungen

// Quelle-Pointer erzeugen: (PLC-Daten)
      L      Lager_DB
      T      LW4                                             // DB_Nummer
      L      Lager_DW                                        // Adresse
      SLD    3
      L      16#8400_0000                                    // Kennung: Daten
      OD
      T      LD6                                             // Kennung, Adresse

// Ziel-Pointer erzeugen: (PC-Lager-Visu-Daten)
      L      159
      T      LW14                                            // DB_Nummer
      L      0                                               // Adresse
      SLD    3
      L      16#8400_0000                                    // Kennung: Daten
      OD
      T      LD16                                            // Kennung, Adresse

CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel)   // Datenliste-Daten speichern

      L      RET_VAL_BLKMOV                                  // Rückmeldung
      L      0                                               // Fehler vorhanden ?
      <>I                                                    // Ja !
      =      Error.BLKMOV                                    // Error bei Block kopieren
      BEC

// Ziel-Pointer erzeugen: (Lager_Visu_old-Daten)
      L      159
      T      LW14                                            // DB_Nummer
      L      500                                             // Adresse
      SLD    3
      L      16#8400_0000                                    // Kennung: Daten
      OD
      T      LD16                                            // Kennung, Adresse

CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel)   // Datenliste-Daten speichern

      L      RET_VAL_BLKMOV                                  // Rückmeldung
      L      0                                               // Fehler vorhanden ?
      <>I                                                    // Ja !
      =      Error.BLKMOV                                    // Error bei Block kopieren
      BEC

      L      Lager_Nr_aktiv
      T      LeerPuffer_Nr_from_PLC                          // Rückmeldung an PC (Daten stehen an)

      SET
      S      Durchlauf1                                      // 1.Durchlauf hat stattgefunden


--- NW 5: Ende ---
      BE

