=== FB 159: Visu_HM_ABP  [STL] ===
INTERFACE:
  Input:
  Output:
  InOut:
  Static:
    ABP_Visu : "MHM_Arbeitsplatz"                       // ABP-Bereich für Visualisierung
    ABP_Visu_old : "MHM_Arbeitsplatz"                   // COPYRIGHT by Ingenieurbüro A.EmmertOrtsstr.33, D-869925 Fuchstal (Germany)Tel.: 0049(0)8243-960629Version: Omniflow H&M AMR / 04.2025Schritt 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: ABP 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..100] of Int                   // Bereich für Daten-Löschung
    DL_DB : Int                                         // Datenlisten-DB
    ABP_Nr_from_PC : Word                               // PC>PLC: Für diesen ABP Daten bereitstellen
    ABP_Nr_from_PLC : Word                              // PLC>PC: Daten von diesem ABPe aktiv
    ABP_Nr_from_VAR : Word                              // VAR>PLC: Für diesen ABP Daten bereitstellen
    VAR_old : Word                                      // VAR>PLC: Für diesen ABP Daten bereitstellen
    VAR_Timer : Int                                     // VAR>PLC: Für diesen ABP Daten bereitstellen
    RET_VAL_Datenbank : Byte
    RET_VAL_BLKMOV : Int
    Durchlauf1 : Bool                                   // 1.Durchlauf hat stattgefunden
    Error : Struct
      Datenbank : Bool
      Undef_ABP : Bool
      BLKMOV : Bool
  Input:
    B_In_Schleuse_Vorstau : Bool                        // Sensor Trolley ist in ABP Vorstau
  Output:
  InOut:
  Static:
    Dyn : Struct
      HMI : Struct
        Vorstau_resetten : Bool                         // Vorstau-ABP resetten (IN:HMI, Out:PLC)
        Platz_1_resetten : Bool                         // Platz 1-ABP resetten (IN:HMI, Out:PLC)
        Platz_2_resetten : Bool                         // Platz 2-ABP resetten (IN:HMI, Out:PLC)
        Platz_3_resetten : Bool                         // Platz 3-ABP resetten (IN:HMI, Out:PLC)
  Input:
    B_In_Schleuse_Vorstau : Bool                        // Sensor Trolley ist in ABP Vorstau
  Output:
  InOut:
  Static:
    Dyn : Struct
      HMI : Struct
        Vorstau_resetten : Bool                         // Vorstau-ABP resetten (IN:HMI, Out:PLC)
        Platz_1_resetten : Bool                         // Platz 1-ABP resetten (IN:HMI, Out:PLC)
        Platz_2_resetten : Bool                         // Platz 2-ABP resetten (IN:HMI, Out:PLC)
        Platz_3_resetten : Bool                         // Platz 3-ABP resetten (IN:HMI, Out:PLC)
  Temp:
    Quelle : Any                                        // Zeiger, wo Quell-Daten sind
    Ziel : Any                                          // Zeiger, wo Ziel-Daten sind
    ABPn_DB : Int                                       // ABP-DB
    ABPn_DW : Int                                       // ABP-DW
    AR1Zeiger : DWord                                   // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
    AR1Start : DInt                                     // Startwert mit Offset 0
    ABP_Nr_aktiv : Int                                  // Intern: Für diesen ABP Daten bereitstellen
  Constant:

--- NW 1: 
 ---
      L      ABP_Nr_from_VAR                                 // Anforderung von Variablentabelle ?
      L      16#0
      <>I                                                    // Ja !
      JC     X010

      L      ABP_Nr_from_PC                                  // Anfoderung von Visualisierung?
      L      16#0
      <>I                                                    // Ja !
      JC     X011

      L      0
      T      ABP_Nr_from_PLC
      T      VAR_old
      T      VAR_Timer

      SET
      R      Error.Datenbank
      R      Error.Undef_ABP
      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      159
      T      LW4                                             // DB_Nummer
      L      400                                             // Adresse
      SLD    3
      L      16#8400_0000                                    // Kennung: Daten
      OD
      T      LD6                                             // Kennung, Adresse

// Ziel-Pointer erzeugen: (ABP_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: (ABP_Visu_old-Daten)
      L      159
      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      ABP_Nr_aktiv

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

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

      JU     En01

X011: CAC
      T      ABP_Nr_aktiv

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

En01: NOP 0


--- NW 2: Zeiger von gewolltem ABP ermitteln ---
      L      ABP_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_ABP

      L      0
      T      ABP_Nr_from_PLC                                 // Aktiv-ABP

      JU     D010

