# Array berreiche kopieren



## Hobby_Programmierer (13 Mai 2011)

Hallo,

ich bin fast den ganzen Tag nun an einer Aufgabe die ich einfach nicht "unkompliziert" lösen kann.

Klar ist es kein problem Variablen aus einen Array in ein anderes zu Kopieren.

Beispiel:

(*Deklaration*)
START_VAR : ARRAY [0..288] OF REAL
ZIEL_VAR : ARRAY [0..288] OF REAL

(*Programm*)
ZIEL_VAR := START_VAR;

- Aber ich möchte ja nicht KOMPLETTE ARRAYS KOPIEREN! SONDERN TEILE
1 Teil = 0-71
2 Teil = 72-144
3 Teil = 144 - 216
4 Teil = 217 - 288
über IF anweisungen.


oder sehr Aufwendig: (wie ich das auch hinbekommen würde)!

(*Deklaration*)
START_VAR : ARRAY [0..288] OF REAL
ZIEL_VAR : ARRAY [0..71] OF REAL <-------ACHTUNG! GRÖßE geändert!

(*Programm*)
IF TEIL1
THEN
ZIEL_VAR[0] := START_VAR[0];
ZIEL_VAR[1] := START_VAR[1];
.
.
.
ZIEL_VAR [71]:= START_VAR[71];
END_IF


IF TEIL2
THEN
 ZIEL_VAR[0] := START_VAR[72];
 ZIEL_VAR[1] := START_VAR[73];
.
.
.
ZIEL_VAR [71]:= START_VAR[143];
END_IF



Das muss doch aber auch einfacher gehen?!
Wenn jemand weiß wie, kann er mir gerne mal ein Beispiel hier schreiben.
Ich möchte mein Programm nicht all zu lang machen und ich werde so eine funktion sicher noch öfter mal gebrauchen.

Über hilfe wäre ich echt dankbar.
LG


----------



## simon86 (13 Mai 2011)

Das kannst du einfach über eine For Schleife realisieren:


FOR   <Startwert initialisieren>
     TO    <Endwert>
     BY    <Schrittweite>

<auszuführender Teil>
END_FOR;

Du musst jedoch beachten, dass das Zeilarray genügend gross ist.



```
IF TEIL1 THEN
   start := 1;
   end := 71;
ELSIF TEIL2 THEN
   start := 72;
   end := 143;
...
...

END_IF;


FOR i:= start TO end BY 1 DO
    ZIEL_VAR[i] := START_VAR[i];
END_FOR;
```


----------



## Thomas_v2.1 (13 Mai 2011)

Wenn deine Steuerung eine MEMCPY-Funktion unterstützt könntest du es auch so machen:

```
MEMCPY(ADR(ZIEL_VAR[0]), ADR(START_VAR[72]), 72 * SIZEOF(START_VAR[0]));
```

72 * SIZEOF(START_VAR[0]) sollte hoffentlich schon zur Compile-Zeit durch eine Konstante ersetzt werden, das kann man bei Codesys leider nicht nachprüfen.


----------



## Hobby_Programmierer (13 Mai 2011)

Hallo,

ja vielen dank! Bin auch noch auf eine Lösung gekommen ist jedoch nicht so schön ist (die ich noch nicht ausprobiert habe) aber laufen sollte, die ist aber länger und daher ist die von Simon86 meine wahl. 

MEMCPY-Funktion, da weiß ich nicht mal was das ist.
Es ist ein WAGO 750-880 Controller.

LG


----------



## Thomas_v2.1 (13 Mai 2011)

Hobby_Programmierer schrieb:


> MEMCPY-Funktion, da weiß ich nicht mal was das ist.


MEMory CoPY, also Speicherbereiche kopieren.
Sollte man eigentlich nur verwenden wenn es symbolisch nicht mehr geht, weil die Funktionsparameter nur als Zeiger übergeben werden und somit keine Typprüfung möglich ist.
Der eine Parameter ist ein Zeiger auf den Startbereich, der andere auf den Zielbereich, der dritte gibt die Anzahl der zu kopierenden Bytes an.
Wenn deine Wago so eine Funktion nicht in irgendeiner Bibliothek mitliefert, kannst du dir diese natürlich auch mit einer Schleife à la Simon nachbauen.


----------



## Hobby_Programmierer (17 Mai 2011)

Hallo,

da mir hier super geholfen wurde, probiere ich es noch einmal.
Folgendes:

Ich Speichere auf einer SD-Karte eine CSV Datei,
die ich als Array in die Datei schreibe.

Wenn ich die Datei mit der SPS wieder öffne und in ein Array lade
liegt diese Strucktur dahinter.
(also 288 mal 0...287)

TYPE: typCSV
STRUCT
     DT_dateT;
     Parameter: ARRAY[1..3] OF INT;
END_STRUCKT
END_TYPE

TYPEDATA[1] liegen dann Paramter[1] und Paramter[2] und Paramter[3]
(*TYPEDATA weil es in der Deklaration so deklariert ist*)

Mein problem ist nun diese Struktur in 3 verschienene ein dimensionale ARRAYs zu bekommen. Wie z.B. in:
Wert1: ARRAY[0..287] OF INT
Wert2: ARRAY[0..287] OF INT
Wert3: ARRAY[0..287] OF INT

Wenn ich das nun so aufschreibe, kommt mir gerade etwas in den sinn.
Ist das vielleicht schon die Lösung?


(*Deklaration*)
Start: INT := 0;
END: INT := 287;

IF xxxx
THEN
FOR i=Start TO End BY 1 DO
Wert1_ :=TYPEDATA.Paramter[1];
Wert2 :=TYPEDATA.Paramter[2];
Wert2 := TYPEDATA.Paramter[3];
END_FOR
END_IF

Werde ich morgen ausprobieren.
LG und vielen Dank schon mal._


----------



## Chräshe (18 Mai 2011)

[FONT=Arial, sans-serif]Hallo Hobby_Programmierer,[/FONT]

 [FONT=Arial, sans-serif]dein gesuchter Ausdruck ist ein „ARRAY of STRUCT“[/FONT]
 [FONT=Arial, sans-serif]Sieh dir mal das Programm IPC_X86.zip  an und suche folgende Deklaration:[/FONT]
[FONT=Arial, sans-serif]stMessage : ARRAY[1..cMessageMax] OF ST_Message;[/FONT]

 [FONT=Arial, sans-serif]Mit etwas Zeit und Interesse erklärt sich das fast selbst...[/FONT]

 [FONT=Arial, sans-serif]Deine Idee mal alles als CSV auszugeben und wieder zurücklesen ist leider nicht ganz so einfach. Wenn du mit Beckhoff arbeitest, kannst du dir mal den XML Data Server[/FONT] [FONT=Arial, sans-serif]ansehen.[/FONT]
 [FONT=Arial, sans-serif]Selbst habe ich aber noch keine Erfahrungen damit...[/FONT]

 [FONT=Arial, sans-serif]Gruß[/FONT]
 [FONT=Arial, sans-serif]Chräshe[/FONT]


----------



## Hobby_Programmierer (18 Mai 2011)

Hey,
habe es heute morgen bereits geschafft.
Einfach war es nicht, aber die CoDeSys hat eigentlich alle funktionen dafür.
Trotzdem danke für die Hilfe.
Ich nutze dafür eine Wago.

LG


----------

