[TwinCat3] Datensatz schreiben

naheliegend

Level-1
Beiträge
87
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
fbWriter  : FB_CSVMemBufferWriter;
nRow: INT := 1;
sCSVField            : ARRAY [1..iSizeOfValueArray] OF T_MaxString;
sCSVLine            : ARRAY [1..1000000000] OF BYTE;
str_Power: STRING;
aValueArray : ARRAY [1..iSizeOfValueArray] OF LREAL;

Code:
WHILE nRow <= iSizeOfValueArray DO   //nRow wurde oben auf 1 gesetzt
   
  aValueArray[nRow] := nRow + 0.11; //Beispiel aValueArray mit Werten füllen
  
        str_Power:=LREAL_TO_STRING(aValueArray[nRow]);   //LREAL WERT ZU STRING VERWANDELN
                sCSVField[nRow] := STRING_TO_CSVFIELD( str_Power, FALSE );(* TODO: Get field value from your application *) // STRING IN CSVFIELD VERWANDELN
    
    nRow := nRow +1;
    
 END_WHILE //
 
 

               [B] fbWriter[/B](     pBuffer := ADR( sCSVLine ), cbBuffer := SIZEOF( sCSVLine ), putValue := '', pValue := ADR(sCSVField), cbValue := SIZEOF(sCSVField[1]),
                            bCRLF := TRUE);(* bCRLF == TRUE => Write CRLF after the last field value *)
       
                IF [B]fbWriter.bOk[/B] THEN
                    fbWriter.eCmd := eEnumCmd_Next;(* Write next field value *)
                 ELSE(* Error *)
                 
                     RETURN;
                END_IF

Hi, wieso funktioniert mein fbWriter nicht? Ich übergebe mit pValue := ADR(sCSVField) einen Array of STRINGs aus dem STRING_TO_CSV FB.

Infosys: fbWriter aka FB_CSVMemBufferWriter: ( https://infosys.beckhoff.de/index.p...PlcLibUtilities_FB_CSVMemBufferWriter.htm&id= )

Also fb.Writer.bOk meldet auch ein FALSE, weswegen da irgendwas schief läuft. Finde den Fehler aber nicht...

Ich denke der Fehler liegt im pValue, dass ich durch sCSVField, irgendwas falsches übergeben...

pValue: Optional: Adresse eines externen Bytepuffers in dem sich das neue Datenfeld befindet. Zusammen mit dem cbValue-Parameter kann dieser Eingang dann benutzt werden wenn z.B. ein Datenfeld mit Steuerzeichen oder Binärdaten in den Datensatz geschrieben werden soll. Die Steuerzeichen oder Binärdaten im Datenfeld könnten den putValue-String an einer ungewünschten Stelle abschneiden und werden deshalb als Bytepuffer übergeben. Dieser Eingang muss den Wert Null haben wenn er nicht benutzt wird.
 
Wieviele LREAL versuchst Du denn in einem Rutsch in den AusgabePuffer zu quetschen?
Vielleicht klappt's, wenn Du (zum Testen) erstmal z.B. nur drei Werte nimmst und dann guckst, wie lang der so erzeugte String geworden ist.
Beckhoff schreibt da was von maximal möglichen 253 Bytes - vermutlich musst Du Deine Ausgabe zerstückeln?!
Gruss, Heinileini
 
Wieviele LREAL versuchst Du denn in einem Rutsch in den AusgabePuffer zu quetschen?
Vielleicht klappt's, wenn Du (zum Testen) erstmal z.B. nur drei Werte nimmst und dann guckst, wie lang der so erzeugte String geworden ist.
Beckhoff schreibt da was von maximal möglichen 253 Bytes - vermutlich musst Du Deine Ausgabe zerstückeln?!
Gruss, Heinileini

5 Stück nur.

Was Du da machst ist Doppeltgemoppelt und vielleicht die Ursache für Dein Problem.
Mit STRING_TO_CSVFIELD erzeugst Du ein CSV-Feld, aber das macht FB_CSVMemBufferWriter auch.

ich dachte mit STRING_TO_CSVFIELD erzeuge ich ein Datenfeld mit meinem LREAL Wert drin. Und mit FB_CSVMemBufferWriter füge ich diese einzelnen Datenfelder so zusammen, dass ein Datensatz entsteht und ich ihn in eine Reihe des CSV File schrieben kann, jedes Datenfeld getrennt mit einem Simokolon
 
ich dachte mit STRING_TO_CSVFIELD erzeuge ich ein Datenfeld mit meinem LREAL Wert drin. Und mit FB_CSVMemBufferWriter füge ich diese einzelnen Datenfelder so zusammen, dass ein Datensatz entsteht und ich ihn in eine Reihe des CSV File schrieben kann, jedes Datenfeld getrennt mit einem Simokolon
Nein, das macht FB_CSVMemBufferWriter ganz alleine. Sobald Du bCRLF auf TRUE setzt wird nach dem Datenfeld der Datensatz beendet.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich verstehe Beckhoff so, dass
FB_CSVMemBufferWriter nur den AusgabePuffer aufbereitet und der Quark dann noch mit
FB_FilePuts
geschrieben werden muss?

Der Inhalt des Puffers kann danach z.B. mit Hilfe der Bausteine für den Dateizugriff in eine Datei geschrieben werden.

Funktionsbaustein für den DateischreibzugriffFB_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)
 
Nein, das macht FB_CSVMemBufferWriter ganz alleine. Sobald Du bCRLF auf TRUE setzt wird nach dem Datenfeld der Datensatz beendet.

Fett, funktioniert.

Eine Frage habe ich noch: Ich übergebe ja den Ergebnisbuffer sCSVLine aus dem FB_CSVMemBufferWriter an den FB_FileWrite um den Datensatz in ein csv File zu schreiben. Jetzt habe ich den sCSVLine Array am Anfang so dimensioniert:

sCSVLine : ARRAY [1..100] OF BYTE;

Mit meinen 3 LReal Werten: 0.11 , 0.22 , 0.33 wurden jetzt am Ende in sCSVLine 14 BYTE Plätze vollgeschrieben.

Was ist die Maximale Größe von dem Ergebnisbuffer (hier sCSVLine , in FB Info: Zielpuffervariable) ?
Was passiert wenn ich 10000 LREAL Werte als einen Datensatz in eine CSV Datei schreiben möchte?
 
Das ist von Deiner CPU abhängig. Bei ARRAY OF BYTE gibt es keine direkte Obergrenze, solange Dein Programm sich noch übersetzen lässt ist alles gut.
Außerdem willst Du die 10000 Werte ja vermutlich nicht in eine Reihe schreiben wollen, dann kopierst Du den Puffer von sCSVLine in einen anderen mit MEMCPY, schreibst diesen dann in eine Datei, "löscht" parallel sCSVLine und befüllst diesen wieder.
 
Zurück
Oben