Fügt ein neues Element in Array hinzu

Hallo!

Was meinst Du damit?
Möchtest Du einen Arrray-Index einen Wert zuweisen?

Deklaration
Code:
arrTest: ARRAY[0..9] OF INT;
Implementation
Code:
arrTest[3]:=5;

Gruß,
Mac203
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich meine, ein neues Element in Array einzufügen,
z.B. original Array: a[1..4]: ARRAY OF SRING := ['a', 'b', 'd', 'e']
Jetzt wird ein neues STING-Element 'c' in Index 3 des Arrays eingefügt und ein neues Array ['a', 'b', 'c', 'd', 'e'] wird dadurch erzeugt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Begründung:

Wenn ich das richtig verstehe, möchtest Du das Array dynamisch verwalten/ verwalten.
Das funktioniert in der IEC61131-3 2nd Edition nicht.

Wenn man das einmal dürfte, dürfte man auch N mal. Wenn N nur genügend gross wird, stürzt die Kiste ab oder es geht zumindest wegen "Memory alles vergeben" nicht so wie gewünscht.

Das darf auf einem PC noch mit einem Fensterchen als Warnung hingenommen werden, bei einer Anlage sollte es aus Prinzip nie vorkommen können.
 
In Tc3 wird das zukünftig möglich sein!
Aber auch nur bedingt.
Man allociert vorher einen Speicherbereich, in dem man sich frei "bewegen" kann. Im Rahamen dieses Speichers kann dann das Array dynamisch vergrößert und verkleinert werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
mit stellt sich gerade die Frage, ob die Anzahl der hinzuzufügenden Elemente tastächlich unbekannt ist (wovon bisher alle Antworten ausgegangen sind)
oder ob es dem Threadersteller um das grundsätzliche Einfügen eines Elements geht (etwa in ein vorher ausreichend dimensioniertes Array)?

fdisk
 
:smile:Vieleicht habe ich meine Frage voher nicht genau erklärt. Meine Frage ist: die neue Elemente in angegebener Indexe eines vorher dimensionierten Arrays hinzufügen. Die Anzahl der zu fügenden Elemente ist konstant und vorher definiert. Die Dimension neues erzeugten Arrays ist = vorher definierte Dimension dieses Arrays.
z.B.
Array: Array[1..10] OF STING := ['a','b','c','g'];
Jetzt werden 'd', 'e', 'f' einzeln in Index 4, 5, 6 des originalen Arrays hinzugefügt und ein neues Array of String Array := ['a','b','c','d','e','f','g'] wird erzeugt.
ps: An Anfang wird die Dimension des Array in 10 definiert, aber nur erste 4 Elemente werden bewertet. Nach Hinzufügen der neuen Elemente werden erste 7 Elemente bewertet, aber Dimension des Array ist noch 10.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Damit habe ich Deine Frage noch immer nicht verstanden....:?

Du hast ein Array
Code:
arrArray: Array[1..10] OF STING := ['a','b','c','g'];
Im Speicher sieht das dann so aus:
Code:
arrArray[1]:='a'
arrArray[2]:='b'
arrArray[3]:='c'
arrArray[4]:='g'
arrArray[5]:=''
arrArray[6]:=''
arrArray[7]:=''
arrArray[8]:=''
arrArray[9]:=''
arrArray[10]:=''
Wenn Du nun weitere Elemente hinzufügst, nämlich 'd', 'e', 'f' an 4, 5, 6 , sieht dein Array wie folgt aus:
Code:
arrArray[1]:='a'
arrArray[2]:='b'
arrArray[3]:='c'
arrArray[4]:='d'
arrArray[5]:='e'
arrArray[6]:='f'
arrArray[7]:=''
arrArray[8]:=''
arrArray[9]:=''
arrArray[10]:=''
Und was ist nun unklar???
 
Orignales Array sieht so aus:
arrArray[1]:='a'
arrArray[2]:='b'
arrArray[3]:='c'
arrArray[4]:='g'
arrArray[5]:=''
arrArray[6]:=''
arrArray[7]:=''
arrArray[8]:=''
arrArray[9]:=''
arrArray[10]:=''
Wenn neue Elemente hinzufügt werden, soll das neue Array so aussiehen:
arrArray[1]:='a'
arrArray[2]:='b'
arrArray[3]:='c'
arrArray[4]:='d'
arrArray[5]:='e'
arrArray[6]:='f'
arrArray[7]:='g'
arrArray[8]:=''
arrArray[9]:=''
arrArray[10]:=''
Das 4. Element 'g' in orignalem Array nach Hinzufügen der neuer Elemente wird nicht durch neues Element ersetzt aber in Index 7 des neuen Arrays verschoben.
Wie kann ich soweise Hinzufügen erzielen.
 
