Struktur in Array

ipacsre

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo habe ein Problem für euch sicherlich leicht zu lösen!

jedoch ich brauch Hilfe dabei !!!!

habe eine Struktur in der nur Byte werte enthalten sind diese möchte ich gern in ein Array of Byte gleicher größe bringen und ausgeben. Dann soll das Array bearbeitet werden und danach wieder das Array of Byte in die Struktur geschrieben werden.

Ich könnte sozusagen zwei Wandlerfunktionen brauchen die Struct_to_Array und Array_to_Struct!

Könnte mir jemand einen solchen Code zuverfügungstellen?
oder bei der Lösung helfen
modify_inline.gif
 
Hallo,
der Befehl AT ermöglicht es dir, eine vollkommen andere (aber gleich große) Sicht auf einen vorgegebenen Speicherbereich zu definieren. Versuch dich doch mal daran ...

Gruß
LL
 
... schau dir doch mal die Hilfe zu dem Befehl an.

Ansonsten hier mal ein Beispiel :
Code:
myVar1 : struct 
   uVar1 : word ;
   uVar2 : int ;
   uVar3 : DINT ;
end_struct ;
 
myNeuVar1 AT myVar1 : array[1..8] of byte ;
in myNeuVar wird die in myVar vorgegebene Struktur als Array of byte betrachtet. Wichtig hier : es müssen immer beide Elemente in der Größe zueinander passen ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Rene,

deine Funktionen kannst du auch über Pointer realisieren, schau dir doch mal den FB Transfer_STRUCT_Bool_ARRAY (Insider) an, den du sicher hast.

gruß bonatus
 
Hallo Bonatus!!!

Hallo Bonatus könnte dies richtig sein???:)
Code:
FUNCTION_BLOCK STRUCT_to_ARRAY
VAR_INPUT
 adrStruct: POINTER TO BYTE;
 uiSize: UINT;
END_VAR
VAR_OUTPUT
 Data: ARRAY[1..111] OF BYTE;
END_VAR
VAR
 Temp_Struct: ARRAY[1..111] OF BYTE;
 i: INT;
 Temp: BYTE;
END_VAR
--------------------------------------------------------
Code:
FOR i:=1 TO uiSize BY 1 DO
Temp := ROR(Temp_Struct[(i/8+1)],(i-1));
 IF adrStruct^ = 1 THEN
  Temp.0 := TRUE;
 END_IF
 IF adrStruct^ = 0 THEN
  Temp.0 := FALSE;
 END_IF;
Temp_Struct[(i/8+1)] := ROL(Temp,(i-1));
adrStruct := adrStruct + 1;
END_FOR
Data := Temp_Struct;

Danke schon mal im Vorraus...
und liebe Grüße an alle...
 
Hallo,

das kommt jetzt darauf an was du willst dieser FB ist dafür gedacht gewesen BOOLsche Variablen einer Struktur in ein Array zu wandeln. Wenn du nun die Bytes einer Struktur in ein Array packen willst, musst du den Baustein ändern...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Bonatus könnte dies richtig sein???:)
Code:
FUNCTION_BLOCK STRUCT_to_ARRAY
VAR_INPUT
 adrStruct: POINTER TO BYTE;
 uiSize: UINT;
END_VAR
VAR_OUTPUT
 Data: ARRAY[1..111] OF BYTE;
END_VAR
VAR
 Temp_Struct: ARRAY[1..111] OF BYTE;
 i: INT;
 Temp: BYTE;
END_VAR
--------------------------------------------------------
Code:
FOR i:=1 TO uiSize BY 1 DO
Temp := ROR(Temp_Struct[(i/8+1)],(i-1));
 IF adrStruct^ = 1 THEN
  Temp.0 := TRUE;
 END_IF
 IF adrStruct^ = 0 THEN
  Temp.0 := FALSE;
 END_IF;
Temp_Struct[(i/8+1)] := ROL(Temp,(i-1));
adrStruct := adrStruct + 1;
END_FOR
Data := Temp_Struct;
Danke schon mal im Vorraus...
und liebe Grüße an alle...

Schaut mir abenteuerlich aus, was spricht denn gegen
Code:
FOR i:=1 TO uiSize BY 1 DO
DATA[i] := adrStruct^;
adrStruct := adrStruct+1;
END_FOR

du kannst auch einfach einen Pointer folgendermassen definieren:
pbytes : POINTER TO ARRAY [0..SIZE] OF BYTE;
und dem dann die Adresse einer Struktur zuweisen.
pbytes := ADR(struct);
Das entspräche in etwa der AT-Deklaration. mit pbytes^[index] kannst du dann einfach auf die einzelnen Bytes in deiner Structur zugreifen.
Du arbeitest dann allerdings auf dem Original und nicht auf einer Kopie.

Bernhard
 
Welche Hardware? Wago hat eine Funktion "Memcopy" (sinngemäß, kann auswendig nicht garantieren daß es genau so geschrieben wird).

Man könnte natürlich auch die Strukt und das Bytearray auf Merker zeigen lassen:

Code:
    MeineStruktur AT %MW100:    MeineStruct;
    MeinArray AT %MW100:    ARRAY[0..8] OF Bytes ;

Würde ich aber perönlich nicht machen.
 
Zurück
Oben