案例/模板说明

机械臂主控模板说明

以下为机械臂主控模板代码,包含坐标移动基础模板, 坐标移动二次定位模板,轨迹移动同步模板以及轨迹移动异步模板。 关于模板中的 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