BLK_MOV mit Pointer versorgen

CrazyCat

Level-1
Beiträge
683
Reaktionspunkte
9
Zuviel Werbung?
-> Hier kostenlos registrieren
Mein Problem ist folgendes:

Ein sehr speicheraufwendiger FB, der aus einer Reihe von folgenden Anweisungen besteht:

CALL "R_STRNG" IN :="data_in".real1
RET_VAL:="zw".realwert


CALL "BLKMOV"
SRCBLK :=P#DB120.DBX45.0 BYTE 21
RET_VAL:=MW3
DSTBLK :="data".wert_array1


CALL "R_STRNG"
IN :="data_in".real2
RET_VAL:="zw".realwert


CALL "BLKMOV"
SRCBLK :=P#DB120.DBX45.0 BYTE 21
RET_VAL:=MW3
DSTBLK :="data".wert_array2

usw. muss aus Speichergründen geändert werden.

Die Anweisungen werden ca. 30 mal ausgeführt.

Dabei werden die Werte als Real eingelesen, in einen String konvertiert, der Stringkopf entfernt und in ein Array of Char gespeichert.

Wenn ich nun das ganze auf Pointern basierend mache, müsste ich eine Menge Speicher sparen, oder?

Nur wie kann ich den SFC BLKMOV mit einem Pointer als Ausgabegröße versorgen, um das ganze nicht Byte für Byte verschieben zu müssen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Schau Dir mal den Baustein an. Ist auch eine Schale für den SFC 20, arbeitet aber symbolisch.

Bernd

FUNCTION "FC_MOVE_X" : INT
TITLE =Erweiteter Bock Move
//Der FC kopiert den Bereich von Quelle nach Ziel.
//Quelle und Ziel dürfen NICHT in den L-Daten liegen (SFC 20)!
//Die Länge der zu kopierenden Bytes wird über den Parameter "LENGTH" übergeben.
//Über die Parameter "OFFSET_SOURCE" und "OFFSET_DEST" kann Anfang bzw. Ende des
//zu kopierendeb Bereiches verschoben werden.
//
//Änderungen:
//2004-10-11 BS Baustein erstellt
//
{ S7_language := '9(1) Englisch (USA) 09.02.2006 14:58:54' }
VERSION : 0.0


VAR_INPUT
SOURCE : POINTER ;
OFFSET_SOURCE : INT ;
LENGTH : INT ;
DEST : POINTER ;
OFFSET_DEST : INT ;
END_VAR
VAR_TEMP
tSRCBLK : ANY ;
tDSTBLK : ANY ;
tDWORD : DWORD ;
tWORW : DWORD ;
tByteAddr : DINT ;
tArea : BYTE ;
END_VAR
BEGIN
NETWORK
TITLE =SOURCE

L 0;
T #RET_VAL;
NETWORK
TITLE =ANY Quelle

L P##SOURCE;
LAR1 ;
L D [AR1,P#0.0];
T #tDWORD;
L W [AR1,P#4.0];
T #tWORW;

L P##tSRCBLK;
LAR1 ;

L W#16#1002;
T W [AR1,P#0.0];

L #LENGTH;
T W [AR1,P#2.0];

L #tDWORD;
T D [AR1,P#4.0];

L #tWORW;
T W [AR1,P#8.0];


L B [AR1,P#6.0];
L W#16#87; //Vorgänger L-Daten
<>I ;
JC OK_1;
L -4711; //geht nicht wegen SFC20
T #RET_VAL;
JU ENDE;
OK_1: NOP 0;
NETWORK
TITLE =ANY Ziel

L P##DEST;
LAR1 ;
L D [AR1,P#0.0];
T #tDWORD;
L W [AR1,P#4.0];
T #tWORW;

L P##tDSTBLK;
LAR1 ;

L W#16#1002;
T W [AR1,P#0.0];

L #LENGTH;
T W [AR1,P#2.0];

L #tDWORD;
T D [AR1,P#4.0];

L #tWORW;
T W [AR1,P#8.0];

L B [AR1,P#6.0];
L W#16#87; //Vorgänger L-Daten
<>I ;
JC OK_2;
L -4711; //geht nicht wegen SFC20
T #RET_VAL;
JU ENDE;
OK_2: NOP 0;

NETWORK
TITLE =OFFSET Quelle

L #OFFSET_SOURCE;
L 0;
==I ;
JC NOOS;

L P##tSRCBLK;
LAR1 ;

L B [AR1,P#6.0]; //Bereich speichern
T #tArea;

L D [AR1,P#6.0]; //Byte Adresse
L DW#16#FFFFFF;
AD ;
T #tByteAddr;

L #OFFSET_SOURCE;
L 8;
*I ;
ITD ;
L #tByteAddr;
+D ;
T D [AR1,P#6.0];

L #tArea; //Bereich
T B [AR1,P#6.0];

NOOS: NOP 0;
NETWORK
TITLE =OFFSET Ziel

L #OFFSET_DEST;
L 0;
==I ;
JC NOOD;

L P##tDSTBLK;
LAR1 ;

L B [AR1,P#6.0]; //Bereich speichern
T #tArea;

L D [AR1,P#6.0]; //Byte Adresse
L DW#16#FFFFFF;
AD ;
T #tByteAddr;

L #OFFSET_DEST;
L 8;
*I ;
ITD ;
L #tByteAddr;
+D ;
T D [AR1,P#6.0];

L #tArea; //Bereich
T B [AR1,P#6.0];

NOOD: NOP 0;
NETWORK
TITLE =Block Move



CALL "BLKMOV" (
SRCBLK := #tSRCBLK,
RET_VAL := #RET_VAL,
DSTBLK := #tDSTBLK);
NOP 0;


NETWORK
TITLE =


ENDE: L #RET_VAL;
L 0;
==I ;
SAVE ;
BE ;

END_FUNCTION
 
@Ralle: Dein Link funktioniert nicht

@bs: Ich habe dein Skript als SCL - Quelle eingebunden. Wie kann ich die Quelle aufrufen, bzw. welche Parameter muss ich verändern um in einen bestimmten DB die Daten ab einer variablen Adresse abzulegen?

Bin mit SCL nicht wirklich vertraut.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich glaube nicht das das eine AWL - Quelle ist.

Alleine die Strichpunkte am Ende und die VAR_INPUT Optionen deuten für mich auf eine SCL - Quelle hin.

Das Programm kann außerdem als SCL - Quelle gestartet werden, während ich es in AWL erst noch modifizieren muss.

Danke für den Link!
 
@CC
Meine AWL-Quellen haben auch das Semikolon nach jeder Zeile.
SCL hat eigentlich kein "NETWORK"-Statement.
 
Und das akzepziert der Simatic Manager?!?

Ich muss alle Network - Statements löschen, genauso wie die Strichpunkte sonst ist alles rot und ich kann nicht einmal speichern.

Jedenfalls hab' ich das Programm jetzt in einer AWL - Liste (etwas modifiziert -> Var Input und Var Temp oben in Variablen Liste eingetragen, Network - Statement und Strichpunkte weg, etc.) und es funktioniert! :D

Hast du irgendetwas im Simatic Manager umgestellt, damit du solche Programme einfach einfügen kannst bzw. welche Version benutzt du?

Wie gesagt, ohne Modifikation kann ich sie nur als SCL - Quelle direkt übernehmen.
 
Zurück
Oben