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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: in ein Schieberegister per Pointer zugreifen

  1. #1
    Registriert seit
    01.10.2007
    Ort
    Waiblingen
    Beiträge
    3.317
    Danke
    767
    Erhielt 536 Danke für 419 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    so, jetzt hat es mich wieder: Das Thema big und little endian. S7 ist ja bekanntlich ein big-endian-System - aber leider nicht innerhalb der Bytes, was die Bit-Nummerierung anbetrifft.

    erstens die Philosophiefrage: ist links- oder rechts-Schieben die positive Schieberichtung?

    zweitens:
    angenommen, mein Schieberegister ist das MD16 und ich würde mich für links-Schieben (SLD) entscheiden. Dann wäre mein erstes Bit an der Stelle M19.0 (Schieberegister-Eingang, Bit Nummer Null). Und das wird dann auf M19.1 weitergeschoben. Der Übertrag erfolgt dann von M19.7 auf M18.0.

    wenn ich nun
    Code:
    L #Parameter_Zugriffsindex
    LAR1
    U M[ar1,p#16.0]
    schreib, dann geht der Zugriff wegen des big endian bunt durcheinander - wäre es eine little endian Maschine, käm alles schön der Reihe nach.

    was tun, damit danach noch einer durchblickt und der Zusammenhang Indexnummer und Schieberegisterplatz deutlich wird?
    Zitieren Zitieren in ein Schieberegister per Pointer zugreifen  

  2. #2
    Registriert seit
    20.10.2007
    Beiträge
    191
    Danke
    159
    Erhielt 75 Danke für 54 Beiträge

    Standard

    Hi Perfektionist

    ob links- oder rechtsschieben ist, wie du schon bemerkt hast, reine Ansichtssache


    Ich bevorzuge die Variante mit dem Rechtsschieben.
    Bei uns kommen oft Schieberegister mit mehreren Doppelwörtern zum Einsatz.

    Speziell geht es um Positionsverfolgung von Produkten auf Laufbändern
    D.h. für jedes Band gibt es einen DB(Schiebe-DB)

    Um jetzt zu wissen, ob ein am Anfang des Bandes detektiertes Produkt Position X erreicht hat, muss ich den Index jedesmal neu berechnen.
    Über diesen Index greife ich dann per indirekte Adressierung auf den DB zu.

    Hier hatte ich schon mal dazu geschriebn.

    http://www.sps-forum.de/showthread.p...069#post110069

    Gruß

    Pizza

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

    Perfektionist (15.08.2008)

  4. #3
    Registriert seit
    12.08.2006
    Beiträge
    67
    Danke
    0
    Erhielt 69 Danke für 6 Beiträge

    Daumen hoch

    Ganz einfach, wie bei jeder Zahl welche Du schreibst ist die kleinste Ziffer rechts.

    Pointer im Dword-Format beinhalten die Bitadresse, Byteweise linear gerechnet. Wenn Du indirekt auf einen geschobenen Wert Zugreifen möchtest, sind vorher die Bytes zu sortieren.

    1 Bit Linksschieben heist "mal" 2 rechnen, rechtsschieben durch 2 dividieren.
    Da die Bits innerhalb des Datentypes geschoben werden sollte man wissen wie der Datentyp aufgebaut ist (im Editor F1 drücken und mal nach Datentyten suchen).

    Beim Schieben eines Dword ist zu Beachten, daß bei diesem Datentyp zuerst das High- und dann das Low-Word kommen in denen das Highbyte jeweils zuerst steht.

    Z.B. bei Deinem Beispiel ist

    MB19 das niederwertigste Byte
    und M19.0 das niederwertigste (ganz rechts stehende) Bit, welches beim links schieben mit jedem Schritt immer weiter Richtung Bit M16.7 (Highbyte im Highword)wandert.

    Gegenfrage: was ist eine positive Schieberichtung wenn es sich nicht ums Auto handelt?

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

    Perfektionist (15.08.2008)

  6. #4
    Avatar von Perfektionist
    Perfektionist ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    01.10.2007
    Ort
    Waiblingen
    Beiträge
    3.317
    Danke
    767
    Erhielt 536 Danke für 419 Beiträge

    Standard

    Zitat Zitat von Hartmut Lux Beitrag anzeigen
    ... was ist eine positive Schieberichtung wenn es sich nicht ums Auto handelt?
    genau das ist die Frage: gibt es eine bevorzugte Schieberichtung?

    @ Pizza: Danke, das trifft es schon sehr genau. Das Kaskadieren mit dem Rotierbefehl ist sehr gut - die Berechnung des Zeigers ... na ja, im Prinzip war mir das ja schon in etwa so klar, ich scheue den Aufwand noch etwas, aber prinzipiell kopier ich das jetzt erstmal so von Dir.

  7. #5
    Registriert seit
    20.10.2007
    Beiträge
    191
    Danke
    159
    Erhielt 75 Danke für 54 Beiträge

    Standard

    Zitat Zitat von Perfektionist Beitrag anzeigen
    ... aber prinzipiell kopier ich das jetzt erstmal so von Dir.
    gerne, wenn ich auch mal helfen konnte

    Gruß

    Pizza

  8. #6
    Avatar von Perfektionist
    Perfektionist ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    01.10.2007
    Ort
    Waiblingen
    Beiträge
    3.317
    Danke
    767
    Erhielt 536 Danke für 419 Beiträge

    Standard

    von den drei Bit-Adressen brauch ich einfach nur das Einer-Komplement - und schon hab ich linear fortlaufend die Bitnummern des Schieberegisters:
    Code:
          L     #P_Platz_SRG
          XOD   DW#16#7
          LAR1  
          U     M [AR1,P#16.0]
    Zitieren Zitieren ich glaub, ich habs  

  9. Folgender Benutzer sagt Danke zu Perfektionist für den nützlichen Beitrag:

    Pizza (18.08.2008)

  10. #7
    Registriert seit
    20.10.2007
    Beiträge
    191
    Danke
    159
    Erhielt 75 Danke für 54 Beiträge

    Standard

    hi Perfektionist

    nun musste ich erstmal zweimal lesen.

    was sollte mir dieser Vierzeiler sagen

    nach ein bischen Grübeln, schien es mir zu dämmern.
    (ist nicht so einfach mit dem Denken nach einem scheiß Tag)

    schnell meine Test- und Spiel-CPU angeschmissen und siehe da,
    warum einfach, wenns auch umständlich geht

    warum habe ich nur meine Schieberegisteradresse bisher so umständlich berechnet, wenn es doch so einfach geht

    Dreimal darfst du raten, wer jetzt welchen Code kopiert

    Gruß

    Pizza

  11. Folgender Benutzer sagt Danke zu Pizza für den nützlichen Beitrag:

    Perfektionist (19.08.2008)

  12. #8
    Avatar von Perfektionist
    Perfektionist ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    01.10.2007
    Ort
    Waiblingen
    Beiträge
    3.317
    Danke
    767
    Erhielt 536 Danke für 419 Beiträge

    Standard

    @Pizza: Danke fürs Testen

    Zitat Zitat von Pizza Beitrag anzeigen
    ...
    was sollte mir dieser Vierzeiler sagen
    ...
    also schreib ich noch was (auch für die Mitleser) zur Erläuterung dazu:
    ich hab mich nun auch (wie Pizza) erstmal für Rechtsschieben entschieden, also von Byte mit kleiner Ordnungsnummer zu Byte mit hoher Ordnungsnummer (im konkreten Fall MD16). Leider schiebt es aber dabei innerhalb des Bytes von hoher Bitnummer Richtung niederer Bitnummer. Um also die 32 Bit des Schieberegisters fortlaufend zu adressieren muss dem Pointer-Aufbau ...bbbbxxx (b=Byte, x=Bit) entsprechend also auf die Bitnummern 7, 6, ..., 1, 0, 15, 14, ..., 9, 8, 23, ... usw. zugegriffen werden.
    Diesen Kunstgriff, die Zählung 7-0, 15-8, 23-16 und 31-24 umzudrehen, erledigt die Operation XOD DW#16#7, indem das Einerkomplement der Bits zwei bis null, also der drei niederwertigsten Bits des Zeigers gebildet wird und damit die Zählung dann fortlaufend erscheint.

  13. #9
    Avatar von Perfektionist
    Perfektionist ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    01.10.2007
    Ort
    Waiblingen
    Beiträge
    3.317
    Danke
    767
    Erhielt 536 Danke für 419 Beiträge

    Standard

    und da ich das ja gerne sauber programmieren möchte, wäre da doch ein symbolischer Zugriff auf das Schieberegister wünschenswert. Aber Siemens treibt mich da zum Wahnsinn

    was ja jederzeit geht:
    Code:
    L P##Schieberegister
    was ja seltsamer Weise nicht geht
    Code:
    L P#"Schieberegister"
    und was überhaupt nicht geht (weder noch!):
    Code:
     ... [AR1,P##Schieberegister]
     ... [AR1,P#"Schieberegister"]
    was bleibt also? gezwungener Maßen das Schieberegister in statische Lokaldaten legen und den Adressoffset auch noch von Hand rechnen? Wozu ist dieser Adressoffset beim Operanden [AR1,P#xxx.x], wenn ich da eh nichts symbolisch eintragen kann und daher P#0.0 eintrage, um zuvor per L P##... die Adresse zu ermitteln und dann selber aufzuaddieren?

  14. #10
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Perfektionist,
    der Offset hinter dem AR-Register ist eine Konstante ...!
    Ich benutze das (wenn ich mal so programmiere) z.B. bei Schleifen, wo ich etwas mit dem Operanden an Adresse AR1,P#0.0 mache und den dann vielleicht in den Operanden an Adresse AR1,P#16.0 zurückschreibe - also wenn du über das entsprechend Grund-Offset ggf. 2 oder Mehr Varaiblen erreichen kannst ... (leider habe ich gerade keinen schönen Anwendungsfall parat).

    Gruß
    LL

Ähnliche Themen

  1. Auf DB mit Pointer zugreifen
    Von Holger Levetzow im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 03.11.2010, 06:41
  2. Mit Any- Pointer auf Lokaldaten zugreifen
    Von AJ67 im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 25.06.2009, 10:01
  3. Indirekt (Any-Pointer) auf PEW zugreifen?
    Von thorsten im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 11.05.2009, 12:44
  4. Mit Any-Pointer auf PAW zugreifen?
    Von merlin im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 24.06.2007, 20:51
  5. Schieberegister (FIFO) mit Pointer
    Von Anonymous im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 31.03.2004, 18:55

Lesezeichen

Berechtigungen

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