Probleme mit dem Auslesen von String-Arrays

FelMa

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

bin relativ neu auf dem Thema, der SPS-Programmierung in ST und habe gerade ein paar Problem mit den String-Arrays.
Habe auch schon versucht mich hier im Forum schlau zu machen, habe aber noch nichts passendes gefunden.

Ich bekomme von einer externen Quelle ein UDP-Datagramm mit 16-Byte Länge. Dieses wandle ich anschließend in einen String um und möchte es nun gerne in eine Datei schreiben.
Hier kommt dann das Problem: Ich habe hierfür ein String-Array mit jeweils String-Länge 3 deklariert, beim Schreiben in die Text-Datei wird jedoch an die Strings, die kürzer als 3 sind irgendwelche Sonderzeichen oder Leerzeichen angehängt, die ich überhaupt nicht brauchen kann.

Hab mir schon überlegt, die String-Längen des Arrays dynamisch zu ändern, aber dass das nicht möglich ist, hab ich mittlerweile schon herausgefunden.

Hättet ihr irgendwelche Lösungsansätze?

Code:
(* Schleife zum byte-weisen Auslesen der empfangenen Nachricht *)
WHILE ctsz <= SIZEOF(in) DO
pt:= ADR(in[i]);
ptval:= pt^;
ptstr:= BYTE_TO_STRING(ptval);
strarr1[i].s1:= ptstr;
i:= i+1;
ctsz:= ctsz + 1;
END_WHILE

(* Re-Initialisieren des Schleifen- und des Adresszählers *)
i:= 1;
ctsz:= 1;

(* Schreiben in test.txt *)
TEXTFILE:= SysFileOpen(szFile:= 'C:\Dokumente und Einstellungen\felbma\Desktop\test.txt' , am:= AM_WRITE , pResult:= 0);
out:= SysFileWrite(hFile:= TEXTFILE , pbyBuffer:= ADR(strarr1) , ulSize:= SIZEOF(strarr1), pResult:= 0);
SysFileClose(hFile:= TEXTFILE);

"in" ist mein eingehendes Byte-Array
"strarr1" ist das String-Array

Viele Grüße,
Matthias
 
SysFileWrite schreibt alle Bytes des kompletten Arrays unabängig von der tatsächlich genutzten Stringlänge.
Du müßtest die Strings vor dem SysFileWrite mit Concat zu einem "Zeilen"-String zusammenfassen oder jeden String einzeln schreiben mit ulSize:=LEN(strarr1) oder alle Strings im Array zur Maximallänge mit Leerzeichen auffüllen (linksbündig oder rechtsbündig).

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank Harald,

hab mir jetzt einen String gebaut, in dem ich die Teile des Arrays zusammenbaue.
Scheint mir aber trotzdem irgendwie nicht die feine englische Art zu sein :p Gibt es denn nicht noch andere Möglichkeiten so etwas in der Richtung zu realisieren?

Viele grüße,
Matthias
 
In welcher Richtung wünschst Du denn andere Möglichkeiten? Ich hatte ja schon 2 weitere genannt.

SysFileWrite schreibt lediglich einen Byte-Bereich, welcher bei der Adresse pbyBuffer beginnt und ulSize lang ist. Die Struktur des Byte-Bereichs ist SysFileWrite herzlich egal (kann auch nicht ermittelt werden). Mit nur einem Aufruf von SysFileWrite geht es nicht. Entweder Du betrachtest den gesamten Bytebereich als 1 Daten-Item und wunderst Dich dann auch nicht, daß das gesamte Item geschrieben wird, oder Du mußt SysFileWrite für jedes Item extra aufrufen. Oder halt mehrere Items vor dem SysFileWrite zu einem Item zusammenbauen.

Andere Möglichkeiten sehe ich nicht.

Harald
 
Ok, vielen Dank.

Hatte irgendwie nicht auf dem Schirm, dass SysFileWrite mehrere male hintereinander schreiben kann... Bin irgendwie davon ausgegangen, dass das zuvor geschriebene einfach überschrieben wird.
Dann bau ich mir das nochmal um und probiers damit SysFileWrite öfter aufzurufen.

Viele Grüße,
Matthias
 
Zurück
Oben