FUNCTION "DatenReset" : Void
TITLE = Datenlisten-Modul
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : IBAE
FAMILY : DLISTE
NAME : DatenIn
VERSION : 0.1
//COPYRIGHT by Ingenieurbüro A.Emmert
//Ortsstr.33, D-869925 Fuchstal (Germany)
//Tel.: 0049(0)8243-1254
//Version: P&O / 10.2024
//Version: ILS2100 / 06.11.2009
//
//Datenblock in Datenliste resetten
//SSDB:    Datenlisten-DB
//SSDW:    Datenlisten-1.DW
//RE_VAL:  Rückmeldungen:
//   Bit0: Kein Datenlistenbereich / falscher Kopfinhalt / Endekennung
//   Bit1: SFC20-Aufruf mit Fehler
//   Bit2: Frei
//   Bit3: Frei
//   Bit4: Frei
//   Bit5: Frei
//   Bit6: Frei
//   Bit7: Frei
//
   VAR_INPUT 
      SSDB : Int;   // Datenlisten-DB
      SSDW : Int;   // Datenlisten-1.DW
   END_VAR

   VAR_OUTPUT 
      RE_VAL : Byte;   // Rückmeldung
   END_VAR

   VAR_TEMP 
      Quelle : Any;   // Zeiger, wo Rein-Daten sind
      Ziel : Any;   // Zeiger, FIFO-Stelle
      Kopf : Byte;   // Datenliste-Kennnung (DA)
      Datensatzlaenge : Byte;   // Datensatzlänge in Word (01 - F0) F0=128
      Listenlaenge : Int;   // Länge der Datenliste (maximale Anzahl der Datensätze)
      Stammdaten : Int;   // Stammdatenlänge in Word (1 - 9)
      IndDB : Word;   // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!)
      IndDB_Laenge : Int;   // Länge des indizierten DB in Einträge (nur bei Stammdaten = 1 erlaubt !!!)
      IndDaten_FC : Int;   // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!)
      Suchzeiger : Int;   // Speicherung des letzten Zugriffs / Suchzeiger
      Belegt14 : Int;   // reserviert von Sort-Datenliste
      Reserve16 : Int;   // Reserve
      Reserve18 : Int;   // Reserve
      DBDatenliste : Word;   // Datenlisten-DB
      SFC_RET_VAL : Int;   // Rückmeldung SFC-Aufruf
      SFC_DB_LENGTH : Word;   // Rückmeldung SFC-Aufruf
      Datenlisten_Ende : Word;   // Ende der Datenliste
      Schleife : Word;   // Loopzähler
      SFC_WRITE_PROT : Bool;   // Rückmeldung SFC-Aufruf
      AR1Zeiger : DWord;   // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
      DB_Länge : Int;
   END_VAR


BEGIN
NETWORK
TITLE = Schnittstellen-DB sinnvoll ?
      L #SSDB;
      T #DBDatenliste;

      CALL "TEST_DB_TO_ATTR_DB"
      (  DB_Number                   := #DBDatenliste , 
         RetVal                      := #SFC_RET_VAL , 
         DB_Length                   := #SFC_DB_LENGTH , 
         Write_Prot                  := #SFC_WRITE_PROT
      );

      CALL "BCD (4stellig)_to_INT"
      (  BCD_Wert                    := #SFC_DB_LENGTH , 
         Int_Wert                    := #DB_Länge
      );

      L #SFC_RET_VAL;
      L 2#0000_0000_0000_0000;
      <>I;
      O #SFC_WRITE_PROT;
      SPB Err0;//kein Datenlisten-Bereich

NETWORK
TITLE = Datenlistekopf holen
//Quelle-Pointer erzeugen:
      L 16#1004;//Kennung 10 + Word=04
      T %LW0;//Any-Kennung, Datentyp
      L 16#000A;//10 Dw´s holen
      T %LW2;//Wiederholungen
      L #SSDB;
      T %LW4;//DB_Nummer
      L #SSDW;//Adresse
      SLD 3;
      L 16#8400_0000;//Kennung: Daten
      OD;
      T %LD6;//Kennung, Adresse

      CALL BLKMOV//1.-10.DW Datenliste holen
      {blk_type := 'Variant'}
      (  SRCBLK                      := #Quelle , 
         RET_VAL                     := #SFC_RET_VAL , 
         DSTBLK                      := P#L20.0 WORD 10
      );

      L #SFC_RET_VAL;
      L 2#0000_0000_0000_0000;
      <>I;
      SPB Err1;

