TCP-Packet in Structured Text aufbauen

NikolasE

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

Ich hoffe mal, dass ich das richtige Forum ausgewählt habe..

Wir arbeiten in Structured Text auf eine B&R Steuerung und wollen Daten per TCP auf einen Industrie PC übertragen. Die Übertragung an sich funktioniert, so
dass wir jetzt daran arbeiten, das TCP-Packet aufzubauen. Wir haben Variablen mit verschiedenen Typs, die wir übertragen wollen, können sie aktuell nur leider
nicht in ein Array kopieren. In C würde ich in die Richtung arbeiten:

void* buffer = malloc(100);
int ID = 23;
memcpy((int*)(buffer),ID,4);
float foo = 17.2;
memcpy((float*)(buffer+4),foo,4);

Könnte mir also jemand sagen, wie ich Reals und Ints so in ein Array kopieren kann, damit ich es per TCP verschicken kann?

Nikolas
 
Du könntest alle Zahlen in Klartext (CHAR, STRING) umwandeln und in ein ARRAY OF CHAR (oder BYTE) packen.
Oder ein ARRAY OF BYTE benutzen und alle Datentypen in die Einzel-Bytes zerlegen.
Etwa so:
Code:
buffer[0] := INT_TO_BYTE(intvar);       //L-Byte
buffer[1] := INT_TO_BYTE(intvar/256);   //H-Byte

Harald
 
Hallo

Ich hoffe mal, dass ich das richtige Forum ausgewählt habe..

Wir arbeiten in Structured Text auf eine B&R Steuerung und wollen Daten per TCP auf einen Industrie PC übertragen. Die Übertragung an sich funktioniert, so
dass wir jetzt daran arbeiten, das TCP-Packet aufzubauen. Wir haben Variablen mit verschiedenen Typs, die wir übertragen wollen, können sie aktuell nur leider
nicht in ein Array kopieren. In C würde ich in die Richtung arbeiten:

void* buffer = malloc(100);
int ID = 23;
memcpy((int*)(buffer),ID,4);
float foo = 17.2;
memcpy((float*)(buffer+4),foo,4);

Könnte mir also jemand sagen, wie ich Reals und Ints so in ein Array kopieren kann, damit ich es per TCP verschicken kann?

Nikolas

Hallo,
du könntest auch einen Datentyp erzeugen, welcher die Daten abbildet. Dieser 'Transfer' Datentyp enthält alles was du zum IPC senden willst

Das ganze könnte dann auch so aussehen


Transfer.ID = 23
Transfer.foo = 17.2
usw....

Symbolisch wird das dann so irgendwie gesendet.

send (...., adr(Transfer), sizeof(Transfer), ....)

Am IPC nimmst du auch einen Datentyp der genauso aussieht...

receive (.... , &Transfer, &rec_len, ...)

Aufpassen muss man wegen Alignement, d.h. wenn du Struktur innerhalb einer Struktur machst, bzw. nur ein einzelnes Byte oder Bool, dann musst du Füllbytes im IPC reingeben, der Compiler für die Steuerung macht das automatisch ohne dich darauf hinzuweisen.

Gutes Gelingen
BG
BB
 
Hallo

So haben wir es jetzt auch gelöst und sind zufrieden damit. Wir verschicken jetzt ints (2Byte) und floats (4Byte) und achten drauf, dass die integer immer nur in einer geraden Anzahl auftreten, also float int int float statt float int float int. Dann baut der Compiler auch keine Padding Byte mehr ein und diet Daten liegen schön sequenziell im Speicher.

Nikolas
 
Zurück
Oben