# HTTP Post String grösse 500



## tiego (23 Juli 2019)

Guten Tag,

ich habe das Problem das mein HTTP Post eine grössere länge als 500 zeichen sein muss.

aktuell verwende ich:

                pabReqData:= ADR(sPoststring),
                uiReqDataCount:= LEN(sPoststring),

und füge mir alle Messwerte welche ich übertragen muss mit "Concat" zusammen.

alles funktioniert nur jetzt sind die 500 Zeichen zu kurz.

die Bibliotek verlangt folgendes:

    pabReqData        : POINTER TO ARRAY [0..MAX_RECEIVE_TCP_CLIENT] OF BYTE; (* Pointer to HTTP-Request-data *)
    uiReqDataCount    : UINT;         (* Bytecount of HTTP-Request-data  *)


gibt es eine möglichkeit die einzelnen kleinen Strings bereits in ein Array of bytes zu wandeln und dort die weiteren werte hinzuzufügen?
oder vieleicht sogar das ADR für Array of Strings?

danke


----------



## KLM (23 Juli 2019)

Ein String liegt im Speicher, wie ein Array Of Byte. Jedes Zeichen wird durch den Zahlenwert aus der ASCII Tabelle repräsentiert. Hinter dem letzten darstellbaren Zeichen folgt ein Byte mit Wert 0, was das Ende der Zeichenfolge kennzeichnet. Du Kannst den Pointer To String (also ADR(STRING), was der Adresse des Anfangs des Speicherbereichs (DWord) entspricht) also mit einem Pointer To Array Of Byte gleichsetzen. Das macht der CONCAT intern auch und kopiert dann die Bytes der darstellbaren Zeichen zusammen (via FOR-Schleife mit Ende, wenn Byte=0) und setzt als letzten Byte-Wert eine 0.


----------



## tiego (24 Juli 2019)

Guten morgen,

danke fÃ¼r deine Antwort, da ich aber zimlich neuling bin kann ich dir aktuell noch nicht folgen.

der Baustein HTTP Post benötigt die Variable pabReqData, diese ist laut mir folgendermasen aufgebaut,... 
Index,Bytevariable

Wenn ich den obrigen post richtig verstehe müsste ich wenn der "String" folgenden inhalt hat 'test' dies in der Variable pabReqData stehen?

1,Zeichen 't' als Byte
2,Zeichen 'e' als Byte
3,Zeichen 's' als Byte
4,Zeichen 't' als Byte
5,Zeichen 0 als Byte

Ich habe folgendes getestet, aber leider funktioniert es nicht und die Steuerung geht in STOP bzw es benätigt ein reset...

ps := ADR(str);
FOR i := 0 TO LEN(str)DO
    pt^_ := ps^;
    ps := ps + 1;
END_FOR;

Ich bin für jede unterstützung sehr dankbar._


----------



## Thruser (24 Juli 2019)

Hallo,

bist Du sicher mit den 500 Bytes? Nach WagoLibEthernet_01 ist MAX_RECEIVE_TCP_CLIENT definiert mit 1500.

Die kannst Du jedenfalls neu definieren unter den Globalen Variablen:

```
VAR_GLOBAL CONSTANT
  MAX_RECEIVE_TCP_CLIENT                 : DWORD:=1500;
END_VAR
```
Den anderen Teil der Frage verstehe ich nicht so ganz. Und bei Deinem zweiten Post müßte man noch zusätzlich die Variablendeklaration kennen um das besser nachvollziehen zu können.

Bei dem Pointer könntees eventuell

```
(pt+i)^ := ps^;
```
oder

```
pt[i] := ps^;
```
heißen. Kann aber auch sein, daß ich das jetzt mit C verwechsle.

Gruß


----------



## tiego (24 Juli 2019)

Hallo,

danke für die rückmeldung.

mit den >500 war gemeint das ich nun am limit bin.
ich müsste eine  gröseren String übertragen.


aktuell setze ich den 
pabReqData:= ADR(sPoststring),
                uiReqDataCount:= LEN(sPoststring),

so zusammen:


```
sPoststring:=CONCAT('ID=',sAnlagenName);
    sPoststring:=CONCAT(sPoststring,';');
    sPoststring:=REAL_TO_STRF(rMesswert_1,2,'.');
    sPoststring:=CONCAT(sPoststring,';');
  ....
    sPoststring:=CONCAT(sPoststring,REAL_TO_STRF(rMesswert_100,2,'.'));
    sPoststring:=CONCAT(sPoststring,';');
```

da ich aber ans limt mit String(510) gekommen bin müsste ich jetzt die Teilstrings bereits in 
POINTER TO ARRAY [0..MAX_RECEIVE_TCP_CLIENT] OF BYTE;
wandeln.

aber daran scheiter ich.


----------



## KLM (25 Juli 2019)

Nachdem der FB ein Array Of Byte will, kannst Du Dir natürlich den "Umweg" über einen String sparen und gleich ein Array of Byte zusammenstellen. Im Speicher ist das eh das gleiche. Für einen längeren String hab ich vor einiger Zeit mal was gebastelt. Das sollte auch mit noch längeren Strings funktionieren, aber das habe ich nicht getestet. Dein Absturz resultiert sicherlich aus einem Zugriff auf unzulässige Speicherbereiche durch die Verschiebung des Pointers über die Grenzen des Arrays. Solche Fehler findest Du am besten im Schrittweisen debugging.

FUNCTION CONCAT_512 : STRING(512)
(*
	concatation of two strings with a max. length of each input string and output string of 512
	- cuts after 512 charaters
	- CONCAT in stadard.lib only supports a length of 255 for each input string


	v0.1	2015-04-17	created
	v0.2	2017-02-22	bugfix stop char
*)
VAR_INPUT
	sStr1	: STRING(512);
	sStr2	: STRING(512);
END_VAR


VAR
	ptByteStr1	: POINTER TO BYTE;
	ptByteStr2	: POINTER TO  BYTE;
	ptByteConcat : POINTER TO BYTE;
END_VAR
----------------------------------------
ptByteStr1 := ADR(sStr1);
ptByteStr2 := ADR(sStr2);
ptByteConcat := ADR(CONCAT_512);


WHILE TRUE DO
	IF ptByteStr1^ = 0 THEN (* stop char of a string is 0 or '\0' *)
		EXIT;
	END_IF
	ptByteConcat^ := ptByteStr1^;
	ptByteConcat := ptByteConcat +1;
	ptByteStr1 := ptByteStr1 +1;
END_WHILE


WHILE TRUE DO
	IF (ptByteConcat - ADR(CONCAT_512)) >= 512 THEN
		EXIT;
	END_IF
	ptByteConcat^ := ptByteStr2^;
	ptByteConcat := ptByteConcat +1;
	ptByteStr2 := ptByteStr2 +1;
	IF ptByteStr2^ = 0 THEN (* stop char of a string is 0 or '\0' *)
		ptByteConcat^ := 0;
		EXIT;
	END_IF
END_WHILE


----------

