Du hast doch eine Instanz des Structs, während das Array nur als Pointer auf die Startadresse des Structs zeigt. Die Anordnung der Daten im Speicher wird also durch das Struct bestimmt, seine einzelnen Strings beginnen an Byte 0, 41, 82, 123 usw. Wenn Du über den Array-Pointer auf die Strings zugreifen willst, müssen die Array-Felder an genau den gleichen Speicheradressen beginnen, also auch als "String(40)" deklariert sein. Da bleibt kein freier Bereich. Wenn im Struct zwischen den Strings keine Bytes frei sind, dann kann und darf das im Array auch nicht sein.
Hi,
habe etwas vorbereitet, sollte (ich hoffe es) wieterhelfen, falls Fragen noch offen Message an dieser Stelle reicht aus.
Vor deinem Problem habe ich vor einigen Tage selbst kapituliert, jetzt ist alles Einfach, Stringbreite deklariert = Anzahl Bytes + 1 fuer Stringende im Speicher der PLC.
Sollst du Online testen, bitte nach Aenderung der Werte Onlinereset durchfueren.
PROGRAM MAIN
VAR
Array1:ARRAY[1..4] OF STRING(1):='1','2','3','4';
Array2:ARRAY[1..4] OF STRING(2):='1','2','3','4';
Array3:ARRAY[1..4] OF STRING(4):='1','2','3','14';
_size_Array1:INT;
_size_Array2:INT;
_size_Array3:INT;
_size_Item_Array1:INT;
_size_Item_Array2:INT;
_size_Item_Array3:INT;
_pointer1: POINTER TO BYTE;(* bei 1 Ergebnis=16#49 also ASCI '1'*)
_pointer2: POINTER TO WORD;
_pointer3: POINTER TO DWORD;
_pointer1A: POINTER TO STRING(1);
_pointer2A: POINTER TO STRING(2);
_pointer3A: POINTER TO STRING(4);
_adr1:WORD;
_adr2:WORD;
_adr3:WORD;
_gesuchte_String1:STRING(1);(* bei 1 Ergebnis= '1' also direkt das Zeichen !*)
_gesuchte_String2:STRING(2);
_gesuchte_String3:STRING(4);
_gesuchte_String1A:STRING(1);(* bei 1 Ergebnis= '1' also direkt das Zeichen !*)
_gesuchte_String2A:STRING(2);
_gesuchte_String3A:STRING(4);
END_VAR
(***********************************************************)
_adr1:=ADR(Array1);
_size_Array1:=SIZEOF(Array1);
_size_Item_Array1:=SIZEOF(Array1[1]);(*Deklariert 1 Zeichen also 1Byte, werden aber 2Byte benoetigt fuer die Kennung "Stringende"*)
_adr2:=ADR(Array2);
_size_Array2:=SIZEOF(Array2);
_size_Item_Array2:=SIZEOF(Array2[1]);(*Deklariert 2 Zeichen also 1Byte, werden aber 3Byte benoetigt fuer die Kennung "Stringende"*)
_adr3:=ADR(Array3);
_size_Array3:=SIZEOF(Array3);
_size_Item_Array3:=SIZEOF(Array3[1]);(*Deklariert 4 Zeichen also 4Byte, werden aber 5Byte benoetigt fuer die Kennung "Stringende"*)
_pointer1A:=_adr1;
_pointer2A:=_adr1;
_pointer3A:=_adr1;
(*gesuchte String mit Breite 1;2;4 Zeichen *)
_gesuchte_String1:=_pointer1A^;
_gesuchte_String2:=_pointer2A^;
_gesuchte_String3:=_pointer3A^;
_pointer1A:=_adr1;
_pointer2A:=_adr1+4;
_pointer3A:=_adr1+6;
_gesuchte_String1A:=_pointer1A^;
_gesuchte_String2A:=_pointer2A^;
_gesuchte_String3A:=_pointer3A^;
_pointer1A:=_adr3;
_pointer2A:=_adr3+10;
_pointer3A:=_adr3+15;
_gesuchte_String1A:=_pointer1A^;
_gesuchte_String2A:=_pointer2A^;
_gesuchte_String3A:=_pointer3A^;
(********************************************************)