-> Hier kostenlos registrieren
Hallo zusammen,
bin neu in der Beckhoff Welt und versuche seit einiger Zeit eine CSV Datei in ein Array einzulesen.
Dazu habe ich auch hier im Forum einige Beispiele gefunden. Danke dafür!
Das einlesen funktioniert auch soweit. Das Problem was ich habe, es wird nicht die komplette CSV eingelesen.
Habe nun eine Demo CSV mit 26 Spalten und 50 Zeilen erstellt.
In meinen Augen scheint das begrenzende Element das 2D-Array zu sein. Auch wenn ich dieses größer mache, wird immer nur ein gewisser Anteil gelesen.
Mache ich beim Array die erste Dimension kleiner, kann ich mehr in der zweiten Dimension lesen und umgekehrt. Wenn ich mir das online anschaue, werden auch nicht alle Elemente des Arrays angezeigt.
Meine Frage wäre ob es da ein Begrenzung bei den Dimensionen gibt? Bei Beckhoff konnte ich darüber nichts finden.
Oder liegt das Problem doch wo anders?
Gruß und Danke
bin neu in der Beckhoff Welt und versuche seit einiger Zeit eine CSV Datei in ein Array einzulesen.
Dazu habe ich auch hier im Forum einige Beispiele gefunden. Danke dafür!
Das einlesen funktioniert auch soweit. Das Problem was ich habe, es wird nicht die komplette CSV eingelesen.
Habe nun eine Demo CSV mit 26 Spalten und 50 Zeilen erstellt.
In meinen Augen scheint das begrenzende Element das 2D-Array zu sein. Auch wenn ich dieses größer mache, wird immer nur ein gewisser Anteil gelesen.
Mache ich beim Array die erste Dimension kleiner, kann ich mehr in der zweiten Dimension lesen und umgekehrt. Wenn ich mir das online anschaue, werden auch nicht alle Elemente des Arrays angezeigt.
Meine Frage wäre ob es da ein Begrenzung bei den Dimensionen gibt? Bei Beckhoff konnte ich darüber nichts finden.
Oder liegt das Problem doch wo anders?
Code:
FUNCTION_BLOCK FB_CSV_EVU_Read
(* Reading of CSV file in text mode. None of the field value is containing any non-printing control characters like line feed, carriage return, quotation marks, semicolon... *)
VAR CONSTANT
nMaxRow : INT := 30; // CSV Zeilen
nMaxColumn : INT := 50; // CSV Spalten
END_VAR
VAR_INPUT
bRead : BOOL := FALSE;(* Rising edge starts program execution *)
sNetId : T_AmsNetId := ''; (* TwinCAT system network address *)
sFileName : T_MaxString := 'D:\temp\Parameter_E22.csv';(* CSV source file path and name *)
END_VAR
VAR
database : ARRAY[1..nMaxRow,1..nMaxColumn] OF STRING(100);(* Target PLC database *)
END_VAR
VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
nErrId : UDINT;
END_VAR
VAR
nRow : INT := 0;(* Row number (record) *)
nColumn : INT := 0;(* Column number (record field) *)
hFile : UINT := 0;(* File handle of the source file *)
step : DWORD := 0;
fbFileOpen : FB_FileOpen;(* Opens file *)
fbFileClose : FB_FileClose;(* Closes file *)
fbFileRead : FB_FileRead;(* Reads one record (line) *)
fbRead : FB_CSVMemBufferReader;
record : ARRAY[0..25000] OF BYTE;(* Binary (row) data buffer. The size of this buffer have to be > length of longest record line + 2 (CRLF) *)
cbRecord : UDINT := 0;(* Number of bytes in row buffer *)
END_VAR
Code:
CASE step OF
0:(* Wait for rising edge at bRead variable *)
IF bRead THEN
bRead:= FALSE;
bBusy:= TRUE;
bError:= FALSE;
nErrId:= 0;
hFile:= 0;
nRow:= 1;
nColumn:= 1;
MEMSET(ADR(database),0 ,SIZEOF(database));
step:= 1;
END_IF
1:(* Open source file *)
fbFileOpen(bExecute:= FALSE);
fbFileOpen(sNetId:= sNetId, sPathName:= sFileName, nMode:= FOPEN_MODEREAD OR FOPEN_MODEBINARY, ePath:= PATH_GENERIC, bExecute:= TRUE);(* Open file in Binary mode! *)
step:= 2;
2:(* Wait until open not busy *)
fbFileOpen(bExecute:= FALSE, bError=> bError, nErrID=> nErrID, hFile=> hFile);
IF NOT fbFileOpen.bBusy THEN
IF NOT fbFileOpen.bError THEN
step:= 3;
ELSE(* Error: file not found? *)
step:= 100;
END_IF
END_IF
3:(* Read single line (record) *)
fbFileRead(bExecute:= FALSE);
fbFileRead(sNetId:= sNetId, hFile:= hFile, bExecute:= TRUE, pReadBuff:= ADR(record), cbReadLen:= SIZEOF(record));
step:= 4;
4:(* Wait until read not busy *)
fbFileRead(bExecute:= FALSE, bError=> bError, nErrID=> nErrID,);
IF NOT fbFileRead.bBusy THEN
IF NOT fbFileRead.bError THEN
IF fbFileRead.bEOF THEN
step:= 10;(* End of file reached => Close source file *)
ELSE
cbRecord := fbFileRead.cbRead;
step:= 5;
END_IF
ELSE(* Error *)
step:= 100;
END_IF
END_IF
5:(* Parse single line (record)*)
fbRead.eCmd:= eEnumCmd_First;(* Write first field value *)
REPEAT
fbRead(pBuffer:= ADR(record), cbBuffer:= SIZEOF(record),);(* bCRLF == TRUE => Write CRLF after the last field value *)
IF fbRead.bOk THEN
fbRead.eCmd := eEnumCmd_Next;(* Read next field value *)
IF ( nRow <= nMaxRow ) THEN
IF ( nColumn <= nMaxColumn ) THEN
database[nRow,nColumn]:= fbRead.getValue;
END_IF
END_IF
//nColumn := nColumn + 1;(* Increment number of read columns *)
nRow := nRow + 1;(* Increment number of read records *)
IF fbRead.bCRLF THEN(* CRLF == TRUE => End of reacord reached *)
nColumn := nColumn + 1;(* Increment number of read columns *)
nRow := 1;
//nRow := nRow + 1;(* Increment number of read records *)
//nColumn := 1;
END_IF
ELSE(* Error: End of record reached or all fields read *)
step := 3;(* Try to read next line *)
END_IF
UNTIL NOT fbRead.bOk
END_REPEAT
10:(* Close source file *)
fbFileClose(bExecute:= FALSE);
fbFileClose(sNetId:= sNetId, hFile:= hFile, bExecute:= TRUE);
step:= 11;
11:(* Wait until close not busy *)
fbFileClose(bExecute:= FALSE, bError=> bError, nErrID=> nErrID);
IF (NOT fbFileClose.bBusy) THEN
hFile:= 0;
step:= 100;
END_IF
100:(* Error or ready step => cleanup *)
IF (hFile <> 0) THEN
step:= 10; (* Close the source file *)
ELSE
bBusy:= FALSE;
step:= 0; (* Ready *)
END_IF
END_CASE
Gruß und Danke