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

553 lines
25 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 85: DatenIn [STL] ===
INTERFACE:
Input:
SSDB : Int // Datenlisten-DB
SSDW : Int // Datenlisten-1.DW
INDATEN : Pointer // InDaten-Schnittstelle
Output:
RE_VAL : Byte
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 !!!)
Schreibzeiger : Int // Speicherung des letzten Zugriffs / Schreibzeiger
Belegt14 : Int // reserviert von Sort-Datenliste
AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!)
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
AR2_Speicher : DWord // Adress-Register 2 zwischenspeichern
Schleife : Word // Loopzähler
DBInDaten : Word // Indaten-DB, falls angegeben
InDaten_Pointer : DWord // In-Daten-Pointer: Kennung, Adresse
InDaten_Startpunkt : Word // In-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)
LeerZeiger : Word // Zeiger für Leerzelle
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
Sortliste : Bool // Sortliste wird durchsucht
tRE_VAL : Byte // Rückmeldung
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
DB_Länge : Int
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
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: In-DATEN-Pointer übernehmen: ---
L P#
LAR2
L NoneW [AR2,]
T DBInDaten // Indaten-DB
L DBInDaten // Indaten-DB
L 0 // Angegeben ?
==I // Nein
JC W401
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBInDaten, 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 Indaten
L NoneD [AR2,] // Kennung, Adresse
L 16#00FF_FFFF // Ohne Kennung
AW
SRW 3 // Ohne Bit
T InDaten_Startpunkt
L Datensatzlaenge // Datenblocklänge
L 2 // DB byteorientiert
*I
L InDaten_Startpunkt
+I
L "DB_Länge"
>I // Indaten-DB ist zu kurz
JC Err4 // Undefinierte Indaten
W401: L NoneD [AR2,] // Kennung, Adresse
T InDaten_Pointer
LAR2
L DBInDaten // Indaten-DB
L 0 // Angegeben ?
==I // Nein
JC W402
OPN DB[DBInDaten]
W402: L NoneW [AR2,] // Indaten überprüfen
T Daten_1 // 1.Indaten speichern
L NoneD [AR2,] // Suchdaten überprüfen
T Daten_2 // 1.Suchdaten speichern
L Stammdaten
L400: T Schleife
L DBInDaten // Indaten-DB
L 0 // Angegeben ?
==I // Nein
JC W403
OPN DB[DBInDaten]
W403: L NoneW [AR2,] // Indaten überprüfen
L 0 // Etwas angegeben ?
<>I // Ja !
JC Nw05 // Weiter
ADDAR2 P#2.0
L Schleife
LOOP L400
JU Err4 // Undefinierte Indaten
--- NW 5: Indiziert speichern ? ---
Nw05: SET
R Indok // Indizierung möglich
R IndZeiger_ok // Indizier-Zeiger angegeben
L IndDB // Indizierter DB
L 0 // Angegeben ?
==I // Nein !
O Sortliste // Sortliste wird durchsucht
JC Nw06
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 Nw06 // kein Indizier-DB vorhanden
L IndDB_Laenge // Länge des Indizierten DB überschritten ?
L 2 // DB byteorientiert
*I
L "DB_Länge"
>I // Indizier-DB ist zu kurz
JC Nw06 // Zeiger ausserhalb Ind.DB
L Stammdaten // Stammdaten
L 3 // zu viele Stammdaten ?
>=I // Ja !
JC Nw06 // 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 Nw06 // Zeiger = 0
L IndDB_Laenge // Länge des Indizierten DB überschritten ?
L IndPointer // Stelle, wo Zeiger hinterlegt ist
<=I // Ja !
JC Nw06 // Zeiger ausserhalb Ind.DB
L 2
*I // DB byteorientiert
SLD 3 // Pointer erzeugen
T IndPointer // Pointer, wo Zeiger hinterlegt ist
OPN DB[IndDB] // Indizierter DB
L DBW [IndPointer]
T Schreibzeiger // Schreibzeiger
OPN DB[DBDatenliste] // Datenliste DB
SET
S Indok // Indizierung möglich
S IndZeiger_ok // Indizier-Zeiger angegeben
--- NW 6: Kontrolle auf gleiche Stammdaten ---
Nw06: L 0 // nicht gespeichert
T LeerZeiger // Zeiger Leerzelle
L Schreibzeiger // Schreibzeiger
L 0 // Angegeben ?
==I // Nein !
JC W600 // Suche bei 1.Datensatz beginnen
L Schreibzeiger // Schreibzeiger
+ -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 // Schreibzeiger nicht im Raster !
JC W600 // Suche bei 1.Datensatz beginnen
L 0 // Bei angegebener Stelle suchen
T Suchstelle // Such bei X-ten Datensatz
JU W601
W600: 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 Schreibzeiger // Schreibzeiger
W601: L Schreibzeiger // Schreibzeiger
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L InDaten_Pointer
LAR2
L Stammdaten // Anzahl der Stammdaten
L600: T Schleife
L DBInDaten // Indaten-DB
L 0 // Angegeben ?
==I // Nein
JC W602
OPN DB[DBInDaten]
W602: L NoneW [AR2,] // Indaten überprüfen mit
OPN DB[DBDatenliste]
L DBW [AR1Zeiger] // Datenliste-Daten lesen
<>I // nicht identisch !
JC W603
L AR1Zeiger
SRD 3
L DINT#2
+D
SLD 3
T AR1Zeiger
ADDAR2 P#2.0
L Schleife
LOOP L600
L 2#0000_0000_1100_0000 // Daten werden gespeichert + überschrieben
T tRE_VAL // Ok-Status
JU Nw07 // Datensatz ist in Liste enthalten
W603: L 0 // Suche bei 1.Datensatz begonnen
L Suchstelle // Such bei X-ten Datensatz
==I // Nein !
JC W600
L LeerZeiger // Zeiger Leerzelle
L 0 // Gespeichert ?
<>I // Ja !
JC W604
L Schreibzeiger // Schreibzeiger
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L Datensatzlaenge
L601: T Schleife
L DBW [AR1Zeiger] // Daten lesen
L 0 // Leerzelle ?
<>I // Nein !
JC W604
L AR1Zeiger
SRD 3
L DINT#2
+D
SLD 3
T AR1Zeiger
L Schleife
LOOP L601
L Schreibzeiger // Schreibzeiger
T LeerZeiger // Zeiger Leerzelle
W604: 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 W605 // Nein !
L 0 // Gefunden ?
L LeerZeiger // Zeiger Leerzelle
==I // Nein !
JC Err2 // Datenliste ist voll
T Schreibzeiger // Schreibzeiger
L 2#0000_0000_1000_0000 // Daten werden gespeichert
T tRE_VAL // Ok-Status
JU Nw07
W605: L Datenblock_inBytes // Datenblocklänge in bytes
L Schreibzeiger // Schreibzeiger
+I
T Schreibzeiger // Schreibzeiger
JU W601
--- NW 7: Quelle-Pointer erzeugen: ---
Nw07: 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 DBInDaten
T LW4 // DB_Nummer
L InDaten_Pointer
T LD6 // Kennung, Adresse
// Ziel-Pointer erzeugen:
// Kennung + Datenbytes s.o.
L SSDB
T LW14 // DB_Nummer
L Schreibzeiger // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
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 Sortliste // Sortliste wird durchsucht
JC Nw8
L SSDW
+ 12
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L Schreibzeiger // Schreibzeiger
OPN DB[DBDatenliste]
T DBW [AR1Zeiger] // Speicherung letzter Zugriff
L tRE_VAL // Ok-Status
L 2#0000_0000_1100_0000 // Daten werden gespeichert + überschrieben ?
==I // Ja !
O Indok // Indizierung möglich ((Dann nicht!)
JC Nw8 // Kein Neueintrag !
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 // Einträge +1
T DBW [AR1Zeiger] // Anzahl der Einträge
--- NW 8: Indizierung ok ? ---
Nw8: AN Indok // Indizierung möglich
O IndZeiger_ok // Indizier-Zeiger angegeben
JC Ende
OPN DB[IndDB] // Indizierter DB
L Schreibzeiger // Schreibzeiger
T DBW [IndPointer]
OPN DB[DBDatenliste] // Datenliste DB
--- NW 9: 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 // Datenliste ist voll
JU Err
Err4: L 2#0000_0000_0001_0000 // Undefinierte Indaten
Err: CLR // VKE = 0 bei Fehler !!!
Ok: T tRE_VAL
SAVE // VKE in BIE-Bit speichern
L AR2_Speicher // AR2 zurückspeichern
LAR2
--- NW 10: Ausgangsvariablen schreiben ---
L tRE_VAL
T RE_VAL