ok2:  SET
      R      Error.Datenbank
      R      Error.Undef_ABP

      L      "MW222"
      L      276                                             // HM-ABP?
      ==I                                                    // Ja!
      JC     Ok2_Mig

      JU     No

Ok2_Mig: L      "MW224"
      T      ABPn_DB
      L      "MW226"
      T      ABPn_DW


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

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

// SK_zum_Beladeplatz-Reset:
X300: A      ABP_Visu.Dyn.Sk_zum_Beladeplatz.Reset
      A      ABP_Visu_old.Dyn.Sk_zum_Beladeplatz.Reset
      O
      AN     ABP_Visu.Dyn.Sk_zum_Beladeplatz.Reset
      AN     ABP_Visu_old.Dyn.Sk_zum_Beladeplatz.Reset
      JC     X301                                            // Keine Änderung !

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

// SK_aus_Beladeplatz-Reset:
X301: A      ABP_Visu.Dyn.Sk_aus_Beladeplatz.Reset
      A      ABP_Visu_old.Dyn.Sk_aus_Beladeplatz.Reset
      O
      AN     ABP_Visu.Dyn.Sk_aus_Beladeplatz.Reset
      AN     ABP_Visu_old.Dyn.Sk_aus_Beladeplatz.Reset
      JC     X700                                            // Keine Änderung !

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#114                                        // Offset für Sk_aus_Beladeplatz-Zeug
      SLD    3
      L      4                                               // Damit DBX_Bit 4
      OD
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
      A      ABP_Visu.Dyn.Sk_aus_Beladeplatz.Reset
      OPN    DB[ABPn_DB]                                     // ABP-DB öffnen
      =      DBX [AR1Zeiger]                                 // ABP-Sk_aus_Beladeplatz-Reset

X700: A      ABP_Visu.Dyn.HMI.Vorstau_resetten
      A      ABP_Visu_old.Dyn.HMI.Vorstau_resetten
      O
      AN     ABP_Visu.Dyn.HMI.Vorstau_resetten
      AN     ABP_Visu_old.Dyn.HMI.Vorstau_resetten
      JC     X701                                            // Keine Änderung !

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#72                                         // Offset für Sk_aus_Beladeplatz-Zeug
      SLD    3
      L      0                                               // Damit DBX_Bit 0
      OD
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
      A      ABP_Visu.Dyn.HMI.Vorstau_resetten
      OPN    DB[ABPn_DB]                                     // ABP-DB öffnen
      =      DBX [AR1Zeiger]                                 // ABP-Sk_aus_Beladeplatz-Reset

X701: A      ABP_Visu.Dyn.HMI.Platz_1_resetten
      A      ABP_Visu_old.Dyn.HMI.Platz_1_resetten
      O
      AN     ABP_Visu.Dyn.HMI.Platz_1_resetten
      AN     ABP_Visu_old.Dyn.HMI.Platz_1_resetten
      JC     X702                                            // Keine Änderung !

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#72                                         // Offset für Sk_aus_Beladeplatz-Zeug
      SLD    3
      L      1                                               // Damit DBX_Bit 1
      OD
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
      A      ABP_Visu.Dyn.HMI.Platz_1_resetten
      OPN    DB[ABPn_DB]                                     // ABP-DB öffnen
      =      DBX [AR1Zeiger]                                 // Platz resetten

X702: A      ABP_Visu.Dyn.HMI.Platz_2_resetten
      A      ABP_Visu_old.Dyn.HMI.Platz_2_resetten
      O
      AN     ABP_Visu.Dyn.HMI.Platz_2_resetten
      AN     ABP_Visu_old.Dyn.HMI.Platz_2_resetten
      JC     X703                                            // Keine Änderung !

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#72                                         // Offset für Sk_aus_Beladeplatz-Zeug
      SLD    3
      L      2                                               // Damit DBX_Bit 2
      OD
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
      A      ABP_Visu.Dyn.HMI.Platz_2_resetten
      OPN    DB[ABPn_DB]                                     // ABP-DB öffnen
      =      DBX [AR1Zeiger]                                 // Platz resetten

X703: A      ABP_Visu.Dyn.HMI.Platz_3_resetten
      A      ABP_Visu_old.Dyn.HMI.Platz_3_resetten
      O
      AN     ABP_Visu.Dyn.HMI.Platz_3_resetten
      AN     ABP_Visu_old.Dyn.HMI.Platz_3_resetten
      JC     X704                                            // Keine Änderung !

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#72                                         // Offset für Sk_aus_Beladeplatz-Zeug
      SLD    3
      L      3                                               // Damit DBX_Bit 3
      OD
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
      A      ABP_Visu.Dyn.HMI.Platz_3_resetten
      OPN    DB[ABPn_DB]                                     // ABP-DB öffnen
      =      DBX [AR1Zeiger]                                 // Platz resetten

