FUNCTION_BLOCK FB50
VAR_INPUT
// Eingangs Variablen
xWrite :BOOL; (* Es wird ein Wert in dem FIFO-Speicher geschrieben *)
XRead :BOOL; (* Es wird ein Wert aus dem FIFO-Speicher gelesen *)
wStore :WORD; (* Wert der in dem FIFO-Speicher abgelegt werden soll *)
xReset :BOOL; (* Der FIFO-Speicher wird Resetet *)
END_VAR
VAR_OUTPUT
// Ausgangs Variablen
wValue :WORD; (* Wert, der aus dem FIFO-Speicher gelsesen wurde *)
iCount :INT; (* Anzahl der gespeicherten Werte *)
xOverflow :BOOL; (* FIFO-Überlauf *)
xUnderflow :BOOL; (* FIFO-Unterlauf *)
END_VAR
VAR
// statische Variablen
myData :ARRAY[0..199] OF WORD; (* Der FIFO-Speicher *)
myWriteIndex :INT:=0; (* Index zum Schreiben der neuen Daten *)
myReadIndex :INT:=0; (* Index zum Lesen der gespeicherten Daten *)
myFPWrite :BOOL; (* Flanken erkennung zum schreiben von Daten *)
myFPRead :BOOL; (* Flanken erkennung zum lesen von Daten *)
END_VAR
// Anweisungsteil
IF xWrite AND NOT myFPWrite THEN (* Flankenerkennung neue Daten schreiben *)
IF iCount < 199 THEN (* Ist Platz im FIFO-Speicher ? *)
myData[myWriteIndex] := wStore; (* Speichern des neuen Werts *)
myWriteIndex := myWriteIndex + 1; (* "Zeiger" auf die nächste Speicherzelle schieben *)
iCount := iCount + 1; (* Anzahl der gespeicherten Werte erhöhen *)
IF myWriteIndex > 199 THEN (* "Zeiger" überlauf wieder bei 0 beginnen *)
myWriteIndex := 0;
END_IF;
ELSE
xOverflow := TRUE; (* FIFO-Überlauf melden *)
END_IF;
END_IF;
myFPWrite := xWrite; (* Speicher für die Flanken erkennung *)
IF xOverflow THEN (* FIFO-Überlauf Meldung rücksetzen *)
xOverflow := xWrite;
END_IF;
IF xRead AND NOT myFPRead THEN (* Flankenerkennung Daten lesen *)
IF iCount > 0 THEN (* Sind Daten im FIFO-Speicher ? *)
wValue := myData[myReadIndex]; (* Wert aus Speicher an den Ausgang legen *)
myReadIndex := myReadIndex + 1; (* "Zeiger" auf die nächste Speicherzelle schieben *)
iCount := iCount - 1; (* Anzahl der gespeicherten Werte reduzieren *)
IF myReadIndex > 199 THEN (* "Zeiger" überlauf wieder bei 0 beginnen *)
myReadIndex := 0;
END_IF;
ELSE
wValue := 0; (* Wenn keine Daten vorhanden immer 0 ausgeben *)
xUnderflow := TRUE; (* FIFO-Unterlauf melden *)
END_IF;
END_IF;
myFPRead := xRead; (* Speicher für die Flanken erkennung *)
IF xUnderflow THEN (* FIFO-Unterlauf Meldung rücksetzen *)
xUnderflow := xRead;
END_IF;
IF xReset THEN (* FIFO Reseten *)
myWriteIndex := 0;
myReadIndex := 0;
iCount := 0;
END_IF;
END_FUNCTION_BLOCK