ABB机器人程序设计案例

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                    // 主模块结束

!***********************************************************

你可能感兴趣的:(ABB机器人程序设计案例)