1、任务要求:
搬运系统由搬运机器人、真空吸盘及控制装置、传送带、周转箱等主要部件组成。系统要求利用安装在机器人上的真空吸盘,抓取由传送带输送而来的工件;然后,再将工件逐一、依次放置到周转箱的1~4号位置中。一旦周转箱放满4个工件,系统输出“周转箱满”指示灯信号,提示操作者更换周转箱;周转箱更换后,继续进行搬运作业。
[if !supportLists]2、[endif]动作顺序表
[if !supportLists]3. [endif]输入输出信号点
4、路径规划
[if !supportLists]5、[endif]变量定义
[if !supportLists]6、[endif]程序设计
[if !supportLists]7、[endif]程序代码
MODULE mainmodu (SYSMODULE) // 主模块mainmodu及属性
! Module name : Mainmodule for Transfer // 注释
! Robot type : IRB 120
! Software : Robot Ware 6.01
! Created : 2017-06-06
!*************************************** // 定义程序数据(根据实际情况设定)
CONST robtarget p Home:=[……] ; // 作业原点
CONST robtarget p Pick:=[……] ; //抓取点
CONST robtarget p Place Base:=[……] ; //放置基准点
CONST speeddata v Empty High:=[……] ; // 空载高速
CONST speeddata v Empty Low:=[……] ; // 空载低速
CONST speeddata v Load High:=[……] ; // 带载高速
CONST speeddata v Load Low:=[……] ; //带载低速
CONST num n Xoffset:=…… ; // 周转箱X向间距
CONST num n Yoffset:=…… ; // 周转箱Y向间距
CONST num n Zoffset:=…… ; // Z向低速接近距离
PERS tooldata t Gripper:= [……] ; // 作业工具
PERS loaddata Load Full:= [……] ; // 作业负载
PERS wobjdata wobj CNV:= [……] ; // 传送带坐标系
PERS wobjdata wobj Buffer:= [……] ; // 周转箱坐标系
PERS robtarget p Place:=[……] ; // 当前放置点
PERS num n Count ; // 工件计数器
VAR bool b Pick OK ; // 工件抓取状态
!***********************************************************
PROC mainprg () // 主程序
r Initialize ; // 调用初始化程序
WHILE TRUE DO // 无限循环
r Pick Panel ; // 调用工件抓取程序
r Place In Buffer ; // 调用工件放置程序
r Check Buffer ; // 调用周转箱检查程序
Waittime 0.5 // 暂停0.5s
ENDWHILE // 循环结束
ENDPROC // 主程序结束
!***********************************************************
PROC r Initialize () // 初始化程序
r Check Home Pos ; // 调用作业原点检查程序
n Count:=1 // 工件计数器预置
b Pick OK:=FALSE ; // 撤销抓取状态
Reset do32_Vacuum ON // 关闭吸盘
ENDPROC // 初始化程序结束
!***********************************************************
PROC r Pick Panel () // 工件抓取程序
IF b Pick OK:=FALSE THEN
Move JOffs(p Pick,0,0,n Zoffset),v Empty High,z20,t
Gripper\wobj:=wobj CNV;// 移动到p Pick上方减速点
Wait DI di01_In Pick Pos, 1 ; // 等待传送带到位di01=1
Move L p Pick, v Empty Low, fine, t Gripper\ wobj :=wobj CNV ; // p
Pick点定位
Set do32_Vacuum ON ; // 吸盘ON(do32=1)
Wait DI di02_ Vacuum OK, 1 ; // 等待抓取完成di02=1
b Pick OK:=TRUE ; // 设定抓取状态
Grip Load Load Full ; // 设定作业负载
Move LOffs(p Pick,0,0,n Zoffset),v Load Low,z20,t Gripper\wobj:=wobj
CNV;// 提升到p Pick上方减速点
ELSE
TPErase ; // 示教器清屏
TPWrite ''Cycle Restart Error'' ; // 显示出错信息
TPWrite ''Cycle can't start with Panel on Gripper'' ;
TPWrite ''Please check the Gripper and then restart next cycle'' ;
Stop ; // 程序停止
ENDIF
ENDPROC //工件抓取程序结束
!***********************************************************
PROC r Place In Buffer () // 工件放置程序
IF b Pick OK:=TRUE THEN
r Calculate Pos ; // 调用放置点计算程序
Wait DI di03_Buffer Ready, 1 ; // 等待周转箱到位di03=1
Move JOffs(p Place,0,0,n Zoffset),v Load High,z20,t
Gripper\wobj:=wobj Buffer;// 移动到p Place上方减速点
Move L p Place,
v Load Low, fine, t Gripper\ wobj :=wobj Buffer ; // p Pick点定位
Reset
do32_Vacuum ON ; // 吸盘OFF(do32=0)
Wait DI di02_ Vacuum OK, 0 ; // 等待放开di02=0
Waittime 0.5 // 暂停0.5s
b Pick OK:=FALSE ; // 撤销抓取状态
Grip Load Load0 ; // 撤销作业负载
Move LOffs(p Place,0,0,n Zoffset),v Empty Low,z20,t
Gripper\wobj:=wobj Buffer;// 移动到p Place上方减速点
Move J p Home, v Empty High, fine, t Gripper ; // 返回作业原点
n Count:= n Count +1 // 工件计数器加1
ENDIF
ENDPROC //工件放置程序结束
!***********************************************************
PROC r Check
Buffer () // 周转箱检查程序
IF n Count>4 THEN
Set do34_Buffer Full ; // 周转箱满ON(do34=1)
Wait DI di03_Buffer Ready, 0 ; // 等待取走周转箱di03=0
Reset do34_Buffer Full ; // 周转箱满OFF(do34=0)
n Count:= 1 //工件计数器复位
ENDIF
ENDPROC //周转箱检查程序结束
!***********************************************************
PROC r Calculate
Pos () // 放置点计算程序
TEST n Count // 计数器测试
CASE 1:
p Place := p Place Base ; // 放置点1
CASE 2:
p Place := Offs(p Place Base, n Xoffset, 0, 0) ; // 放置点2
CASE 3:
p Place := Offs(p Place Base, 0, n Yoffset, 0) ; // 放置点3
CASE 4:
p Place := Offs(p Place Base, n Xoffset, n Yoffset, 0) ; // 放置点4
DEFAULT:
TPErase ; // 示教器清屏
TPWrite ''The Count Number is Error'' ; // 显示出错信息
Stop ;
ENDTEST
ENDPROC //放置点计算程序结束
!***********************************************************
PROC Check Home
Pos () // 作业原点检查程序
VAR robtarget p ActualPos ; // 程序数据定义
IF NOT In Home Pos( p Home, t Gripper) THEN// 利用功能程序判别作业原点,非作业原点时进行如下处理
p ActualPos:=CRob T(\Tool:= t Gripper \ wobj :=wobj0) ;// 读取当前位置
p ActualPos.trans.z:= p Home.trans.z ; // 改变Z坐标值
Move L p ActualPos, v Empty High, z20, t Gripper ; // Z轴退至p Home
Move L p Home, v Empty High, fine, t Gripper ; // X、Y轴定位到p Home
ENDIF
ENDPROC //作业原点检查程序结束
!***********************************************************
FUNC bool In
Home Pos (robtarget ComparePos, INOUT tooldata TCP)// 作业原点判别程序
VAR num Comp_Count:=0 ;
VAR robtarget Curr_Pos ;
Curr_Pos:= CRob T(\Tool:= t Gripper \ wobj :=wobj0) ;// 读取当前位置,进行以下判别
IF Curr_Pos.trans.x>ComparePos.trans.x-20 AND
Curr_Pos.trans.x<ComparePos.trans.x+20 Comp_Count:= Comp_Count+1 ;
IF Curr_Pos.trans.y>ComparePos.trans.y-20 AND
Curr_Pos.trans.y<ComparePos.trans.y+20 Comp_Count:= Comp_Count+1 ;
IF Curr_Pos.trans.z>ComparePos.trans.z-20 AND
Curr_Pos.trans.z<ComparePos.trans.z+20 Comp_Count:= Comp_Count+1 ;
IF Curr_Pos.rot.q1>ComparePos.rot.q1-0.05 AND
Curr_Pos.rot.q1<ComparePos.rot.q1+0.05 Comp_Count:= Comp_Count+1 ;
IF Curr_Pos.rot.q2>ComparePos.rot.q2-0.05 AND
Curr_Pos.rot.q2<ComparePos.rot.q2+0.05 Comp_Count:= Comp_Count+1 ;
IF Curr_Pos.rot.q3>ComparePos.rot.q3-0.05 AND
Curr_Pos.rot.q3<ComparePos.rot.q3+0.05 Comp_Count:= Comp_Count+1 ;
IF Curr_Pos.rot.q4>ComparePos.rot.q4-0.05 AND
Curr_Pos.rot.q4<ComparePos.rot.q4+0.05 Comp_Count:= Comp_Count+1 ;
RETUN Comp_Count=7 ; // 返回Comp_Count=7的逻辑状态
ENDFUNC //作业原点判别程序结束
!***********************************************************
ENDMODULE // 主模块结束
!***********************************************************