=== 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