×
Siemens Industry Online Support
Siemens AG
Beitragstyp: Anwendungsbeispiel Beitrags-ID: 16825843, Beitragsdatum: 15.08.2003
(4)
Bewerten

Zwischenspeichern der empfangenen Daten in einem Ringpuffer nach dem FIFO-Prinzip und Weiterreichen an die Anwender-Schnittstelle

  • Beitrag
  • Betrifft Produkt(e)

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)

Securityhinweise
Um technische Infrastruktur, Systeme, Maschinen und Netzwerke gegen Cyber-Bedrohungen zu sichern, ist es erforderlich, ein ganzheitliches IT Security-Konzept zu implementieren (und kontinuierlich aufrechtzuerhalten), das dem aktuellen Stand der Technik entspricht. Die Produkte und Lösungen von Siemens formen nur einen Bestandteil eines solchen Konzepts. Weitergehende Informationen über Cyber Security finden Sie unter
https://www.siemens.com/cybersecurity#Ouraspiration.