7/5/2013 7:48 AM | |
Posts: 1064 Rating: (72) |
/tf/WW/en/Posts/73282 Check out this link and the post from ibn-service and marcjan this will do what you want and more if you need help with it let me know it requires 5 inputs DB_Quelle : INT ;//DB-number source DW_Quelle : INT ;//dataword source DB_Ziel : INT ;//DB-number target DW_Ziel : INT ;//dataword target Anzahl_DW : INT ;//Number of words to copy |
Last edited by: playerslight at: 7/5/2013 8:01 AM |
|
7/5/2013 7:53 AM | |
Joined: 1/28/2009 Last visit: 10/11/2024 Posts: 6852 Rating: (1365)
|
These are cases related to SFC20, Case explained by "fritz" in detail comments also would be a great help for SFC 20 with dynamic parameter. Dynamic (Variable) Any Pointer [code]L W#16#1002 // S7 pointer constant 10hex; Data type 02hex (= Byte) T LW 0 // --> Byte 0 & 1 of ANY Pointer L #Length // Lengh of data to be transfered in BYTES (calculated elsewhere) T LW 2 // --> Byte 2 & 3 of ANY Pointer L 0 // Set DB number to 0 (not applicable as Q are is used) T LW 4 // --> Byte 4 & 5 of ANY Pointer L #IOAddress // Q Base address L #Offset // Q Byte offset (dynamic part) +I // add together = Q start Byte number SLD 3 // convert to S7 Pointer L DW#16#82000000 // Load Q Area ID (82hex) OD // add to Q address T LD 6 // --> Byte 6 -9 of ANY Pointer CALL "BLKMOV" SRCBLK :=#StationID RET_VAL:=#dummy DSTBLK :=#INDEX // ANY Pointer in LB 0-9 [/code] Convert Question about SFC20 BLKMOV Please help me with this FC out parameter with ANY type Move data SFC20 indirect address |
Last edited by: hdhosseini at: 7/5/2013 7:54 AM |
|
7/5/2013 9:37 AM | |
Joined: 6/24/2013 Last visit: 10/17/2024 Posts: 1632 Rating: (421) |
The above is nice. some years ago I have done a copy block which takes parameters as integer numbers and Data Block as DB. This is often useful when parts of DB are to be moved and address is dynamically calculated for example in recipe sub-systems. Printout attached. Source: [code] FUNCTION FC 101 : VOID TITLE =Copy data between two DBs //Copies data from source to target. VERSION : 0.0 VAR_INPUT I_ARG1_DB : BLOCK_DB ; //Argument 1 DB I_ARG1_START : INT ; //Argument 1 Start Address I_ARG2_DB : BLOCK_DB ; //Argument 2 DB I_ARG2_START : INT ; //Argument 2 Start Address I_LENGTH : INT ; //Length of arfea to be compared END_VAR VAR_TEMP SAVEAR1 : DWORD ; //Buffer for address registers ADDRESS1 : DWORD ; //Address 1 - Source ADDRESS2 : DWORD ; //Address 2 - Source L_CNTR : INT ; //Loop Counter BUFFER : BYTE ; //Buffer for Copying END_VAR BEGIN NETWORK TITLE =Save existing value from address register //Saves values from AR1 - it will be restored when FC is complete TAR1 ; T #SAVEAR1; NETWORK TITLE =Initialize Address Registers //Initialization of address registers. L P#DBX 0.0; // Pointer L #I_ARG1_START; // To beginning of Area 1 SLD 3; +D ; T #ADDRESS1; // To Address Register 1 L P#DBX 0.0; // Pointer L #I_ARG2_START; // To beginning of Area 2 SLD 3; +D ; T #ADDRESS2; // To Address Register 2 NETWORK TITLE =Copy Loop L #I_LENGTH; // Length of area to be compared NEXT: T #L_CNTR; // from second pass LOOP instruction updates counter OPN #I_ARG1_DB; // Open Argument 1 DB LAR1 #ADDRESS1; L DBB [AR1,P#0.0]; // Load Value from memory area T #BUFFER; +AR1 P#1.0; // Update Source Address TAR1 #ADDRESS1; OPN #I_ARG2_DB; // Open Argument 2 DB LAR1 #ADDRESS2; L #BUFFER; T DBB [AR1,P#0.0]; // Transfer to target +AR1 P#1.0; // Update Destination Address TAR1 #ADDRESS2; L #L_CNTR; // Load Loop Counter LOOP NEXT; // If loop not finish jump to Next LAR1 #SAVEAR1; // Restore Address Registers SET ; // ENO is always true SAVE ; END_FUNCTION FUNCTION FC 102 : VOID TITLE =Compare contents of memory areas //Compares contents of memory area specified by parameters. //The areas are same and comparison is done as DInteger VERSION : 0.0 VAR_INPUT I_ARG1_DB : BLOCK_DB ; //Argument 1 DB I_ARG1_START : INT ; //Argument 1 Start Address I_ARG2_DB : BLOCK_DB ; //Argument 2 DB I_ARG2_START : INT ; //Argument 2 Start Address I_LENGTH : INT ; //Length of arfea to be compared END_VAR VAR_TEMP SAVEAR1 : DWORD ; //Buffer for address registers L_CNTR : INT ; //Loop Counter BUFFER : BYTE ; ADDRESS1 : DWORD ; ADDRESS2 : DWORD ; END_VAR BEGIN NETWORK TITLE =Save existing values from address registers //Saves values from AR1 and AR2 - they will be restored when FC is complete TAR1 #SAVEAR1; NETWORK TITLE =Initialize Address Registers //Initialization of address registers. L P#DBX 0.0; // Pointer L #I_ARG1_START; // To beginning of Area 1 SLD 3; +D ; T #ADDRESS1; // To Address Register 1 L P#DBX 0.0; // Pointer L #I_ARG2_START; // To beginning of Area 2 SLD 3; +D ; T #ADDRESS2; // To Address Register 2 NETWORK TITLE =Comparison Loop L #I_LENGTH; // Length of area to be compared NEXT: T #L_CNTR; // from second pass LOOP instruction updates counter OPN #I_ARG1_DB; // Open Argument 1 DB LAR1 #ADDRESS1; L DBB [AR1,P#0.0]; // Load Value from memory area T #BUFFER; +AR1 P#1.0; TAR1 #ADDRESS1; OPN #I_ARG2_DB; // Open Argument 2 DB LAR1 #ADDRESS2; L DBB [AR1,P#0.0]; // Load Value from memory area L #BUFFER; // Load Value from Area Specified in Arg 1 <>I ; // Different? JC NEQ; // Yes - end of loop ajd jump to Clear ENO +AR1 P#1.0; // Update Second Address TAR1 #ADDRESS2; // and store in variable L #L_CNTR; // Load Loop Counter LOOP NEXT; // If loop not finish jump to Next SET ; // Last Element Equal=All Equal! SAVE ; // Return TRUE JU ENDE; // Jump to restoration of AR1, AR2 NEQ: CLR ; // At least one difference SAVE ; // Return FALSE on ENO ENDE: LAR1 #SAVEAR1; // Restore Address Registers END_FUNCTION [/code] Attachmentdbdbcpy_dbdbcmp.pdf (357 Downloads) |
This contribution was helpful to1 thankful Users |
Follow us on