Beckhoff Arrayverweis

Micha2304

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

ich bin neu im Thema Beckhoff und scheibe gerade meine Technikerarbeit.

Ich hätte folgendes Problem. Ich habe Arrays mit mehreren Level, die ich des öfteren in ein Array mit einem Level kopieren muss.
Bsp.:

gatyArchiv [0..5,0..1000] of T_Grafik;
gatyLive [0,0..1000] of T_Grafik;


Aktuell kopiere ich gatyArchiv[2,0..1000] mit einer "For-Schleife" ins gatyLive Array. Da ich dies doch nun ziemlich häufig machen muss, wird mein System ziemlich Langsam. Kann ich über einen Pointer oder sonst einen Befehl direkt das Array gatyArchiv[2,0..1000] mit gatyLive[0,0..1000] verknüpfen? Dann würde ich mir viele hundert Zeilen Code ersparen und mein System würde wieder deutlich schneller laufen.

Vielen Dank und viele Grüße

Michael
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Erstmal, wenn das Array eindimensional ist lass die zweite Dimension bei der Deklaration weg, also
Code:
gatyLive:ARRAY[0..1000] of T_Grafik;
und nicht
Code:
gatyLive:ARRAY[0,0..1000] of T_Grafik;
Dann versuch es doch mal mit MEMCPY, z.B. so:
Code:
MEMCPY(ADR(gatyLive), ADR(gatyArchiv[2,0]), sizeof(gatyLive));
 
Geht auch ohne MEMCPY.
Code:
(* Typdeklaration für 1 Grafikarray *)
TYPE arrT_Grafik :
   ARRAY[0..1000] OF T_Grafik;
END_TYPE

(* Variablendeklaration *)
gatyArchiv:ARRAY[0..5] OF arrT_Grafik;
gatyLive:arrT_Grafik;

(* Code *)
gatyLive:=gatyArchiv[2];
(* Zugriff auf einzelnes Element von gatyArchiv *)
gatyArchiv[2][500]:=igrendein_T_Grafik;   (* statt gatyArchiv[2,500]) *)
 
Zuletzt bearbeitet:
Dann würde ich mir viele hundert Zeilen Code ersparen und mein System würde wieder deutlich schneller laufen.
Wie schnell ein Programm läuft kann man kaum anhand der Anzahl Codezeilen abschätzen. Man kann durch wenige Zeilen Code in einer Schleife das Programm total langsam machen. Andersrum kommt auch vor, daß 1000 Zeilen lineare Programmierung schneller abgearbeitet werden als 100 Zeilen in einer Schleife mit "unsichtbar" aufwendiger Pointerarithmetik ...

Harald
 
Servus,

erstmals danke für die schnellen Antworten.
Ich brauche die zweite Dimension, da ich Grafikwerte von einem DMS im 10ms Takt aufnehme und im LineChart darstelle. Das LineChart braucht die zweite Dimension, auch wenn diese 0 heißt.

Das Problem ist, dass ich jedes mal alle tausend Werte durchkopieren muss. In meinem Archiv sind es teilweise auch 0..49, 0..10000 Werte die ich alle um ein Level innerhalb der Dimension aufrücken lasse. Ich weiß, es ist etwas umständlich, aber ich kann's im Moment noch nicht besser. Hierbei kommt meine CX2030 mit 2GB soweit ans Limit, dass ich auf 100% Arbeitsspeicherauslastung komme.

Bei der Version ohne MEMCPY: Kann ich so nicht nur einen einzelnen Wert aus dem Array herausnehmen oder gehen da alle 1000 auf einmal? Als 1:1 Kopie?

Ich bin nur Donnerstags in der Firma und habe Zugriff auf die SPS. Ich werde das während der Woche umsetzen und dann nächsten Donnerstag testen.

Vielen Dank

Michael
 
Dann eben
Code:
(* Typdeklaration für 1 Grafikarray *)
TYPE arrT_Grafik :
   ARRAY[0..1000] OF T_Grafik;
END_TYPE

(* Variablendeklaration *)
gatyArchiv:ARRAY[0..5] OF arrT_Grafik;
gatyLive:ARRAY[0] OF arrT_Grafik;

(* Code *)
(* Zugriff auf das gesamte Array (alle 1000 Elemente) *)
gatyLive[0]:=gatyArchiv[2];
(* Zugriff auf einzelnes Element von gatyArchiv *)
gatyArchiv[2][500]:=igrendein_T_Grafik;   (* statt gatyArchiv[2,500]) *)

Du sprichst von "aufrücken lassen". Meinst Du damit so etwas?
Code:
gatyArchiv[0]:=gatyArchiv[1];
gatyArchiv[1]:=gatyArchiv[2];
gatyArchiv[2]:=gatyArchiv[3];
gatyArchiv[3]:=gatyArchiv[4];
gatyArchiv[4]:=gatyArchiv[5];

Wenn ja, werden Dich weder MEMCPY noch meine Lösung retten. Ich hoffe, dass der Compiler für beide Lösungen mit den Blockmove-Befehlen der Intel-CPU arbeitet. Dann findet die Adressberechnung ausschliesslich in den CPU-Registern statt, was einen Geschwindigkeitsvorteil bringt. Die Bytes müssen aber trotzdem kopiert werden, und bei 100% "Arbeitsspeicherauslastung" (ich denke Du meinst Echtzeitauslastung) sind das wohl nicht gerade wenige. Du solltest Dich auf jeden Fall mit Ringpuffern und, soweit TC3 zum Einsatz kommt, mit dem Datentyp "REFERENCE TO" beschäftigen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@structred Trash.

Code:
gatyArchiv[0]:=gatyArchiv[1];
gatyArchiv[1]:=gatyArchiv[2];
gatyArchiv[2]:=gatyArchiv[3];
gatyArchiv[3]:=gatyArchiv[4];
gatyArchiv[4]:=gatyArchiv[5];




Mit Memcpy kannst du auch die Werte im Speicher "shiften". Der Performancegewinn genüber deinen Code aus #8 ist erheblich.

Guga
 
@structred Trash.


Mit Memcpy kannst du auch die Werte im Speicher "shiften". Der Performancegewinn genüber deinen Code aus #8 ist erheblich

Ist mir schon klar, wobei für überlappende Speicherbereiche MEMMOVE die bessere Wahl ist, damit es auch beim Verschieben von unten nach oben klappt. Mein Code war nur ein Beispiel, um abzuklären, ob der TE mit "aufrücken lassen" das meint was ich denke.
Aber wenn der TE mit seiner Kopiererei und möglicherweise Verschieberei einen CX2030 an den Rand des Wahnsinns treibt, dann wird er auch mit den genannten Lösungen noch mehr Rechenleistung verbraten als ihm lieb sein kann. Deshalb mein Hinweis auf Ringpuffer, um diese Aktionen weitgehend zu vermeiden.
 
Zurück
Oben