案例/模板说明
机械臂主控模板说明
以下为机械臂主控模板代码,包含坐标移动基础模板, 坐标移动二次定位模板,轨迹移动同步模板以及轨迹移动异步模板。 关于模板中的 API 可以查阅 ABB 的 “API 说明” 部分。
请注意模板函数并不能直接运行,请一定根据项目现场环境和流程需求进行修改。建议使用 RobotStudio 来修改。
坐标移动基础模板
PROC CartMoveBasic()
! S1: 初始化
VAR num err_code; ! 错误代码
VAR bool eye_on_hand; ! true 表示眼在手上,false 表示眼在手外
VAR num token; ! 获取请求结果凭证
VAR jointtarget home_pose; ! home 点
VAR robtarget scan_pose; ! 眼在手上时,需要发送的拍照位
VAR pose grasp_pose; ! 抓取位姿
VAR num cart_array{6}; ! 用于发送拍照点位姿
VAR num pose_num; ! 识别出的位姿个数
VAR num pipeline_num; ! 处理流程编号
VAR num register_num; ! 抓取序号
Reset output0; ! 重置数字输出
WaitTime 0.5;
! S2: 连接到工控机
xyzCreateSocket master_socket; ! 创建 socket client
xyzConnect master_socket, master_server_ip, master_server_port; ! 连接上位机 server
! err_code := xyzSwitchTask("cart_basic.t"); ! 切换任务流图 ,默认被注释掉,如果需求可以取消注释
! 检查工控机返回的错误码,如果有错误程序将直接停止。可以根据项目需求自定义错误代码处理方式
! xyzCheckErrorCode(err_code);
! 重置任务
err_code := xyzResetTask();
xyzCheckErrorCode(err_code);
! S3: 切换成当前工件
! 切换工件,两个参数分别表示视觉服务ID,和工件代号
! 工件代号为MAX中映射表与通讯协议设置中的参数
err_code := xyzSwitchItem(0,"item1");
xyzCheckErrorCode(err_code);
! S4: 运动到 home 位
! 首先移动到 home 点。注意需要先定义 home_pose 的关节角度值,可以通过 RobotStudio 来修改
! 或者用使用其他点来替代
MoveAbsJ home_pose, gMotSpeed, gMotZone, gMotTool \Wobj:=gMotWobj;
! 如果是眼在机械臂上的应用形式,请把 eye_on_hand 赋值为 true
eye_on_hand := false;
WHILE TRUE DO
LOOPSTART:
! S5: 眼在机械臂上
IF eye_on_hand THEN
! S6: 运动到拍照位姿
! 注意需要先定义 scan_pose 的位姿,可以通过 RobotStudio 来修改
! 或者用使用其他点来替代
MoveL scan_pose, gMotSpeed, fine, gMotTool \Wobj:=gMotWobj; ! 移动到 scan pose
! S7: 发送拍照位姿
err_code := xyzSendCurrentCartPose(scan_pose);
xyzCheckErrorCode(err_code);
ENDIF
! S8: 请求抓取点位
err_code = xyzReqGraspPose(0, token); ! 请求 grasp pose
xyzCheckErrorCode(err_code);
! S9: 获取抓取点位
err_code = xyzGetGraspPose(token, pose_num, pipeline_num, register_num, grasp_pose);
xyzCheckErrorCode(err_code);
IF pose_num < 1 THEN ! 处理没有识别到工件的情况
WaitTime 5
GOTO LOOPSTART;
ENDIF
! S10: 运动到抓取点并抓取工件
! 可能需要添加其他路径点作为过渡
! 移动到预抓取点,偏移值可以根据实际需求修改
MoveL Offs(grasp_pose, 0, 0, 100), gMotSpeed, gMotZone, gMotTool \WObj:=gMotWobj;
! 移动到抓取位姿
MoveL grasp_pose, gMotSpeed, gMotZone, gMotTool \Wobj:=gMotWobj;
Set output0; ! 控制数字输出
WaitTime 0.5;
! S11: 运动到放置点并放置工件
! 移会预抓取点,偏移值可以根据实际需求修改
MoveL Offs(grasp_pose, 0, 0, 100), gMotSpeed, gMotZone, gMotTool \WObj:=gMotWobj;
! 需要添加其他路径点作为过渡
! 移动到放置点之后
Reset output0; ! 重置数字输出
ENDWHILE
ENDPROC
坐标移动二次定位模板
PROC CartMoveRepo()
! S1: 初始化
VAR num err_code; ! 错误代码
VAR num token; ! 获取请求结果凭证1
VAR num token1; ! 获取请求结果凭证2
VAR jointtarget home_pose; ! home 点
VAR robtarget scan_pose; ! 拍照位姿
VAR robtarget grasp_pose; ! 抓取位姿
VAR num cart_array{6}; ! 用于发送拍照点位姿
VAR num pose_num; ! 识别出的位姿个数
VAR num pipeline_num; ! 处理流程编号
VAR num register_num; ! 抓取序号
! S2: 连接到工控机
xyzCreateSocket master_socket; 创建 socket
xyzConnect master_socket, master_server_ip, master_server_port; ! 连接上位机 server
! err_code := xyzSwitchTask("cart_repo.t"); ! 切换任务流图 ,默认被注释掉,如果需求可以取消注释
! 检查工控机返回的错误码,如果有错误程序将直接停止。可以根据项目需求自定义错误代码处理方式
! xyzCheckErrorCode(err_code);
! 重置任务
err_code := xyzResetTask();
xyzCheckErrorCode(err_code);
Reset output0; ! 重置数字输出
Reset output1;
WaitTime 0.5;
! S3: 机械臂外的相机切换成识别当前工件
! 切换工件,两个参数分别表示视觉服务 ID ,和工件代号
! 工件代号为 MAX 中映射表与通讯协议设置中的参数
err_code := xyzSwitchItem(0,"item1");
xyzCheckErrorCode(err_code);
! S4: 运动到 home 位
! 首先移动到 home 点。注意需要先定义 home_pose 的关节角度值,可以通过 RobotStudio 来修改
! 或者用使用其他点来替代
MoveAbsJ home_pose, gMotSpeed, gMotZone, gMotTool \Wobj:=gMotWobj;
WHILE TRUE DO
! S5: 请求工件的抓取位姿
err_code = xyzReqGraspPose(0, token); ! 请求抓取位姿
xyzCheckErrorCode(err_code);
! S6: 获取工件的抓取位姿
err_code = xyzGetGraspPose(token, pose_num, pipeline_num, register_num, grasp_pose);
xyzCheckErrorCode(err_code);
! S7: 处理是否识别到工件
IF pose_num < 1 THEN ! 处理没有识别到工件的情况
! 工作空间内没有工件,需要先移除隔板
! S15: 没有识别到工件,机械臂外的相机切换识别隔板
err_code := xyzSwitchItem(0,"board"); ! 切换隔板
xyzCheckErrorCode(err_code);
! S16: 请求隔板抓取位姿
err_code = xyzReqGraspPose(0, token); ! 请求隔板的抓取位姿
xyzCheckErrorCode(err_code);
! S17: 获取隔板的抓取位姿
err_code = xyzGetGraspPose(token, pose_num, pipeline_num, register_num, grasp_pose);
xyzCheckErrorCode(err_code);
IF pose_num < 1 THEN ! 未识别到隔板的处理
TPWrite "Get board grasp pose failed";
Stop;
ENDIF
! S18: 运动到隔板抓取位姿,并抓取隔板
! 注意: 可能需要添加其他路径点作为过渡
! 移动到预抓取位姿,偏移值可以根据实际需求修改
MoveL Offs(grasp_pose, 0, 0, 100), gMotSpeed, gMotZone, gMotTool \WObj:=gMotWobj;
! 移动到抓取点
MoveL grasp_pose, gMotSpeed, gMotZone, gMotTool \Wobj:=gMotWobj;
Set output0; ! 控制数字输出
WaitTime 0.5;
! S19: 运动到隔板的放置位姿
! 注意: 可能需要添加其他路径点作为过渡
! 注意需要先定义隔板放置位姿
! 移回预抓取位姿,偏移值可以根据实际需求修改
MoveL Offs(grasp_pose, 0, 0, 100), gMotSpeed, gMotZone, gMotTool \WObj:=gMotWobj;
! 此处需要添加放置隔板的路径点
! S20: 机械臂外的相机切换成识别当前工件
err_code := xyzSwitchItem(0,"item1"); ! 切换工件
xyzCheckErrorCode(err_code);
ELSE ! 如果识别数量不为0
! S8: 运动到拍照位姿
! 注意需要先定义 scan_pose 的位姿,可以通过 RobotStudio 来修改
! 或者用使用其他点来替代
MoveL scan_pose, gMotSpeed, gMotZone, gMotTool \Wobj:=gMotWobj; ! 运动到 scan pose
! S9: 发送拍照位姿
err_code := xyzSendCurrentCartPose(scan_pose);
xyzCheckErrorCode(err_code);
! S10: 机械臂上的相机切换成识别当前工件
err_code := xyzSwitchItem(1,"item1"); ! 切换工作空间与工件
xyzCheckErrorCode(err_code);
! S11: 机械臂上的相机请求工件抓取位姿
err_code = xyzReqGraspPose(1, token1); ! 请求抓取位姿
xyzCheckErrorCode(err_code);
! S12: 获取工件的抓取位姿
err_code = xyzGetGraspPose(token1, pose_num, pipeline_num, register_num, grasp_pose); ! 获取抓取位姿
xyzCheckErrorCode(err_code);
IF pose_num < 1 THEN ! 未识别到工件的处理
TPWrite "Get grasp pose failed";
Stop;
ENDIF
! S13: 运动到工件的抓取位姿并进行抓取
! 注意: 可能需要添加其他路径点作为过渡
! 移动到预抓取位姿,偏移值可以根据实际需求修改
MoveL Offs(grasp_pose, 0, 0, 100), gMotSpeed, gMotZone, gMotTool \WObj:=gMotWobj;
! 移动到抓取点
MoveL grasp_pose, gMotSpeed, gMotZone, gMotTool \Wobj:=gMotWobj;
Set output1; ! 控制数字输出
WaitTime 0.5;
! S14: 运动到工件的放置位姿
! 注意:可能需要添加其他路径点作为过渡
! 注意:需要定义工件放置位姿
! 移回预抓取位姿,偏移值可以根据实际需求修改
MoveL Offs(grasp_pose, 0, 0, 100), gMotSpeed, gMotZone, gMotTool \WObj:=gMotWobj;
! 此处需要添加放置工件的路径点
Reset output1; ! 重置数字输出
ENDIF
ENDWHILE
ENDPROC
轨迹移动同步模板
PROC TrajMoveSync()
! S1: 初始化
VAR num err_code; ! 错误代码
VAR num vs_id; ! 工作空间
VAR num pose_num; ! 轨迹点的个数
VAR num pipeline_num; ! 处理流程编号
VAR num register_num; ! 抓取序号
VAR num wp_type{30};
VAR jointtarget home_pose; ! home 点位
VAR jointtarget joint_wp{30};
VAR robtarget cart_wp{30};
! S2: 连接到工控机
xyzCreateSocket master_socket;
xyzConnect master_socket, master_server_ip, master_server_port;
vs_id := 0;
err_code := 0;
! err_code := xyzSwitchTask("traj_sync.t"); ! 切换任务流图,默认被注释掉,如果需求可以取消注释
! xyzCheckErrorCode(err_code);
! 重置任务
err_code := xyzResetTask();
xyzCheckErrorCode(err_code);
! S3: 切换成当前工件
! 切换工件,两个参数分别表示视觉服务 ID ,和工件代号
! 工件代号为 MAX 中映射表与通讯协议设置中的参数
err_code := xyzSwitchItem(0,"item1");
xyzCheckErrorCode(err_code);
Reset output0;
WaitTime 0.5;
! S4: 运动到 home 位
! 首先移动到 home 点。注意需要先定义 home_pose 的关节角度值,可以通过 RobotStudio 来修改
! 或者用使用其他点来替代
MoveAbsJ home_pose, gMotSpeed, gMotZone, gMotTool \Wobj:=gMotWobj;
WHILE TRUE DO
! S5: 请求抓取和放置规划
err_code := xyzReqPickPlace(vs_id);
xyzCheckErrorCode(err_code);
! S6: 获取 pick-in 轨迹
err_code := xyzGetPickin(vs_id, pose_num, pipeline_num, register_num, wp_type, joint_wp, cart_wp);
xyzCheckErrorCode(err_code);
! S7: 判断是否识别到工件
IF pose_num < 1 THEN
TPWrite "Tote Cleared";
Stop;
ENDIF
! S8: 执行 pick-in 轨迹
xyzExecuteTraj pose_num, pipeline_num, register_num, wp_type, joint_wp, cart_wp;
Set output0;
! S9: 获取 pick-out 轨迹
err_code := xyzGetPickout(vs_id, pose_num, pipeline_num, register_num, wp_type, joint_wp, cart_wp);
xyzCheckErrorCode(err_code);
! S10: 执行 pick-out 轨迹
xyzExecuteTraj pose_num, pipeline_num, register_num, wp_type, joint_wp, cart_wp;
! S11: 获取 place-in 轨迹
err_code := xyzGetPlacein(vs_id, pose_num, pipeline_num, register_num, wp_type, joint_wp, cart_wp);
xyzCheckErrorCode(err_code);
! S12: 执行 place-in 轨迹
xyzExecuteTraj pose_num, pipeline_num, register_num, wp_type, joint_wp, cart_wp;
Reset output0;
! S13: 获取 place-out 轨迹
err_code := xyzGetPlaceout(vs_id, pose_num, pipeline_num, register_num, wp_type, joint_wp, cart_wp);
xyzCheckErrorCode(err_code);
! S14: 执行 place-out 轨迹
xyzExecuteTraj pose_num, pipeline_num, register_num, wp_type, joint_wp, cart_wp;
ENDWHILE
ENDPROC
轨迹移动异步模板
PROC TrajMoveAsync()
! S1: 初始化
VAR num err_code; ! 错误代码
VAR num vs_id; ! 工作空间 id
VAR num pose_num; ! 轨迹点的个数
VAR num pipeline_num; ! 处理流程编号
VAR num register_num; ! 抓取序号
VAR num wp_type{30};
VAR jointtarget home_pose; ! 示教器的home点位
VAR jointtarget joint_wp{30};
VAR robtarget cart_wp{30};
! S2: 连接到工控机
xyzCreateSocket master_socket;
xyzConnect master_socket, master_server_ip, master_server_port;
vs_id := 0;
err_code := 0;
! err_code := xyzSwitchTask("traj_async.t"); ! 切换任务流图,默认被注释掉,如果需求可以取消注释
! xyzCheckErrorCode(err_code);
! 重置任务
err_code := xyzResetTask();
xyzCheckErrorCode(err_code);
! S3: 切换成当前工件
! 切换工件,两个参数分别表示视觉服务 ID ,和工件代号
! 工件代号为 MAX 中映射表与通讯协议设置中的参数
err_code := xyzSwitchItem(0,"item1");
xyzCheckErrorCode(err_code);
Reset output0;
WaitTime 0.5;
! S4: 运动到 home 位
! 首先移动到 home 点。注意需要先定义 home_pose 的关节角度值,可以通过 RobotStudio 来修改
! 或者用使用其他点来替代
MoveAbsJ home_pose, gMotSpeed, gMotZone, gMotTool \Wobj:=gMotWobj;
! S5: 请求抓取和放置规划
err_code := xyzReqPickPlace(vs_id); ! 请求抓取和放置规划
xyzCheckErrorCode(err_code);
WHILE TRUE DO
! S6: 获取 pick-in 轨迹
err_code := xyzGetPickin(vs_id, pose_num, pipeline_num, register_num, wp_type, joint_wp, cart_wp);
xyzCheckErrorCode(err_code);
! S7: 判断是否识别到工件
IF pose_num < 1 THEN
TPWrite "Tote Cleared";
Stop;
ENDIF
! S8: 执行 pick-in 轨迹
xyzExecuteTraj pose_num, pipeline_num, register_num, wp_type, joint_wp, cart_wp;
Set output0;
! S9: 获取 pick-out 轨迹
err_code := xyzGetPickout(vs_id, pose_num, pipeline_num, register_num, wp_type, joint_wp, cart_wp);
xyzCheckErrorCode(err_code);
! S10: 执行 pick-out 轨迹
xyzExecuteTraj pose_num, pipeline_num, register_num, wp_type, joint_wp, cart_wp;
! S11: 请求下一次的抓取和放置规划
! 运动到相机视野外,开始请求下一次的抓取和放置规划
err_code := xyzReqPickPlace(vs_id);
xyzCheckErrorCode(err_code);
! S12: 获取本次 place-in 轨迹
! 继续请求本次 place-in 轨迹
err_code := xyzGetPlacein(vs_id, pose_num, pipeline_num, register_num, wp_type, joint_wp, cart_wp);
xyzCheckErrorCode(err_code);
! S13: 执行本次 place-in 轨迹
xyzExecuteTraj pose_num, pipeline_num, register_num, wp_type, joint_wp, cart_wp;
Reset output0;
! S14: 获取本次 place-out 轨迹
err_code := xyzGetPlaceout(vs_id, pose_num, pipeline_num, register_num, wp_type, joint_wp, cart_wp);
xyzCheckErrorCode(err_code);
! S15: 执行本次 place-out 轨迹
xyzExecuteTraj pose_num, pipeline_num, register_num, wp_type, joint_wp, cart_wp;
ENDWHILE
ENDPROC