ANY-Pointer indirekt adressieren

A

Anonymous

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe das Problem, dass ich aus einem Datenbaustein je nach Wert einer Variable immer einen anderen Bereich des einen DB in einen anderen DB kopieren möchte.
Da der zu kopierende Bereich aus INT, REAL sowei STRING besteht will ich den SFC 20 verwenden.
Also direkt adressiert sieht das so aus:

CALL SFC 20
SRCBLK :=P#DB1.DBX34.0 BYTE 32
RET_VAL:=MW20
DSTBLK :=P#DB2.DBX0.0 BYTE 32

Jetzt bin ich am probieren, wie ich das statische "DBX34.0" durch einen Zeiger ersetzen könnte.
Normalerweise müsste der ja im Dopelwortformat sein.
Aber sowas wie z.B.:

SRCBLK := P#DB1.[MD 40] BYTE 32

funktioniert natürlich nicht.

Weiß jemand wie das geht, oder ob überhaupt?

MfG
Thomas
 
Manuelle Lösung

Hallo.

Würde ich manuell machen. Dafür eine eigene Funktion schreiben und entsprechende Eingabeparameter definieren. Nachfolgend ein Listing, wie es funktionieren müsste. Ist aber nicht getestet, müsste aber zumindest vom Prinzip funktionieren.

// ------------------------------------------------------------------------
// Quellparameter
L 12
T MW 100 // Startadresse
L 10
T MW 102 // DB-Startadresse

// Zielparameter
L 10
T MW 150 // Zieladresse
L 20
T MW 152 // DB-Zieladresse

// Anzahl der zu übertragenden Datenwörter!
L 16
T MW 110 // Anzahl Datenwörter
// ------------------------------------------------------------------------

// Quelle lesen
NEU: LAR1 P#0.0
L MW 100 // Das ist die Startadresse
SLW 3
+AR1
AUF DB [MW 102]
L DBW [AR1,P#0.0] // Das ist das 1.Wort des Quellbereichs
T #Quelle

// Zum Ziel schreiben
LAR1 P#0.0
L MW 150 // Das ist die Startadresse
SLW 3
+AR1
AUF DB [MW 152]
L #Quelle
T DBW [AR1,P#0.0] // Das ist das 1.Wort des Quellbereichs

// Lesezeiger erhöhen
L MW 100
INC 2
T MW 100
// Zielzeiger erhöhen
L MW 150
INC 2
T MW 150

L MW 110
DEC 2
T MW 110
LOOP NEU
 
VAR_IN_OUT
DB_NR : INT ;
END_VAR

VAR_TEMP
AN : ANY ;

END_VAR


BEGIN
NETWORK
TITLE =



NETWORK
TITLE =ANY-Zeiger fuer Quelle

L P##AN;
L B#16#10; //Kennung
T LB [AR1,P#0.0];
L B#16#2; // 2 = BYTE 4 = WORD
T LB [AR1,P#1.0];
L 16; // Laenge
T LW [AR1,P#2.0];
L #DB_NR; // DB_Nr // DB_Nr
T LW [AR1,P#4.0];
L P#DBX 0.0;
L 32; // erstes Datenwort
SLD 3;
+D ;
T LD [AR1,P#6.0];

ergibt = p#db1.DBX32.0 Byte 16

Ziel genauso zusammenstellen
 
Erstmal Danke an Gast.

Aber dann müssten doch die ersten 3 Zeilen so sein:

L P##AN
LAR1 // Adresse des ANY-Pointers in AR1
L B#16#10
.
.
.

Ich habe mal in den Siemens FAQ&s durchgeblättert, aber irgendwie keine genaue Beschreibung des Formates für ANY-Pointer gefunden.
Beispielprogramme sind ja kostenpflichtig (wie peinlich, ich bin Schüler)

Vielleicht weiß ja jemand wo das zu finden ist. Ich konnte in dem Durcheinander bei denen noch nichts brauchbares finden.

MfG
Thomas
 
Thomas\/2 schrieb:
Erstmal Danke an Gast.

Aber dann müssten doch die ersten 3 Zeilen so sein:

L P##AN
LAR1 // Adresse des ANY-Pointers in AR1
L B#16#10
.
.
.

Ich habe mal in den Siemens FAQ&s durchgeblättert, aber irgendwie keine genaue Beschreibung des Formates für ANY-Pointer gefunden.
Beispielprogramme sind ja kostenpflichtig (wie peinlich, ich bin Schüler)

Vielleicht weiß ja jemand wo das zu finden ist. Ich konnte in dem Durcheinander bei denen noch nichts brauchbares finden.

MfG
Thomas

Hallo Thomas
der Trick an der Sache sind die Lokaldaten mit IN IN_OUT geht so nicht
mann braucht zur Laufzeit die Adresse der Lokaldaten und dann kann kann
man Pointen und ANY-Zeiger so zusammenbauen.
Somit kann mann Pointer und ANY berechnen.
Bei IN und LAR1 habe ich die Daten des Eingangszeigers
die auch zerlegt werden koennen
 
Zurück
Oben