HTTP Post String grösse 500

tiego

Level-1
Beiträge
51
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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:
Code:
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
Code:
(pt+i)^ := ps^;
oder
Code:
pt[i] := ps^;
heißen. Kann aber auch sein, daß ich das jetzt mit C verwechsle.

Gruß
 
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:

Code:
    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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Zurück
Oben