Files
HundM_awl/=A01+UH06-KF00/Programmbausteine/Module/DatenOut.awl
T

895 lines
39 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
=== FC 86: DatenOut [STL] ===
INTERFACE:
Input:
SSDB : Int // Datenlisten-DB
SSDW : Int // Datenlisten-1.DW
PARA : Word // Aufrufparameter (Auftrag / Anzahl Zusatzdaten)
SEARCHDATEN : Pointer // Such-Daten-Schnittstelle
Output:
RE_VAL : Byte // Rückmeldung
OUTDATEN : Pointer // OutDaten-Schnittstelle
Position : Int // Daten stehen an angegebener Position in Datenbank
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
AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!)
Reserve18 : Int // Reserve
Para1 : Byte // 1.Aufrufparameter
Para2 : Byte // 2.Aufrufparameter
DBDatenliste : Word // Datenlisten-DB
OffsetDaten_1 : Int // Stammdaten beginnen ab hier
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
Datenlisten_Ende : Int // Ende der Datenliste
AR2_Speicher : DWord // Adress-Register 2 zwischenspeichern
Schleife : Word // Loopzähler
DBSuchDaten : Word // Such-Daten-DB, falls angegeben
SuchDaten_Pointer : DWord // Such-Daten-Pointer: Kennung, Adresse
SuchDaten_Startpunkt : Word // Such-Daten-Startpunkt: Adresse
DBOutDaten : Word // Out-Daten-DB, falls angegeben
OutDaten_Pointer : DWord // Out-Daten-Pointer: Kennung, Adresse
OutDaten_Startpunkt : Word // Out-Daten-Startpunkt: Adresse
IndPointer : DWord // Zeiger für IndDB
Daten_1 : Word // 1.Datenwort der Indaten
Daten_2 : DWord // 1+2.Datenwort der Indaten (falls ind.Suchen mit Stammdaten 2)
Datenblock_inBytes : Word // Datenblocklänge in Bytes
Suchstelle : Word // Bei angegebenen Datensatz suchen
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
Indok : Bool // Indizierung möglich
IndZeiger_ok : Bool // Indizier-Zeiger angegeben
Weitersuchen : Bool // Weitersuchen ist aktiv
Offsetsuchen : Bool // Offsetsuchen ist aktiv
Sortliste : Bool // Sortliste wird durchsucht
WandelFC : Bool // Wnadel-FC für ind.Suchen vorhanden
tRE_VAL : Byte // Rückmeldung
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
DB_Länge : Int
NichtCopy : Int // Datenmenge, die nicht vorschoben wird
LoeschPos : Word // Lösch-Position
Wandel_FC : Word // Wandel-FC
Constant:
Return:
Ret_Val : Void
--- NW 1: Schnittstellen-DB sinnvoll ? ---
TAR2
T AR2_Speicher // AR2 zwischenspeichern
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 // schreibgeschützt
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#DB // = Sort-Datenlistekennung ?
==I // Ja !
= Sortliste // Sortliste wird durchsucht
JC w030
CAC
L 16#DA // = Datenlistekennung ?
<>I // Nein !
JC Err0 // kein Datenlistebereich
w030: 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 !
A(
CAC
L 16#DBEE // Sort-Datenliste-Endekennung ?
<>I // Nein !
)
JC Err0 // kein Datenlisten-Bereich
L Datensatzlaenge // Datenblocklänge
L 2
*I
T Datenblock_inBytes // Datenblocklänge in Bytes
--- NW 4: Auftrag kontrollieren ---
SET
R Indok // Indizierung möglich
R IndZeiger_ok // Indizier-Zeiger angegeben
R Weitersuchen // Weitersuchen ist aktiv
R Offsetsuchen // Offsetsuchen ist aktiv
L 0 // Vorerst kein Offset
T OffsetDaten_1
L PARA
T LW40 // Aufrufparameter zwischenspeichern
L 16#00 // XX = 00 ?
L Para1
==I // Ja!
JC W401
L 16#E1 // XX = E1 ?
==I // Ja!
A Sortliste // Sortliste wird durchsucht
JC Err3 // Falscher Aufrufparameter (austragen nicht erlaubt !)
CAC
L 16#E1 // XX = E1 ?
==I // Ja!
JC W401
L 16#F1 // XX = F1 ?
L Para1
<>I // Nein !
JC W400
L Para2
L 16#00
<>I
O Sortliste // Sortliste wird durchsucht
JC Err3 // Falscher Aufrufparameter
SET
S Weitersuchen
L SSDW
+ 20
T Suchzeiger
JU Nw08 // OutDaten ok ?
W400: L 16#FF // XX = FF ?
<>I // Nein !
JC W403
L Para2
L 16#00
<>I
O Sortliste // Sortliste wird durchsucht
JC Err3 // Falscher Aufrufparameter
SET
S Weitersuchen
L Suchzeiger // Alter Suchzeiger
L Datenblock_inBytes // Datenblocklänge in bytes
+I // Nächsten Datensatz suchen
T Suchzeiger // Neuer Suchzeiger
L Datenblock_inBytes // Datenblocklänge in bytes
L Listenlaenge // Alle möglichen Einträge
*I // Gesamtlänge
L SSDW // Startpunkt
+I
+ 20 // Offset 1.Daten
L Suchzeiger // Schreibzeiger
>I // Noch nicht am Ende !
JC Nw08 // OutDaten ok ?
JU Err2 // Listenende erreicht
W403: L 16#02 // XX < 02 ?
L Para1
>I // Ja!
JC Err3 // Falscher Aufrufparameter
L 16#80 // XX > 80 ?
>I // Ja!
JC Err3 // Falscher Aufrufparameter
CAC
L Datensatzlaenge // XX > Datensatzlänge
>I // Ja!
JC Err3 // Falscher Aufrufparameter
CAC
+ -1 // Angegebener Offset -1
L 2 // DB byteorientiert
*I
T OffsetDaten_1 // Richtiger Offset der 1.Stammdaten
L 0
T Suchzeiger // Suche ab Anfang
SET
S Offsetsuchen
W401: L 16#00 // =0 ?
L Para2 // 2.Aufrufparameter
==I // Ja !
JC W402
T Stammdaten // Anzahl der Stammdaten
L Datensatzlaenge // Datenblocklänge
>I
JC Err3 // Falscher Aufrufparameter
L 1
L Stammdaten // Anzahl der Stammdaten
>I
JC Err3 // Falscher Aufrufparameter
L 9
>I
JC Err3 // Falscher Aufrufparameter
W402: AN Offsetsuchen
JC Nw05
L Para1 // Offset
+ -1
L Stammdaten
+I // Letzte Stammdaten zu groß ?
L Datensatzlaenge
>I // Ja!
JC Err3 // Falscher Aufrufparameter
--- NW 5: Such-DATEN-Pointer übernehmen: ---
Nw05: L 0
T Suchzeiger // Suchzeiger
L P#
LAR2
L NoneW [AR2,]
T DBSuchDaten // Suchdaten-DB
L NoneD [AR2,] // Kennung, Adresse
T SuchDaten_Pointer
L DBSuchDaten // Suchdaten-DB
L 0 // Angegeben ?
==I // Nein
JC W501
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBSuchDaten, 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 // Fehler vorhanden ?
<>I // Ja !
JC Err4 // Undefinierte Stammdaten
L NoneD [AR2,] // Kennung, Adresse
L 16#00FF_FFFF // Ohne Kennung
AW
SRW 3 // Ohne Bit
T SuchDaten_Startpunkt
L Datensatzlaenge // Datenblocklänge
L 2 // DB byteorientiert
*I
L SuchDaten_Startpunkt
+I
L "DB_Länge"
>I // Suchdaten-DB ist zu kurz
JC Err4 // Undefinierte Stammdaten
W501: L SuchDaten_Pointer
LAR2
L DBSuchDaten // Suchdaten-DB
L 0 // Angegeben ?
==I // Nein
JC W502
OPN DB[DBSuchDaten]
W502: L NoneW [AR2,] // Suchdaten überprüfen
T Daten_1 // 1.Suchdaten speichern
L NoneD [AR2,] // Suchdaten überprüfen
T Daten_2 // 1.Suchdaten speichern
L Stammdaten
L500: T Schleife
L DBSuchDaten // Suchdaten-DB
L 0 // Angegeben ?
==I // Nein
JC W503
OPN DB[DBSuchDaten]
W503: L NoneW [AR2,] // Suchdaten überprüfen
L 0 // Etwas angegeben ?
<>I // Ja !
JC Nw06 // Weiter
ADDAR2 P#2.0
L Schleife
LOOP L500
JU Err4 // Undefinierte Stammdaten
--- NW 6: Indiziert suchen ? ---
Nw06: L IndDB // Indizierter DB
L 0 // =0 ?
==I // Kein indizierter DB !
O Offsetsuchen
O Sortliste // Sortliste wird durchsucht
JC Nw07
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 Nw07 // kein Indizier-DB vorhanden
L IndDB_Laenge // Länge des Indizierten DB überschritten ?
L DINT#2 // DB byteorientiert
*D
L "DB_Länge"
>I // Indizier-DB ist zu kurz
JC Nw07 // Zeiger ausserhalb Ind.DB
L Stammdaten // Stammdaten
L 3 // zu viele Stammdaten ?
>=I // Ja !
JC Nw07 // ohne Indizierung weiter
L IndDaten_FC // Offset zum Abziehen
T Wandel_FC
L 0 // Parameter vorhanden ?
<=I // Nein
JC NoFC // Bei diesem Schritt weiter
L Daten_1 // Stammdaten (1.DW)
T "MW90" // übergeben
L Daten_2 // Stammdaten (2.DW)
T "MD94" // übergeben
UC DB[Wandel_FC] // Beeinflussung der Weiterfahrt
L "MW92" // Rückwert von FC
JU Ret
NoFC: L Daten_1 // Stammdaten
Ret: T IndPointer // Stelle, wo Zeiger hinterlegt ist
L 0
<I // negativ
JC Nw07 // Zeiger = 0
L IndDB_Laenge // Länge des Indizierten DB überschritten ?
L IndPointer // Stelle, wo Zeiger hinterlegt ist
<=I // Ja !
JC Nw07 // Zeiger ausserhalb Ind.DB
L 2
*I // DB byteorientiert
ITD
SLD 3 // Pointer erzeugen
T IndPointer // Pointer, wo Zeiger hinterlegt ist
OPN DB[IndDB] // Indizierter DB
L DBW [IndPointer]
T Suchzeiger // Suchzeiger
OPN DB[DBDatenliste] // Datenliste DB
SET
S Indok // Indizierung möglich
S IndZeiger_ok // Indizier-Zeiger angegeben
--- NW 7: Kontrolle auf gleiche Stammdaten ---
Nw07: L Suchzeiger // Suchzeiger
L 0 // Angegeben ?
==I // Nein !
JC W700 // Suche bei 1.Datensatz beginnen
L Suchzeiger // Suchzeiger
+ -20 // Zeiger 1.Daten
L Datenblock_inBytes // Datenblocklänge in Bytes
/I // Ermittlung der wievielten Daten -1
SRD 16 // Rest ermitteln
L 0 // = 0 ?
<>I // Suchzeiger nicht im Raster !
JC W700 // Suche bei 1.Datensatz beginnen
L 0 // Bei angegebener Stelle suchen
T Suchstelle // Such bei X-ten Datensatz
JU W701
W700: L 1 // Suche bei 1.Datensatz beginnen
T Suchstelle // Such bei X-ten Datensatz
SET
R IndZeiger_ok // Indizier-Zeiger angegeben
L SSDW
+ 20 // Offset für 1.Daten
T Suchzeiger // Suchzeiger
W701: L Suchzeiger // Suchzeiger
L OffsetDaten_1 // Richtiger Offset der 1.Stammdaten
+I
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L SuchDaten_Pointer
LAR2
L Stammdaten // Anzahl der Stammdaten
L700: T Schleife
L DBSuchDaten // Suchdaten-DB
L 0 // Angegeben ?
==I // Nein
JC W702
OPN DB[DBSuchDaten]
W702: L NoneW [AR2,] // Suchdaten überprüfen mit
OPN DB[DBDatenliste]
L DBW [AR1Zeiger] // Datenliste-Daten lesen
<>I // nicht identisch !
JC W703
L AR1Zeiger
SRD 3
L DINT#2
+D
SLD 3
T AR1Zeiger
ADDAR2 P#2.0
L Schleife
LOOP L700
L 2#0000_0000_1000_0000 // Daten sind vorhanden
T tRE_VAL // Ok-Status
JU Nw08 // Datensatz ist in Liste enthalten
W703: L 0 // Suche bei 1.Datensatz begonnen
L Suchstelle // Such bei X-ten Datensatz
==I // Nein !
JC W700
L Suchstelle // Such bei X-ten Datensatz
+ 1
T Suchstelle // Such bei X-ten Datensatz
L Listenlaenge // Anzahl aller Daten in Datenliste
<=I // Alle Datensätze sind durchsucht
JC W705 // Nein !
JU Err6 // Datensatz ist nicht vorhanden
W705: L Datenblock_inBytes // Datenblocklänge in bytes
L Suchzeiger // Suchzeiger
+I
T Suchzeiger // Suchzeiger
JU W701
--- NW 8: Out-DATEN-Pointer übernehmen: ---
Nw08: L P#
LAR2
L NoneW [AR2,]
T DBOutDaten // Outdaten-DB
L NoneD [AR2,] // Kennung, Adresse
T OutDaten_Pointer
L DBOutDaten // Outdaten-DB
L 0 // Angegeben ?
==I // Nein
JC Nw09
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBOutDaten, 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 // Fehler vorhanden ?
<>I // Ja !
JC Err5 // Undefinierte Outdaten
L NoneD [AR2,] // Kennung, Adresse
L 16#00FF_FFFF // Ohne Kennung
AW
SRW 3 // Ohne Bit
T OutDaten_Startpunkt
L OutDaten_Startpunkt
L "DB_Länge"
>I // Outdaten-DB ist zu kurz
JC Err5 // Undefinierte Outdaten
--- NW 9: Quelle-Pointer erzeugen: ---
Nw09: L 16#1004 // Kennung 10 + Word=04
T LW0
T LW10 // Any-Kennung, Datentyp
L Datensatzlaenge // Datenwords speichern
T LW2
T LW12 // Wiederholungen
// DATEN-Pointer übernehmen:
L SSDB
T LW4 // DB_Nummer
L Suchzeiger // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
// Ziel-Pointer erzeugen:
// Kennung + Datenbytes s.o.
L DBOutDaten
T LW14 // DB_Nummer
L OutDaten_Pointer
T LD16 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // Datenliste-Daten speichern
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
A SFC_WRITE_PROT // Datenliste kann nicht beschrieben werden
JC Nw10
L SSDW
+ 12 // Offset letzter Zugriff
ITD
SLD 3 // Pointer erzeugen
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L Suchzeiger // Suchzeiger
OPN DB[DBDatenliste]
T DBW [AR1Zeiger] // Speicherung letzter Zugriff
L Suchstelle // Such bei X-ten Datensatz
T Position // Übergabe nach außen
--- NW 10: Daten aus Datenliste löschen ? (nicht indiziert!) ---
Nw10: L 16#E1 // Daten löschen ?
L Para1 // 1.Aufrufparameter
<>I // Nein !
O SFC_WRITE_PROT // Datenliste kann nicht beschrieben werden
JC Nw11
A Indok // Indizierung möglich
JC X010 // Bei ind.Zugriff nur löschen, nicht verschieben, keine Anzahl!
// Gemeinsame Daten für Pointer erzeugen:
L 16#1004 // Kennung 10 + Word=04
T LW0
T LW10 // Any-Kennung, Datentyp
L Suchzeiger // Stelle, wo gelöscht werden soll
+ -20
L SSDW
-I
L Datenblock_inBytes // Datenblocklänge in bytes
/I
+ 1 // Stelle, die gelöscht werden soll
T LoeschPos // Lösch-Position
L Listenlaenge // Länge der Datenliste (Letzter Eintrag zum Löschen ?)
==I // Ja !
JC Last // Ohne Verschieben letzten Eintrag löschen
L LoeschPos // Lösch-Position
L Datensatzlaenge // Datenblocklänge
*I // Gesamtdatenlänge in Words
T NichtCopy // Datenmenge, die nicht vorschoben wird
L Listenlaenge // Länge der Datenliste
L Datensatzlaenge // Datenblocklänge
*I // Gesamtdatenlänge in Words
L NichtCopy // Datenmenge, die nicht vorschoben wird
-I // abziehen
T LW2
T LW12 // Wiederholungen
L SSDB
T LW4
T LW14 // DB_Nummer
// Quelle-Pointer erzeugen:
L Suchzeiger // Stelle, wo gelöscht werden soll
L Datenblock_inBytes // Datenblocklänge in Bytes
+I
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
// Ziel-Pointer erzeugen:
L Suchzeiger // Stelle, wo gelöscht werden soll
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD16 // Kennung, Adresse
// Daten verschieben:
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // DatenSortliste-Daten verschieben
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
// Letzte Daten löschen:
Last: L Datenlisten_Ende // Ende des Datenbereichs
L Datenblock_inBytes // Datenblocklänge in Bytes
-I // Ab hier löschen !
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L Datensatzlaenge // Datensatzlänge
L080: T Schleife
OPN DB[DBDatenliste]
L 0 // Daten löschen
T DBW [AR1Zeiger]
L AR1Zeiger
SRD 3
L 2 // nächstes DW
+D
SLD 3
T AR1Zeiger
L Schleife
LOOP L080
// Speicherung letzter Zugriff:
L SSDW
+ 12 // Offset letzter Zugriff
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBDatenliste]
L 0 // löschen
T DBW [AR1Zeiger] // Speicherung letzter Zugriff
T Suchzeiger // Suchzeiger
SET
R IndZeiger_ok // Indizier-Zeiger angegeben
// Anzahl Einträge:
L SSDW
+ 16 // Offset Anzahl Einträge
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBDatenliste]
L DBW [AR1Zeiger] // Anzahl der Einträge
+ -1 // -1
T DBW [AR1Zeiger] // Anzahl der Einträge
L 0
>=I
JC w080
T DBW [AR1Zeiger] // Minimum übergeben
w080: JU Nw11
--- NW 11: Daten aus Datenliste löschen ? (indiziert) ---
X010: L 16#E1 // Daten löschen ?
L Para1 // 1.Aufrufparameter
<>I // Nein !
JC Nw11
L Suchzeiger // Suchzeiger
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBDatenliste]
L Datensatzlaenge
LA00: T Schleife
L 0
T DBW [AR1Zeiger]
L AR1Zeiger
SRD 3
L DINT#2
+D
SLD 3
T AR1Zeiger
L Schleife
LOOP LA00
L SSDW
+ 12
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L 0 // Löschen
T Suchzeiger // Suchzeiger
T DBW [AR1Zeiger]
SET
R IndZeiger_ok // Indizier-Zeiger angegeben
--- NW 12: Weitersuchen aktiv ? Datensatz vorhanden oder 0 ? ---
Nw11: AN Weitersuchen
JC Nw12
L OutDaten_Pointer
LAR2
L Datensatzlaenge
L110: T Schleife
L DBOutDaten // Outdaten-DB
L 0 // Angegeben ?
==I // Nein
JC W111
OPN DB[DBOutDaten]
W111: L NoneW [AR2,] // Outdaten überprüfen
L 0 // Etwas angegeben ?
<>I // Ja !
JC W112 // Ok
ADDAR2 P#2.0
L Schleife
LOOP L110
L 2#0000_0000_0100_0000 // Daten sind nicht vorhanden
T tRE_VAL // Ok-Status
JU Ende
W112: L 2#0000_0000_1000_0000 // Daten sind vorhanden
T tRE_VAL // Ok-Status
JU Ende
--- NW 13: Indizierung ok ? ---
Nw12: AN Indok // Indizierung möglich
O IndZeiger_ok // Indizier-Zeiger angegeben
JC Ende
OPN DB[IndDB] // Indizierter DB
L Suchzeiger // Suchzeiger
T DBW [IndPointer]
OPN DB[DBDatenliste] // Datenliste DB
--- NW 14: Fehlerausgabe / RET_VAL ---
Ende: SET // VKE = 1 ohne Fehler !!!
L tRE_VAL // Ok-Status
JU Ok
Err0: L 2#0000_0000_0000_0001 // Kein Datenlistebereich
JU Err
Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler
JU Err
Err2: L 2#0000_0000_0000_0100 // Listenende ist erreicht
JU Err
Err3: L 2#0000_0000_0000_1000 // Falscher Parameter bei Aufruf
JU Err
Err4: L 2#0000_0000_0001_0000 // Undefinierte Suchdaten
JU Err
Err5: L 2#0000_0000_0010_0000 // Undefinierte OUTDaten
JU Err
Err6: L 2#0000_0000_0100_0000 // Datensatz nicht vorhanden
Err: CLR // VKE = 0 bei Fehler !!!
Ok: T tRE_VAL
SAVE // VKE in BIE-Bit speichern
L AR2_Speicher // AR2 zurückspeichern
LAR2
--- NW 15: Ende ---
L tRE_VAL
T RE_VAL