DB-Bereich in SCL löschen

JOKER83

Level-1
Beiträge
30
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute!

ich hab bereits eine SCL Quelle geschrieben die mir einen bestimmten Bereich von DB1 (QUELLE) auf einen anderen definierten Bereich im DB1 kopiert (ZIEL), jedoch bekomme ich es nicht hin, nach dem kopiervorgang die Quelle zu löschen (also in dem Bereich überall 0 einzutragen).

wie kann ich das am besten/schönsten lösen?

DANKE schonmal im Voraus!
 
Stell doch mal den SCL-Code vom Kopieren hier ins Forum. Dann kann man Dir leichter helfen das ganze zu erweitern.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hier der code vom kopieren:

Code:
FUNCTION FC12 : VOID

VAR_INPUT
SP_Ziel : INT;
SP_Quelle : INT;
END_VAR

VAR_TEMP  
Quelle : ANY;  
_Quelle AT Quelle : STRUCT  
    ID : BYTE;  
    Typ : BYTE;  
    Laenge : WORD;  
    DBNr : WORD;  
    Adresse : DWORD;  
END_STRUCT;  
Ziel : ANY;  
_Ziel AT Ziel : STRUCT  
    ID : BYTE;  
    Typ : BYTE;  
    Laenge : WORD;  
    DBNr : WORD;  
    Adresse : DWORD;  
END_STRUCT;  
i : INT;
tRetVal : INT; 
startadr_quelle : INT;
startadr_ziel : INT;
END_VAR  
  
BEGIN   
startadr_quelle := (SP_Quelle-1) * 12;
startadr_ziel := (SP_Ziel-1) *  12;

_Quelle.ID := 16#10;        //10 hex. muss so sein  
_Quelle.Typ := 16#2;        //2 für Byte  
_Quelle.Laenge := 16#08;    //z.B. 8 Byte  
_Quelle.DBNr := 16#01;      //z.B. DB1  
_Quelle.Adresse := INT_TO_DWORD (8*startadr_quelle) OR 16#8400_0000;;  //(DB = 84 hex.) Pointer zeigt zuf Bit, deshalb 8*Byte Nummer  
   
_Ziel.ID := 16#10;          //10 hex. muss so sein  
_Ziel.Typ := 16#2;          //2 für Byte  
_Ziel.Laenge := 16#08;      //z.B. 8 Byte  
_Ziel.DBNr := 16#01;        //z.B. DB1  
_Ziel.Adresse := INT_TO_DWORD (8*startadr_ziel) OR 16#8400_0000;;  //(DB = 84 hex.) Pointer zeigt zuf Bit, deshalb 8*Byte Nummer 
   
//Quelle nach Ziel schieben mit SFC20 (Blockmove)
tRetVal := BLKMOV(SRCBLK := Quelle, DSTBLK := Ziel); 

END_FUNCTION;
 
ok danke erstmal, aber wie genau würde das dann aussehen? ich dachte mit FC21 füllt man den ganzen DB mit einem Wert oder so auf nicht nur einen vordefiniereten Bereich?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

wir machen es mit AWL so:
// Variabel mit "0" zum Löschen vorbelege
L 0
T #tmp_int

CALL SFC 21 // FILL
BVAL :=#tmp_int
RET_VAL:=#tmp_retval
BLK :=#tmp_Pointer

mit SCL sollte es also so funktionieren:

1) VAR_TEMP festlegen, und zwar
tmp_int : INT;

2) in der FUNCTION mit FILL den Bereich füllen
// 0 nach Ziel schieben mit SFC21 (Fill)
tmp_int := 0;
tRetVal := FILL(BVal := tmp_int, BLK := Ziel);
 
hab das gerade getestet, leider wird nicht nur der QUELL-Bereich gelöscht sondern auch der ZIEL-Bereich, hab zuvor schon einiges probiert und da hatte ich meist das selbe Problem, übersehe ich da was?

trotzdem DANKE!
 
hi joker83,

wie oft rufst du deinen "Kopierbaustein" auf ?

Einmal, oder in jedem Zyklus ?
(Stichwort Flankenauswertung )
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kann es sein das Du im nächsten Zyklus einfach den leeren Quellbereich in den Zielbereich schreibst?

Bau mal eine Flanke ein!
 
Zurück
Oben