235 lines
9.1 KiB
Plaintext
235 lines
9.1 KiB
Plaintext
=== 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
|
||
|