KRL: длина массива

В KUKA Robot Language (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 переменная.

2 ответа

Для массивов CHAR есть функция

INT STRDECLLEN (CHAR STRVAR[470]:OUT)

это сделало бы работу и определило длину массива символов. Например, вы можете написать

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

Второй цикл не видит и не должен знать длину массива.

К сожалению, кажется, что нет никакой функции для массивов произвольных типов данных, см. Список официальных и неофициальных функций KRL в http://www.robot-forum.com/robotforum/kuka-robot-forum/kuka-(possibly)-complete-list-of-functions-and-subprograms/. Таким образом, вы должны написать функции или подпрограммы, которые принимают как имя массива, так и длину, или знают длину вашего массива.

Системной функции нет, но вы можете написать ее самостоятельно:

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

Это, вероятно, слишком поздно, чтобы ответить, но это поможет для будущих ссылок.

К сожалению, для определения длины массива переменная не используется. Как только вы определите его, вы знаете свой номер, поэтому вместо использования FOO_LENGTH просто введите 3.

Вы не можете использовать цикл для определения длины массива, как если бы вы нажали последнее число, робот останавливается и не знает, что делать. Однако это длительный процесс, в котором вы можете сделать это, а затем, как только робот остановится, отслеживать значение и записывать число, а затем пропустить цикл и запустить его снова в этот момент. Но это бесполезно, потому что вы всегда можете вернуться к файлу DAT и узнать свою длину, посмотрев на DECL FOO[3].

Надеюсь это поможет.

Другие вопросы по тегам