Beispiel: Schreiben/lesen einer CSV-Datei

Hier können Sie die kompletten Sourcen zum Beispielprojekt entpacken: CSVExample.zip

Mit dem Beispielprojekt generierte CSV-Dateien:

Datenfelder ohne Binärdaten: TextModeGen.zip
Datenfelder beinhalten Binärdaten: BinaryModeGen.zip (bitte beachten Sie dass diese Datei nur von spezieller Software richtig interpretiert werden kann)

CSV steht für Comma-Separated Values. Folgende Dokumentation beschreibt wie CSV-Dateien mit Hilfe der SPS-CSV-Hilfsfunktionen geschrieben bzw. gelesen werden können. In den CSV-Dateien, die eigentlich Textdateien sind, können einfach strukturierte Datensätze gespeichert und zum Datenaustausch zwischen zwei Systemen verwendet werden. Dieses Format erlaubt eine Speicherung von unterschiedlich langen Tabellen oder Listen. Eine Zeile in der Tabelle entspricht einem Datensatz (auch Zeile) in der CSV-Datei. Eine Zelle in einer Tabelle entspricht einem Datenfeld in der CSV-Datei.

Allgemeine Informationen zum unterstützten CSV-Format

Prinzipieller Aufbau einer CSV-Datei mit m-Spalten und n-Zeilen (die CRLF-Zeichen sind normalerweise nicht sichtbar und in der Abbildung vereinfacht mit den Buchstaben: CRLF dargestellt)


"Field1Record1";"Field2Record1"; ... ;"Field(m)Record1"CRLF
"Field1Record2";"Field2Record2"; ... ;"Field(m)Record2"CRLF

...

"Field1Record(n)";"Field2Record(n)";    ... ;"Field(m)Record(n)"CRLF

Verfügbare Funktionsbausteine und Funktionen

CSV-Datei im Textmode oder Binärmode schreiben/lesen

Eine CSV-Datei kann im Textmode oder im Binärmode mit Hilfe der SPS-Funktionsbausteine für den Dateizugriff gelesen bzw. geschrieben werden. Abhängig von dem gewählten Modus ergeben sich Unterschiede mit Vor- und Nachteilen.

In 99% der Fälle können die CSV-Dateien im Textmode gelesen/geschrieben werden. Der Binärmode wird nur in den seltensten Fällen benötigt.

 

Textmode

Binärmode

Funktionsbaustein für den Dateilesezugriff

FB_FileGets (Besonderheit: Das CR-Zeichen am Ende vom letzten Datensatz wird von diesem Baustein automatisch beim Lesezugriff aus der Datei entfernt. Damit der FB_CSVMemBufferReader Baustein einen solchen Datensatz interpretieren kann muss dieses Zeichen vorher wiederhergestellt/eingefügt werden)

FB_FileRead

Funktionsbaustein für den Dateischreibzugriff

FB_FilePuts (Besonderheit: Ein zusätzliches CR-Zeichen am Ende vom letzten Datensatz wird von diesem Baustein automatisch beim Schreibzugriff in die Datei hinzugefügt. Der FB_CSVMemBufferWriter generiert aber die CR-Zeichen auch. Damit das Zeichen nicht doppelt in der CSV-Datei auftaucht muss dieses vor dem Schreibzugriff aus dem Puffer entfernt werden)

FB_FileWrite

Programmieraufwand

Kleiner

Größer

Sonderzeichen, nicht-druckbare Steuerzeichen im Datenfeld

Nicht erlaubt

Erlaubt

Maximale Datensatzlänge die geschrieben/gelesen werden kann

Auf 253 Zeichen begrenzt (Datensatz + CRLF). D.h. die Datensatzlänge darf 253 Zeichen nicht überschreiten.

Die maximale Datensatzlänge ist theoretisch unbegrenzt. Die Funktionsbausteine (FB_CSVMemBufferReader und FB_CSVMemBufferWriter) begrenzen ein CSV Feld jedoch auf die maximale Größe, welche in dem globalen Parameter cMaxCSVFieldValueSize angegeben ist.

