get_conveyor_obj(conv_id, timeout=None, container_type=DR_FIFO, obj_offset_coord=None)
기능
해당 Conveyor로부터 작업 가능한 작업물 좌표계 ID를 리턴합니다. 함수가 불렸을 때, Watch Window에 있는 작업물 중 설정한 container 규칙에 따라 작업물을 한 개씩 반환해줍니다.
인수
인수명 | 자료형 | 기본값 | 설명 |
---|---|---|---|
conv_id | int | - | Conveyor ID |
timeout | float | None | 설정한 시간동안 리턴할 작업물이 없으면 대기 종료하고 함수 리턴 |
container_type | int | DR_FIFO | 작업물 container type(DR_FIFO: first-in/first-out, DR_LIFO: last-in/last-out |
obj_offset_coord | posx | None | 컨베이어 고정 좌표계 대비 작업물 좌표계(mm, ˚) |
list(float[6]) |
알아두기
- 해당 함수를 호출했을 때, Watch Window에 있는 작업물을 설정한 Container 규칙에 따라 작업물 좌표계 id를 한 개씩 반환해줍니다. 예를 들어, 아래와 같이 작업물이 배치되어 있는 순간 get_conveyor_obj 함수를 호출하면 Watch Window 안에 있는 ②, ③ 작업물이 후보가 됩니다. 이 때, container_type을 DR_FIFO로 설정한 경우 Watch Window에 먼저 들어온 ③ 작업물 좌표계 id를 반환하고, DR_LIFO로 설정한 경우 Watch Window에 나중에 들어온 ② 작업물 좌표계 id를 반환합니다. 만약에 함수 호출 당시에 Watch Window에 작업물이 없으면 최대 timeout 변수에 설정된 시간까지 대기하고 있다가 그 사이에 작업물이 들어오면 해당 id를 반환해줍니다.
[작업물 좌표계 id 반환 규칙 설명] - obj_offset_coord는 작업물 좌표계에 offset을 적용하고 싶을 때 사용합니다. 보통 티징점을 손쉽게 입력하기 위해서 사용하거나 외부센서(ex. Vision 센서)와 연동해서 작업물의 자세와 위치를 동적으로 바꿔주고 싶을 때 사용합니다. 입력하지 않으면 offset은 0이 적용됩니다.
아래 그림 같은 경우, 작업물 좌표계가 작업물 우측면에 생성되고, Base or World Coord.과 작업물 좌표계가 90도 틀어져있습니다. 이 때, 티칭점의 위치는 작업물 가운데 기준으로, 티칭점의 자세는 Base or World Coord. 기준으로 부여하고 싶은 경우 obj_offset_coord = posx(-d, 0, 0, -90, 0, 0)으로 적용하면 됩니다. 이 TP UI를 통해서 티칭점을 획득할 경우 필수적인 부분은 아니지만, drl만을 사용하거나 티칭점을 직접 입력해야 할 경우 필요합니다.
[obj_offset_coord 적용 사례 1]
다음으로, 아래 그림 같이 작업물이 컨베이어 진행 방향과 무관한 방향으로 위치가 변하는 경우 또는 작업물의 자세가 바뀌는 경우 엔코더 신호만으로는 작업물의 위치/자세를 알아낼 수 없으므로 비전 센서를 써서 작업물의 추가적인 위치/자세 변화를 감지해야 합니다. 그리고, 여기서 감지한 위치/자세 변화를 동적으로 obj_offset_coord에 입력해주면 작업물 좌표계를 이에 맞게 생성합니다.
[obj_offset_coord 적용 사례 2: 비전 센서 사용]
리턴
값 | 설명 |
---|---|
int | CONV_COORD. Conveyor 유저 좌표계 ID (121~150) |
음의 정수 | timeout 시간이 지나도 반환할 작업물이 없을 경우 |
알아두기
반환할 작업물이 없을 경우, timeout 시간이 지날 때까지 함수를 리턴해주지 않습니다. timeout 시간이 지났지만 해당 작업물이 없으면 -1을 반환합니다. 단, timeout 시간을 입력하지 않은 경우는 계속해서 함수를 리턴해주지 않습니다.
예외
예외 | 설명 |
---|---|
DR_Error (DR_ERROR_TYPE) | 인수들의 데이터형 오류 시 |
DR_Error (DR_ERROR_VALUE) | 인수의 값이 유효하지 않을 시 |
DR_Error (DR_ERROR_RUNTIME) | C Extension 모듈 에러 발생 시 |
DR_Error (DR_ERROR_STOP) | 프로그램 강제 종료 시 |
예제
## One object in a cycle
CONV1 = set_conveyor(‘conveyor1’)
movel(posx(100, 100, 50, 0, 0, 0), ref=DR_BASE) # waiting position
while True:
CONV_COORD_1 = get_conveyor_obj(CONV1)
tracking_conveyor(CONV1)
# synched motion
movel(posx(0,0, 50, 0, 0, 0), ref=CONV_COORD_1)
movel(posx(0,0, 0, 0, 0, 0), ref=CONV_COORD_1)
set_digital_output(DO_GRIPPER, 1)
movel(posx(0,0, 50, 0, 0, 0), ref=CONV_COORD_1)
untracking_conveyor(CONV1)
movel(posx(100, 100, 50, 0, 0, 0), ref=DR_BASE) # waiting position
## Multi objects in a cycle
CONV1 = set_conveyor(‘conveyor1’)
while True:
CONV_COORD_1 = get_conveyor_obj(CONV1)
tracking_conveyor(CONV1)
# fist object
movel(posx(0,0, 50, 0, 0, 0), ref=CONV_COORD_1)
movel(posx(0,0, 0, 0, 0, 0), ref=CONV_COORD_1)
set_digital_output(DO_GRIPPER, 1)
movel(posx(0,0, 50, 0, 0, 0), ref=CONV_COORD_1)
# second object
CONV_COORD_2 = get_conveyor_obj(CONV1, time_out=10)
if CONV_COORD_2 > 0: # -1 if no objects available during time_out
movel(posx(0,0, 50, 0, 0, 0), ref=CONV_COORD_2)
movel(posx(0,0, 0, 0, 0, 0), ref=CONV_COORD_2)
set_digital_output(DO_GRIPPER, 1)
movel(posx(0,0, 50, 0, 0, 0), ref=CONV_COORD_2)
# first object if you need
movel(posx(0,0, 50, 0, 0, 0), ref=CONV_COORD_1)
untracking_conveyor(CONV1)
movel(posx(100, 100, 50, 0, 0, 0), ref=DR_BASE)