8/3/2015 2:05 PM | |
Posts: 26 Rating: (2) |
Hello, I wrote the following code for reading an element in array (whose size is 15) specifing position of the element in array: FUNCTION Array_Read_Val_By_Index : VOID TITLE = 'Read in array a value specified by index' VAR_INPUT Array_In : ARRAY[1..15] OF INT; //Input Array Index : INT; //Index of the element that is to be readed END_VAR VAR_OUTPUT V_Out : INT; //Value of readed element Error : BOOL; //Error if index exceedes the lenght of array END_VAR //Begin V_Out := 0; Error := False; IF (Index > 0 ) AND (Index <= 15) THEN V_Out := Array_In[Index]; ELSE Error := True; END_IF;
END_FUNCTION I would like to make this function general so that it can accept as input parameter a variable size array. Input array can also be stored in a temp variable, not only in DB, so I think I can't use ANY data type because it needs DB number in STRUCT. To perform this solution, I was searching for the using of POINTER data type, but I couldn't find good examples. Can you help me, please? Thanks in advance. Best regards. ----------------------------------------------------------------------------------------------------
Split from Array in SCL - function that receives an array of variable size. |
Last edited by: Min_Moderator at: 8/3/2015 2:36:45 PMNew subject after splitting |
|
This contribution was helpful to1 thankful Users |
8/3/2015 3:29 PM | |
Posts: 26 Rating: (2) |
Thank you for your fast reply. Can you post an example code, please, if you can? Best regards. |
8/3/2015 3:58 PM | |
Joined: 12/16/2012 Last visit: 9/13/2024 Posts: 653 Rating: (130) |
Hi! Search for smiffy's posts about the ANY pointer. You'll find there plenty of examples. e.g. |
8/4/2015 8:50 AM | |
Joined: 12/16/2012 Last visit: 9/13/2024 Posts: 653 Rating: (130) |
Hi! I do not have v5.5 scl so cannot test your code, but it looks OK. How do you pass the array to your function? Do you use a symbolic name or absolute address? When a symbol name is used, the generated ANY pointer is converted to a Byte data type ANY. See page 6 of attached document. AttachmentVolume 3 describes the use of DB Pointers and ANY Pointers.pdf (518 Downloads) |
8/4/2015 11:55 AM | |
Joined: 12/16/2012 Last visit: 9/13/2024 Posts: 653 Rating: (130) |
Hi! Regarding the example with DB1.DB0.0 INT 100, I just wanted to show you what the attached document states on page 6: "The user may enter an “absolute” form of the ANY pointer, or the user may apply a symbolic variable to the parameter. When a symbol name is applied to the ANY pointer input of a function or function block, it is converted to an “absolute” ANY pointer whose starting address is the address of the symbol, whose data type is BYTE, and whose length if the byte length of the defined symbol (for instance, a REAL element would have a byte length of 4)." Regarding the second part with #MyArray, I do not see any BLKMOV in your example code. Anyway, looks like something is wrong with the source and destination memory areas (see last point of link). Maybe the local stack of OB1 is too small for your array - I don't know. You could try to construct an ANY pointer which points to #MyArray as in smiffy's example, and use that with BLKMOV: pAnySRC.S7Code := 16#10; PS another good example from smiffy: https://support.industry.siemens.com/tf/ww/en/posts/any-pointer-in-scl/50677/?page=0&pageSize=10 |
Last edited by: Kahl at: 8/4/2015 11:56:22 AMLast edited by: Kahl at: 8/4/2015 11:59:48 AMLast edited by: Kahl at: 8/4/2015 2:14:33 PM |
|
8/4/2015 1:03 PM | |
Joined: 12/16/2012 Last visit: 9/13/2024 Posts: 653 Rating: (130) |
Hi! What does not work? What happens? |
9/12/2017 8:54 PM | |
Joined: 1/20/2011 Last visit: 6/11/2024 Posts: 4 Rating: (0) |
It appears the command, ReadFromArrayDB is only for S7-1500. |
Last edited by: ORION500 at: 9/12/2017 8:57:12 PM |
|
Follow us on