Ein kompletter Datensatz kann mit dem Baustein für den Schreibzugriff geschrieben werden

Ja

Ja

Ein kompletter Datensatz kann mit dem Baustein für den Lesezugriff gelesen werden

Ja Ein Datensatz in einer reinen Textdatei endet mit CRLF. CRLF markiert in einer solchen Datei das Zeilenende. Der FB_FileGets-Funktionsbaustein liest die Daten bis zum CRLF.

Nein

Binärdaten im Datenfeld

Nicht erlaubt

Erlaubt

Hilfsfunktionen für die Konvertierung der SPS-Daten in den CSV-Format und umgekehrt

CSVFIELD_TO_STRING STRING_TO_CSVFIELD

CSVFIELD_TO_ARG ARG_TO_CSVFIELD

Unterstützte SPS Variablentypen die direkt geschrieben/gelesen werden können

T_MaxString ( STRING mit 255 Zeichen), andere Datentypen müssen zuerst in einen String konvertiert werden und dann als Datenfeld im Stringformat geschrieben/gelesen werden.

Beliebige Datentypen können geschrieben/gelesen werden

Beispielcode

P_TextModeRead() P_TextModeWrite()

P_BinaryModeRead() P_BinaryModeWrite()

Beispielprojekt

Das Beispielprojekt beinhaltet eigentlich 4 Beispiele: 2 für den Schreib-/Lesezugriff im Textmode (bevorzugt) und 2 für den Schreib-/Lesezugriff im Binärmode (selten):

P_TextModeRead();

P_TextModeWrite();

P_BinaryModeRead();

P_BinaryModeWrite();

Prinzipieller Programmablauf beim Lesen einer CSV-Datei im Textmode:

1. Schritt: Die CSV-Datei im Textmode öffnen (FB_FileOpen). Wenn erfolgreich dann zu Schritt 2 gehen.

2. Schritt: Eine Zeile mit dem Funktionsbaustein FB_FileGets lesen. Das CR-Zeichen anhängen (siehe Hinweise in der Tabelle). Wenn erfolgreich dann zu Schritt 3 gehen, andernfalls zu Schritt 4 gehen (das Ende der Datei wurde erreicht oder ein Fehler ist aufgetreten).

3. Schritt: Die gelesene Zeile mit dem Funktionsbaustein FB_CSVMemBufferReader parsen. Es werden dabei die einzelnen Datenfelder gelesen. Danach zu Schritt 2 springen und die nächste Zeile lesen. Schritte 2 und 3 so lange wiederholen bis das Ende der Datei erreicht wurde oder ein Fehler aufgetreten ist.

4. Schritt: Die CSV-Datei schließen (FB_FileClose).

Prinzipieller Programmablauf beim Schreiben einer CSV-Datei im Textmode.

1. Schritt: Die CSV-Datei im Textmode öffnen (FB_FileOpen). Wenn erfolgreich dann zu Schritt 2 gehen.

2. Schritt: Mit dem Funktionsbaustein FB_CSVMemBufferWriter einen neuen Datensatz generieren. Die einzelnen Datenfelder werden dafür in einen Puffer hineingeschrieben. Dieser Puffer kann auch ein größerer String sein. Das CR-Zeichen vom Ende des Datensatzes entfernen und zu Schritt 3 gehen.

3. Schritt: Eine Zeile mit dem Funktionsbaustein FB_FilePuts schreiben. Dann Schritte 2 und 3 so lange wiederholen bis alle Datensätze geschrieben worden sind. Danach zu Schritt 4 gehen.

4. Schritt: Datei schließen (FB_FileClose).

Voraussetzungen

Entwicklungsumgebung

Zielplattform

Einzubindende SPS-Bibliotheken (Kategoriegruppe)

TwinCAT v3.1.0

PC oder CX (x86, x64, ARM)

Tc2_Utilities (System)