=== FB 252: Visu_HMOmniBereich_Plus  [STL] ===
INTERFACE:
  Input:
  Output:
  InOut:
  Static:
    Bereich_Visu : "MHMOmniBereich_Plus"                // Schleuse-Bereich für Visualisierung
    Bereich_Visu_old : "MHMOmniBereich_Plus"
    Empty_Visu : Array[1..100] of Int                   // Bereich für Daten-Löschung
    DL_DB : Int                                         // Datenlisten-DB
    Bereich_Nr_from_PC : Int                            // PC>PLC: Für diesen Schleuse Daten bereitstellen
    Bereich_Nr_from_PLC : Int                           // PLC>PC: Daten von diesem Schleusee aktiv
    Bereich_Nr_from_VAR : Int                           // VAR>PLC: Für diesen Schleuse Daten bereitstellen
    VAR_old : Int                                       // VAR>PLC: Für diesen Schleuse Daten bereitstellen
    VAR_Timer : Int                                     // VAR>PLC: Für diesen Schleuse Daten bereitstellen
    RET_VAL_Datenbank : Byte
    RET_VAL_BLKMOV : Int
    Durchlauf1 : Bool                                   // 1.Durchlauf hat stattgefunden
    Error : Struct
      Datenbank : Bool
      Undef_Schleuse : Bool
      BLKMOV : Bool
  Temp:
    Quelle : Any                                        // Zeiger, wo Quell-Daten sind
    Ziel : Any                                          // Zeiger, wo Ziel-Daten sind
    Bereichs_DB : Int                                   // Schleuse-DB
    Bereichs_DW : Int                                   // Schleuse-DW
    AR1Zeiger : DWord                                   // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
    AR1Start : DInt                                     // Startwert mit Offset 0
    Schleuse_Nr_aktiv : Int                             // Intern: Für diesen Schleuse Daten bereitstellen
  Constant:

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

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

      L      0
      T      Bereich_Nr_from_PLC
      T      VAR_old
      T      VAR_Timer

      SET
      R      Error.Datenbank
      R      Error.Undef_Schleuse
      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      100                                             // Datenwords speichern
      T      LW2
      T      LW12                                            // Wiederholungen

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

// Ziel-Pointer erzeugen: (Schleuse_Visu_Daten)
      L      252
      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: (Schleuse_Visu_old-Daten)
      L      252
      T      LW14                                            // DB_Nummer
      L      200                                             // 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      Schleuse_Nr_aktiv

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

// Automatisches Deaktivieren:
      L      Bereich_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      Bereich_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      Bereich_Nr_from_VAR
      T      VAR_old
      T      VAR_Timer                                       // Timer

      JU     En01

X011: CAC
      T      Schleuse_Nr_aktiv

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

En01: NOP 0


--- NW 2: Zeiger von gewolltem Bereich_Plus ermitteln ---
      L      Schleuse_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_Schleuse

      L      0
      T      Bereich_Nr_from_PLC                             // Aktiv-Schleuse

      JU     D010

ok2:  SET
      R      Error.Datenbank
      R      Error.Undef_Schleuse

      L      "MW222"
      L      2275                                            // Omni-Bereich_Plus?
      ==I                                                    // Ja!
      JC     Ok2_Mig

      JU     No

Ok2_Mig: L      "MW224"
      T      Bereichs_DB
      L      "MW226"
      T      Bereichs_DW


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

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

// Raus-Trolleys:
      L      Bereich_Visu.Dyn.Raus_Trolleys
      L      Bereich_Visu_old.Dyn.Raus_Trolleys
      ==I                                                    // Keine Änderung !
      JC     X200

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#192                                        // Offset für Raus-Trolleys
      SLD    3
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
      L      Bereich_Visu.Dyn.Raus_Trolleys
      OPN    DB[Bereichs_DB]                                 // Schleuse-DB öffnen
      T      DBW [AR1Zeiger]                                 // Raus-Trolleys

// Fahrzeit:
X200: L      Bereich_Visu.Bereich.Fahrzeit
      L      Bereich_Visu_old.Bereich.Fahrzeit
      ==I                                                    // Keine Änderung !
      JC     X201

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#50                                         // Offset für Fahrzeit
      SLD    3
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
      L      Bereich_Visu.Bereich.Fahrzeit
      OPN    DB[Bereichs_DB]                                 // Schleuse-DB öffnen
      T      DBW [AR1Zeiger]                                 // Schleuse-Zug

// Schleusen.SK-Reset:
X201: A      Bereich_Visu.Dyn.Sk.Reset
      A      Bereich_Visu_old.Dyn.Sk.Reset
      O
      AN     Bereich_Visu.Dyn.Sk.Reset
      AN     Bereich_Visu_old.Dyn.Sk.Reset
      JC     X301                                            // Keine Änderung !

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#88                                         // 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      Bereich_Visu.Dyn.Sk.Reset
      OPN    DB[Bereichs_DB]                                 // Schleuse-DB öffnen
      =      DBX [AR1Zeiger]                                 // Schleuse-SK-Reset

// HMI-Reset:
X301: A      Bereich_Visu.Dyn.HMI.Bereich_resetten
      A      Bereich_Visu_old.Dyn.HMI.Bereich_resetten
      O
      AN     Bereich_Visu.Dyn.HMI.Bereich_resetten
      AN     Bereich_Visu_old.Dyn.HMI.Bereich_resetten
      JC     En03                                            // Keine Änderung !

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#72                                         // Offset für HMI
      SLD    3
      L      0                                               // Damit DBX_Bit 0
      OD
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
      A      Bereich_Visu.Dyn.HMI.Bereich_resetten
      OPN    DB[Bereichs_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      100                                             // Datenwords speichern
      T      LW2
      T      LW12                                            // Wiederholungen

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

// Ziel-Pointer erzeugen: (PC-Schleuse-Visu-Daten)
      L      252
      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: (Schleuse_Visu_old-Daten)
      L      252
      T      LW14                                            // DB_Nummer
      L      200                                             // 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      Schleuse_Nr_aktiv
      T      Bereich_Nr_from_PLC                             // Rückmeldung an PC (Daten stehen an)

      SET
      S      Durchlauf1                                      // 1.Durchlauf hat stattgefunden


--- NW 5: Ende ---
      BE

