Probleme mit Any-Pointer

Smazze

Level-1
Beiträge
22
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo. Ich habe folgendes Problem.
Ich habe einen Any-Pointer:

LAR1 P##mySourcePointer //zeiger ins adressregister laden
L W#16#10 //SyntaxID. bei S7 immer 10
T LB [AR1,P#0.0]
L W#16#2 //Typ BYTE
T LB [AR1,P#1.0]
L 18 //Anzahl Bytes
T LW [AR1,P#2.0]
L 1 //Quell-DB
T LW [AR1,P#4.0]
L 0 //Anfang des Zieles
SLD 3
T LD [AR1,P#6.0]
L B#16#84 //Speicherbereich (hier DB)
T LB [AR1,P#6.0]


Problem ist nun das ich den Quelle und den Anfang des Speicherbreiches nach der Variable richten soll. Sprich.. Ich gebe in dem FB eine Variable an und DB und Startadresse wird in jeweils eine Integervariable geschrieben.


Vielen Dank im Vorraus
Smazze
 
Zuletzt bearbeitet:
Meinst Du, daß Du die konstante DB-Nummer 1 und die konstante Adresse 0 durch Variablen ersetzen willst?
Dann mach' das doch und schreibe statt den Konstanten die Variablen dahin.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie mach ich das dann?

LAR1 P##mySourcePointer //zeiger ins adressregister laden
L W#16#10 //SyntaxID. bei S7 immer 10
T LB [AR1,P#0.0]
L W#16#2 //Typ BYTE
T LB [AR1,P#1.0]
L 18 //Anzahl Bytes
T LW [AR1,P#2.0]
L #Variable //Quell-DB
T LW [AR1,P#4.0]
L #Variable //Anfang des Zieles
SLD 3
T LD [AR1,P#6.0]
L B#16#84 //Speicherbereich (hier DB)
T LB [AR1,P#6.0]

..geht ja nicht. Dann würde er ja den Inhalt der Variablen nehen. Geht das dann mit P## ?? meine das hötte aber auch nicht funktioniert..
Bzw. einmal müsst ich ja den DB haben und einmal die Adresse.
Bräuchte ein Befehlen wie Inthilsvariable=DBof(Variable) und Inthilsvariable=adressof(Variable) wenn wir in C wären ;)
 
Zuletzt bearbeitet:
Wieso soll das nicht gehen? Wenn man eine Variable lädt dann lädt man den Inhalt der Variable, so wie auch in C. Was willst Du mit der Adresse der Variable anfangen???

Ob Du uns vielleicht mal mitteilen kannst, wo/wie Du die DB-Nummer und die Anfangsadresse herbekommst?

Harald
 
... es geht natürlich NICHT mit derselben Variablen - du bräuchtest da schon wenigstens 2. Die könnten dann auch sinnvollerweise #Quell_DB und #Start_Adr heissen.
Vielleicht sind das ja IN-Parameter deines Bausteins oder Variablen des Bausteins in dem du dich befindest ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Glaub wir verstehen uns da grade falsch.
Klar wird es hinter so aussehen:

LAR1 P##mySourcePointer //zeiger ins adressregister laden
L W#16#10 //SyntaxID. bei S7 immer 10
T LB [AR1,P#0.0]
L W#16#2 //Typ BYTE
T LB [AR1,P#1.0]
L 18 //Anzahl Bytes
T LW [AR1,P#2.0]
L #Quell_DB //Quell-DB
T LW [AR1,P#4.0]
L #Start_Adr //Anfang des Zieles
SLD 3
T LD [AR1,P#6.0]
L B#16#84 //Speicherbereich (hier DB)
T LB [AR1,P#6.0]

Allerdings habe ich in einem FB eine Stuktur die übertragen werden soll. Diese Stuktur liegt ja in einem DB und hat eine Anfangsadresse.
Und somit muss ich nun rausbekommen wo die Stuktur liegt die übertragen werden soll.. Von der Strukur kenn ich nur den Namen und die Länge...
 
Es ist schwer Dir zu folgen!
Du willst in einem FB1 auf die Instanzdaten eines FB2 zugreifen?!
Habe ich das so richtig verstanden?

Wenn ja, kannst Du die Anfangsadresse der Struktur im FB2 auswerten und danach dem FB1 zur Verfügung stellen.
 
Ich habe einen FB in dem der Anypointer und eine Struktur ist.
Die Struktur soll in einen anderen DB kopiert werden.

Problem ist nur das ich den FB umbenennen kann (zB vo FB10 in FB100) oder den FB als Multiinstanz in einem anderen FB aufrufen könnte.
Dann müsst ich doch wissen in welchem DB wo die Startadresse liegt...
Nun würde ich gerne irgendwie abfragen wie der DB und die Anfangsadresse von der Sturktur ist die übergeben werden soll...
..und die beiden Daten werden dann als Integer in #Quell_DB und #Start_Adr gespeichert..
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der FB, der die Struktur aus seinen Instanzdaten hergeben soll, könnte die Struktur sauber über seine Baustein-Schnittstelle übergeben. Dann schließe einfach außen Deinen Zielbereich an und es kopiert sich von ganz alleine ohne ANY-Gebastel.

Woher soll Dein Programmcode wissen/wie wolltest Du ihm mitteilen, auf welche FB-Instanz er zugreifen soll und auf welcher Adresse da die Struktur liegt?
Oder ist Dein Programmcode in dem FB, welcher die Struktur aus seinen eigenen Instanzdaten irgendwohin kopieren soll? Dann ist die Übergabe über die Baustein-Schnittstelle am einfachsten. Wenn man aber unbedingt selber wursteln will, dann erhält man die eigene IDB-Nummer über "L DINO" und die Adresse im IDB errechnet sich aus P##Struktur + AR2 (suche mal nach Multiinstanz Offset AR2).

PS: Wie ein FB heißt hat für die Berechnung von Variablenadressen keinen Einfluß.

Harald
 
ich weiss ich bin da etwas komisch. Aber ich find einfach in SCL ist solches Pointergeschubse irgendwie einfacher :)

Code:
FUNCTION_BLOCK "Baustein_1"{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
   VAR_INPUT 
      Startdaten : Any;
      pStartdaten AT Startdaten : "ANY_POINTER";
      versatz : Int;
   END_VAR


   VAR_TEMP 
      Zieldaten : Any;
      pZieldaten AT Zieldaten : "ANY_POINTER";
      index : Int;
      IN_Byte : Int;
   END_VAR




BEGIN
	#pZieldaten := #pStartdaten;
	
	#IN_Byte := DWORD_TO_INT(SHR(IN := SHL(IN := #pStartdaten.Startadresse, N := 8), N := 11));
	
	FOR #index := 0 TO (#pStartdaten.Anzahl_Werte - 2) DO
	    WORD_TO_BLOCK_DB(INT_TO_WORD(#pZieldaten.DB_Nr)).DB(#IN_Byte + #index + #versatz)
	    := WORD_TO_BLOCK_DB(INT_TO_WORD(#pStartdaten.DB_Nr)).DB(#IN_Byte + #index);
	END_FOR;
	    
END_FUNCTION_BLOCK

In AWL ist das so mühsam.

mfG René
 
Vielen Dank soweit! Problem ist das ich und ein Kollege nur in AWL und FUB programmieren. Wollt nun nicht noch eine dritte Programmiersprache einführen ;/
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Problem ist nur das ich den FB umbenennen kann (zB vo FB10 in FB100) oder den FB als Multiinstanz in einem anderen FB aufrufen könnte.
Dann müsst ich doch wissen in welchem DB wo die Startadresse liegt...
Nun würde ich gerne irgendwie abfragen wie der DB und die Anfangsadresse von der Sturktur ist die übergeben werden soll...
..und die beiden Daten werden dann als Integer in #Quell_DB und #Start_Adr gespeichert..

Mir fällt es nach wie vor schwer, dir zu folgen.
Vielleicht solltest du das Ganze mal mit einem Beispiel untermalen/ausführen - also wie sähe das aus und was soll wohin.

Gruß
Larry
 
... Problem ist das ich und ein Kollege nur in AWL und FUB programmieren. Wollt nun nicht noch eine dritte Programmiersprache einführen ;/

Tja ... wenn du meinst ...
Ich fand den Vorschlag von Vollmi hierzu gar nicht so schlecht.
Ungeachtet dessen sollte man sich heute (wenn man noch so 2 bis 25 Jahre im Geschäft mitspielen will) der SCL/ST-Programmierung nicht (mehr) verschliessen ...

Gruß
Larry
 
Mir fällt es nach wie vor schwer, dir zu folgen.
Vielleicht solltest du das Ganze mal mit einem Beispiel untermalen/ausführen - also wie sähe das aus und was soll wohin.

Gruß
Larry

Ich denke es ist sinnlos wenn jemand keinen halbwegs verständlichen Satz schreiben kann.

Ich habe einen FB in dem der Anypointer und eine Struktur ist.

Problem ist nur das ich den FB umbenennen kann
...

Nun würde ich gerne irgendwie abfragen wie der DB und die Anfangsadresse von der Sturktur ist


Also wenn sich jemand nicht- nach Aufforderung- bemüßigt fühlt einen halbwegs klaren Satz zu schreiben, dann werde ich auch nicht über Antworten nachdenken.
 
Zurück
Oben