FRAGE:
Gibt es ein Programmbeispiel zum Speichern und Weiterreichen von Daten in einem FIFO-Speicher?
ANTWORT: Das Zwischenspeichern von Daten nach dem "First in First out" Prinzip (FIFO) wird häufig dann benötigt, wenn ein synchrones Weiterreichen empfangener Daten nicht gewährleistet ist und keine Daten verloren gehen dürfen.
Im Beitrag 8685494 ist dazu ein FIFO-Funktionsbaustein verfügbar, der einen FIFO-Speicher verwaltet und das Ein- und Auslesen der Variablen organisiert. Der Baustein in dem o.g. Beitrag ist in S7-SCL geschrieben.
Dieser Beitrag enthält ein Programmbeispiel für einen FIFO-Speicher in STEP 7 AWL. Für den Empfang und für das Weiterreichen der Daten wird jeweils ein Datenbaustein verwendet. Die Länge und die Anzahl der Telegramme, die im FIFO gespeichert werden können, kann dabei auf einfache Weise variiert werden.
- Telegramm-Länge: Ist die Länge einer FIFO Komponente und wird durch die Länge des UDT 1 bestimmt.
- Anzahl der Telegramme: Die Anzahl entspricht der Anzahl der Komponenten die im FIFO gespeichert werden können.
Die Anzahl der möglichen Telegramme wird durch die Definition der statischen Variablen "FIFO_Buffer" am FB 2 bestimmt.
Bild1: Übersichtsbild zur Arbeitsweise des FIFO-Speichers
Ausführliche Beschreibung:
DB 1: Telegramm-Empfangs-DB Typischerweise kommen die zu empfangende Telegramme über eine Kommunikationsverbindung z.B. PtP Schnittstelle und werden in einem Datenbaustein, hier als Telegramm-Empfangs-DB (DB 1) bezeichnet, abgelegt. Die Länge und Struktur des Telegramm-Empfangs-DBs muss identisch mit der Länge und Struktur des Telegramms sein. Der Telegramm-Empfangs-DB basiert auf dem UDT1 (User Defined Datatype) und kann beliebig geändert werden.
In diesem Programmierbeispiel ist der UDT1 folgendermaßen definiert:
- Telegrammkennung: 0D HEX, Datentyp "BYTE". Die Konstante 0D HEX muss vorbesetzt werden.
- Datum und Uhrzeit(und Wochentag): Datentyp "DATE_AND_TIME" mit Länge 8 Byte. Datum und Uhrzeit werden mit SFC 1 "READ_CLK" von der S7-300-CPU zyklisch eingelesen.
- Nutzdaten: Datentyp "STRING" im vorliegenden Beispiel 20 Byte. Die Länge des Strings kann nach Bedarf einfach geändert werden.
DB 2: Instanz-DB von FB 2, mit FIFO-Speicher Er setzt sich aus 2 Bereichen zusammen:
- Deklarationsbereich mit den Parametern und Variablen die im FB 2 verwendet werden.
- FIFO-Speicher, bestehend aus einem Feld mit Datenelementen vom Typ "UDT 1". Der Name des Feldes ist "FIFO_Buffer".
Um die Arbeitsweise bequem testen zu können ist aktuell die Anzahl der Komponenten auf 7 voreingestellt. Um diesen Wert zu ändern, öffnen Sie bitte den FB 2 im KOP/FUP/AWL-Editor und selektieren in der Variablenübersicht die statische Variable "FIFO_Buffer".
Über das Kontextmenü wählen sie den Menüpunkt "Objekteigenschaften" und öffnen den Eigenschaftsdialog.
In der Zeile "Datentyp" können Sie die Feldlänge und damit die Anzahl der möglichen FIFO Einträge, sowie die verwendete Datenstruktur definieren.
Nach einer Änderung beachten Sie bitte, auch den Aufruf vom FB 2 im FC 2 zu aktualisieren. Z.B. mit Hilfe der Funktion "Baustein Konsistenz prüfen".
Bild 2: Eigenschaftsdialog zur Definition des FIFO-Speichers (Variable "FIFO_Buffer")
DB 3: Anwender-Schnittstelle Der DB 3 ist eine Nachbildung von DB 1 ausschließlich mit Variablen mit Byte-Länge (ebenfalls für die "DATE_AND_TIME" Variable). Damit haben Sie die Möglichkeit, die eingetroffenen Daten direkt im Datenbaustein zu beobachten.
FB 2: FIFO-Verwaltung Der Baustein enthält folgende Funktionsteile:
| Funktionsteil |
Beschreibung |
| Simulation und Funktionsauswahl |
Über Schalter können folgende Funktionen simuliert werden:
- FIFO initialisieren
- FIFO schreiben
- FIFO lesen
Ebenfalls kann eingestellt werden, ob nach dem lesen einer FIFO-Komponente der Eintrag gelöscht werden soll oder stehen bleibt. |
| FIFO initialisieren |
Bereitet die Zeiger und andere Daten auf das Schreiben in den FIFO von Anfang an vor. |
Eine FIFO-Komponente übertragen
(FIFO schreiben/lesen) |
"FIFO schreiben" überträgt den Inhalt von DB1 in eine FIFO-Komponente. Den Anstoß für "FIFO schreiben" liefert normalerweise der Empfangs-SFB des Kommunikationsprogramms am Zustandsparameter "New data ready", nachdem es die Telegrammdaten in den DB 1 geschrieben hat.
"FIFO lesen" überträgt den Inhalt einer FIFO-Komponente in den DB 3. Den Befehl gibt das Anwenderprogramm aus, das auch die eingetroffenen Nutzdaten weiter verarbeitet. |
| FIFO-Status melden |
Meldung "FIFO leer" wird beim initialisieren gesetzt und immer dann, wenn alle FIFO-Einträge ausgelesen wurden.
Meldung "FIFO voll" wird gesetzt, nachdem der FIFO gerade vollgeschrieben wurde und rückgesetzt, wenn aus dem vollen FIFO gelesen wurde.
Meldung "FIFO overflow" wird gesetzt, wenn beim vollen FIFO der Befehl für "FIFO schreiben" ausgegeben wurde. In diesem Fall bleibt das Schreiben in den FIFO aus und der im DB 1 stehende Datensatz geht verloren, weil für diesen Datensatz kein weiterer Schreibanstoß kommt. Nachdem der kontinuierliche Fluss der Telegramm-Datensätze unterbrochen wurde, muss der FIFO neu initialisiert werden. Mit der richtigen Relation der Schreib- und Lesehäufigkeit zur FIFO-Länge kann man den FIFO-Überlauf theoretisch außchließen. |
Im FB 2 werden die folgenden Systemfunktionen aufgerufen:
- SFC 24 "Test-DB" ermittelt die Länge des DB 1 (UDT 1) und berechnet die Länge des zu löschenden Feldes beim Initialisieren.
- SFC 21 "Fill" füllt beim Initialisieren den FIFO-Speicher mit Nullen.
- SFC 20 "BLKMOV" erledigt den Kopiervorgang im FIFO-Funktionsteil "Eine FIFO-Komponente übertragen", nachdem die notwendigen Zeiger richtig gestellt und die passenden Nummern und Längen berechnet und geladen wurden. Dafür benutzt er zwei in den temporären Lokaldaten deklarierte variablen ANY-Zeiger (Zeiger auf Quelle und Ziel), die vor dem SFC 20-Aufruf mit Daten versehen müssen.
Bild 3: Programmablaufplan vom FB 2:
Empfohlene Vorgehensweise zum Testen des Beispielprogramms Um die Funktionsweise des FIFO-Ringspeichers ohne ein aufrufendes Steuerprogramm ausführen zu können, sind die folgenden Signale für die "Simulation" definiert (VAT_SIM).
| Adresse |
Symbol |
Signal-
Folge |
Beschreibung |
| E 0.0 |
SIM_FIFO_Start |
Ein |
Simulation wirksam - muss für Simulation "Ein" sein. |
| E 0.1 |
SIM_FIFO_init |
Ein/Aus |
FIFO wird initialisiert, Datenbit "W_initialized" und Merker "Meld_FIFO_ ready" werden gesetzt. |
| E 0.3 |
SIM_FIFO_write |
Ein/Aus |
In den FIFO wird ein Eintrag geschrieben (Kopie aus dem DB 1). Die Anzahl der FIFO-Einträge wird um "1" erhöht und der Schreibzeiger auf die nächste Komponente gestellt. Nach dem Beschreiben der letzten leeren Komponente wird der Merker "FIFO_full" gesetzt. |
| E 0.5 |
SIM_FIFO_read |
Ein/Aus |
Aus dem FIFO wird ein Eintrag gelesen und in den DB 3 kopiert. Die Anzahl der FIFO-Einträge wird um "1" dekrementiert und der Lesezeiger auf die nächste Komponente gestellt.
Der Merker "FIFO_full" wird rückgesetzt. |
| E 0.6 |
SIM_Rd_Entry_Del |
Ein |
Wenn dieser Eingang gesetzt ist, dann werden die gelesen Einträge im FIFO gelöscht.
Im anderen Fall werden die Einträge (ohne vorheriges Löschen) überschrieben. |
Ergänzend dazu stehen Ihnen folgende Möglichkeiten zum Beobachten des Datenverlaufes zur Verfügung.
- VAT_DB1: Daten des Quell DB die in den FIFO Puffer übertragen werden
- VAT_FB2 -- Beobachten der Einträge im FB 2 und DB 2 (FIFO Puffer)
- DB 3 -- Datenbaustein mit den Daten die aus dem FIFO Puffer ausgelesen wurden
Hinweise:
Wird versucht, in einen vollen FIFO zu schreiben ("FIFO_full" ist gesetzt), wird das Schreiben abgelehnt und der Merker "FIFO_overflow" gesetzt. Danach muss der FIFO neu initialisiert werden.
Die folgende Tabelle gibt Ihnen einen kurzen Überblick über den Inhalt des Downloads:
| Inhalt |
Beschreibung |
| Projekt-Name |
STEP 7 "FIFOBuffer" |
| Verwendete Programmiersprache(n) |
STEP 7 AWL |
| Schnittstellenbeschreibung der Funktionen und Bausteine |
ja, als Kommentar beim Aufruf |
| Baustein im Binärcode |
ja |
| Kommentare im Baustein |
deutsch / englisch (umschaltbar über "Texte mehrsprachig verwalten") |
| Baustein(e) im Quellcode vorhanden |
ja |
| Mnemonik und Kommentare im Quellcode |
englisch |
FIFOBuffer.zip
Speichern Sie die Datei "FIFOBuffer.zip" in ein separates Verzeichnis auf Ihrer Festplatte. Im SIMATIC Manager können Sie dann über den Menübefehl "Datei > Dearchivieren..." das Projekt laden und bearbeiten.
Weiterführende Informationen: Weiterführende Informationen zu den verwendeten Systemfunktionsaufrufen (SFC 20, SFC 21 und SFC 24) finden Sie in dem Handbuch "SIMATIC Systemsoftware für S7-300/400 System- und Standardfunktionen" (Beitrags ID 1214574 ).
Ablauffähigkeit und Testumgebung: Das Beispiel ist einsetzbar auf S7-300, S7- 400, C7 und WinAC.
In der folgenden Tabelle sind die Komponenten aufgeführt, mit denen dieser Beitrag erstellt und die beschriebene Funktionsweise verifiziert wurde:
| Testumgebung |
Version |
| PC Plattform |
Prozessor Pentium III,
850 MHz, 260 MB |
| PC-Betriebssystem |
Windows XP |
| STEP 7 |
STEP 7 V5.2, SP 1 |
| Optionspakete |
-- |
| S7-CPU |
CPU 315-2DP
(6ES7 315-2AF03-0AB0) |
|