Fragen zu Any-Zeiger

petzi

Level-1
Beiträge
255
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich gehe gerade das Beispiel (Kopiere mithilfe des SFC20 einen variablen Merkerbereich (im Beispiel ab MB 20) mit 8 Byte Länge in den DB10 ab DBB4.) von Volker durch:

http://sps-forum.de/showthread.php?t=12923

Meine Fragen dazu:

Warum wird hier eine Variable (myZeiger) deklariert und warum belegt diese den Bereich 0.0 bis 9.7?

Könnte man nicht direkt eingeben:

Call SFC 20
SRCBLK := P#M20.0 BYTE8 // Quelle
RET_VAL := MW200
DSTBLK := P#DB10.DBX 4.0 BYTE 8 // Ziel

Vielen Dank für eine Erklärung!

LG

petzi
 
Das macht er damit er diesen Zeiger verändern kann. So kann er im Lokaldatenstack die einzelnen Bytes verändern so wie er es braucht. Hat schon seine richtigkeit.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok Proxy,
aber warum belegt die Variable (myZeiger) genau den Bereich 0.0 bis 9.7 - das wären ja 10 Byte; warum ist das gefordert, bzw. wo ist das ersichtlich?

Danke

petzi
 
Das ist so, weil die Größe des ANY-Pointers so definiert ist.
Vielleicht schaust du zu dem Thema auch mal in die Step7-Hilfe. Dort wird der Aufbau des Zeigers auch gut erklärt ...

Gruß
LL
 
Ok, Larry Laffer - das heißt also Byte 0 bis Byte 9. Soweit OK.

Mir ist allerdings noch immer nicht ganz klar, was mit dieser temporären Variable (myZeiger) bezweckt werden soll?

Wo steckt denn nun der "gebastelte Any-Zeiger" P#M20.0 BYTE8 drin? Das hat doch nichts mit dieser Variablen zu tun - oder doch?

Würde denn dann der Quellcode der Funktion so aussehen:

VAR_TEMP
myZeiger : Any;
END_VAR

Netzwerk 1:

L B#16#10
T LB 0
L B#16#2
T LB 1
L 8
T LW 2
L 0
T LW 4
L 20
SLD 3
T LD 6
L B#16#83
T LB 6

Netzwerk 2:

CALL "BLKMOV"
SRCBLK :=#myZeiger
RET_VAL:=MW200
DSTBLK :=P#DB10.DBX 4.0 BYTE 8



Blicke das irgendwie noch nicht...

petzi
 
Zuletzt bearbeitet:
@Petzi:
vielleicht noch einmal grundsätzlich :
Volkers Beispiel ist so gemacht, weil der ANY-Pointer in vielen Fällen variabel benötigt wird. Deshalb hat er das Beispiel gemacht um zu verdeutlichen, wie das geht.
Wenn du allerdings nur "fest" einen Bereich X in einen Bereich Y verschieben willst, dann geht es so, wie du es grundsätzlich (Beitrag #1) vorhattest.

Gruß
LL
 
Danke für die Hilfe,
mir ist der Aufbau des Any-Zeigers im Grunde jetzt schon klar.

Ich habe nur mein Problem mit dieser Variable (myZeiger), weil ich nicht genau verstehe, was es mit ihr auf sich hat.

Wenn ich euch also richtig verstanden habe, so wird einfach eine temporäre Variable in einer Funktion (FC) angelegt, um dieser dann beliebige "Any-Zeiger" zuweisen zu können.

Wenn dem so ist, dann könnte der Quellcode z.B. so lauten:

LAR1 P##myZeiger
L B#16#10
T LB 0
L B#16#2
T LB 1
L 8
T LW 2
L 0
T LW 4
L 20
SLD 3
T LD 6
L B#16#83
T LB 6

Somit würde ich also jetzt den Any-Zeiger P#M20.0 BYTE8 in das Adressregister 1 laden - ist das korrekt?
petzi
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn dem so ist, wo kann ich dann dieser Variable so einen Any-Zeiger übergeben?

Gar nicht, den kannst du nur manuell erzeugen. Alle direkten Zugriffen mit eier größeren Breite als 4 Byte funktionieren nicht mit Lade-Transferiere.

Gruß
LL
 
... das heißt diese Variable (myZeiger) steht sozusagen nur als "Platzhalter" und ich könnte diese im Programm dann z.B. durch den Any-Zeiger P#M20.0 BYTE8 (oder irgend einen anderen) ersetzen?

Danke,

petzi
 
1.
mir ist der Aufbau des Any-Zeigers im Grunde jetzt schon klar.

2.
Ich habe nur mein Problem mit dieser Variable (myZeiger), weil ich nicht genau verstehe, was es mit ihr auf sich hat.

3.
Wenn ich euch also richtig verstanden habe, so wird einfach eine temporäre Variable in einer Funktion (FC) angelegt, um dieser dann beliebige "Any-Zeiger" zuweisen zu können.

4.
Wenn dem so ist, dann könnte der Quellcode z.B. so lauten:

LAR1 P##myZeiger
L B#16#10
T LB 0
L B#16#2
T LB 1
L 8
T LW 2
L 0
T LW 4
L 20
SLD 3
T LD 6
L B#16#83
T LB 6

Somit würde ich also jetzt den Any-Zeiger P#M20.0 BYTE8 in das Adressregister 1 laden - ist das korrekt?
petzi
1. wirklich ?
2. gewisse funktionen benötigen einen any-zeiger. um sich den zur späteren verwendung bauen zu können, muss ein variablenbereich im temp festgelegt werden der die länge eines any-zeigers hat. hier myzeiger.
3.nein, nicht wirklich. den zeiger bastelst du dur ja komplett zusammen.
4. die lar1 anweisung ist hier völlig überflüssig/nutzlos.
der anyzeiger steht nicht im adressregister
mit lar1 p##myzeiger lädst du die anfangsadresse des zeigers in ar1.

wenn du über die lokaldaten den anyzeiger beschreibst muss auf die adressen gachtet werden. fügst du z.b. eine variable vor dem myzeiger im temp-bereich ein so verschieben sich die adressen des myzeiger und du müsstest das prog entsprechend ändern.

hier kommt jetzt das adressregister zum tragen wo lar1 myzeiger sinn macht.
steht auch in dem beitrag der faq
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also so ganz ist es mir noch immer nicht klar - liegt aber an mir und nicht an euren Erklärungen... :confused:


Ich deklariere doch im Temp-Bereich eine Variable (myZeiger) mit der Länge von 10 Bytes, was dem Aufbau eines Any-Zeigers entspricht.


Im Beispiel schreibt Volker:

" Nun bauen wir uns den Zeiger, um auf den Merkerbereich zugreifen zu können."

...

"Mit diesen Anweisungen haben wir nun folgenden Any-Zeiger gebaut:"

P#M 20.0 BYTE 8


Fragen:

1)
Hat nun dieser "selbst gebaute" Zeiger (P#M 20.0 BYTE 8) irgendetwas mit dieser Variable (myZeiger) zu tun oder ist diese Variable nur deklariert worden, um dann später, falls notwendig, diesen Speicherbereich zur Verfügung zu haben?


2)
Mit der Anweisung LAR1 P##myZeiger lade ich ja die Anfangsadresse des Zeigers in das Adressregister 1. Da diese Variable ja bei der Adresse 0.0 beginnt lade ich also auch diese Adresse 0.0 in das Adressregister 1, oder?

