-> Hier kostenlos registrieren
Hallo Leute,
ich möchte aus einem Array Datein in eine CSV-Tabelle schreiben. Mit Hilfe des Beispiels von Beckhoff ist mir das auch gelungen. Nun ist aber das Problem, dass die ersten drei Zeilen und die erste Spalte der bereits vorhandenen CSV-Datei nicht überschrieben werden dürfen. Das Programm soll quasi in der zweiten Spalte und der vierten Zeile beginnen zu schreiben.
Hier erstmal der Quelltext:
Eine meiner Ideen wäre es, dass er den CR denn er nach Beendigung einer Zeile hinzufügt, vor dem eigentlichen schreiben drei mal durchführt (Hoffe, ihr wisst was ich meine). Allerdings hat die Umsetzung nicht ganz funktioniert. :?
Ich danke euch schon mal für eure Ideen.
MfG, BrascoC
ich möchte aus einem Array Datein in eine CSV-Tabelle schreiben. Mit Hilfe des Beispiels von Beckhoff ist mir das auch gelungen. Nun ist aber das Problem, dass die ersten drei Zeilen und die erste Spalte der bereits vorhandenen CSV-Datei nicht überschrieben werden dürfen. Das Programm soll quasi in der zweiten Spalte und der vierten Zeile beginnen zu schreiben.
Hier erstmal der Quelltext:
Code:
CASE step OF
0: (* Wait for rising edge at bWrite variable *)
IF bWrite THEN
bWrite := FALSE;
bBusy := TRUE;
bError := FALSE;
nErrId := 0;
hFile := 0;
nRow := 0;
nColumn := 0;
step := 1;
END_IF
1: (* Open source file *)
fbFileOpen( bExecute := FALSE );
fbFileOpen( sNetId := sNetId, sPathName := sFileName, nMode := FOPEN_MODEWRITE OR FOPEN_MODETEXT,(* Open file in TEXT mode! *)
ePath := PATH_GENERIC, bExecute := TRUE );
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:(* Convert one PLC record to CSV format *)
sCSVLine := '';
fbWriter.eCmd := eEnumCmd_First;(* Write first field value *)
IF nRow <= 17 THEN
FOR nColumn := 0 TO 23 BY 1 DO
sCSVField := STRING_TO_CSVFIELD( gvl.arParameter[nRow,nColumn], FALSE );(* TODO: Get field value from your application *)
(* Add new field to the record buffer *)
fbWriter( pBuffer := ADR( sCSVLine ), cbBuffer := SIZEOF( sCSVLine ) - 1, putValue := sCSVField, pValue := 0, cbValue := 0,
bCRLF := ( nColumn = 23 ) );(* bCRLF == TRUE => Write CRLF after the last field value *)
IF fbWriter.bOk THEN
fbWriter.eCmd := eEnumCmd_Next;(* Write next field value *)
ELSE(* Error *)
step := 100;
RETURN;
END_IF
END_FOR(* FOR nColumn := 0... *)
(* FB_FilePuts adds allready CR (carriage return) to the written line.
We have to replace the $R$L characters with $L character to avoid double CR. *)
IF RIGHT( sCSVLine, 2 ) = '$R$L' THEN
sCSVLine := REPLACE( sCSVLine, '$L', 2, LEN( sCSVLine ) - 1 );
END_IF
nRow := nRow + 1;(* Increment number of created records (rows) *)
step := 4;(* Write record to the file *)
ELSE(* All rows written => Close file *)
step := 10;
END_IF
4: (* Write single text line *)
fbFilePuts( bExecute := FALSE );
fbFilePuts( sNetId := sNetId, hFile := hFile, sLine := sCSVLine, bExecute := TRUE );
step := 5;
5:(* Wait until write not busy *)
fbFilePuts( bExecute := FALSE, bError => bError, nErrID => nErrID );
IF NOT fbFilePuts.bBusy THEN
IF NOT fbFilePuts.bError THEN
step := 3;(* Write next record *)
ELSE(* Error *)
step := 100;
END_IF
END_IF
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
Eine meiner Ideen wäre es, dass er den CR denn er nach Beendigung einer Zeile hinzufügt, vor dem eigentlichen schreiben drei mal durchführt (Hoffe, ihr wisst was ich meine). Allerdings hat die Umsetzung nicht ganz funktioniert. :?
Ich danke euch schon mal für eure Ideen.
MfG, BrascoC
Zuletzt bearbeitet: