Step 7 Verständnisfrage zum Programm Beitr.: Bit aus Array of Bool (mit Index) lesen, in AWL

User-SPS_Forum

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

ich habe mir gerade einen sehr interessanten Beitrag zur indirekten Adressierung durchgelesen. Leider kann mich mir die Funktionsweise von folgendem Betrag nicht erklären.
Thema: „Bit aus Array of Bool (mit Variable als Index) lesen, setzen, rücksetzen in AWL“ vom 10.08.2015, im Themenfeld „S7“
Beitrag von „Löwensenf“ am 10.08.2015

„Hi WTEFUE,

so arg falsch ist dein Weg gar nicht! Ausgehend von deinen Zeilen oben und der Annahme, dass TrayIndex als INT an (Lokal)Adresse 0.0 und TestArrayBool an (Lokal)Adresse 2.0 steht:

Code:
// Variablen:
// TrayIndex als INT
// TestArrayBool als Array [0..14] of Bool
 
// TrayIndex testweise beschreiben
L         10
T         TrayIndex
 
L         P##TestArrayBool         //Pointer auf Array laden
// AKKU1 enthält jetzt (hex)8600 0010 und zeigt
// somit auf Byte 2 der Lokaldaten. Entspricht TrayIndex = 0.
// Daran denken, dass ein Pointer in den untersten drei
// Bit die 8 einzelnen Bits eines Bytes addressiert!
// Es würde jetzt also auf TestArrayBool[0] gezeigt.
 
// Soll bspw. auf TestArrayBool[10] (TrayIndex = 10) gezeigt
// werden, muss einfach TrayIndex (also 10) zum Wert im
// AKKU1 addiert werden. AKKU1 enthält dann
// (hex)8600 001A. Oder anders ausgedrückt: die Adresse
// auf das Bit L3.2.
L        TrayIndex
+D
LAR1
 
// Zum Vergleich ein Laden der Adresse auf L3.2 direkt.
L P#L 3.2
 
// Um den Zustand des Bits 10 im Array (auf das zeigt AR1
// zu lesen/zu schreiben, die gewohnte Semantik verwenden.
// Also bspw. zum Lesen:
SET
U        L [AR1, P#0.0]
=        M4711.0
 
// Oder zum Übernehmen eines anderen Bits
SET
U        M4711.1
=        L [AR1, P#0.0]
 
// Das Setzen wie üblich mit
SET
S        L [AR1, P#0.0]
 
// Oder das Rücksetzen mit
SET
R        L [AR1, P#0.0]


Meine Fragen:
1. Ich versuche mir zu erklären wie der Programmausschnitt funktioniert. Leider weiß ich nicht wie man rechnerisch auf die Adresse 8600 0010 (hex) kommt, wenn der Zeiger auf die temporäre Variable 2.0 zeigt. (Ebenso verhält es sich mit der berechneten Zahl von 8600 001A(hex). Ich kann mir nicht erklären warm der Zeiger dann auf die tem-Variable 3.2 zeigt.)

2. Da ich nicht weiß wie die Umrechnung funktionier, weiß ich nicht welche Einschränkungen es gibt. Kann man beispielsweise auch mit einem größeren Array arbeiten und anstatt um 10 Bits beispielsweise um 120 Bits erhöhen?

Leider kann ich dem Autor („Löwensenf“) keine Nachricht schicken, um ihn direkt zu fragen.

Mit freundlichem Gruß,
Stefan
 
Schau Dir in der AWL Hilfe mal "Format des Parametertyps POINTER" an.
Das ist zwar nicht genau dasselbe aber es hilft.

86 bedeutet Lokaldaten
dann kommen ein paar Nullen, dann eine 16Bit Byte- Adresse und dann eine 3Bit Bit Adresse.
1A am Ende ist binär
0000000000000011010
=
0000000000000011.010
= 3.2
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
1.
http://www.sps-forum.de/faq/8887-pointer-zeiger-fifo-lifo.html
hier findest du ein Bild welches dir zeigt wie ein Pointer aufgebaut ist.

2. Wenn das Array 120 oder Bit groß wäre könntest du jedes einzelene Bit mit dem Pointer adressieren.
Wenn das Array kleiner ist und die Lokaldaten auch kleiner sind wie die Stelle wohin der Pointer zeigt bekommst du ein Fehler in SPS
Bei 120 Bits (15Byte) ab dem 2.0 Byte müssten deine Lokaldaten bis mind. 14.7 Byte gehen damit du kein Sammelfehler erhälst.

Gruß
Erick
 
Hallo borromeus,

Deine Umrechnung ist mir soweit verständlich (wie beim SLD3 zur Erstellung eines Zeigers, wenn wegen den drei Bits bzw. wegen der Wertigkeit 7 verschoben werden muss.). Danke dafür!
Mir ist auch klar, dass bei der Addition von 10(dez) bei einem Startwert von 8600 0010 (hex) das folgende Ergebnis rauskommen muss: 8600 0010 (hex) + 0000 000A (hex) = 8600 001A, ABER
mir ist nicht klar, warum der Startwert = 8600 0010 beträgt, wenn der Zeiger auf die temp-Variable 2.0 zeigt. (Die "10" am Ende sieht so nach einer binären 2 aus, wobei das bei der hexadezimalen Darstellung natürlich Blödsinn ist.)

Ich werde mir nach Feierabend mal die Hilfe zum "Format des Parametertyps POINTER" durchlesen. Wahrscheinlich ergeben sich die Fragen damit.

Besten Dank!
 
Oha, ich habs endlich gerafft!

1A (hex) entspricht 1 1010 (bin) entspricht Bit 3.2 (Adresse)

ALSO gilt...

Bit 2.0 (Adresse) entspricht 1 0000 (binär) entspricht 10 (hex)!

Sorry, habe heute ne lange Leitung!:rolleyes:

Besten Dank!
 
Zurück
Oben