Problem Concat TWINCAT2

siegener19

Level-2
Beiträge
255
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe ein kleines Problem mit der Funktion Concat.
Ich möchte gerne für die csv-Dateien eine je Spalte eine Überschrift erstellen. Das habe ich so gemacht:

FILEDATA1 := CONCAT ('Datum', ';');
FILEDATA1 := CONCAT (FILEDATA1, 'Mess1');
FILEDATA1 := CONCAT (FILEDATA1, ';');
FILEDATA1 := CONCAT (FILEDATA1, 'Mess2');
FILEDATA1 := CONCAT (FILEDATA1, ';');
FILEDATA1 := CONCAT (FILEDATA1, 'Mess2');
FILEDATA1 := CONCAT (FILEDATA1, ';');
FILEDATA1 := CONCAT (FILEDATA1, 'Mess2');
FILEDATA1 := CONCAT (FILEDATA1, ';');
FILEDATA1 := CONCAT (FILEDATA1,'Mess2');
FILEDATA1 := CONCAT (FILEDATA1, ';');
FILEDATA1 := CONCAT (FILEDATA1,'Mess2');
FILEDATA1 := CONCAT (FILEDATA1, ';');
FILEDATA1 := CONCAT (FILEDATA1, 'Mess2');
FILEDATA1 := CONCAT (FILEDATA1, ';');
FILEDATA1 := CONCAT (FILEDATA1, 'Mess2');
FILEDATA1 := CONCAT (FILEDATA1, '$N');

buffer:= FILEDATA1;

Das funktioniert auch soweit. Wenn ich aber die Strings Mess2 vergrößere, also zum Beispiel Scheinwiderstand schreibe, dann kommt alles durcheinander und die Werte werden irgendwo abgehackt und oder woanders geschrieben.

Ich habe versucht dieses Problem mit einem Array of String zu lösen, nur leider habe ich hier dasselbe Problem.

Hat jemand eine Idee, wie ich beliebige große Worte als Überschrift haben kann?
 
Vergiss die Funktion Concat hierfür. Die funktioniert nur mit Strings und die haben eine Begrenzung. Arbeite mit Bytearrays. Hier die Funktion die ich immer nehme für CSV, Irgendwasanders,... schreiben

Code:
FUNCTION FUN_AddString : DWORD
VAR_INPUT
 byBuffer   : POINTER TO ARRAY [0..MAX_BYTE_ARRAY] OF BYTE;
 nActWritePos  : DWORD;
 strAddText   : STRING(255);
END_VAR
VAR
 iLength    : UINT := 0;    
END_VAR


// Neue Version = Memmove
iLength := INT_TO_UINT(LEN(strAddText));


// Fehler Grenzen überschritten
IF nActWritePos + iLength >= MAX_BYTE_ARRAY THEN
 FUN_AddString := nActWritePos + iLength;
 RETURN;
END_IF


// Daten anhängen
mem.MemMove(
 pDestination := ADR(byBuffer^[nActWritePos]),
 pSource := ADR(strAddText), 
 uiNumberOfBytes := iLength
);


FUN_AddString := nActWritePos + iLength;

Aufruf der Funktion:

Code:
VAR
 nWritePos : DWORD := 0; // Schreibposition im Puffer
 byWriteBuffer : ARRAY [0..MAX_BYTE_ARRAY] OF BYTE; // Bytepuffer der später in Datei gespeichert wird
END_VAR

nWritePos := 0;
nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, 'Messwert1;Messwert2;Messwert3;$R$N'); // Aufpassen nicht mehr als 255 Zeichen verwenden! Falls mehr notwendig ist dann auftrennen und Fkt mehrmals aufrufen
nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, CONCAT('WERT;','WERT'));//Natürlich geht hier auch CONCAT in der FKT
file.SysFileWrite(rtsHandle, ADR(byWriteBuffer), nWritePos,ADR(rtsResult));  // Dann Bytearray schreiben

// Nun entweder die Variable nWritePos wieder auf 0 setzen und neu das Bytearry befüllen oder Datei schließen
// Ich schreibe immer wieder mit SysFileWrite damit die Bytegrenzen nicht überschritten werden
nWritePos := 0;
nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, 'BLABLUBBSDASD$R$N');
file.SysFileWrite(rtsHandle, ADR(byWriteBuffer), nWritePos,ADR(rtsResult));  // Dann Bytearray schreiben


file.SysFileFlush(hFile:= rtsHandle);
file.SysFileClose(rtsHandle);
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Falls du die Fkt "MEMMOVE" nicht hast kannst du das auch mit einer Schleife lösen. So habe ich das früher genutzt aber das ist deutlich langsamer und ich mag Performance. Trotzdem hier als Schleifenlösung:

Code:
FUNCTION FUN_AddString : DWORD
VAR_INPUT
 byBuffer   : POINTER TO ARRAY [0..MAX_BYTES_TO_EXPORT] OF BYTE;
 nActWritePos  : DWORD;
 strAddText   : STRING(255);
END_VAR
VAR
 i       : DWORD  := 0;
 pTemp    : POINTER TO BYTE;
 iLength    : UINT := 0;    
END_VAR

pTemp := ADR(strAddText);
FOR i := nActWritePos TO nActWritePos + INT_TO_DWORD(LEN(strAddText)) DO
 byBuffer^[i] := pTemp^;
 pTemp := pTemp + 1;
END_FOR;
FUN_AddString := i-1;
 
Danke für den Code, aber ich sehe den wald vor lauter bäumen nicht :)

Das könnte ich doch auch nehmen? :

Überschrift:= 'Messwert1;Messwert2;.....;SN'
 
Kopiere die Fkt rein dann ruf die so auf:

nWritePos := 0;

nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, 'Messwert1;');
nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, 'Messwert2;');
nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, 'Messwert3;');
nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, 'Messwert4;');
nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, 'Messwert5;');
nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, 'Messwert6;$R$N');

FOR i := 0 TO WERTEMAX DO
nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, DINT_TO_STRING(blablub.Wert1) );
nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, DINT_TO_STRING(blablub.Wert2) );
nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, DINT_TO_STRING(blablub.Wert3) );
nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, DINT_TO_STRING(blablub.Wert4) );
nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, DINT_TO_STRING(blablub.Wert5) );
nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, '$R$N' );
END_FOR;

file.SysFileWrite(rtsHandle, ADR(byWriteBuffer), nWritePos,ADR(rtsResult)); // Dann Bytearray schreiben
file.SysFileFlush(hFile:= rtsHandle);
file.SysFileClose(rtsHandle);
 
USchrift:='Messwert1;Messwert2;Messwert3;Messwert4;Messwert5;Messwert6;Messwert7;Messwert8;Messwert9;Messert10;$N';

Das hat auch geklappt.
 
Bin jetzt beim nächsten Problem (von einem zum anderen :))

Siehe ersten Beitrag: Ich möchte gerne das Datum einfügen ( Datum + Uhrzeit).
ich habe es mit dem "NT_GetTime" versucht und daraus per concat mir ein String gebaut und es dann in die Stelle von "Datum" getan. Das führt aber leider zu Problemen, wo die Daten dann durcheinander geworfen werden.
Weiß jemand wie man das am besten löst?
 
Zurück
Oben