Array of Struct in CSV Datei schreiben

NeuerSIMATICNutzer

Well-known member
Beiträge
382
Punkte Reaktionen
10
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo zusammen,

ich beschäftige mich gerade mit der Erstellung einer CSV Datei auf einem WAGO PFC200 und Codesys 2.3. (syslibfile.lib)
Die CSV Datei hat 30 Zeilen zu je 6 Werte pro Zeile.
Habe meine Werte in einem Struct zusammengefasst und möchte die nun in eine csv schreiben.

Habe schon verschiedene Strings mit CONCAT zusammengefügt und in eine CSV geschrieben, allerdings bin ich hier auf 255 Zeichen begrenzt.
Nun habe ich hier einige Zeichen mehr. Jemand ne Idee wie ich das lösen könnte?

Wie gehe ich da am besten vor.

VG
NSN
 

wollvieh

Well-known member
Beiträge
350
Punkte Reaktionen
74
Hallo,

ich mache das so :
1) ich lege mir ein bytearray an ( resultdata_csv : ARRAY[1..4000000] OF BYTE; )
2) dann definiere ich mir die trennzeichender csv Werte ( szSeperator : STRING(1):= ';' ;)
sowie Carriage return und linefeed ( CRLF : STRING(2) := '$R$N';
LF : STRING(1) := '$N'; )
3) Dann 2 Pointer definiert, einer aufs bytearray und einer auf den einzfügenden string, und dann immer lustig ins Bytearray geschrieben.

das ergebnis sieht dann so aus :


csv.PNG
P.S: Am Schluss die Datei nur mit der Länge schreiben, wie der Pointer aufs bytearray durch die Einträge angewachsen ist,
sonst würde die Datei unnötig gross.
( Ich habe das bei mir so gross gewählt, da ich max.100 Werte in den Spalten haben kann, und das mal 3600 Zeilen mal 6 ASCII Zeichen,
das ergibt theoretisch so 3.600.000 byte , falls alle CSV Datensätze ausgenutzt werden).

Gruß, Wollvieh.



 
Zuletzt bearbeitet:
OP
N

NeuerSIMATICNutzer

Well-known member
Beiträge
382
Punkte Reaktionen
10
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo wollvieh,

danke für deinen Beitrag.
Jetzt wird es schwierig für mich. Habe schon in anderen Threads gesehen das sowas mit Pointern gelöst wurde,
allerdings habe ich damit noch nichts zu tun. Werde mich wohl Intensiv damit befassen müssen.


VG
NSN
 
OP
N

NeuerSIMATICNutzer

Well-known member
Beiträge
382
Punkte Reaktionen
10
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo,

danke für Eure Hilfe. Mit den Pointern funktioniert es super.

P.S: Am Schluss die Datei nur mit der Länge schreiben, wie der Pointer aufs bytearray durch die Einträge angewachsen ist,
sonst würde die Datei unnötig gross.
Wie begrenzt du die Datei? Mit SIZEOF?

Vg
NSN
 

wollvieh

Well-known member
Beiträge
350
Punkte Reaktionen
74
Mit Adressarithmetik. Einen Pointer referenziere ich mit der Basisadresse des Bytearrays. Ein zweiter Pointer wird mit jedem neuen Zeichen incrementiert. Am Ende die Differenz der beiden Pointer gebildet, das gibt dann die Grösse der Datei. (pEnd-pBase).
Wollvieh.

Beispiel :
resultdata_csv : ARRAY[1..4000000] OF BYTE;
pEnd : POINTER TO STRING;


fwrite(
sNetId:= sNetId,
hFile:= handleFile,
pWriteBuff:= ADR(resultdata_csv),
cbWriteLen:= pEnd - ADR(resultdata_csv),
bExecute:= ,
tTimeout:= ,
bBusy=> ,
bError=> ,
nErrId=> ,
cbWrite=> );
 
Zuletzt bearbeitet:

sa1bot

Member
Beiträge
11
Punkte Reaktionen
2
Eine alternative könnte es evtl. sein, deine CSV einfach Zeilenweise zu schreiben,
weniger effektiv wie ein einzelner Schreibvorgang ja, aber bei einer Steuerung mit
einem Cortex A8 bei 1GHz welche eigentlich für V3 ausgelegt ist und bei nur 30 Zeilen weniger tragisch.

Kommt jetzt aber auch natürlich drauf an wie Zeitkritisch das ganze ist.

Gibt einem ein wenig den komfort mit z.B. SysFileWrite(FileHandle,ADR(st_csvRow),LEN(st_csvRow));
ohne Pointer und Index die Zeile zu schreiben.
Falls die Zeile selbst die 255 Zeichen überschreitet, dann wirst den Weg eines ByteArrays
wie oben schon beschriebengehen müssen.
 

Tom...

Well-known member
Beiträge
85
Punkte Reaktionen
5
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo,
ich baue eine "zu lange Zeile" einfach aus mehreren Teilen zusammen:
Code:
  Text_Puffer_1   :=   'hier kommen die ersten maximal 255 Zeichen rein, oder auch weniger' ;
  Text_Puffer_2   :=   'hier kommen die zweiten maximal 255 Zeichen rein, oder auch weniger' ;
  Text_Puffer_3   :=   'hier kommen die dritten maximal 255 Zeichen rein, oder auch weniger und am Ende einfach ein $L' ;
  fileWriteOK     :=   SysFileWrite ( File := fileHandle , Buffer := ADR ( Text_Puffer_1 ) , Size := LEN ( Text_Puffer_1 ) );
  fileWriteOK     :=   SysFileWrite ( File := fileHandle , Buffer := ADR ( Text_Puffer_2 ) , Size := LEN ( Text_Puffer_2 ) );
  fileWriteOK     :=   SysFileWrite ( File := fileHandle , Buffer := ADR ( Text_Puffer_3 ) , Size := LEN ( Text_Puffer_3 ) );
funktioniert auf einer WAGO 750-880 super...

Grüße
tom
 
OP
N

NeuerSIMATICNutzer

Well-known member
Beiträge
382
Punkte Reaktionen
10
Danke für eure Beiträge und unterschiedliche Möglichkeiten zum erstellen der CSV Datei.
Habe mich dann für die Variante mit der Schleife entschieden. Sieht sehr vielversprechend aus..:)

VG
NSN
 
Oben