-> Hier kostenlos registrieren
Hallo,
Ich habe einen Sensor der gibt mir sein Messwert mit einer Frequenz von 2,5 Khz ( T =0,4 ms) .
Die Beckhoff SPS kann problemlos mithalten, indem ich die Zykluszeit ( jetzt auf 0,1 ms pro Zyklus)heruntersetze und ich kann jeden Messwert zwischenspeichern.
Nun möchte ich die Messwerte auf die Festplatte (der SPS) mitloggen und zwar möglichst jeden.
Momentan habe mit FB_CSVMemBufferWriter und FB_FilePuts aus dem CSV Beispiel geschafft, mit ca. 1kHz die daten mitzuloggen, d.h. "nur" fast jeden dritten Wert schaffe ich zu loggen.
Ich gehe davon aus , dass durch das zeilenweise Schreiben der Schreibevorgang so lange dauert.
Nun meine Frage:
Welche Möglichkeiten habe ich, dass ich jeden Messwert Mitloggen kann in 2,5 kHz?
kann ich mehrere "zeilen" auf einmal schreiben, d.h. wenn ich mir ein array[0..100] bastel mit 100 werten, kann dieses dann in weniger als 100 Zyklen( >40 ms) auf die Festplatte geschrieben werden, damit danach die nächsten 100 Werte ohne Verlust angehängt werden können ?!
gehts eventuell mit einer Textdate Schneller ( fb_filewrite, probiere ich jetzt aus)?
Die dauer des Loggens beträgt später max 20 Sec.
MFG
Morris
CSV Beispiel : [url]https://infosys.beckhoff.com/index.php?content=../content/1031/tcplclibutilities/html/TcPlcLibUtilities_CSV_Sample.htm&id= [/URL]
Ich habe einen Sensor der gibt mir sein Messwert mit einer Frequenz von 2,5 Khz ( T =0,4 ms) .
Die Beckhoff SPS kann problemlos mithalten, indem ich die Zykluszeit ( jetzt auf 0,1 ms pro Zyklus)heruntersetze und ich kann jeden Messwert zwischenspeichern.
Nun möchte ich die Messwerte auf die Festplatte (der SPS) mitloggen und zwar möglichst jeden.
Momentan habe mit FB_CSVMemBufferWriter und FB_FilePuts aus dem CSV Beispiel geschafft, mit ca. 1kHz die daten mitzuloggen, d.h. "nur" fast jeden dritten Wert schaffe ich zu loggen.
Ich gehe davon aus , dass durch das zeilenweise Schreiben der Schreibevorgang so lange dauert.
Nun meine Frage:
Welche Möglichkeiten habe ich, dass ich jeden Messwert Mitloggen kann in 2,5 kHz?
kann ich mehrere "zeilen" auf einmal schreiben, d.h. wenn ich mir ein array[0..100] bastel mit 100 werten, kann dieses dann in weniger als 100 Zyklen( >40 ms) auf die Festplatte geschrieben werden, damit danach die nächsten 100 Werte ohne Verlust angehängt werden können ?!
gehts eventuell mit einer Textdate Schneller ( fb_filewrite, probiere ich jetzt aus)?
Die dauer des Loggens beträgt später max 20 Sec.
3* Convert one PLC record to CSV format *)
sCSVLine := '';
fbWriter.eCmd := eEnumCmd_First;(* Write first field value *)
IF nRow <= MAX_CSV_ROWS THEN
FOR nColumn := 0 TO MAX_CSV_COLUMNS BY 1 DO
database[nRow,1]:= UDINT_TO_STRING(nRow); // Testweise die Spaltennummer ( von 0 .. 100)
database[nRow,2]:= UDINT_TO_STRING(udtime); // Hier steht der SPS Zyklus drinnen ( im main wird i +1 hochgezählt), in der CSV Datein steht dann 10,20,30,40
// da bei 0,1 ms nur in jedem 10 Zykluszeit dert Messwert gespichert wird ( => nur ca 1kHz )
database[nRow,3]:= UDINT_TO_STRING(udarray[nRow]); // AUch ein Array wird zeilenweise geschrieben => verluste
sCSVField := STRING_TO_CSVFIELD( database[ 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 = MAX_CSV_COLUMNS ) );(* 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 *)
MFG
Morris
CSV Beispiel : [url]https://infosys.beckhoff.com/index.php?content=../content/1031/tcplclibutilities/html/TcPlcLibUtilities_CSV_Sample.htm&id= [/URL]