twincat - Beckhoff Twincat3 Structured text Dynamic Array size calculation - Stack Overflow

I am writing a program that loops through an array to check Boolean alarm variable statuses.I want to

I am writing a program that loops through an array to check Boolean alarm variable statuses.

I want to dynamically generate the for-loop count integer to end the loop.

I have looked through Benchoff's Twincat 3 Documentation and can't find any generic SIZEOF() functions to generate the array size, for example

nArraySize := SIZEOF(Array);

another thought is the Generate the Upper and lower bounds of the array to determine the size but I cannot find any functions to do this either.

I am writing a program that loops through an array to check Boolean alarm variable statuses.

I want to dynamically generate the for-loop count integer to end the loop.

I have looked through Benchoff's Twincat 3 Documentation and can't find any generic SIZEOF() functions to generate the array size, for example

nArraySize := SIZEOF(Array);

another thought is the Generate the Upper and lower bounds of the array to determine the size but I cannot find any functions to do this either.

Share Improve this question edited Jan 5 at 16:13 asys 7317 silver badges29 bronze badges asked Nov 16, 2024 at 16:26 Alex ChalaAlex Chala 231 silver badge2 bronze badges 1
  • Please provide some context, at least how "Array" is declared. – Fred Commented Nov 16, 2024 at 16:45
Add a comment  | 

1 Answer 1

Reset to default 2

You can't really determine the size like that, the SIZEOF returns number of bytes the variable occupies. You are missing one step, divide the array size (byte count) with the base type, to determine how many slices of data you have:

nArraySize := SIZEOF(array)/SIZEOF(array[0]) - 1;

and then you can call the for loop as

for i := 0 to nArraySize by 1 do
   myArray[i] ...

This of course assumes your array starts at 0.

Upper and lower bounds can only be used on variable sized arrays. One way you could do something is have the array defined somewhere in your program, and then have a function or a method, that has the variable array as IN_OUT parameter, as required by the variable arrays:

myArray : ARRAY[5..10] of ST_MyDataType;

F_DoSomething
VAR_IN_OUT
    refArray : ARRAY[*] of ST_MyDataType
END_VAR

VAR
    nIteration
END_VAR

FOR nIteration := LOWER_BOUND(refArray,1) to UPPER_BOUND(refArray,1) by 1 do
    if refArray[nIteration].Something = TRUE then
...
END_FOR

and then call the function as is:

F_DoSomething(myArray);

One last way you could work is with memory access and pointers, but that gets a bit more complicated then, and is unsafe if not taken extra care of addresses.

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1745652657a4638356.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信