X704: A      ABP_Visu.Dyn.HMI."Sk_zu_Plätze_resetten"
      A      ABP_Visu_old.Dyn.HMI."Sk_zu_Plätze_resetten"
      O
      AN     ABP_Visu.Dyn.HMI."Sk_zu_Plätze_resetten"
      AN     ABP_Visu_old.Dyn.HMI."Sk_zu_Plätze_resetten"
      JC     X705                                            // Keine Änderung !

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#72                                         // Offset für Sk_aus_Beladeplatz-Zeug
      SLD    3
      L      4                                               // Damit DBX_Bit 4
      OD
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
      A      ABP_Visu.Dyn.HMI."Sk_zu_Plätze_resetten"
      OPN    DB[ABPn_DB]                                     // ABP-DB öffnen
      =      DBX [AR1Zeiger]                                 // Platz resetten

X705: A      ABP_Visu.Dyn.HMI."Sk_aus_Plätze_resetten"
      A      ABP_Visu_old.Dyn.HMI."Sk_aus_Plätze_resetten"
      O
      AN     ABP_Visu.Dyn.HMI."Sk_aus_Plätze_resetten"
      AN     ABP_Visu_old.Dyn.HMI."Sk_aus_Plätze_resetten"
      JC     X621                                            // Keine Änderung !

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#72                                         // Offset für Sk_aus_Beladeplatz-Zeug
      SLD    3
      L      5                                               // Damit DBX_Bit 5
      OD
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
      A      ABP_Visu.Dyn.HMI."Sk_aus_Plätze_resetten"
      OPN    DB[ABPn_DB]                                     // ABP-DB öffnen
      =      DBX [AR1Zeiger]                                 // Platz resetten

X621: A      ABP_Visu.Dyn.SS."PC>Trolley_zum_Platz_1_starten"
      A      ABP_Visu_old.Dyn.SS."PC>Trolley_zum_Platz_1_starten"
      O
      AN     ABP_Visu.Dyn.SS."PC>Trolley_zum_Platz_1_starten"
      AN     ABP_Visu_old.Dyn.SS."PC>Trolley_zum_Platz_1_starten"
      JC     X622                                            // Keine Änderung !

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#60                                         // Offset für Sk_aus_Beladeplatz-Zeug
      SLD    3
      L      1                                               // Damit DBX_Bit 1
      OD
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
      A      ABP_Visu.Dyn.SS."PC>Trolley_zum_Platz_1_starten"
      OPN    DB[ABPn_DB]                                     // ABP-DB öffnen
      =      DBX [AR1Zeiger]                                 // Platz resetten

X622: A      ABP_Visu.Dyn.SS."PC>Trolley_zum_Platz_2_starten"
      A      ABP_Visu_old.Dyn.SS."PC>Trolley_zum_Platz_2_starten"
      O
      AN     ABP_Visu.Dyn.SS."PC>Trolley_zum_Platz_2_starten"
      AN     ABP_Visu_old.Dyn.SS."PC>Trolley_zum_Platz_2_starten"
      JC     X623                                            // Keine Änderung !

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#60                                         // Offset für Sk_aus_Beladeplatz-Zeug
      SLD    3
      L      2                                               // Damit DBX_Bit 2
      OD
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
      A      ABP_Visu.Dyn.SS."PC>Trolley_zum_Platz_2_starten"
      OPN    DB[ABPn_DB]                                     // ABP-DB öffnen
      =      DBX [AR1Zeiger]                                 // Platz resetten

X623: A      ABP_Visu.Dyn.SS."PC>Trolley_zum_Platz_3_starten"
      A      ABP_Visu_old.Dyn.SS."PC>Trolley_zum_Platz_3_starten"
      O
      AN     ABP_Visu.Dyn.SS."PC>Trolley_zum_Platz_3_starten"
      AN     ABP_Visu_old.Dyn.SS."PC>Trolley_zum_Platz_3_starten"
      JC     X627                                            // Keine Änderung !

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#60                                         // Offset für Sk_aus_Beladeplatz-Zeug
      SLD    3
      L      3                                               // Damit DBX_Bit 3
      OD
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
      A      ABP_Visu.Dyn.SS."PC>Trolley_zum_Platz_3_starten"
      OPN    DB[ABPn_DB]                                     // ABP-DB öffnen
      =      DBX [AR1Zeiger]                                 // Platz resetten

