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

377 lines
17 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 83: FIFOSearch [STL] ===
INTERFACE:
Input:
SSDB : Int // Schnittstellen-DB
SSDW : Int // Schnittstellen-1.DW
SEARCHDATEN : Pointer // SuchDaten-Schnittstelle
Laenge : Int // Anzahl der DWs zum Vergleichen im Datensatz
Output:
RE_POS : Int // Position des Eintrags, der gesuchten Daten
RE_VAL : Byte // Rückmeldungen
InOut:
Temp:
Quelle : Any // Zeiger, wo Rein-Daten sind
Ziel : Any // Zeiger, FIFO-Stelle
Kopf : Byte // Fifo-Kennung (FF)
Datensatzlaenge : Byte // Datensatzlänge in Word (1 - 128)
FifoLaenge : Int // Länge des Fifo (maximale Anzahl der Datensätze)
Bringzeiger : Int // Zeiger, wohin nächster Eintrag gespeichert wird
Holzeiger : Int // Zeiger, woher nächste Daten geholt werden
Anzahl : Int // Anzahl der Datensätze (eingetragene)
Status : Word // Status des Fifo
Err : Byte // Fehlerbits
MinHolzeiger : Int // Minimum Holzeiger
MaxHolzeiger : Int // Maximum Holzeiger
DBFifo : Word // FIFO-DB
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
Fifo_Ende : Word // Ende des Fifo
AR2_Speicher : DWord // Adress-Register 2 zwischenspeichern
DBSuchdaten : Word // Solldaten-DB, falls angegeben
SuchDaten_Startpunkt : Word // SuchDaten-Startpunkt: Adresse
SuchZeiger : Word // Suchzeiger
Schleife : Word // Loopzähler
NixSave : Bool // Status nicht speichern
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
AR1Start : DInt // Startwert mit Offset 0
sRE_POS : Int // Position des Eintrags, der gesuchten Daten
Constant:
Return:
Ret_Val : Void
--- NW 1: Schnittstellen-DB sinnvoll ? ---
TAR2
T AR2_Speicher // AR2 zwischenspeichern
L SSDB
T DBFifo
// CALL TEST_DB
// DB_NUMBER :=#DBFifo
// RET_VAL :=#SFC_RET_VAL
// DB_LENGTH :=#SFC_DB_LENGTH
// WRITE_PROT :=#SFC_WRITE_PROT
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBFifo, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
= NixSave // Status nicht speichern
O SFC_WRITE_PROT
JC Err0 // kein Fifobereich
--- NW 2: Quelle-Pointer erzeugen: ---
L 16#1004 // Kennung 10 + Word=04
T sRE_POS // Any-Kennung, Datentyp
L 16#0006 // 6 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 6) // 1.-6.DW FIFO holen
L Status
L 2#0000_0000_1110_0000
AW
T Err
JP Err // Kapitalfehler vorhanden
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
--- NW 3: Zeigerüberprüfung ---
L Kopf // Fifo-Kopf
L 16#FF // = Fifokennung ?
<>I // Nein !
= NixSave // Status nicht speichern
JC Err0 // kein Fifobereich
L 1
L Datensatzlaenge // Datenblocklänge
>I
JC Err0 // kein Fifobereich
L 128
>I
JC Err0 // kein Fifobereich
L 1
L FifoLaenge // Max.Anzahl von Datenblöcken
>I
JC Err0 // kein Fifobereich
L SSDW
+ 40 // Speichern ab 20.DW
T MinHolzeiger // Minimum Holzeiger
L FifoLaenge // Länge FIFO (in Word)
+ -1
L Datensatzlaenge // Datenblocklänge
*I
L 2 // DB byteorientiert
*I
+ 40 // Speichern ab 20.DW
L SSDW
+I
T MaxHolzeiger // Maximum Holzeiger
L Datensatzlaenge // Datenblocklänge
L 2 // DB byteorientiert
*I
L MaxHolzeiger // Maximum Holzeiger
+I // Zeiger Endekennung
T Fifo_Ende
ITD
T AR1Start // Startwert mit Offset 0
SLD 3
T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBFifo]
L Fifo_Ende
L SFC_DB_LENGTH
>I // Fifo-DB ist zu kurz!
JC Err0 // kein Fifo-Bereich
L DBW [AR1Zeiger]
L 16#FFEE // Fifo-Endekennung ?
<>I // Nein !
JC Err0 // kein Fifobereich
L MinHolzeiger // Minimum Holzeiger
L Holzeiger // Holzeiger
<=I // Ok ?
JC W300 // Ja!
L 0 // Grundstellung ?
<>I // Nein !
JC Err6 // Holzeiger ist ausserhalb
L Bringzeiger // Bringzeiger Grundstellung ?
<>I // Nein !
JC Err6 // Holzeiger ist ausserhalb
L Anzahl // Anzahl Datensätze
L 0 // Grundstellung ?
<>I // Nein !
JC Err6 // Holzeiger ist ausserhalb
L MinHolzeiger // Minimum Holzeiger
T Bringzeiger // Bringzeiger
T Holzeiger // Holzeiger
JU Err2 // Fifo ist leer
W300: L MaxHolzeiger // Maximum Holzeiger
<=I // Ok ?
JC W301 // Ja!
JU Err6 // Holzeiger ist ausserhalb
W301: L Bringzeiger // Bringzeiger
L Holzeiger // Holzeiger
==I // Identisch !
A(
L FifoLaenge
L Anzahl // Anzahl der gespeicherten Datensätze
<>I // Fifo noch nicht voll !
)
A(
L 0
<>I // Datensätze aber noch vorhanden !
)
JC Err7 // Versatz Bring-/Holzeiger
L Bringzeiger // Bringzeiger
L Holzeiger // Holzeiger
<>I // Ungleich !
A(
L FifoLaenge
L Anzahl // Anzahl der gespeicherten Datensätze
==I // Aber Fifo ist voll !
O(
L 0
==I // Aber keine Datensätze vorhanden !
)
)
JC Err7 // Versatz Bring-/Holzeiger
L Anzahl // Anzahl der gespeicherten Datensätze
L 0
==I // Keine Datensätze vorhanden !
JC Err2 // Fifo ist leer
--- NW 4: Fifodaten suchen ---
L 1
T sRE_POS // RET-POS
L Holzeiger // Holzeiger
T SuchZeiger // Suchzeiger
W400: ITD
T AR1Start // Startwert mit Offset 0
SLD 3
T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
// DATEN-Pointer übernehmen:
L P#
LAR2
L NoneW [AR2,]
T DBSuchdaten // Solldaten-DB
L DBSuchdaten // Solldaten-DB
L 0 // Angegeben ?
==I // Nein
JC W401
// CALL TEST_DB
// DB_NUMBER :=#DBSuchdaten
// RET_VAL :=#SFC_RET_VAL
// DB_LENGTH :=#SFC_DB_LENGTH
// WRITE_PROT :=#SFC_WRITE_PROT
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBSuchdaten, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
L SFC_RET_VAL
L 2#0000_0000_0000_0000 // Fehler vorhanden ?
<>I // Ja !
JC Err1 // SFC20-Aufruf mit Fehler
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 SFC_DB_LENGTH
>I // Indaten-DB ist zu kurz
JC Err1 // SFC20-Aufruf mit Fehler
W401: L NoneD [AR2,] // Kennung, Adresse
LAR2
L Laenge // Anzahl der DWs zum Vergleichen im Datensatz
L400: T Schleife
L DBSuchdaten // Solldaten-DB
L 0 // Angegeben ?
==I // Nein
JC W402
OPN DB[DBSuchdaten]
W402: L NoneW [AR2,] // Mit Solldaten überprüfen
OPN DB[DBFifo]
L DBW [AR1Zeiger] // Fifo-Daten lesen
<>I // nicht identisch !
JC W403
L AR1Start // Startwert mit Offset 0
+ DINT#2
T AR1Start // Startwert mit nächstem Offset
SLD 3
T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
ADDAR2 P#2.0
L Schleife
LOOP L400
JU Ende // Datensatz ist in Fifo enthalten
W403: L sRE_POS // RET-POS
+ 1
T sRE_POS // RET-POS
L Anzahl // Anzahl der Daten im Fifo
>I // Alle Datensätze sind durchsucht
JC Err2
L Datensatzlaenge // Datenblocklänge
L 2 // DB byteorientiert
*I
L SuchZeiger // Suchzeiger
+I
T SuchZeiger // Suchzeiger
L MaxHolzeiger // Maximum Holzeiger
<=I // Ende erreicht? Nein!
JC W404
L MinHolzeiger // Minimum Holzeiger
T SuchZeiger
W404: L SuchZeiger // Suchzeiger
JU W400
--- NW 5: Fehlerausgabe / RET_VAL ---
Ende: SET // VKE = 1 ohne Fehler !!!
JU Ok
Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich
T Err
JU Err
Err1: S L32.1 // SFC20-Aufruf mit Fehler
JU Err
Err2: S L32.2 // Fifo ist leer
JU Err
Err6: S L32.6 // Holzeiger außerhalb
JU Err
Err7: S L32.7 // Versatz Bring-/Holzeiger
Err: L 0
T sRE_POS // RET-POS = 0
CLR // VKE = 0 bei Fehler !!!
Ok: L Err
T RE_VAL
L Status
OW
T Status
SAVE // VKE in BIE-Bit speichern
--- NW 6: Fifokopfdaten speichern ---
L AR2_Speicher // AR2 zurückspeichern
LAR2
A L32.0 // Falscher Parameter
A NixSave // Status nicht speichern
BEC
L SSDW
+ 10 // Status
ITD
T AR1Start // Startwert mit Offset 0
SLD 3
T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBFifo]
L Err
T DBW [AR1Zeiger]
--- NW 7: ---
L sRE_POS
T RE_POS