=== FB 154: Visu_StartSync_Visu  [STL] ===
INTERFACE:
  Input:
  Output:
  InOut:
  Static:
    StartSync_Visu : "MStartSync"                       // StartSync-Bereich für Visualisierung
    StartSync_Visu_old : "MStartSync"
    Empty_Visu : Array[1..75] of Int                    // Bereich für Daten-Löschung
    DL_DB : Int                                         // Datenlisten-DB
    StartSync_Nr_from_PC : Int                          // PC>PLC: Für diese StartSync Daten bereitstellen
    StartSync_Nr_from_PLC : Int                         // PLC>PC: Daten von diesem StartSynce aktiv
    StartSync_Nr_from_VAR : Int                         // VAR>PLC: Für diese StartSync Daten bereitstellen
    VAR_old : Int                                       // VAR>PLC: Für diese StartSync Daten bereitstellen
    VAR_Timer : Int                                     // VAR>PLC: Für diese StartSync Daten bereitstellen
    RET_VAL_Datenbank : Byte
    RET_VAL_BLKMOV : Int
    Durchlauf1 : Bool                                   // 1.Durchlauf hat stattgefunden
    Error : Struct
      Datenbank : Bool
      Undef_StartSync : Bool
      BLKMOV : Bool
  Temp:
    Quelle : Any                                        // Zeiger, wo Quell-Daten sind
    Ziel : Any                                          // Zeiger, wo Ziel-Daten sind
    Weiche_DB : Int                                     // Weiche-DB
    Weiche_DW : Int                                     // Weiche-DW
    AR1Zeiger : DWord                                   // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
    AR1Start : DInt                                     // Startwert mit Offset 0
    StartSync_Nr_aktiv : Int                            // Intern: Für diese StartSync Daten bereitstellen
  Constant:

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

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

      L      0
      T      StartSync_Nr_from_PLC
      T      VAR_old
      T      VAR_Timer

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

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

// Ziel-Pointer erzeugen: (Sep_Visu_Daten)
      L      154
      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: (Sep_Visu_old-Daten)
      L      154
      T      LW14                                            // DB_Nummer
      L      150                                             // 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      StartSync_Nr_aktiv

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

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

      JU     En01

X011: CAC
      T      StartSync_Nr_aktiv

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

En01: NOP 0


--- NW 2: Zeiger von gewollte Weiche ermitteln ---
      L      StartSync_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_StartSync

      L      0
      T      StartSync_Nr_from_PLC                           // Aktiv-Weiche

      JU     D010

ok2:  SET
      R      Error.Datenbank
      R      Error.Undef_StartSync

      L      "MW226"
      L      177                                             // StartSync?
      ==I                                                    // Ja!
      JC     Ok2_Mig

      JU     No

Ok2_Mig: L      "MW222"
      T      Weiche_DB
      L      "MW224"
      T      Weiche_DW


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

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

// StartSync-Reset:
      A      StartSync_Visu.Dyn.Reset
      A      StartSync_Visu_old.Dyn.Reset
      O
      AN     StartSync_Visu.Dyn.Reset
      AN     StartSync_Visu_old.Dyn.Reset
      JC     En03                                            // Keine Änderung !

      L      AR1Start                                        // Startwert mit Offset 0
      +      DINT#86                                         // Offset für Status
      SLD    3
      L      3                                               // Damit DBX_Bit 3
      OD
      T      AR1Zeiger                                       // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
      A      StartSync_Visu.Dyn.Reset
      OPN    DB[Weiche_DB]                                   // Sep-DB öffnen
      =      DBX [AR1Zeiger]                                 // Sep-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      75                                              // Datenwords speichern
      T      LW2
      T      LW12                                            // Wiederholungen

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

// Ziel-Pointer erzeugen: (PC-Sep-Visu-Daten)
      L      154
      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: (Sep_Visu_old-Daten)
      L      154
      T      LW14                                            // DB_Nummer
      L      150                                             // 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      StartSync_Nr_aktiv
      T      StartSync_Nr_from_PLC                           // Rückmeldung an PC (Daten stehen an)

      SET
      S      Durchlauf1                                      // 1.Durchlauf hat stattgefunden


--- NW 5: Ende ---
      BE

