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

503 lines
22 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 81: FifoOut [STL] ===
INTERFACE:
Input:
SSDB : Int // Schnittstellen-DB
SSDW : Int // Schnittstellen-1.DW
PARA : Word // Aufrufparameter (Auftrag / Anzahl Zusatzdaten)
Output:
OUTDATEN : Pointer // OutDaten-Schnittstelle
RE_VAL : Byte // Rückmeldung
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
Para1 : Byte // 1.Aufrufparameter
Para2 : Byte // 2.Aufrufparameter
Para21 : Byte // 2.Aufrufparameter 1.Stelle
Para22 : Byte // 2.Aufrufparameter 2.Stelle
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
Schleife : Word // Loopzähler
Offset : Byte // Offset 1. zu lesendes Zusatzwort
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
NixSave : Bool // Status nicht speichern
BieSpeicher : Bool // Bie-Bit zwischenspeichern
Lesezeiger : Int // Lesezeiger
Diff : Int // Differenz
Constant:
Return:
Ret_Val : Void
--- NW 1: Schnittstellen-DB sinnvoll ? ---
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
O SFC_WRITE_PROT
= NixSave // Status nicht speichern
JC Err0 // kein Fifobereich
--- NW 2: Quelle-Pointer erzeugen: ---
L 16#1004 // Kennung 10 + Word=04
T LW0 // 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
SLW 3 // Pointer erzeugen
LAR1
OPN DB[DBFifo]
L Fifo_Ende
L SFC_DB_LENGTH
>I // Fifo-DB ist zu kurz!
JC Err0 // kein Fifo-Bereich
L DBW [AR1,]
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 Zus // Zusatzdaten lesen ?
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
--- NW 4: Zusatzdaten lesen ? ---
Zus: L PARA
T LW33 // Aufrufparameter zwischenspeichern
L 16#E2 // Nur Zusatzdaten lesen ?
L Para1 // 1.Aufrufparameter
==I // Ja !
A(
L Para2 // 2.Aufrufparameter
L 16#00 // =0 ?
==I // Ja !
)
JC Err3 // Falscher Aufrufparameter
L 16#00 // =0 ?
L Para2 // 2.Aufrufparameter
==I // Ja !
JC Nw05 // Keine Zusatzdaten lesen
L 16#00F0
AW
SRW 4
T Para21 // 1.Stelle isolieren
L Para2 // 2.Aufrufparameter
L 16#000F
AW
T Para22 // 2.Stelle isolieren
L Para21
L Para22
>I // 1.Stelle > 2.Stelle !
JC Err3 // Falscher Aufrufparameter
L 16#04
>I // 2.Stelle > 4 !
JC Err3 // Falscher Aufrufparameter
L Para21
L 16#00
==I // 1.Stelle = 0 !
JC Err3 // Falscher Aufrufparameter
// Quelle-Pointer erzeugen:
L 16#1004 // Kennung 10 + Word=04
T LW0 // Any-Kennung, Datentyp
T LW10 // Any-Kennung, Datentyp
L Para22 // bis
L Para21 // von
-I
+ 1
T LW2 // Wiederholungen
T LW12 // Wiederholungen
L Para21 // Beginn ab X.Zusatzwort
+ -1
L 2 // byteorientiert
*I
T Offset // Offset 1. zu speicherndes Zusatzwort
L SSDB
T LW4 // DB_Nummer
L SSDW
+ 12 // ab 6.Dw lesen
L Offset // falls nicht ab 1.Zusatzwort
+I
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
// Ziel-Pointer erzeugen:
// Kennung + Datenbytes s.o.
L 0
T LW14 // DB_Nummer
L 16#00F0 // Adresse (MW240)
L Offset // falls nicht ab 1.Zusatzwort
+I
SLD 3
L 16#8300_0000 // Kennung: Merker
OD
T LD16 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // Zusatz-Daten speichern
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
--- NW 5: Fifodaten lesen ---
Nw05: L Para1 // 1.Aufrufparameter
L 16#E2 // Nur Zusatzdaten lesen ?
==I // Ja !
JC Ende // Fertig !
L Anzahl // Anzahl der gespeicherten Datensätze
L 0
==I // Keine Datensätze vorhanden !
JC Err2 // Fifo ist leer
// Quelle-Pointer erzeugen:
L 16#1004 // Kennung 10 + Word=04
T LW0
T LW10 // Any-Kennung, Datentyp
L Datensatzlaenge // Datenbytes speichern
T LW2
T LW12 // Wiederholungen
L SSDB
T LW4 // DB_Nummer
L Holzeiger // Adresse (erstmal !, falls Para 2=0)
T Lesezeiger // Lesezeiger
L Para1 // 1.Aufrufparameter
L 16#00 // =0 ?
==I
O(
CAC
L 16#E1 // Datensatz löschen ?
==I // Ja !
)
JC w050
CAC // X-te Stelle lesen
+ -1 // -1, da 1.ohne Offeset
L Datensatzlaenge // Datenblocklänge
*I
L 2 // DB byteorientiert
*I
L Holzeiger // Adresse
+I
T Lesezeiger // Lesezeiger
L MaxHolzeiger // Maximum Holzeiger
<=I // Ist nicht über Maximum !
JC w050
L FifoLaenge // Länge FIFO (in Word)
L Datensatzlaenge // Datenblocklänge
*I
L 2 // DB byteorientiert
*I
T Diff
L Lesezeiger // Differenz subtrahieren:
L Diff
-I
T Lesezeiger // Lesezeiger
w050: L Lesezeiger // Lesezeiger
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
// Ziel-Pointer erzeugen:
// Kennung + Datenbytes s.o.
// DATEN-Pointer übernehmen:
L P#
LAR1
L NoneW [AR1,]
T LW14 // DB_Nummer
L NoneD [AR1,]
T LD16 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // FIFO-Daten speichern
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
--- NW 6: Daten aus Fifo austragen ? ---
L 16#E1 // Daten löschen ?
L Para1 // 1.Aufrufparameter
<>I // Nein !
JC Ende // Fertig !
L Holzeiger // Holzeiger
SLW 3 // Pointer erzeugen
LAR1
OPN DB[DBFifo]
L Datensatzlaenge
L600: T Schleife
L 0
T DBW [AR1,]
ADDAR1 P#2.0
L Schleife
LOOP L600
--- NW 7: Holzeiger, Anzahl erniedrigen ---
L Datensatzlaenge // Datenblocklänge
L 2 // 1 word = 2 bytes
*I
L Holzeiger // Holzeiger
+I
T Holzeiger // Holzeiger
L MaxHolzeiger // Maximum Holzeiger
<=I // Erreicht ?
JC W700 // Nein !
L MinHolzeiger // Minimum Holzeiger
T Holzeiger // Holzeiger
W700: L Anzahl // Anzahl der gespeicherten Datensätze
+ -1
T Anzahl // Anzahl der gespeicherten Datensätze
--- NW 8: Versatz Bring-/Holzeiger ---
L Bringzeiger // Bringzeiger
L Holzeiger // Holzeiger
==I // Identisch !
A(
L Anzahl // Anzahl der gespeicherten Datensätze
L 0
<>I // Datensätze aber noch vorhanden !
)
JC Err7 // Versatz Bring-/Holzeiger
L Bringzeiger // Bringzeiger
L Holzeiger // Holzeiger
<>I // Ungleich !
A(
L Anzahl // Anzahl der gespeicherten Datensätze
L 0
==I // Aber keine Datensätze vorhanden !
)
JC Err7 // Versatz Bring-/Holzeiger
--- NW 9: 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
Err3: S L32.3 // Falscher Parameter
JU Err
Err6: S L32.6 // Holzeiger außerhalb
JU Err
Err7: S L32.7 // Versatz Bring-/Holzeiger
Err: CLR // VKE = 0 bei Fehler !!!
Ok: L Err
T RE_VAL
L Status
OW
T Status
SAVE // VKE in BIE-Bit speichern
A ?SW?
= BieSpeicher
--- NW 10: Fifokopfdaten speichern ---
A L32.0 // Falscher Parameter
A NixSave // Status nicht speichern
BEC
// Ziel-Pointer erzeugen:
L 16#1004 // Kennung 10 + Word=04
T LW10 // Any-Kennung, Datentyp
L 16#0004 // 4Dw´s speichern
T LW12 // Wiederholungen
L SSDB
T LW14 // DB_Nummer
L SSDW // Adresse
L 4
+I
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD16 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=P#L24.0 WORD 4, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // Ab Bringzeiger sichern!
A BieSpeicher
SAVE // VKE in BIE-Bit speichern