User-SPS_Forum
Level-1
- Beiträge
- 3
- Reaktionspunkte
- 0
-> 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:
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
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