553 lines
25 KiB
Plaintext
553 lines
25 KiB
Plaintext
=== 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
|
||
|
||
|