X627: A      ABP_Visu.Dyn.SS."PC>Trolley_an_Platz_1_freigegeben"
      A      ABP_Visu_old.Dyn.SS."PC>Trolley_an_Platz_1_freigegeben"
      O
      AN     ABP_Visu.Dyn.SS."PC>Trolley_an_Platz_1_freigegeben"
      AN     ABP_Visu_old.Dyn.SS."PC>Trolley_an_Platz_1_freigegeben"
      JC     X630                                            // Keine Änderung !

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#60                                         // Offset für Sk_aus_Beladeplatz-Zeug
      SLD    3
      L      7                                               // Damit DBX_Bit 7
      OD
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
      A      ABP_Visu.Dyn.SS."PC>Trolley_an_Platz_1_freigegeben"
      OPN    DB[ABPn_DB]                                     // ABP-DB öffnen
      =      DBX [AR1Zeiger]                                 // Platz resetten

X630: A      ABP_Visu.Dyn.SS."PC>Trolley_an_Platz_2_freigegeben"
      A      ABP_Visu_old.Dyn.SS."PC>Trolley_an_Platz_2_freigegeben"
      O
      AN     ABP_Visu.Dyn.SS."PC>Trolley_an_Platz_2_freigegeben"
      AN     ABP_Visu_old.Dyn.SS."PC>Trolley_an_Platz_2_freigegeben"
      JC     X631                                            // Keine Änderung !

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#61                                         // Offset für Sk_aus_Beladeplatz-Zeug
      SLD    3
      L      0                                               // Damit DBX_Bit 0
      OD
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
      A      ABP_Visu.Dyn.SS."PC>Trolley_an_Platz_2_freigegeben"
      OPN    DB[ABPn_DB]                                     // ABP-DB öffnen
      =      DBX [AR1Zeiger]                                 // Platz resetten

X631: A      ABP_Visu.Dyn.SS."PC>Trolley_an_Platz_3_freigegeben"
      A      ABP_Visu_old.Dyn.SS."PC>Trolley_an_Platz_3_freigegeben"
      O
      AN     ABP_Visu.Dyn.SS."PC>Trolley_an_Platz_3_freigegeben"
      AN     ABP_Visu_old.Dyn.SS."PC>Trolley_an_Platz_3_freigegeben"
      JC     X632                                            // Keine Änderung !

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#61                                         // Offset für Sk_aus_Beladeplatz-Zeug
      SLD    3
      L      1                                               // Damit DBX_Bit 1
      OD
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
      A      ABP_Visu.Dyn.SS."PC>Trolley_an_Platz_3_freigegeben"
      OPN    DB[ABPn_DB]                                     // ABP-DB öffnen
      =      DBX [AR1Zeiger]                                 // Platz resetten

// Anzahl Leertrolleys im Vorstau:
X632: L      ABP_Visu.Dyn.Vorstau.Anzahl_Leertrolleys
      L      ABP_Visu_old.Dyn.Vorstau.Anzahl_Leertrolleys
      ==I                                                    // Keine Änderung !
      JC     X633                                            // Keine Änderung !

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#132                                        // Offset für Trolleys im Vorstau
      SLD    3
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
      L      ABP_Visu.Dyn.Vorstau.Anzahl_Leertrolleys
      OPN    DB[ABPn_DB]                                     // ABP-DB öffnen
      T      DBW [AR1Zeiger]                                 // Anzahl

// Arbeitsplatz aktivieren / deaktivieren:
X633: A      ABP_Visu.Dyn.Status.Arbeitsplatz_aktiviert
      A      ABP_Visu_old.Dyn.Status.Arbeitsplatz_aktiviert
      O
      AN     ABP_Visu.Dyn.Status.Arbeitsplatz_aktiviert
      AN     ABP_Visu_old.Dyn.Status.Arbeitsplatz_aktiviert
      JC     En03

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#62                                         // Offset für Status
      SLD    3
      L      0                                               // Damit DBX_Bit 0
      OD
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
      A      ABP_Visu.Dyn.Status.Arbeitsplatz_aktiviert
      OPN    DB[ABPn_DB]                                     // ABP-DB öffnen
      =      DBX [AR1Zeiger]                                 // ABP aktivieren / deaktivieren

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      ABPn_DB
      T      LW4                                             // DB_Nummer
      L      ABPn_DW                                         // Adresse
      SLD    3
      L      16#8400_0000                                    // Kennung: Daten
      OD
      T      LD6                                             // Kennung, Adresse

// Ziel-Pointer erzeugen: (PC-ABP-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: (ABP_Visu_old-Daten)
      L      159
      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      ABP_Nr_aktiv
      T      ABP_Nr_from_PLC                                 // Rückmeldung an PC (Daten stehen an)

      SET
      S      Durchlauf1                                      // 1.Durchlauf hat stattgefunden


--- NW 5: Ende ---
      BE

