KRL:阵列的长度

时间:2014-01-03 20:21:21

标签: arrays robotics kuka-krl

在库卡机器人语言(KRL)中,是否可以获得数组的长度,或者有没有办法循环遍历数组中的所有值?目前我将数组长度存储在一个单独的变量中,并按照以下方式执行:

; In the DAT file:
DECL CONST INT FOO_LENGTH = 3
DECL CONTS INT FOO[3]
FOO[1] = 12
FOO[2] = 34
FOO[3] = 56

; In the SRC file:
INT IDX
FOR IDX = 1 TO FOO_LENGTH
  do_something(FOO[IDX])
ENDFOR

基本上我想摆脱FOO_LENGTH变量。

3 个答案:

答案 0 :(得分:1)

这可能是为时已晚,无法回答,但它有助于未来的参考。

不幸的是,没有用于确定数组长度的变量。一旦你定义它,你知道你的号码,所以不要使用FOO_LENGTH,只需输入3.

你不能真正使用一个循环来确定阵列的长度,就像你击中最后一个数字一样,机器人停下来并且不知道该怎么做。但是,这是一个漫长的过程,你可以做到这一点,然后一旦机器人停止,监视值并记录数字,然后跳过循环并在那一刻再次启动它。但是这没有任何意义,因为你可以通过查看DECL FOO [3]来回到DAT文件并找出你的长度。

希望这会有所帮助。

答案 1 :(得分:1)

对于CHAR数组,有一个函数

INT STRDECLLEN(CHAR STRVAR [470]:OUT)

这将完成工作并确定char数组的长度。例如。你可以写

DEF stringtests( )
char myString[80]
int i,n
n = strdecllen(myString[])
for i = 1 to n
  myString[i] = "Z"
endfor
n = strdecllen(myStringDat[])
for i = 1 to n
  myStringDat[i] = "Z"
endfor
end

带有相应的.dat文件

DEFDAT  stringtests PUBLIC
CHAR myStringDat[10]
myStringDat[]="ZZZZZZZZZZ"
ENDDAT

第二个循环看不到,不需要知道数组的长度。

不幸的是,似乎没有针对任意数据类型的数组的函数,请参见http://www.robot-forum.com/robotforum/kuka-robot-forum/kuka-(possibly)-complete-list-of-functions-and-subprograms/下的官方非官方KRL函数列表。因此,您必须编写同时包含数组名称和长度的函数或子例程,或者知道您的数组长度。

答案 2 :(得分:0)

没有系统功能,但您可以自己编写:

DEFFCT INT GetIntArrLength(intarray :OUT)
 DECL INT intArray[]
 DECL INT length
 FOR length = 1 TO 2147483647 STEP 1
  ON_ERROR_PROCEED
  intArray[length] = intArray[length]
  IF ($ERR.NUMBER <> 0) THEN
   ERR_CLEAR($ERR)
   RETURN length - 1
  ENDIF
 ENDFOR
 return -1
ENDFCT

通过以下方式使用它:

DEF ArrayLength ( )
 FooLength = GetIntArrLength(Foo[]) 
END