String mit Nullterminierung in der Mitte senden

Pippsem

Member
Beiträge
6
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo,

ein Ethercatgerät erwartet als Parameter 2 nullterminierte Strings, wobei ich dem Objekt nur ein String zuweisen kann. Wenn ich die 2 Strings einzeln deklariere, hat jeder seine Terminierung, fasse ich diese über Concat zusammen, verliert der erste String die Terminierung. In der Anleitung fordert das Gerät folgende Bytefolge Hex "31 00 31 00". Auch der Versuch den String wie folgt zu initialisieren ist fehlgeschlagen...

str : STRING(4):= '$31$00$31';

Hat jemand eine Idee?

Beste Grüße
 

PN/DP

User des Jahres 2011-2013; 2015-2017; 2020-2021
Beiträge
19.470
Punkte Reaktionen
5.871
Nimm anstatt STRING ein BYTE- oder CHAR-Array, und kopiere die einzelnen Zeichen da hinein.

Harald
 
OP
P

Pippsem

Member
Beiträge
6
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo Harald,

am Ende muss ich dem Objekt einen String übergeben, da es diesen erwartet. Ich hatte ein Array of Byte mit den Werten und dann hatte ich über MemCopy dies in den String kopiert. Das Ergebnis war das die zweite „1“ angeschnitten wurde.
 

PN/DP

User des Jahres 2011-2013; 2015-2017; 2020-2021
Beiträge
19.470
Punkte Reaktionen
5.871
am Ende muss ich dem Objekt einen String übergeben, da es diesen erwartet.
Wirklich? Bist Du sicher? Für welches Objekt ist der "String"? Gibt es ein Handbuch, wo die ominöse Zuweisung von 2 Strings erklärt wird?
Ein nullterminierter String kann definitionsgemäß kein 0-Byte enthalten.
Kannst Du nicht bei der Übergabe, wo der String erwartet wird, einen Pointer übergeben, der auf den Anfang eines CHAR-Arrays zeigt? Wenn der Empfänger ein 0-Byte in dem String erwartet, dann weiß er auch, daß der übergebene "String" erst beim zweiten 0-Byte endet.

Harald
 
Zuletzt bearbeitet:

sps_21

Active member
Beiträge
39
Punkte Reaktionen
7
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo Harald,

am Ende muss ich dem Objekt einen String übergeben, da es diesen erwartet. Ich hatte ein Array of Byte mit den Werten und dann hatte ich über MemCopy dies in den String kopiert. Das Ergebnis war das die zweite „1“ angeschnitten wurde.

Ich bin bei Harald - lt. Definition geht das gar nicht.

Ich würde versuchen dein Array mit Byte zu beschreiben und den String über Zeiger auf exakt diese Adresse zu setzen und dann die Länge manuell zu setzen. Danach ist es zumindest im Speicher korrekt. Fragt sich wohin und wie du das austauscht - eigentlich geht es nur mit Zeiger + Länge umkopieren, da alle System/IEC-Funktionen lt. Definition fehlschlagen müssen weil sie am ersten Terminator aufhören.
 

Tobsucht

Well-known member
Beiträge
267
Punkte Reaktionen
68
In CODESYS 3.5 funktioniert myString := '1$001';
Wenn der Text statisch vorgegeben werden kann, kannst Du das so machen.

Alternativ könnte man sich per memcpy etwas zusammenkopieren.

Wenn die Werte dynamisch vorgegeben werden müssen, würde ich zu einem Union mit einem Array of Byte und dem String tendieren.
 

sps_21

Active member
Beiträge
39
Punkte Reaktionen
7
In CODESYS 3.5 funktioniert myString := '1$001';

Codesys 3.5 kenn' ich leider nicht. Aber das es geht spricht dafür dass sie nullterminierte Strings zumindest nicht in ihrer Architektur verwenden. Sondern noch irgendwie die alte Festlegung mit dem Längenbyte. Nur größer halt.

Frage mich gerade, ob die Antwort (geht "einfach": j/n) dann abhängig vom Target ist.
 

KLM

Well-known member
Beiträge
462
Punkte Reaktionen
102
Zuviel Werbung?
->Hier kostenlos registrieren
CODESYS zeigt den Wert einer STRING Variable bis zum ersten Terminierungszeichen, im Speicher sind die Bytes dahinter aber noch vorhanden. D.h. Du kannst mit MemCpy, Pointer-Verschiebung, Union oder myString[<Positionsindex mit Basis 0>] die beiden Werte zusammenkopieren. Standardfunktionen für Strings werden nicht funktionieren, weil die immer bei der ersten Terminierung aufhören. Letzteres ist vermutlich das Hauptproblem, denn auch der verwendetes Sende Baustein erwartet einen STRING ohne Angabe der zu sendenden Länge und wird die zu sendenden Bytes ermitteln indem das erste Terminierungszeichen gesucht wird. Du wirst daher vermutlich den Baustein für die Kommunikation selbst neu erstellen oder den Autor um Anpassung bitten müssen.
 
Oben