Zuletzt bearbeitet:
Okay....ich denke, jetzt habe ichs verstanden.

Du möchtest also den Inhalt von Index 4 an die Position von Index 7 verschieben?

In dem Fall muss Du das wirklich händisch machen.

Original Array
Code:
sTemp:=arrArray[4]:='g';
Neue Array Zuweisung
Code:
arrArray[4]:='d' ;
arrArray[5]:='e' ;
arrArray[6]:='f' ;
arrArray[7]:=sTemp ;
Ergebenis: Neues Array
Code:
arrArray[1]:='a' 
arrArray[2]:='b' 
arrArray[3]:='c' 
arrArray[4]:='d' 
arrArray[5]:='e' 
arrArray[6]:='f' 
arrArray[7]:='g' 
arrArray[8]:='' 
arrArray[9]:='' 
arrArray[10]:=''
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hab es so verstanden:

Bsp: füge 'd' in pos. 4 ein:

-> ALLE Elemenete ab dem 4 Index verschieben sich um 1 nach hinten
-> an pos 4 wird "d" gesetzet.

In dem Fall würde ich ein zweites Array zur Hand nehmen und alle Elemente ab Index 4 temporär da hineinspeichern. Dann das neue Element an Pos 4 rein, zum Schluss alle Elemente in Temp-Array ins Orig-Array ab Index 4+1 wieder zurrück.
 
Zuletzt bearbeitet:
Vielen Dank! In o.g. Beispiel wird nur ein Element verschoben. Das kann man natürlich händisch machen. Aber wenn ein Array wuchtige Dimension z.B. Array[1..10000] hat und in dem mehrere tausende neue Elmente hinzugefügt sowie mehrere tausende alte Elemente verschoben werden sollen. Es ist nicht einfach händisch zu machen. Haben Sie noch gut Idee? Gibt es Funktion in TC2 ,mit der kann man einfach tausende Elemente in Array nach hinter verschieben?
 
Ich hab es so verstanden:

Bsp: füge 'd' in pos. 4 ein:

-> ALLE Elemenete ab dem 4 Index verschieben sich um 1 nach hinten
-> an pos 4 wird "d" gesetzet.

In dem Fall würde ich ein zweites Array zur Hand nehmen und alle Elemente ab Index 4 temporär da hineinspeichern. Dann das neue Element an Pos 4 rein, zum Schluss alle Elemente in Temp-Array ins Orig-Array ab Index 4+1 wieder zurrück.
Vielen Dank! Gute Idee, ob es ist so zu machen, wenn man Elemente in Temp-Array ins Orig-Array wieder zurückgibt.
Annahme, die Dimension des Temp-Array ist 1000
FOR index =1 To 1000 BY 1 DO
Orig-Array [index+4]:= Temp-Array [index];
END_FOR
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank! Gute Idee, ob es ist so zu machen, wenn man Elemente in Temp-Array ins Orig-Array wieder zurückgibt.
Annahme, die Dimension des Temp-Array ist 1000
Für den Fall muss das Orginal-Array aber wie folgt deklariert sein
Code:
Orig-Array [1..1004] OF STRING;
Dann ist das machbar.

Gibt es Funktion in TC2 ,mit der kann man einfach tausende Elemente in Array nach hinter verschieben?
Nein, weder in Tc2 noch in Tc3!
Die einzige Möglicheit bestünde mit Speicherzugriffsfunktionen wie z.B. MEMCPY. Damit sollte man dann aber sinnvoll und bewußt umgehen. Hierbei wird auf den tatsächlichen Speicher und nicht auf eine TwinCAT generierte Adresse zugegegriffen.
Damit hat man schnell, bei falscher Anwendung gerade in Schleifenkonstrukten, Änderungen im Speicher vorgenommen, die sich auch auf andere Programme außerhalb von TwinCAT auswirken können!
 
Zuletzt bearbeitet:
OK! Dank alle, jetzt weiß ich wie kann man soweise Probleme lösen. In VB und Labview gibt es Array.insert-Funktion, mit der man neues Element einfach in gewünschten Index des Arrays hinzufügen kann. Aber leider in IEC 61131 gibt es nicht, muss man das so händisch machen.:cry:
 
Zurück
Oben