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

424 lines
11 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.
FUNCTION "FIFOSearch" : Void
TITLE = Fifo-Modul
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : IBAE
FAMILY : FIFO
NAME : FifoIn
VERSION : 0.1
//COPYRIGHT by Ingenieurbüro A.Emmert
//Ortsstr.33, D-869925 Fuchstal (Germany)
//Tel.: 0049(0)8243-960629
//Version: KyungBang00 / 14.04.2009
//
//Datenblock in Fifo suchen
//SSDB: FIFO-DB
//SSDW: FIFO-1.DW
//SEARCHDATEN: Pointer, wo zu suchende Daten stehen (P#DB1.DBX0.0, P#M220.0)
//RE_POS: Position an welcher sich Datensatz befindet
//RE_VAL: Rückmeldungen:
// Bit0: Kein Fifobereich / falscher Kopfinhalt / Endekennung
// Bit1: SFC20-Aufruf mit Fehler
// Bit2: Fifo ist leer
// Bit3: Frei
// Bit4: Frei
// Bit5: Bringzeiger ist ausserhalb
// Bit6: Holzeiger ist ausserhalb
// Bit7: Versatz Bring-/Holzeiger
//
VAR_INPUT
SSDB : Int; // Schnittstellen-DB
SSDW : Int; // Schnittstellen-1.DW
SEARCHDATEN : Pointer; // SuchDaten-Schnittstelle
Laenge : Int; // Anzahl der DWs zum Vergleichen im Datensatz
END_VAR
VAR_OUTPUT
RE_POS : Int; // Position des Eintrags, der gesuchten Daten
RE_VAL : Byte; // Rückmeldungen
END_VAR
VAR_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
END_VAR
BEGIN
NETWORK
TITLE = 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 "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;
SPB Err0;//kein Fifobereich
NETWORK
TITLE = Fifokopfdaten holen
//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 BLKMOV//1.-6.DW FIFO holen
{blk_type := 'Variant'}
( SRCBLK := #Quelle ,
RET_VAL := #SFC_RET_VAL ,
DSTBLK := P#L20.0 WORD 6
);
L #Status;
L 2#0000_0000_1110_0000;
UW;
T #Err;
SPP Err;//Kapitalfehler vorhanden
L #SFC_RET_VAL;
L 2#0000_0000_0000_0000;
<>I;
SPB Err1;
NETWORK
TITLE = Zeigerüberprüfung
L #Kopf;//Fifo-Kopf
L 16#FF;//= Fifokennung ?
<>I;//Nein !
= #NixSave;//Status nicht speichern
SPB Err0;//kein Fifobereich
L 1;
L #Datensatzlaenge;//Datenblocklänge
>I;
SPB Err0;//kein Fifobereich
L 128;
>I;
SPB Err0;//kein Fifobereich
L 1;
L #FifoLaenge;//Max.Anzahl von Datenblöcken
>I;
SPB 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)
AUF DB[ #DBFifo];
L #Fifo_Ende;
L #SFC_DB_LENGTH;
>I;//Fifo-DB ist zu kurz!
SPB Err0;//kein Fifo-Bereich
L DBW[ #AR1Zeiger];
L 16#FFEE;//Fifo-Endekennung ?
<>I;//Nein !
SPB Err0;//kein Fifobereich
L #MinHolzeiger;//Minimum Holzeiger
L #Holzeiger;//Holzeiger
<=I;//Ok ?
SPB W300;//Ja!
L 0;//Grundstellung ?
<>I;//Nein !
SPB Err6;//Holzeiger ist ausserhalb
L #Bringzeiger;//Bringzeiger Grundstellung ?
<>I;//Nein !
SPB Err6;//Holzeiger ist ausserhalb
L #Anzahl;//Anzahl Datensätze
L 0;//Grundstellung ?
<>I;//Nein !
SPB Err6;//Holzeiger ist ausserhalb
L #MinHolzeiger;//Minimum Holzeiger
T #Bringzeiger;//Bringzeiger
T #Holzeiger;//Holzeiger
SPA Err2;//Fifo ist leer
W300: L #MaxHolzeiger;//Maximum Holzeiger
<=I;//Ok ?
SPB W301;//Ja!
SPA Err6;//Holzeiger ist ausserhalb
W301: L #Bringzeiger;//Bringzeiger
L #Holzeiger;//Holzeiger
==I;//Identisch !
U(;
L #FifoLaenge;
L #Anzahl;//Anzahl der gespeicherten Datensätze
<>I;//Fifo noch nicht voll !
);
U(;
L 0;
<>I;//Datensätze aber noch vorhanden !
);
SPB Err7;//Versatz Bring-/Holzeiger
L #Bringzeiger;//Bringzeiger
L #Holzeiger;//Holzeiger
<>I;//Ungleich !
U(;
L #FifoLaenge;
L #Anzahl;//Anzahl der gespeicherten Datensätze
==I;//Aber Fifo ist voll !
O(;
L 0;
==I;//Aber keine Datensätze vorhanden !
);
);
SPB Err7;//Versatz Bring-/Holzeiger
L #Anzahl;//Anzahl der gespeicherten Datensätze
L 0;
==I;//Keine Datensätze vorhanden !
SPB Err2;//Fifo ist leer
NETWORK
TITLE = 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##SEARCHDATEN;
LAR2;
L W[ AR2, P#0.0];
T #DBSuchdaten;//Solldaten-DB
L #DBSuchdaten;//Solldaten-DB
L 0;//Angegeben ?
==I;//Nein
SPB W401;
// CALL TEST_DB
// DB_NUMBER :=#DBSuchdaten
// RET_VAL :=#SFC_RET_VAL
// DB_LENGTH :=#SFC_DB_LENGTH
// WRITE_PROT :=#SFC_WRITE_PROT
CALL "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 !
SPB Err1;//SFC20-Aufruf mit Fehler
L D[ AR2, P#2.0];//Kennung, Adresse
L 16#00FF_FFFF;//Ohne Kennung
UW;
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
SPB Err1;//SFC20-Aufruf mit Fehler
W401: L D[ AR2, P#2.0];//Kennung, Adresse
LAR2;
L #Laenge;//Anzahl der DWs zum Vergleichen im Datensatz
L400: T #Schleife;
L #DBSuchdaten;//Solldaten-DB
L 0;//Angegeben ?
==I;//Nein
SPB W402;
AUF DB[ #DBSuchdaten];
W402: L W[ AR2, P#0.0];//Mit Solldaten überprüfen
AUF DB[ #DBFifo];
L DBW[ #AR1Zeiger];//Fifo-Daten lesen
<>I;//nicht identisch !
SPB 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)
+AR2 P#2.0;
L #Schleife;
LOOP L400;
SPA 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
SPB 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!
SPB W404;
L #MinHolzeiger;//Minimum Holzeiger
T #SuchZeiger;
W404: L #SuchZeiger;//Suchzeiger
SPA W400;
NETWORK
TITLE = Fehlerausgabe / RET_VAL
Ende: SET;//VKE = 1 ohne Fehler !!!
SPA Ok;
Err0: L 2#0000_0000_0000_0001;//Kein Fifobereich
T #Err;
SPA Err;
Err1: S %L32.1;//SFC20-Aufruf mit Fehler
SPA Err;
Err2: S %L32.2;//Fifo ist leer
SPA Err;
Err6: S %L32.6;//Holzeiger außerhalb
SPA 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
NETWORK
TITLE = Fifokopfdaten speichern
L #AR2_Speicher;//AR2 zurückspeichern
LAR2;
U %L32.0;//Falscher Parameter
U #NixSave;//Status nicht speichern
BEB;
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)
AUF DB[ #DBFifo];
L #Err;
T DBW[ #AR1Zeiger];
NETWORK
TITLE =
L #sRE_POS;
T #RE_POS;
END_FUNCTION