=== FC 82: FifoReset  [STL] ===
INTERFACE:
  Input:
    SSDB : Int                                          // Schnittstellen-DB
    SSDW : Int                                          // Schnittstellen-1.DW
    PARA : Word                                         // Aufrufparameter (Durchlaufspeicher?)
  Output:
    RE_VAL : Byte                                       // Rückmeldung
  InOut:
  Temp:
    Quelle : Any                                        // Zeiger, wo Rein-Daten sind
    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
    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
    SFC_WRITE_PROT : Bool                               // Rückmeldung SFC-Aufruf
  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
      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#L10.0 WORD 6)   // 1.-6.DW FIFO holen

      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 !
      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      FifoLaenge                                      // Länge FIFO (in Word)
      L      Datensatzlaenge                                 // Datenblocklänge
      *I
      L      2                                               // DB byteorientiert
      *I
      +      40                                              // Speichern ab 20.DW
      L      SSDW
      +I
      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


--- NW 4: Fifo-Daten löschen ---
      L      SSDW
      +      4                                               // Ab 2.Dw
      SLW    3                                               // Pointer erzeugen
      LAR1

      OPN    DB[DBFifo]

      L      Datensatzlaenge
      L      FifoLaenge
      *I
      +      18                                              // 18 Datenwörter (wortorientiert)
L400: T      Schleife

      L      0
      T      DBW [AR1,]

      ADDAR1 P#2.0

      L      Schleife
      LOOP   L400



--- NW 5: Durchlaufspeicher ? ---
      L      PARA                                            // Aufrufparameter
      SRW    4
      L      16#000D                                         // Durchlaufspeicher ?
      <>I                                                    // Nein !
      JC     N006

      L      SSDW
      +      4                                               // Speichern ab 4.DW
      SLW    3                                               // Pointer erzeugen
      LAR1

      OPN    DB[DBFifo]

      L      SSDW
      +      40                                              // 1.Speicherzelle
      T      DBW [AR1,]                                      // Bringzeiger
      T      DBW [AR1,]                                      // Holzeiger

      L      FifoLaenge                                      // Fifo ist voll
      T      DBW [AR1,]                                      // Anzahl

      L      PARA                                            // Aufrufparameter
      L      16#00D1                                         // Durchlaufspeicher mit FFFF füllen
      <>I                                                    // Nein !
      JC     N006

      L      FifoLaenge                                      // Fifo ist voll
      T      DBW [AR1,]                                      // 1.Zusatz-Dw (Anzahl der Daten)

      L      2#0000_0000_0000_0011                           // Daten vorhanden/kommen raus
      T      DBW [AR1,]                                      // 4.Zusatz-Dw (Status)

      L      SSDW
      +      40                                              // Ab 20.Dw
      SLW    3                                               // Pointer erzeugen
      LAR1

      OPN    DB[DBFifo]

      L      Datensatzlaenge
      L      FifoLaenge
      *I
L500: T      Schleife

      L      16#FFFF
      T      DBW [AR1,]

      ADDAR1 P#2.0

      L      Schleife
      LOOP   L500


--- NW 6: Fehlerausgabe / RET_VAL ---
N006: SET                                                    // VKE = 1 ohne Fehler !!!
      L      2#0000_0000_0000_0000
      JU     Ok
Err0: L      2#0000_0000_0000_0001                           // Kein Fifobereich
      JU     Err
Err1: L      2#0000_0000_0000_0010                           // SFC20-Aufruf mit Fehler

Err:  CLR                                                    // VKE = 0 bei Fehler !!!
Ok:   T      RE_VAL

      SAVE                                                   // VKE in BIE-Bit speichern

