案例/模板说明
机械臂主控程序说明
以下为机械臂主控模板代码,注意对工控机返回的 err_code 进行判断。
座标移动基础模板
DEF xyz_CartMove_template()
; S1: Initialization
; S1: 初始化
INT err_code ; 错误码
INT grasp_pose_token ; 抓取位姿 token
E6POS grasp_pose ; 抓取位姿
E6POS home_pose ; home 位姿
E6POS scan_pose ; 拍照位姿
E6POS place_pose ; 放置位姿
INT grasp_pose_num ; 抓取位姿数量
BOOL is_eye_in_hand ; 是否为眼在手上
INT obj_pipeline_num ; 物体 pipeline 编号
INT obj_register_num ;物体注册编号
grasp_pose_token = 0
gMasterFlag = TRUE
err_code = 0
grasp_pose_num = 0
obj_pipeline_num = 0
obj_register_num = 0
; 以下为中断处理等代码,不能删除
GLOBAL INTERRUPT DECL 3 WHEN $STOPMESS==TRUE DO IR_STOPM ( )
INTERRUPT ON 3
BAS (#INITMOV,0 )
; The first movement for Kuka must be a PTP movement
$BWDSTART = FALSE
PDAT_ACT = PPDAT_1
FDAT_ACT = FPDAT_2
BAS(#PTP_PARAMS, PPDAT_1.vel)
; Comment out this line if there is an error
SET_CD_PARAMS (0)
PTP $AXIS_ACT
; S2: Connect to IPC
; S2: 连接 IPC
xyzOpenSocket("MasterClient") ; 连接 IPC
; change the flow name here!
; err_code = xyzSwitchFlow("cart_move.t") ; 切换任务
; IF (err_code <> 0) THEN ;
; GOTO END_PROGRAM;
; ENDIF
; S3: Switch object
; S3: 切换物体
; 0: ws_id, "item1": item_codename
; change the item_codename here!
err_code = xyzSwitchItem(0,"item1") ; 切换物体
IF (err_code <> 0) THEN ;
HALT;
GOTO END_PROGRAM;
ENDIF
; S4: Move to home pose
; S4: 移动到 home 位姿
; you should use WorkVisual to set the home_pose,
; or use pendant to set the home_pose
; 使用 WorkVisual 设置 home 位姿,或者使用示教器设置 home 位姿
; home_pose = {X 578.80, Y -9.12, Z 541.47, A 173.34,B -4.38,C -177.88}
; xyzSetMoveJParameters(10,20,0) ; 设置关节移动参数: 速度、加速度、减速度
; PTP home_pose ; 关节移动到 home 位姿
; xyzSetMoveLParameters(10,20,0) ; 设置直线移动参数: 速度、加速度、减速度
; LIN home_pose ; 直线移动到 home 位姿
; $OUT[500] = TRUE; IO 操作
; if application is eye_on_hand, please make eye_on_hand := true;
; 如果是眼在手上的应用,请将 eye_on_hand := true;
is_eye_in_hand = false;
BEGIN_WHILE:
WHILE TRUE
; S5: eye on hand application
; S5: 眼在手上的应用
IF is_eye_in_hand THEN
; S6: Move to scan pose
; S6: 移动到拍照位姿
; you should use WorkVisual to set the scan_pose,
; or use pendant to set the scan_pose
; 使用 WorkVisual 设置拍照位姿,或者使用示教器设置拍照位姿
; set movel or moveJ parameters(vel, acc, zone)
; scan_pose = {X 578.80, Y -9.12, Z 541.47, A 173.34,B -4.38,C -177.88}
; xyzSetMoveJParameters(10,20,0) ; 设置关节移动参数: 速度、加速度、减速度
; PTP scan_pose ; 关节移动到拍照位姿
; xyzSetMoveLParameters(10,20,0) ; 设置直线移动参数: 速度、加速度、减速度
; LIN scan_pose ; 直线移动到拍照位姿
; S7: Send scan pose
; S7: 发送拍照位姿
err_code = xyzSendCurrentCartPose()
IF (err_code <> 0) THEN ;
HALT;
GOTO END_PROGRAM;
ENDIF
ENDIF
; S8: Request grasp pose(including cap image)
; S8: 请求抓取位姿
err_code = xyzReqGraspPose(0,grasp_pose_token)
IF (err_code <> 0) THEN ;
HALT;
GOTO END_PROGRAM;
ENDIF
; S9: Get grasp pose
; S9: 获取抓取位姿
err_code = xyzGetGraspPose(grasp_pose_token, grasp_pose, grasp_pose_num, obj_pipeline_num, obj_register_num)
IF (err_code <> 0) THEN ;
HALT;
GOTO END_PROGRAM;
ENDIF
; 如果没有可以抓取的物体
IF (grasp_pose_num < 1) THEN
WAIT SEC 5
GOTO BEGIN_WHILE;
ENDIF
; S10: Move to grasp pose and grasp object
; S10: 移动到抓取位姿并抓取物体
; Attention: Additional waypoints maybe need added
; 注意:可能需要添加额外的路径点
; xyzSetMoveJParameters(10,20,0) ; 设置关节移动参数: 速度、加速度、减速度
; PTP grasp_pose ; 关节移动到抓取位姿
; xyzSetMoveLParameters(10,20,0) ; 设置直线移动参数: 速度、加速度、减速度
; LIN grasp_pose ; 直线移动到抓取位姿
; $OUT[500] = TRUE; grasp object 抓取物体
; WAIT SEC 0.5
; S11: Move to place pose and place object
; S11: 移动到放置位姿并放置物体
; you should use WorkVisual to set the place_pose,
; or use pendant to set the place_pose
; 使用 WorkVisual 设置放置位姿,或者使用示教器设置放置位姿
; place_pose = {X 578.80, Y -9.12, Z 541.47, A 173.34,B -4.38,C -177.88}
; xyzSetMoveJParameters(10,20,0) ; 设置关节移动参数: 速度、加速度、减速度
; PTP place_pose ; 关节移动到放置位姿
; xyzSetMoveLParameters(10,20,0) ; 设置直线移动参数: 速度、加速度、减速度
; LIN place_pose ; 直线移动到放置位姿
; Attention: Additional waypoints should be added
; 注意:需要添加额外的路径点
; after move to place pose
; 在移动到放置位姿之后
; $OUT[500] = FALSE; place object 放置物体
ENDWHILE
END_PROGRAM:
END
座标移动二次定位模板
DEF xyz_CartMove_reposition()
; S1: Initialization
; S1: 初始化
INT err_code ; 错误码
INT rough_grasp_pose_token ; 粗定位抓取位姿 token
E6POS rough_grasp_pose ; 粗定位抓取位姿
INT rough_grasp_pose_num ; 粗定位抓取位姿数量
INT board_grasp_pose_token ; 精定位抓取位姿 token
E6POS board_grasp_pose ; 精定位抓取位姿
INT board_grasp_pose_num ; 精定位抓取位姿数量
INT fine_grasp_pose_token ; 精定位抓取位姿 token
E6POS fine_grasp_pose ; 精定位抓取位姿
INT fine_grasp_pose_num ; 精定位抓取位姿数量
E6POS home_pose ; home 位姿
INT obj_pipeline_num ; 物体 pipeline 编号
INT obj_register_num ; 物体注册编号
INT board_pipeline_num ; board pipeline 编号
INT board_register_num ; board 注册编号
gMasterFlag = TRUE
err_code = 0
obj_pipeline_num = 0
obj_register_num = 0
board_pipeline_num = 0
board_register_num = 0
fine_grasp_pose_token = 0
; 以下为中断处理等代码,不能删除
GLOBAL INTERRUPT DECL 3 WHEN $STOPMESS==TRUE DO IR_STOPM ( )
INTERRUPT ON 3
BAS (#INITMOV,0 )
; The first movement for Kuka must be a PTP movement
$BWDSTART = FALSE
PDAT_ACT = PPDAT_1
FDAT_ACT = FPDAT_2
BAS(#PTP_PARAMS, PPDAT_1.vel)
; Comment out this line if there is an error
SET_CD_PARAMS (0)
PTP $AXIS_ACT
; $OUT[500] = TRUE; io initialization IO 初始化
; S2: Connect to IPC
; S2: 连接 IPC
xyzOpenSocket("MasterClient") ; 连接 IPC
; change the flow name here! The name should be less than 13 characters.
; err_code = xyzSwitchFlow("cart_repo.t") ; 切换任务
; IF (err_code <> 0) THEN ;
; HALT;
; GOTO END_PROGRAM;
; ENDIF
; S3: The camera outside the robotic arm is switched to recognize the current workpiece
; S3: 切换机械臂外部的相机,识别当前工件
; camera 1 rough location, 0: ws_id, "item1": item_codename
; change item_codename here!
err_code = xyzSwitchItem(0,"item1") ; 切换工件
IF (err_code <> 0) THEN ;
HALT;
GOTO END_PROGRAM;
ENDIF
; S4: Move to home pose
; S4: 移动到 home 位姿
; Additional: should define home_pose first,
; you can modify home_pose with WorkVisual,
; or use pendant to set the home_pose
; 需要先定义 home 位姿,
; 可以使用 WorkVisual 修改 home 位姿,或者使用示教器设置 home 位姿
; home_pose = {X 578.80, Y -9.12, Z 541.47, A 173.34,B -4.38,C -177.88}
; xyzSetMoveJParameters(10,20,0) ; vel, acc, zone 设置关节移动参数:速度、加速度、减速度
; PTP home_pose ; 关节移动到 home 位姿
; xyzSetMoveLParameters(10,20,0) ; vel, acc, zone 设置直线移动参数:速度、加速度、减速度
; LIN home_pose ; 直线移动到 home 位姿
; S5: Request grasp pose
; S5: 请求抓取位姿
err_code = xyzReqGraspPose(0,rough_grasp_pose_token) ; 请求抓取位姿
IF (err_code <> 0) THEN ;
HALT;
GOTO END_PROGRAM;
ENDIF
BEGIN_WHILE:
WHILE TRUE
; S6: get grasp pose
; S6: 获取抓取位姿
err_code = xyzGetGraspPose(rough_grasp_pose_token, rough_grasp_pose, rough_grasp_pose_num, obj_pipeline_num, obj_register_num)
IF (err_code <> 0) THEN ;
HALT;
GOTO END_PROGRAM;
ENDIF
; S7: grasp board if no object exists on board
; S7: 如果board上没有物体,就抓取board
IF (rough_grasp_pose_num < 1) THEN
; S15: The camera outside the robotic arm is switched to recognize the board
; S15: 切换机械臂外部的相机,识别board
; no object in workspace, should remove board first
; 没有物体在工作区,应该先移除board
; switch board; O:ws_id, board: board_name
err_code = xyzSwitchItem(0,"board") ; 切换工件为 board
IF (err_code <> 0) THEN ;
HALT;
GOTO END_PROGRAM;
ENDIF
; S16: Request board grasp pose
; S16: 请求 board 抓取位姿
err_code = xyzReqGraspPose(0,board_grasp_pose_token)
IF (err_code <> 0) THEN ;
HALT;
GOTO END_PROGRAM;
ENDIF
; S17: Get board grasp pose
; S17: 获取 board 抓取位姿
err_code = xyzGetGraspPose(board_grasp_pose_token, board_grasp_pose, board_grasp_pose_num, board_pipeline_num, board_register_num)
IF (err_code <> 0) THEN ;
HALT;
GOTO END_PROGRAM;
ENDIF
; 如果没有可以抓取的 board
IF (board_grasp_pose_num < 1) THEN
; no board exists, you can change tote
HALT;
GOTO END_PROGRAM;
ENDIF
; S18: Move to board grasp pose and grasp board
; S18: 移动到 board 抓取位姿并抓取 board
; xyzSetMoveJParameters(10,20,0) ; vel, acc, zone 设置关节移动参数:速度、加速度、减速度
; PTP grasp_pose ; 关节移动到抓取位姿
; xyzSetMoveLParameters(10,20,0) ; vel, acc, zone 设置直线移动参数:速度、加速度、减速度
; LIN grasp_pose ; 直线移动到抓取位姿
; $OUT[500] = TRUE; grasp board ; 抓取 board
WAIT SEC 0.5
; S19: Move to board place pose
; S19: 移动到 board 放置位姿
; you should use WorkVisual to set the place_pose,
; or use pendant to set the place_pose
; 需要先定义 place 位姿,使用 WorkVisual 或者示教器设置
; place_pose = {X 578.80, Y -9.12, Z 541.47, A 173.34,B -4.38,C -177.88}
; xyzSetMoveJParameters(10,20,0) ; vel, acc, zone 设置关节移动参数:速度、加速度、减速度
; PTP place_pose ; 关节移动到放置位姿
; xyzSetMoveLParameters(10,20,0) ; vel, acc, zone 设置直线移动参数:速度、加速度、减速度
; LIN place_pose ; 直线移动到放置位姿
; $OUT[500] = FALSE; place board ; 放置 board
; S20: The camera outside the robotic arm is switched to recognize the current workpiece
; S20: 切换机械臂外部的相机,识别当前工件
; 0: ws_id, "item1": item_codename
; change the item_codename here!
err_code = xyzSwitchItem(0,"item1") ; 切换工件为 item1
IF (err_code <> 0) THEN ;
HALT;
GOTO END_PROGRAM;
ENDIF
GOTO BEGIN_WHILE;
ELSE
; S8: Move to scan pose
; S8: 移动到拍照位姿
; Additional: should define scan_pose first,
; youcan modify scan_pose with WorkVisual or
; use pendant to set scan_pose
; 需要先定义 scan 位姿,使用 WorkVisual 或者示教器设置
; scan_pose = {X 578.80, Y -9.12, Z 541.47, A 173.34,B -4.38,C -177.88}
; xyzSetMoveJParameters(10,20,0) ; 设置关节移动参数:速度、加速度、减速度
; PTP scan_pose ; 关节移动到拍照位姿
; xyzSetMoveLParameters(10,20,0) ; 设置直线移动参数:速度、加速度、减速度
; LIN scan_pose ; 直线移动到拍照位姿
; S9: Send scan pose
; S9: 发送拍照位姿
err_code = xyzSendCurrentCartPose()
IF (err_code <> 0) THEN ;
HALT;
GOTO END_PROGRAM;
ENDIF
; S10: The camera on the robotic arm is switched to recognize the current workpiece
; S10: 切换机械臂上的相机,识别当前工件
; camera2 cap precise image, 1: ws_id, "item1": item_codename
; change the item_codename here!
err_code = xyzSwitchItem(1,"item1") ; 切换工件为 item1
IF (err_code <> 0) THEN ;
GOTO END_PROGRAM;
ENDIF
; S11: Request grasp pose
; S11: 请求抓取位姿
err_code = xyzReqGraspPose(1,fine_grasp_pose_token)
IF (err_code <> 0) THEN ;
HALT;
GOTO END_PROGRAM;
ENDIF
; S12: Get grasp pose
; S12: 获取抓取位姿
err_code = xyzGetGraspPose(fine_grasp_pose_token ,fine_grasp_pose, fine_grasp_pose_num, obj_pipeline_num, obj_register_num)
IF (err_code <> 0) THEN ;
HALT;
GOTO END_PROGRAM;
ENDIF
; 如果没有可以抓取的工件
IF (fine_grasp_pose_num < 1) THEN
HALT;
GOTO END_PROGRAM;
ENDIF
; S13: Move to grasp pose and grasp workpiece
; S13: 移动到抓取位姿并抓取工件
; xyzSetMoveJParameters(10,20,0) ; vel, acc, zone 设置关节移动参数:速度、加速度、减速度
; PTP fine_grasp_pose ; 关节移动到抓取位姿
; xyzSetMoveLParameters(10,20,0) ; vel, acc, zone 设置直线移动参数:速度、加速度、减速度
; LIN fine_grasp_pose ; 直线移动到抓取位姿
; $OUT[500] = TRUE; grasp workpiece ; 抓取工件
WAIT SEC 0.5
; S14: Move to place pose and place workpiece
; S14: 移动到放置位姿并放置工件
; you should use WorkVisual to define place_pose,
; or use pendant to set place_pose
; 需要先定义 place 位姿,使用 WorkVisual 或者示教器设置
; place_pose = {X 578.80, Y -9.12, Z 541.47, A 173.34,B -4.38,C -177.88}
; xyzSetMoveJParameters(10,20,0) ; vel, acc, zone 设置关节移动参数:速度、加速度、减速度
; PTP place_pose ; 关节移动到放置位姿
; xyzSetMoveLParameters(10,20,0) ; vel, acc, zone 设置直线移动参数:速度、加速度、减速度
; LIN place_pose ; 直线移动到放置位姿
; $OUT[500] = FALSE; place workpiece ; 放置工件
ENDIF
ENDWHILE
END_PROGRAM:
END
3D轨迹移动同步程序
DEF xyz_TrajMove_Sync()
; S1: Initialization
; S1: 初始化
INT err_code
CHAR flow_name[20]
INT ws_id
CHAR item_codename[20]
E6POS home_pose
INT pipeline_num
INT register_num
INT way_point_num
INT wp_type[30]
E6AXIS joints[50]
E6POS carts[50]
gMasterFlag = TRUE
GLOBAL INTERRUPT DECL 3 WHEN $STOPMESS==TRUE DO IR_STOPM ( )
INTERRUPT ON 3
BAS (#INITMOV,0 )
; The first movement for Kuka must be a PTP movement
$BWDSTART = FALSE
PDAT_ACT = PPDAT_1
FDAT_ACT = FPDAT_2
BAS(#PTP_PARAMS, PPDAT_1.vel)
; Comment out this line if there is an error
SET_CD_PARAMS (0)
PTP $AXIS_ACT
; S2: Connect to IPC
; S2: 连接工控机
xyzOpenSocket("MasterClient")
gStrOpSuccess = STRCLEAR(gSendgMotMsg[])
; flow_name[] = "traj_sync.t"
; err_code = xyzSwitchFlow(flow_name[])
; IF (err_code <> 0) THEN ;
; HALT;
; GOTO err_exit;
; ENDIF
; S3: Switch to the current item
; S3: 切换到当前工件
ws_id = 0
item_codename[] = "item1"
err_code = xyzSwitchItem(ws_id, item_codename[])
IF (err_code <> 0) THEN ;
HALT;
GOTO err_exit;
ENDIF
; IO operation
; $OUT[500] = False
WAIT SEC 0.5
; S4: Move to home pose
; S4: 移动到 home 位姿
; you should use WorkVisual to set the home pose,
; or use pendant to set the home pose
; home_pose = {X 578.80, Y -9.12, Z 541.47, A 173.34,B -4.38,C -177.88}
; xyzSetMoveJParameters(10,20,0) ; vel, acc, zone
; PTP home_pose
; xyzSetMoveLParameters(10,20,0)
; LIN home_pose
WHILE True
; S5: Request Pick and place trajectory
; S5: 请求抓取放置轨迹
ws_id = 0
err_code = xyzReqPickPlace(ws_id)
IF (err_code <> 0) THEN ;
HALT;
GOTO err_exit;
ENDIF
; S6: Get Pick in trajectory
; S6: 获取抓取入筐轨迹
err_code = xyzGetPickin(0, pipeline_num, register_num, way_point_num, wp_type[], joints[], carts[])
IF (err_code <> 0) THEN
; S15
HALT;
GOTO err_exit;
ENDIF
; if tote cleared, exit
; 如果没有可以抓取的物体,退出
IF (way_point_num < 1) THEN
GOTO clear_tore_exit
ENDIF
; S8 Execute Pick in trajectory
; S8: 执行抓取入筐轨迹
xyzExecutePickInTraj(way_point_num, wp_type[], joints[], carts[])
; IO operation IO 操作
; $OUT[500] = False
; S9: Get Pick out trajectory
; S9: 获取抓取出筐轨迹
err_code = xyzGetPickout(0, pipeline_num, register_num, way_point_num, wp_type[], joints[], carts[])
IF (err_code <> 0) THEN ;
HALT;
GOTO err_exit;
ENDIF
; S10: Execute Pick out trajectory
; S10: 执行抓取出筐轨迹
xyzExecutePickOutTraj(way_point_num, wp_type[], joints[], carts[])
; S11: Get Place in trajectory
; S11: 获取放置入筐轨迹
err_code = xyzGetPlacein(0, pipeline_num, register_num, way_point_num, wp_type[], joints[], carts[])
IF (err_code <> 0) THEN ;
HALT;
GOTO err_exit;
ENDIF
; S12: Execute Place in trajectory
; S12: 执行放置入筐轨迹
xyzExecuteTraj(way_point_num, wp_type[], joints[], carts[])
; IO operation IO 操作
; $OUT[500] = True
; S13: Get Place out trajectory
; S13: 获取放置出筐轨迹
err_code = xyzGetPlaceout(0, pipeline_num, register_num, way_point_num, wp_type[], joints[], carts[])
IF (err_code <> 0) THEN ;
HALT;
GOTO err_exit;
ENDIF
; S14: Execute Place out trajectory
; S14: 执行放置出筐轨迹
xyzExecuteTraj(way_point_num, wp_type[], joints[], carts[])
ENDWHILE
err_exit:
clear_tore_exit:
END
3D轨迹移动异步运行程序
DEF xyz_TrajMove_Async()
; S1: Initialization
; S1: 初始化
INT err_code
CHAR flow_name[20]
INT ws_id
CHAR item_codename[20]
E6POS home_pose
INT pipeline_num
INT register_num
INT way_point_num
INT wp_type[30]
E6AXIS joints[50]
E6POS carts[50]
gMasterFlag = TRUE ; 表示正在运行机械臂主控
; 以下为中断处理等代码,不能删除
GLOBAL INTERRUPT DECL 3 WHEN $STOPMESS==TRUE DO IR_STOPM ( )
INTERRUPT ON 3
BAS (#INITMOV,0 )
; The first movement for Kuka must be a PTP movement
$BWDSTART = FALSE
PDAT_ACT = PPDAT_1
FDAT_ACT = FPDAT_2
BAS(#PTP_PARAMS, PPDAT_1.vel)
; Comment out this line if there is an error
SET_CD_PARAMS (0)
PTP $AXIS_ACT
; S2: Connect to IPC
; S2: 连接工控机
xyzOpenSocket("MasterClient")
gStrOpSuccess = STRCLEAR(gSendgMotMsg[])
; flow_name[] = "traj_async.t"
; err_code = xyzSwitchFlow(flow_name[])
; IF (err_code <> 0) THEN ;
; HALT;
; GOTO err_exit;
; ENDIF
; S3: Switch to the current item
; S3: 切换到当前工件
ws_id = 0
item_codename[] = "item1"
err_code = xyzSwitchItem(ws_id, item_codename[])
IF (err_code <> 0) THEN ;
HALT;
GOTO err_exit;
ENDIF
; IO operation IO 操作
; $OUT[500] = False
; S4: Move to home pose
; S4: 移动到 home 位姿
; you should use WorkVisual to set the home_pose,
; or use pendant to set the home_pose
; home_pose = {X 578.80, Y -9.12, Z 541.47, A 173.34,B -4.38,C -177.88}
; xyzSetMoveJParameters(10,20,0) ; vel, acc, zone
; PTP home_pose
; xyzSetMoveLParameters(10,20,0)
; LIN home_pose
WHILE True
; S5: Request Pick and place trajectory
; S5: 请求抓取放置轨迹
ws_id = 0
err_code = xyzReqPickPlace(ws_id)
IF (err_code <> 0) THEN ;
HALT;
GOTO err_exit;
ENDIF
; S6: Get Pick in trajectory
; S6: 获取抓取入筐轨迹
ws_id = 0
err_code = xyzGetPickin(ws_id, pipeline_num, register_num, way_point_num, wp_type[], joints[], carts[])
IF (err_code <> 0) THEN ;
HALT;
GOTO err_exit;
ENDIF
; if tote cleared, exit
; 如果没有可以抓取的物体,退出
IF (way_point_num < 1) THEN
GOTO clear_tore_exit
ENDIF
; S8 Execute Pick in trajectory
; S8: 执行抓取入筐轨迹
xyzExecutePickInTraj(way_point_num, wp_type[], joints[], carts[])
; IO operation IO 操作
; $OUT[500] = False
; S9: Get Pick out trajectory
; S9: 获取抓取出筐轨迹
ws_id = 0
err_code = xyzGetPickout(ws_id, pipeline_num, register_num, way_point_num, wp_type[], joints[], carts[])
IF (err_code <> 0) THEN ;
HALT;
GOTO err_exit;
ENDIF
; S10: Execute Pick out trajectory
; S10: 执行抓取出筐轨迹
xyzExecutePickOutTraj(way_point_num, wp_type[], joints[], carts[])
; S11: request next pick and place plan in advance
; S11: 提前请求下一次抓取放置轨迹
ws_id = 0
err_code = xyzReqPickPlace(ws_id)
IF (err_code <> 0) THEN ;
HALT;
GOTO err_exit;
ENDIF
; S12: Get Place in trajectory
; S12: 获取放置入筐轨迹
ws_id = 0
err_code = xyzGetPlacein(ws_id, pipeline_num, register_num, way_point_num, wp_type[], joints[], carts[])
IF (err_code <> 0) THEN ;
HALT;
GOTO err_exit;
ENDIF
; S13: Execute Place in trajectory
; S13: 执行放置入筐轨迹
xyzExecuteTraj(way_point_num, wp_type[], joints[], carts[])
; IO operation IO 操作
; $OUT[500] = True
; S14: Get Place out trajectory
; S14: 获取放置出筐轨迹
ws_id = 0
err_code = xyzGetPlaceout(ws_id, pipeline_num, register_num, way_point_num, wp_type[], joints[], carts[])
IF (err_code <> 0) THEN ;
HALT;
GOTO err_exit;
ENDIF
; S15: Execute Place out trajectory
; S15: 执行放置出筐轨迹
xyzExecuteTraj(way_point_num, wp_type[], joints[], carts[])
ENDWHILE
err_exit:
clear_tore_exit:
END