NETWORK
TITLE = Zeigerüberprüfung
      L #Kopf;//Datenliste-Kopf
      L 16#DA;//= Datenlistekennung ?
      <>I;//Nein !
      SPB Err0;//kein Datenlistebereich

      L 1;
      L #Datensatzlaenge;//Datenblocklänge
      >I;
      SPB Err0;//kein Datenlistebereich

      L 128;
      >I;
      SPB Err0;//kein Datenlistebereich

      L 1;
      L #Listenlaenge;//Max.Anzahl von Datenblöcken
      >I;
      SPB Err0;//kein Datenlistebereich

      L 1;
      L #Stammdaten;//Anzahl der Stammdaten
      >I;
      SPB Err0;//kein Datenlistebereich

      L 9;
      >I;
      SPB Err0;//kein Datenlistebereich

      L #Stammdaten;//Anzahl der Stammdaten
      L #Datensatzlaenge;//Datenblocklänge
      >I;
      SPB Err0;//kein Datenlistebereich

      L #Listenlaenge;//Länge der Datenliste
      L #Datensatzlaenge;//Datenblocklänge
      *I;
      L 2;//DB byteorientiert
      *I;
      + 20;//Speichern ab 10.DW
      L #SSDW;
      +I;
      T #Datenlisten_Ende;
      ITD;
      SLD 3;
      T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)

      AUF DB[ #DBDatenliste];

      L #Datenlisten_Ende;
      L #DB_Länge;
      >I                       ;//Datenlisten-DB ist zu kurz!
      SPB Err0;//kein Datenlisten-Bereich

      L DBW[ #AR1Zeiger];
      L 16#DAEE;//Datenliste-Endekennung ?
      <>I;//Nein !
      SPB Err0;//kein Datenlisten-Bereich

NETWORK
TITLE = Indizierung löschen ?
      L #IndDB;//Indizierter DB
      L 0;//=0 ?
      ==I;//Kein indizierter DB !
      SPB Nw05;

      CALL "TEST_DB_TO_ATTR_DB"
      (  DB_Number                   := #IndDB , 
         RetVal                      := #SFC_RET_VAL , 
         DB_Length                   := #SFC_DB_LENGTH , 
         Write_Prot                  := #SFC_WRITE_PROT
      );

      CALL "BCD (4stellig)_to_INT"
      (  BCD_Wert                    := #SFC_DB_LENGTH , 
         Int_Wert                    := #DB_Länge
      );

      L #SFC_RET_VAL;
      L 2#0000_0000_0000_0000;
      <>I;
      O #SFC_WRITE_PROT;
      SPB Nw05;//kein Indizier-DB vorhanden

      L 0;
      ITD;
      SLD 3;
      T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)

      AUF DB[ #IndDB];

      L #DB_Länge   ;//In Bytes angegeben
L400:      T #Schleife;

      L 0;
      T DBB[ #AR1Zeiger]    ;//Inhalte löschen

      L #AR1Zeiger;
      SRD 3;
      L DINT#1;
      +D;
      SLD 3;
      T #AR1Zeiger;

      L #Schleife;
      LOOP L400;


NETWORK
TITLE = Datenliste löschen
Nw05:      L #SSDW;
      + 12                 ;//12.Dw
      ITD;
      SLD 3;
      T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)

      AUF DB[ #DBDatenliste];

      L 0;
      T DBW[ #AR1Zeiger]    ;//Letzte Speicherung löschen

      L #SSDW;
      + 16                ;//16.Dw
      ITD;
      SLD 3;
      T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)

      AUF DB[ #DBDatenliste];

      L 0;
      T DBW[ #AR1Zeiger]      ;//Anzahl Einträge löschen

      L #SSDW;
      + 20                 ;//Daten ab 20.Dw
      ITD;
      SLD 3;
      T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)

      L #Datensatzlaenge;
      L #Listenlaenge;
      *I;
L500:      T #Schleife;

      AUF DB[ #DBDatenliste];

      L 0;
      T DBW[ #AR1Zeiger]    ;//Inhalte löschen

      L #AR1Zeiger;
      SRD 3;
      L DINT#2;
      +D;
      SLD 3;
      T #AR1Zeiger;

      L #Schleife;
      LOOP L500;


NETWORK
TITLE = Fehlerausgabe / RET_VAL
      SET;//VKE = 1 ohne Fehler !!!
      SPA Ok;
Err0:      L 2#0000_0000_0000_0001;//Kein Fifobereich
      SPA Err;
Err1:      L 2#0000_0000_0000_0010;//SFC20-Aufruf mit Fehler

Err:      CLR;//VKE = 0 bei Fehler !!!
Ok:      T #RE_VAL;

      SAVE;//VKE in BIE-Bit speichern  

END_FUNCTION

