Index Array

peraho

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

habe nur eine ganz kleine Frage:

ist es nur in SCL möglich den Index eines Arrays indirekt zu adressieren?

Vielen Dank im voraus.

In welchen Step 7 Paketen ist denn SCL dabei?

Gruß peraho
 
Was heißt indirekt adressieren?
Du kannst in SCL den Index eines Array als Variable (INT) eingeben.

Code:
i := 10;
MyArray[I] := 25;

In Step7-Professionel ist SCL bereits dabei, man kann es aber auch einzeln erwerben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Ralle,

erst mal vielen Dank für die Eilantwort.
In AWL gibt es also keine Möglichkeit den Index des Arrays über eine Variable anzusprechen?
Liege ich richtig, daß dies nur über Pointer auf die jeweilige Adresse des Elements im DB möglich ist?

Gruß peraho.
 
In AWL gibt es also keine Möglichkeit den Index des Arrays über eine Variable anzusprechen?

Das ist richtig, es gibt es in AWL keine Möglichkeit, den Index eines Arrays über eine Variable anzusprechen.

Liege ich richtig, daß dies nur über Pointer auf die jeweilige Adresse des Elements im DB möglich ist?

Auch das richtig, Du musst hier mit Pointern auf die jeweiligen Adressen der Variablen arbeiten.

Gruß Kai
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Ralle,

erst mal vielen Dank für die Eilantwort.
In AWL gibt es also keine Möglichkeit den Index des Arrays über eine Variable anzusprechen?
Liege ich richtig, daß dies nur über Pointer auf die jeweilige Adresse des Elements im DB möglich ist?

Gruß peraho.

Genau, so ist es. Ich hatte da nicht ganz präzise auf deine Frage geantwortet, das "nur" überlesen. ;)
 
Hi Ralle,

alles klar. Danke für die Bestätigung. Werde dann mal fleißig Pointer basteln.

Gruß peraho
 
Hallo Ralle, ich müsste dieses Thema noch einmal aufleben lassen, habe folgendes Problem:

Habe diese einfachen Zuweisungen als Funktion programmiert, da sich das Array vom Typ DWORD aber 1..699 wiederholt ist es sehr aufwendig den Index pro Box 13 mal zu ändern.
Da es in AWL, so wie es weiter oben steht, nicht möglich ist den Index als INT anzugeben, soll dies ja mit einem Pointer funktionieren, könntest du mir erklären wie ich das machen muss? Leider habe ich noch nicht mit Pointern gearbeitet.

Vielen Dank!!!

// Box Frei
U "DB_Box".Box[10].Bit16_Vorwahl_Frei
UN "DB_Box".Box[10].Bit28_Status_Stoerung
= "DB_Box".Box[10].Bit24_Status_Frei
// Box Belegt
UN #Eingang
U "DB_Box".Box[10].Bit17_Vorwahl_Belegt
UN "DB_Box".Box[10].Bit28_Status_Stoerung
= "DB_Box".Box[10].Bit25_Status_Belegt
// Box Bestellt
U "DB_Box".Box[10].Bit18_Vorwahl_Bestellt
UN "DB_Box".Box[10].Bit28_Status_Stoerung
= "DB_Box".Box[10].Bit26_Status_Bestellt
// Box Leer
U #Eingang
U "DB_Box".Box[10].Bit17_Vorwahl_Belegt
UN "DB_Box".Box[10].Bit28_Status_Stoerung
= "DB_Box".Box[10].Bit27_Status_Leer
// Box Störung
U #Stoerung
= "DB_Box".Box[10].Bit28_Status_Stoerung
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sieh dir bitte zuerst die FAQ des Forums an, da gibt es sehr gute Beiträge zum Thema Pointer und Any und indirekte Adressierung. Dann kannst du hier im Forum ebenfalls suchen, Stichwörter wären "Pointer" "indirekte Adressierung". Damit hast du erst mal eine Menge zu lesen und zu verstehen, aber das macht durchaus Sinn.
In deinem Falle gibt es verschiedene Vorgehensmöglichkeiten (na ja, wie eigentlich immer).

Code:
L Index //Index als INT
L 4  //DWORD besteht aus 4 Byte, daher zur Adressierung des richtigen DBD *4 (das geht natürlich auch mit SLD 5 statt SLD 3)
*D
SLD 3 //Pointerformat erstellen
LAR1 //in das Adressregister 1 laden

Damit kannst du dann auf einzelne Bits des DWORD zugreifen (P#0.0 bis P#3.7)

Code:
AUF "BOX_DB"
U     DBX [AR1,P#1.0]

Ich bin mir gerade nicht sicher, in welcher Reihenfolge die Bits adressiert werden müssen,
also ob in dem DWORD Bit0 auch P#0.0 oder P3.0 ist, das müßte ich auch erst mal nachsehen,
aber das kannst über ein kleines Testprogramm auch selbst herausbekommen.

Es gibt noch ein andere Möglichkeit, indem man die Variable per indirekter Adressierung auf eine Hilfsvariable
kopiert und dann mit den einzelnen Bits dieser Hilfsvariable weiterarbeitet und anschließend das Ganze wieder Return,
das ist aber schwieriger zu erklären.
 
Zuletzt bearbeitet:
Mit ist noch was einfaches eingefallen.
Du hast in deinem BOX_DB DBD0 als Arbeits-DW, dein Array beginnt daran anschließend mit Index 1!!!
Im DBD 0 (als Variable ArbeitsDWORD) sind deine Bits einzeln deklariert.

Code:
L Index //Index als INT
L 4  //DWORD besteht aus 4 Byte, daher zur Adressierung des richtigen DBD *4 (das geht natürlich auch mit SLD 5 statt SLD 3)
*D
SLD 3 //Pointerformat erstellen
LAR1 //in das Adressregister 1 laden

AUF BOX_DB
L DBD [AR1, P#0.0]
T BOX_DB.DBD0

// Box Frei
U "DB_Box".ArbeitsDWord.Bit16_Vorwahl_Frei
UN "DB_Box".ArbeitsDWord.Bit28_Status_Stoerung
= "DB_Box".ArbeitsDWord.Bit24_Status_Frei
// Box Belegt
UN #Eingang
U "DB_Box".ArbeitsDWord.Bit17_Vorwahl_Belegt
UN "DB_Box".ArbeitsDWord.Bit28_Status_Stoerung
= "DB_Box".ArbeitsDWord.Bit25_Status_Belegt
// Box Bestellt
U "DB_Box".ArbeitsDWord.Bit18_Vorwahl_Bestellt
UN "DB_Box".ArbeitsDWord.Bit28_Status_Stoerung
= "DB_Box".ArbeitsDWord.Bit26_Status_Bestellt
// Box Leer
U #Eingang
U "DB_Box".ArbeitsDWord.Bit17_Vorwahl_Belegt
UN "DB_Box".ArbeitsDWord.Bit28_Status_Stoerung
= "DB_Box".ArbeitsDWord.Bit27_Status_Leer
// Box Störung
U #Stoerung
= "DB_Box".ArbeitsDWord.Bit28_Status_Stoerung

L BOX_DB.DBD0
AUF BOX_DB
T DBD [AR1, P#0.0]
 
Zuletzt bearbeitet:
Super vielen Dank, funktioniert einwandfrei, auch wenn ich die Vorgehensweise nicht ganz verstehe da ich mich mit Pointer nicht auskenne... Aber ich sehe schon, muss mich wohl bei Gelegenheit mal hinsetzen und mir das Thema zu gemüte führen :)
Also nochmal vielen Dank!!
 
Zurück
Oben