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

Ergebnis 1 bis 7 von 7

Thema: Indirekte Adressierung - Unterschied speicher- und registerindirekt + Problem

  1. #1
    Registriert seit
    25.02.2014
    Beiträge
    23
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo liebe Forenuser,

    bin nun wieder in der Siemensmaterie untergekommen und auf die indirekte Adressierung gestoßen. Habe dafür ein bereits existierendes Beispiel ausprobiert: Indirekte Adressierung von einem DB

    Kurze Zusammenfassung: Je nach Stunde soll ein DWORD aus einem DB (Global-DB16) in das MD10 gespeichert werden. Habe dies einmal speicher- und einem registerindirekt gelöst. Jetzt zur ersten Frage, wann sollte man den die speicher- und wann die registerindirekte Adressierung verwenden? Außer dass bei der speicherindirekten Adressierung das MD50 belegt ist, dafür bei der registerindirekten das AR1 - gibt es sonst noch Unterschiede?

    (Siehe Anhang Bild 1 + 2)

    Zur zweiten Frage:

    Nun möchte ich den Wert von MD10 in ein anderes DWORD aus einem anderen Global-DB (DB15) speichern, wenn ich jedoch in einem neuen Netzwerk in AWL folgenden Code eintippe bekomme ich nur Fehlermeldungen um die Ohren:

    AUF DB 15
    L MD 10
    T DB15.DBD0


    Mit dem BlockMove - SFC20 funktioniert dies jedoch ohne Probleme.



    Danke schonmal und noch nen schönen Abend
    mfG Harry
    Angehängte Grafiken Angehängte Grafiken
    Zitieren Zitieren Indirekte Adressierung - Unterschied speicher- und registerindirekt + Problem  

  2. #2
    Registriert seit
    27.11.2005
    Ort
    im Osten
    Beiträge
    1.183
    Danke
    141
    Erhielt 271 Danke für 248 Beiträge

    Standard

    Welche Fehlermeldung bekommst du den bei dem Code der MD10 in DB15.DBD0 schreiben soll?

    übrigens:
    Code:
    AUF DB 15
    L MD 10
    T DB15.DBD0
    Das öffnen des DB15 kannst du dir hier sparen, da du beim Transfer Befehl den DB 15 direkt angegeben hast.
    Es ist nicht schwierig, mit noch nicht erreichten Zielen zu Leben; schwierig ist, ohne Ziele zu Leben !
    (Günther Kraftschik)

  3. #3
    Harry_99 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    25.02.2014
    Beiträge
    23
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Habe es heute morgen nochmal mit dem selben Code probiert, funktioniert einwandfrei. Leider habe ich die Fehlermeldung aus dem Baugruppenzustand nicht gesichert, hatte jedoch nichts damit zutun ob ich "T DB15.DBD0" oder "T DBD0" geschrieben habe.

    Da sich dass jetzt geklärt hat würde ich nur mehr wissen wollen, wo nun die speicher- und wo die registerindirekte Adressierung sinnvoll ist.

    mfG

  4. #4
    Registriert seit
    25.03.2012
    Beiträge
    314
    Danke
    60
    Erhielt 9 Danke für 8 Beiträge

    Standard

    Zitat Zitat von Harry_99 Beitrag anzeigen
    Je nach Stunde soll ein DWORD aus einem DB (Global-DB16) in das MD10 gespeichert werden.
    Dein Algorithmus enthält noch einen Fehler, als Faktor darfst du nicht #Stunde, sondern #Stunde-1 verwenden, damit #Stunde = 1 --> DBD0 ergibt.


    Habe dies einmal speicher- und einem registerindirekt gelöst. Jetzt zur ersten Frage, wann sollte man den die speicher- und wann die registerindirekte Adressierung verwenden? Außer dass bei der speicherindirekten Adressierung das MD50 belegt ist, dafür bei der registerindirekten das AR1 - gibt es sonst noch Unterschiede?
    Ich würde hier einfach mal PN/DP zitieren:

    dann ist es in FB "schöner", statt registerindirekter Adressierung (mit AR..) die speicherindirekte Adressierung mit Pointer in TEMP-DWORD (LD) zu benutzen. Da kann man beliebig viele Pointer benutzen und spart sich das dauernde Umladen des AR1-Registers und muß AR2 nicht anfassen.
    Wenn du dich in einer FB-Multiinstanz bewegst, dann steht im AR2 der Instanzoffset. Wird der von dir überschrieben, dann funktionieren die Zugriffe auf deine Instanzvariablen nicht mehr.. von daher ist speicherindirekte Adressierung zu bevorzugen.
    We must all suffer from one of two pains: the pain of discipline or the pain of regret. The difference is discipline weighs ounces while regret weighs tons.

  5. #5
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.335
    Danke
    932
    Erhielt 3.333 Danke für 2.691 Beiträge

    Standard

    Wann man keine Wahl hat:
    • Speicherindirekte Adressierung geht nicht bereichsübergreifend (L W [#Pointer]), sondern nur bereichsintern (L DBW [#Pointer]) - die Bereichskennung muß immer in der Operation angegeben werden, eine eventuell im Pointer enthaltene Bereichskennung wird immer ignoriert.
    • Speicherindirekte Adressierung kann man zur indirekten Adressierung von Timern, Zählern, DB, FB und FC benutzen. Die registerindirekte Adressierung kann das nicht.


    Wenn man die Wahl hat, dann ist speicherindirekte Adressierung besser lesbar und nicht so fehleranfällig, weil der Zugriffs-Speicherbereich und der Variablenname des benutzten Pointers in der Operation steht.

    Speicherindirekte Adressierung eignet sich besonders
    • für Zugriff auf Arrays von einfachen Datentypen oder unstrukturierte Speicherbereiche. (Es kann kein zusätzlicher Versatz angegeben werden, wodurch für jeden Zugriff die genaue Adresse im Pointer stehen muß.)
    • wenn man mit mehreren Pointern arbeitet (z.B. Kopieraktionen), dann spart man sich das dauernde Umladen des AR1-Registers und muß AR2 nicht anfassen, was wiederum vorteilhaft bei der Verwendung in FB ist.

    Registerindirekte Adressierung eignet sich besonders
    • für Zugriff auf Strukturen. Da kann man die Anfangsadresse in einem Adressregister halten und per zusätzlichem Versatz in der Operation auf verschiedene Strukturmember zugreifen, ohne das Adressregister verändern zu müssen.
    • zur Verarbeitung von ANY-Pointern, weil auch bereichsübergreifende Operationen möglich sind, wo die Bereichskennung nicht in der Operation sondern im Pointer enthalten ist.


    Details siehe z.B.: Hilfe zu AWL > Index > Indirekte Adressierung

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet
    Zitieren Zitieren Speicherindirekte Adressierung vs. Registerindirekte Adressierung  

  6. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    Harry_99 (23.02.2015)

  7. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.797
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    ... ich habe mir mal den Spass gemacht und diese wirklich schöne Beschreibung in der "Pointer Zeiger LiFo FiFo"-Thread in der FAQ mit hinein-kopiert ...

  8. #7
    Harry_99 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    25.02.2014
    Beiträge
    23
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Vielen Dank für die super Erklärung

Ähnliche Themen

  1. indirekte Adressierung
    Von Christian84 im Forum CODESYS und IEC61131
    Antworten: 9
    Letzter Beitrag: 21.02.2009, 09:09
  2. indirekte Adressierung
    Von Linowitch im Forum HMI
    Antworten: 13
    Letzter Beitrag: 06.12.2008, 19:43
  3. Indirekte Adressierung
    Von hbck im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 29.06.2007, 17:11
  4. S7 200 und indirekte Adressierung
    Von Rengel im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 27.05.2004, 11:03
  5. indirekte Adressierung und Pointer ??????????????
    Von Mathias W. im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 13.10.2003, 20:21

Stichworte

Lesezeichen

Berechtigungen

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