# String Concat



## sadik (16 Juni 2016)

Hallo 

Ich habe vier String-Variablen der Form.
a = '2086 1672 365000 100 100 1162134 78445 4294967295 0 0 4294967295 347500 117600'
b = '0 23080 0 0 4294967295 4294967295 4294967295 5000 -200 303 500 56 100 213 5570 6150 15 803 15 15 0 -2147483648 0 0 0'
c = '0 5000 23200 0 0 300 0 0 1000 0 0 0 300 0 1240 345600 29376000 0'
d = '0 0 19 0 0 DT#2016-06-14-01:27:50'

verkette diese strings anschließend mit der CONCAT-FB con := CONCAT(a, ''); con := CONCAT(con, b); ... usw. 
und übertrage diese über TCP/IP an meinen Rechner, jedoch  kommt nur ein Ausschnitt der konkatinierten[FONT=arial, sans-serif][/FONT]an, so ungefähr bis hälfte von der c-variable.
Ich habe die strings mit der größe 800 definiert, aber funktioniert auch nicht.

Wie kann ich große strings konkatenieren und übertragen ?

Gruß


----------



## Dr.MirakulixX (16 Juni 2016)

Hast du dir deinen String mal angesehen ? Also ob der String selber ggf. Komplett ist und bei der Übertragung gekürzt wird ?
Oder ist wirklich der String nach deinem Concat zu klein ?


----------



## sadik (16 Juni 2016)

Bei CONCAT-FB. Die string-variablen a und b werden vollständig konkatiniert, aber bei c wird ab "29376000" nicht mehr weiter hinzugefügt.


----------



## oliver.tonn (16 Juni 2016)

Das ist auch so in Ordnung, die Standard Stringfunktionen können nur Strings bis 255 Zeichen verarbeiten.

Von irgendwas mit Internetzugang gesendet.


----------



## sadik (16 Juni 2016)

OK wie kann ich dann mein Ziel erreichen ? also die letzte string variable hinzufügen ? 
Gibt es eine andere variante der concat - fb ?


----------



## oliver.tonn (16 Juni 2016)

Solange die Einzelstrings nicht länger als 255 Zeichen sind, könntest Du einen Zielstring in entsprechender Größe anlegen und die einzelnen Strings mit MEMCOPY an die entsprechende Position kopieren. Die Position musst Du Dir mit LEN dann errechnen.

Von irgendwas mit Internetzugang gesendet.


----------



## PN/DP (16 Juni 2016)

Mit welchem Programmiersystem programmierst Du? Gibt es da MEMCPY?
Ansonsten hier eine CONCAT-Variante mit Byte-weisem Kopieren mit Pointern für längere Strings
FUNCTION My_CONCAT

Harald


----------



## -J-E- (16 Juni 2016)

Schreibe dir eine eigene Concat Funktion. Die ist dann auch Threadsave(im Gegensatz zu den normalen String Operatoren).
Hier mal ein Beispiel:

```
[FONT=arial narrow]pBytepointer_to_String1 := ADR(String_1);
pBytepointer_to_String2 := ADR(String_2);
pBytepointer_to_StringRes := ADR(f_OWN_Concat);
  
WHILE TRUE DO (* Solange bis exit aufgerufen wird *)
     IF (xString2) THEN
         pBytepointer_to_StringRes^ := pBytepointer_to_String2^;
         IF (pBytepointer_to_String2^= 0) THEN
             EXIT; (* FERTIG - raus aus der Schleife *)
         END_IF
         pBytepointer_to_String2 := pBytepointer_to_String2 + 1;
         pBytepointer_to_StringRes := pBytepointer_to_StringRes + 1;
     ELSIF (pBytepointer_to_String1^ = 0) THEN
             xString2 := TRUE;
     ELSE
             pBytepointer_to_StringRes^ := pBytepointer_to_String1^;
             pBytepointer_to_String1 := pBytepointer_to_String1 + 1;
             pBytepointer_to_StringRes := pBytepointer_to_StringRes + 1;
     END_IF
     IF (pBytepointer_to_StringRes - ADR(f_OWN_Concat) >= 512) THEN (* Überlauf *)
         pBytepointer_to_StringRes^ := 0;
         EXIT; (* FERTIG - raus aus der Schleife *)
     END_IF
 END_WHILE
[/FONT]
```


hier die Dazugehörige Deklaration:


```
FUNCTION f_OWN_Concat: STRING(512)
VAR_INPUT
     String_1:   STRING(512);
     String_2:   STRING(512);
 END_VAR
VAR
    pBytepointer_to_String1 :   POINTER TO BYTE;
    pBytepointer_to_String2 :   POINTER TO BYTE;
     pBytepointer_to_StringRes :  POINTER TO BYTE;
     xString2 :   BOOL := FALSE;
 END_VAR
```


Aber Achtung: bei Codesys lassen sich z.B. nicht mehr als 512 Zeichen lange Strings definieren


----------