Vermutlich dumme Fragen, aber dennoch danke!

petzi
 
Zuletzt bearbeitet:
Ist zwar eigentlich Volkers Baustelle ... ich schreibe aber mal trotzdem was :

zu 1.) der Thread von Volker, auf den du dich beziehst stellt eine Anleitung dazu dar, wie man das mit dem ANY-Pointer anstellt. Es gibt Anwendungen, wo es nötig ist, sich einen solchen Pointer selber zu bauen bzw. einen übermittelten Pointer zu zerlegen. Ich habe da jetzt aber gerade kein Beispiel ... :rolleyes:

zu 2.) ja ...
das ist dazu gut, damit du wenn du deine TEMP-Variablen mal stärker veränderst, trotzdem noch (in der weiteren Folge) mit den richtigen L-Adressen arbeitest ... (du könntest ja z.B. vor myZeiger eine weitere Variable eingefügt haben ...)

Gruß
LL
 
1)
Hat nun dieser "selbst gebaute" Zeiger (P#M 20.0 BYTE 8) irgendetwas mit dieser Variable (myZeiger) zu tun oder ist diese Variable nur deklariert worden, um dann später, falls notwendig, diesen Speicherbereich zur Verfügung zu haben?petzi

natürlich hat der was damit zu tun. denn die ganzen tranferbefehle in den bereich LB0-LB9 ERGEBEN den zeiger
und dieser myzeiger wird am sfc20 benutzt

folgener aufruf hätte das gleiche ergebnis wie im beispiel
Code:
      CALL  SFC   20
       SRCBLK :=P#L 0.0 BYTE 10
       RET_VAL:=#retval
       DSTBLK :=P#DB10.DBX 4.0 BYTE 8
grundsätzlich:
die 'absolute' benutzung von lokaldaten sollte man sowieso vermeiden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok, danke für eure Geduld... :)

1)
Wenn ich mir nun Volker's Beispiel am Stück zusammengesetzt vorstelle, so ist also in einer einzigen Funktion (FC) in deren Temp-Bereich eine Variable (myZeiger) mit der Anfangsadresse 0.0 deklariert, im Netzwerk 1 dieser Funktion erfolgen dann die ganzen Transferbefehle in den Bereich LB0-LB9 und im Netzwerk 2 dieser Funktion erfolgt der Aufruf der SFC20.

Stimmt das so?

2)
Lade ich nun mit der Anweisung LAR1 P##myZeiger nur die Anfangsadresse 0.0 oder aber die gesamten 10 Bytes in das Adressregister 1 - ich denke doch mal alle 10 Bytes, oder?

Vielen Dank...

petzi
 
Zuletzt bearbeitet:
1. Ja
2. Nein, es wird der "Beginn", also die Anfangsadresse, von MyZeiger in das AR1 geladen.

Die weiteren Zugriffe auf die restlichen Byte des Zeigers, erfolgen ja dann mit indirekter Adressierung und Offsets.
 
Anwendungsbeispiel: Parametrierbarer Blockmove

hier mal ein anwendungsbeispiel

ein ECHTER BlockMove.
Die sfc20 ist in wirklichkeit ein BlockCopy :ROFLMAO:
 

Anhänge

  • blk_move.AWL.txt
    2,6 KB · Aufrufe: 72
Zuletzt bearbeitet:
Zurück
Oben