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