Array mit Variablen füllen TWINCAT 3

Gizzl0r

Level-1
Beiträge
142
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag,
ich habe eine Frage zu Array. Ich habe eine VISU Oberfläche wo ich die Werte dim_x und dim_y eingebe. Als Beispiel (s.Anhang) 500x500. In einem FB lasse ich die Werte für die pos1_x - pos3_x berechnen.
Diese Werte werden mir auch angezeigt im Online Modus, jedoch bleiben die Array Werte aus dem Array pos_x bei 0. Woran kann das liegen?


Hier ein Teil des Definitions Codes in Global Var


VAR_GLOBAL
dim_x : REAL :=0;
dim_y : REAL :=0;
pos1_x: REAL :=0;
pos2_x: REAL :=0;
pos3_x: REAL :=0;
pos_x: ARRAY [0..2] OF REAL := [pos1_x,pos2_x,pos3_x];
END_VAR

Pos_array.png
 
Zuletzt bearbeitet:
Der Deklarationsbereich ist nur für den Compiler interessant.
Du weist die Werte 0 bei der initialisierung des Array's zu. Die berechneten Werte mußt Du im Code zuweisen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das wird in der Deklaration nicht funktionieren. Das musst du im Programmteil abhändeln.
In der Deklaration wird nur einmal der Wert zugewiesen. Und zu diesem Zeitpunkt ist dim_x... noch 0.
Wusste auch gar nicht, dass dies so kompilierbar ist... Mal wieder was dazu gelernt.

Also im Programm:
Code:
pos_x[0] := pos1_x;
pos_x[1] := pos2_x;
pos_x[2] := pos3_x;

Frage ist dann nur, ob du die Zwischenvariablen tatsächlich brauchst.

Gruß snej
 
Danke für die schnelle Antwort. Ich bin was Arrays und deren Handhabung noch ein Neuling, deswegen Entschuldige ich mich schon mal im Voraus für die Fragen. Ich habe die Variablen pos1_x - pos3_x wie auch das Array (pos_x: ARRAY [0..2] OF REAL := [pos1_x,pos2_x,pos3_x]; ) in den Globalen Variablen Definiert.
Im Main Quellcode wird der Inhalt des Array und deren Aktuelle Positionen abgefragt:( GL_VAR.X := GL_VAR.pos_x[GL_VAR.pos_x_i];) (s.Anhang).
Habe mir bereits mehrere Tutorial Vides angeschaut. Werde daraus aber nicht schlauer. Ich vermute schon fast das die Art wie und wo ich das Array definiere Falsch ist.

posx_array.jpg
 
@snej
Danke dir. So Funktioniert es! Welche Zwischenvariable meinst du?
Ich habe jetzt die GL_VAR.X als Eingang für die Position eines MC_MoveAbsolute genommen.
Wenn ich jetzt die 2. X-Position anfahren will, wie machen ich das? Ich müsste ja den Index "hochzählen" oder? Wenn ja wie?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
also mal eine kurze Anmerkung zur Architektur:
wenn die Variablen pos1_x und pos_x[0] immer den gleichen Wert haben sollen, kannst du dir eine davon auch sparen.
und die zeile "pos_x: ARRAY [0..2] OF REAL := [pos1_x,pos2_x,pos3_x];" verknüpft nicht die Variablen miteinander, wie du zu glauben scheinst, sondern weist nur einmalig (zur initialisierung) die Werte zu. nachfolgende Änderungen wirken sich nicht auf beide Variablen aus.

ansonsten, wenn du wie in obigem Codeausschnitt pos_x_i als Indexvariable benutzt, dann mußt du natürlich auch genau die hochzählen, um den Index zu ändern.
 
@_Eddi
Vielen Dank, das mit den Array und der Initialisierung habe ich verstanden. Wie genau zähle ich diese hoch? Ich habe den Baustein (s.Anhang) als Position ist jetzt GL_VAR.X mit dem anfänglichen index 0 (pos1_x).
Nachdem Done Aktiv ist, möchte ich den Index hochzählen. Gibt es dafür einen Baustein oder wie mache ich das?
Mein Grundproblem ist, das ich für jeden Position ein MC_MoveAbsolute Baustein nutze. Die jedoch eigentlich alle das selbe machen, nur das sich die Position ändert. Dadurch ist mein Programm extrem unübersichtlich und das wollte ich jetzt minimieren.

Unbenannt.jpg
 
Zuletzt bearbeitet:
Zurück
Oben