indriekte Adressierung von sfc20 (blkmov)

A

Anonymous

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
ich möchte dem systemfunktionbaustein als zieladresse eine dynamische adresse zu ordnen hab aber nocht nicht rausgefunden wies geht.
Genauer: ich habe einen db (db30) erstellt. die ersten 4 byte belegt dort eine zählervariable. nun möchte ich mit blkmov einen string von 10 bytens in db30 schieben lassen an die adresse von inhalt erstes datenwort in db30 * 24. wie muss ich meine zieladresse deklarieren oder erstellen?
 
Das hier benutze ich, als Anregung ist es allemal gut

AWL-Quelle:


FUNCTION FC 112 : INT
TITLE =BLK_Move
AUTHOR : Ralle
NAME : BLK_MOVE
VERSION : 1.0


VAR_INPUT
AnzahlDBB : INT ;
QuellDB : INT ;
QuellDW : INT ;
ZielDB : INT ;
ZielDW : INT ;
END_VAR
VAR_TEMP
Quelle : ANY ;
Ziel : ANY ;
END_VAR
BEGIN
NETWORK
TITLE =Blocktransfer zwischen Datenbausteinen

LAR1 P##Quelle; //Anfangsadresse des ANY-Pointers in AR1 laden

L B#(16, 2); //Syntax-ID und Typ: Byte laden
T LW [AR1,P#0.0];
L #AnzahlDBB; //Transferlaenge
T LW [AR1,P#2.0];
L #QuellDB; //Quelle-DB
T LW [AR1,P#4.0];
L P#DBX 0.0; //Anfangs-DW im Quell-DB
L #QuellDW;
SLW 3;
+D ;
T LD [AR1,P#6.0];

LAR1 P##Ziel; //Anfangsadresse des ANY-Pointers in AR1

L B#(16, 2); //Syntax-ID und Typ: Byte laden
T LW [AR1,P#0.0];
L #AnzahlDBB; //Transferlaenge
T LW [AR1,P#2.0];
L #ZielDB; //Ziel-DB
T LW [AR1,P#4.0];
L P#DBX 0.0; //Anfangs-DW im Ziel-DB
L #ZielDW;
SLW 3;
+D ;
T LD [AR1,P#6.0];

CALL SFC 20 (
SRCBLK := #Quelle,
RET_VAL := #RET_VAL,
DSTBLK := #Ziel);
END_FUNCTION

Gruß Ralle !
 
Zuviel Werbung?
-> Hier kostenlos registrieren
sehe ich das richt, das folgendes funktionieren müsste...

L DB30.DBW0
L 24
*I
T MW10 // Soll Zieldatenwort im DB sein!


LAR1 P##Ziel; //Anfangsadresse des ANY-Pointers in AR1

L B#(16, 2); //Syntax-ID und Typ: Byte laden
T LW [AR1,P#0.0];
L 10 //Transferlaenge
T LW [AR1,P#2.0];
L 30
T LW [AR1,P#4.0];
L P#DBX 0.0; //Anfangs-DW im Ziel-DB
L MW10;
SLW 3;
+D ;
T LD [AR1,P#6.0];

Jetzt habe ich die Zeiladresse in #Ziel ??
 
'Ziel' mußt du als Any-Pointer in Temp deklarieren (Ziel : ANY), dann sollte es gehen, aber Achtung, du hast geschrieben die ersten 4 Byte beinhalten den Zähler, das wäre DBD0 und *D, aber mit den ersten 2 Byte kommst du eigentlich weit genug !

Gruß Ralle !

PS: Wenn du den FC so nimmst wie er ist, kannst du als Ziel-DW das von die errechnete Ziel MW10 angeben, die Quelle kannst du ja fest angeben, wenn sie immer gleich ist.
 
Stimmt.
Eigentlich müsste es gehen.

LAR1 lädt den Inhalt des Akkus
LAR1 p##xy lädt xy ins AR1

aber komischerweise geht das bei mir nicht.

Na ja, zurück zum TP :twisted:
 
Hallo plc_tippser,

bei multiinstanzfähigen FBs geht's nur mit:

Code:
L   Zeiger
LAR1

bei sonstigen Bausteinen:

Code:
LAR1   Zeiger


Gruß, Onkel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Onkel,

das ist schon mal gut zu wissen. Gestern hatte ich es in einem FC getestet. Aber nicht so ausgiebig.

Ansonsten wende ich dieses aber nur in Multiinstanzfähigen FBs an.

Gruß pt
 
Zurück
Oben