=== FC 87: DatenReset [STL] === INTERFACE: Input: SSDB : Int // Datenlisten-DB SSDW : Int // Datenlisten-1.DW Output: RE_VAL : Byte // Rückmeldung InOut: 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 Constant: Return: Ret_Val : Void --- NW 1: Schnittstellen-DB sinnvoll ? --- L SSDB T DBDatenliste CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBDatenliste, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT) CALL FC "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 JC Err0 // kein Datenlisten-Bereich --- NW 2: 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 SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 10) // 1.-10.DW Datenliste holen L SFC_RET_VAL L 2#0000_0000_0000_0000 <>I JC Err1 --- NW 3: Zeigerüberprüfung --- L Kopf // Datenliste-Kopf L 16#DA // = Datenlistekennung ? <>I // Nein ! JC Err0 // kein Datenlistebereich L 1 L Datensatzlaenge // Datenblocklänge >I JC Err0 // kein Datenlistebereich L 128 >I JC Err0 // kein Datenlistebereich L 1 L Listenlaenge // Max.Anzahl von Datenblöcken >I JC Err0 // kein Datenlistebereich L 1 L Stammdaten // Anzahl der Stammdaten >I JC Err0 // kein Datenlistebereich L 9 >I JC Err0 // kein Datenlistebereich L Stammdaten // Anzahl der Stammdaten L Datensatzlaenge // Datenblocklänge >I JC 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) OPN DB[DBDatenliste] L Datenlisten_Ende L "DB_Länge" >I // Datenlisten-DB ist zu kurz! JC Err0 // kein Datenlisten-Bereich L DBW [AR1Zeiger] L 16#DAEE // Datenliste-Endekennung ? <>I // Nein ! JC Err0 // kein Datenlisten-Bereich --- NW 4: Indizierung löschen ? --- L IndDB // Indizierter DB L 0 // =0 ? ==I // Kein indizierter DB ! JC Nw05 CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=IndDB, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT) CALL FC "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 JC Nw05 // kein Indizier-DB vorhanden L 0 ITD SLD 3 T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) OPN 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 --- NW 5: Datenliste löschen --- Nw05: L SSDW + 12 // 12.Dw ITD SLD 3 T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) OPN 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) OPN 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 OPN 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 --- NW 6: Fehlerausgabe / RET_VAL --- SET // VKE = 1 ohne Fehler !!! JU Ok Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich JU 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