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
- Die Dateien im CSV-Format sollten die Endung .csv besitzen.
- Das CRLF-Zeichen (CR =Carriage Return, LF=Line Feed) wird zur Trennung der einzelnen Datensätze (Zeilen) verwendet (Windows-Betriebssysteme). D.h. nach jedem Datensatz muss ein CRLF folgen.
- Das Ende der CSV-Datei muss ebenfalls mit CRLF-Zeichen abgeschlossen werden.
- Binärdaten müssen in Hochkommas eingeschlossen werden. Wenn keine Hochkommas verwendet werden, dann dürfen im Datenfeld nur Zahlen und/oder Buchstaben verwendet werden.
- Felder mit Sonderzeichen/Steuerzeichen im Datenfeld werden in Anführungszeichen eingeschlossen. Wenn ein Einführungszeichen selbst im Datenfeld enthalten ist wird dieses verdoppelt.
- Ein spezielles Zeichen wird zur Trennung von Datenfeldern (Spalten) verwendet. Als Trennzeichen für die einzelnen Datenfelder wird von den Hilfsfunktionen standardmäßig ein Semikolon verwendet. In Deutschland und Europa wird als Datenfeldtrennzeichen ein Semikolon verwendet, in USA eher ein Komma. Über die globale SPS-Variable: DEFAULT_CSV_FIELD_SEP kann das Trennzeichen vom Semikolon auf Komma konfiguriert werden.
- Jeder Datensatz sollte die gleiche Anzahl an Datenfeldern (Spalten) besitzen.
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
- STRING_TO_CSVFIELD, ARG_TO_CSVFIELD: Konvertiert SPS-Daten in ein Datenfeld im CSV-Format;
- CSVFIELD_TO_STRING, CSVFIELD_TO_ARG: Konvertiert Datenfeld im CSV-Format in SPS-Daten;
- FB_CSVMemBufferWriter: Generiert aus mehreren Datenfeldern Datensätze in einem Bytepuffer;
- FB_CSVMemBufferReader: Zerlegt Datensätze in einem Bytepuffer in einzelne Datenfelder;
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 | ||
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) |