3

在 KUKA 机器人语言 (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变量。

4

3 回答 3

2

对于 CHAR 数组,有一个函数

INT STRDECLEN (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- (可能)下的官方和非官方 KRL 函数列表-功能和子程序的完整列表/。因此,您必须编写同时采用数组名称和长度的函数或子例程,或者知道您的数组长度。

于 2018-10-30T10:45:17.530 回答
1

这可能为时已晚,但对将来的参考有所帮助。

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

你不能真正使用循环来确定数组的长度,就像你打到最后一个数字一样,机器人就会停下来,不知道该怎么办。但是,这是一个漫长的过程,您可以这样做,然后在机器人停止后立即监视值并记录数字,然后跳过循环并在该时刻重新启动。但这毫无用处,因为您始终可以返回 DAT 文件并通过查看 DECL FOO[3] 来找出您的长度。

希望这可以帮助。

于 2014-04-04T16:58:40.770 回答
1

没有系统函数,但你可以自己写:

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
于 2019-05-11T11:54:49.037 回答