Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 6 von 6

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

  1. #1
    Registriert seit
    29.10.2015
    Beiträge
    3
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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
    Zitieren Zitieren Verständnisfrage zum Programm Beitr.: Bit aus Array of Bool (mit Index) lesen, in AWL  

  2. #2
    Registriert seit
    08.02.2007
    Ort
    A-2320
    Beiträge
    2.252
    Danke
    244
    Erhielt 332 Danke für 303 Beiträge

    Standard

    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

  3. Folgender Benutzer sagt Danke zu borromeus für den nützlichen Beitrag:

    User-SPS_Forum (29.10.2015)

  4. #3
    Registriert seit
    15.01.2015
    Beiträge
    25
    Danke
    2
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hi,
    1.
    Pointer Zeiger FIFO LIFO
    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

  5. Folgender Benutzer sagt Danke zu MC_DARKSTONE für den nützlichen Beitrag:

    User-SPS_Forum (29.10.2015)

  6. #4
    User-SPS_Forum ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    29.10.2015
    Beiträge
    3
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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!

  7. #5
    User-SPS_Forum ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    29.10.2015
    Beiträge
    3
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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!

    Besten Dank!

  8. #6
    Registriert seit
    15.01.2015
    Beiträge
    25
    Danke
    2
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Richtig.
    die ersten 3 Bit sind für die Bitadressen und die nachfolgenden 12Bit für die Byteadresse

    Der Pointer fängt bei Byte 2 an weil die erste Lokalvari ein INT ist

Ähnliche Themen

  1. Antworten: 12
    Letzter Beitrag: 11.08.2015, 18:02
  2. Antworten: 5
    Letzter Beitrag: 07.11.2014, 16:11
  3. Antworten: 10
    Letzter Beitrag: 01.08.2014, 06:17
  4. Index aus Array auslesen
    Von heri1980 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 17.09.2010, 14:54
  5. IEC-61131 Pointer mit Index auf BOOL Variable
    Von Stussi im Forum CODESYS und IEC61131
    Antworten: 21
    Letzter Beitrag: 14.12.2007, 09:11

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •