Step 7 Indirekte Adressierung - Unterschied speicher- und registerindirekt + Problem

Harry_99

Level-1
Beiträge
21
Reaktionspunkte
0
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: http://www.sps-forum.de/simatic/29555-indirekte-adressierung-von-einem-db.html

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
 

Anhänge

  • registerindirekt.jpg
    registerindirekt.jpg
    117,4 KB · Aufrufe: 69
  • speicherindirekt.jpg
    speicherindirekt.jpg
    119,7 KB · Aufrufe: 55
Welche Fehlermeldung bekommst du den bei dem Code der MD10 in DB15.DBD0 schreiben soll?

übrigens:
Code:
[COLOR=#ff0000]AUF DB 15[/COLOR]
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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.
 
Speicherindirekte Adressierung vs. Registerindirekte Adressierung

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
 
Zurück
Oben