Speicherbereich dynamisch darstellen bei SFC 20

Rose

Level-1
Beiträge
58
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

Im OB1 habe ich solche AWL-Code erzeugt:

L DB99.DBW4 // Fehler Anzahl (z.B. 4)
T PAD 100

CALL "BLKMOV"
SRCBLK :=P#DB11.DBX0.0 BYTE 16
RET_VAL:=MW100
DSTBLK :=P#A 104.0 BYTE 16
NOP 0

gibt es Möglichkeit, dass ich díe Speicherbereich in SRCBLK und DSTBLK als Parameter eingeben kann? z.B. ich lese DB99.DBW4 und bekomme eine Zahl x, in SRCBLK schreibe ich dann " P#DB11.DBX0.0 BYTE x*4 " , weißt jemand wie kann ich das mit AWL realisieren?

MFG,
Rose
 
Klar!

Er ist relativ kurz, deshalb poste ich ihn gleich hier und sende dir kein Projekt.

Hier ist der Baustein:

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 "BLKMOV"
SRCBLK :=#Quelle
RET_VAL:=MW1
DSTBLK :=#Ziel


Als Variablen musst du bei IN folgende Variablen einfügen:

AnzahlDBB, INT
QuellDB, INT
QuellDW, INT
ZielDB, INT
ZielDW, INT

Unter TEMP legst du diese 2 an:

Quelle, ANY
Ziel, ANY

und dann speicherst du das ganze in einem FC.

Das ganze sollte dann eigentlich funktionieren, probier' es mal.
 
@Rose
Und mach aus dem SLW 3 ein SLD 3, es funktioniert beides, aber SLD ist richtig und bei "langen" Sprungweiten würde SLW zu "Fehlsprüngen" führen!

Sieh dazu auch hier: http://www.esatex.com/SPS-Forum/showthread.php?t=1330&highlight=blkmove, in dem angehängten Baustein ist es auch noch mit SLW, bin erst später darauf gekommen.

Hier noch die AWL-Quelle:

Code:
FUNCTION FC 112 : INT
TITLE =BLK_Move
{ S7_language := '7(1) Deutsch (Deutschland) 16.06.2005 14:21:35' }
AUTHOR : Ralle
FAMILY : SYSTEM
NAME : BLK_MOVE
VERSION : 1.1
 
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; 
ITD ; 
SLD 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; 
ITD ; 
SLD 3; 
+D ; 
T LD [AR1,P#6.0]; 
CALL SFC 20 (
SRCBLK := #Quelle,
RET_VAL := #RET_VAL,
DSTBLK := #Ziel);
END_FUNCTION
 
Zuletzt bearbeitet:
nun in OB1:

CALL FC 114
AnzahlDBB:=DB99.DW4
QuellDB :=DB12.DBD0
QuellDW :=DBD0
ZielDB := ?
ZielDW := ?

geht das auch wenn die Zielbereich nicht ein DB sondern der Ausgang ab Adresse 100 ist?

// DSTBLK :=P#A 100.0 BYTE 16
 
Zuviel Werbung?
-> Hier kostenlos registrieren
CALL FC 114
AnzahlDBB:=DB99.DW4 //hier muß eine Zahl drinstehen, wieviel Byte kopiert werden sollen (z.Bsp.8
QuellDB :=DB12.DBD0 //Hier die Quell-DB-Nummer (also 10 für DB10)
QuellDW :=DBD0 //Hier sollte die Nummer des StartDBB der Quelle drinstehen (Z.Bsp. 0 für DBB0)
ZielDB := 20 //Das Ziel ist DB20
ZielDW := 10 //im DB20 ab DW10 stehen nach dem Kopieren 8 Byte Daten

Also z.Bsp.

CALL FC 114
AnzahlDBB:=8 //8 Byte kopieren
QuellDB :=10 //aus DB10
QuellDW :=0 //ab DW0 lesen
ZielDB := 20 //in DB20
ZielDW := 10 //ab DW ablegen

geht das auch wenn die Zielbereich nicht ein DB sondern der Ausgang ab Adresse 100 ist?

// DSTBLK :=P#A 100.0 BYTE 16

Nein so geht das nicht, der FC kann nur von DB in DB kopieren.
Du kannst aber im FC114 die Zeile

L P#DBX 0.0; //Anfangs-DW im Ziel-DB
durch
L P#A0.0; ersetzen, die DB-Nummer wird dann ignoriert, oder du mußt sie mit 0 angeben, probiere es einmal aus, sollte so gehen, vielleicht hat das ja schon einmal jemand ausprobiert.
 
Zurück
Oben