ABB左右码垛详细解说 下载本文

内容发布更新时间 : 2024/12/25 9:55:24星期一 下面是文章的全部内容请认真阅读。

pTarget.robconf:=pPlaceBase90.robconf;

pTarget:=Offs(pTarget,Compensation{nCount,1},Compensation{nCount,2},Compensation{nCount,3}); CASE 11:

pTarget.trans.x:=pPlaceBase0.trans.x; pTarget.trans.y:=pPlaceBase0.trans.y;

pTarget.trans.z:=pPlaceBase0.trans.z+2*nBoxH; pTarget.rot:=pPlaceBase0.rot;

pTarget.robconf:=pPlaceBase0.robconf;

pTarget:=Offs(pTarget,Compensation{nCount,1},Compensation{nCount,2},Compensation{nCount,3}); CASE 12:

pTarget.trans.x:=pPlaceBase0.trans.x+nBoxL; pTarget.trans.y:=pPlaceBase0.trans.y;

pTarget.trans.z:=pPlaceBase0.trans.z+2*nBoxH; pTarget.rot:=pPlaceBase0.rot;

pTarget.robconf:=pPlaceBase0.robconf;

pTarget:=Offs(pTarget,Compensation{nCount,1},Compensation{nCount,2},Compensation{nCount,3}); CASE 13:

pTarget.trans.x:=pPlaceBase90.trans.x; pTarget.trans.y:=pPlaceBase90.trans.y;

pTarget.trans.z:=pPlaceBase90.trans.z+2*nBoxH; pTarget.rot:=pPlaceBase90.rot;

pTarget.robconf:=pPlaceBase90.robconf;

pTarget:=Offs(pTarget,Compensation{nCount,1},Compensation{nCount,2},Compensation{nCount,3}); CASE 14:

pTarget.trans.x:=pPlaceBase90.trans.x+nBoxW; pTarget.trans.y:=pPlaceBase90.trans.y;

pTarget.trans.z:=pPlaceBase90.trans.z+2*nBoxH; pTarget.rot:=pPlaceBase90.rot;

pTarget.robconf:=pPlaceBase90.robconf;

pTarget:=Offs(pTarget,Compensation{nCount,1},Compensation{nCount,2},Compensation{nCount,3}); CASE 15:

pTarget.trans.x:=pPlaceBase90.trans.x+2*nBoxW; pTarget.trans.y:=pPlaceBase90.trans.y;

pTarget.trans.z:=pPlaceBase90.trans.z+2*nBoxH;

pTarget.rot:=pPlaceBase90.rot;

pTarget.robconf:=pPlaceBase90.robconf;

pTarget:=Offs(pTarget,Compensation{nCount,1},Compensation{nCount,2},Compensation{nCount,3}); DEFAULT: TPErase;

TPWrite \ stop;

!若当前nCount数值均非所列CASE中的数值,则视为计数出错,写屏显示信息,并停止程序运行

ENDTEST

Return pTarget;

!计算出放置位置后,将此位置数据返回,在其他程序中调用此功能后则算出当前所需的摆放位置数据 ENDFUNC

PROC rPlaceRD() !码垛计数程序 TEST nPalletNo

!利用TEST判断执行哪侧码垛计数 CASE 1:

!若为1,则执行左侧码垛计数 Incr nCount_L;

!左侧计数nCount_L加1,其等同于:nCount_L:=nCount_L+1 IF nCount_L>15 THEN

Set do02_PalletFull_L; bPalletFull_L:=TRUE; nCount_L:=1; ENDIF

!判断左侧码盘是否已满载,本案例中码盘上面只摆放15个产品,则当计数数值大于15,则视为满载,输出左侧码盘满载信号,将左侧满载布尔量置为TRUE,并复位计数数据nCount_L CASE 2:

!若为2,则执行右侧码垛计数 Incr nCount_R; !右侧计数nCount_R加1

IF nCount_R>15 THEN

Set do03_PalletFull_R; bPalletFull_R:=TRUE; nCount_R:=1; ENDIF

!判断右侧码盘是否已满载,本案例中码盘上面只摆放15个产品,则当计数数值大于15,则视为满载,输出右侧码盘满载信号,将右侧满载布尔量置为TRUE,并复位计数数据nCount_R DEFAULT:

TPERASE;

TPWRITE \ Stop;

!数据nPalletNo 数值出错处理,提示操作员检查并停止运行 ENDTEST ENDPROC

PROC rCheckHomePos()

!检测机器人是否在Home点程序 VAR robtarget pActualPos;

!定义一个目标点数据pActualPos

IF NOT CurrentPos(pHome,tGripper)THEN

!调用功能程序CurrentPos。此为一个布尔量型的功能程序,括号里面的参数分别指的是所要比较的目标点以及使用的工具数据。这里写入的是Phome,是将当前机器人位置与Phome点进行比较,若在Phome点,则此布尔量为True;若不在Phome点,则为False。在此功能程序的前面加上一个NOT,则表示当机器人不在Home点时才会执行IF判断中机器人返回Home点的动作指令

pActualpos:=CRobT(\\Tool:=tGripper\\WObj:=wobj0);

!利用CRobT功能读取当前机器人目标位置并赋值给目标点数据pActualpos pActualpos.trans.z:=pHome.trans.z; !将pHome点的Z值赋给pActualpos 点的Z值 MoveL pActualpos,v500,z10,tGripper; !移至已被赋值后的pActualpos 点

MoveJ pHome,v1000,fine,tGripper;

!移至pHome点,上述指令的目的是需要先将机器人提升至与pHome点一样的高度,之后再平移至pHome点,这样可以简单地规划一条安全回Home点的轨迹 ENDIF ENDPROC

FUNC bool CurrentPos(robtarget ComparePos,INOUT tooldata TCP) !检测目标点功能程序,带有两个参数,比较目标点和所使用的工具数据 !比较机器人当前位置是否在给定目标点偏差范围之内 VAR num Counter:=0;

!定义数字型数据Counter VAR robtarget ActualPos; !定义目标点数据ActualPos

ActualPos:=CRobT(\\Tool:=TCP\\WObj:=wobj0);

!利用CRobT功能读取当前机器人目标位置并赋值给ActualPos IF ActualPos.trans.x>ComparePos.trans.x-25 AND ActualPos.trans.xComparePos.trans.y-25 AND ActualPos.trans.yComparePos.trans.z-25 AND ActualPos.trans.z

IF ActualPos.rot.q1>ComparePos.rot.q1-0.1 AND ActualPos.rot.q1ComparePos.rot.q2-0.1 AND ActualPos.rot.q2ComparePos.rot.q3-0.1 AND ActualPos.rot.q3ComparePos.rot.q4-0.1 AND ActualPos.rot.q4

!将当前机器人所在目标位置数据与给定目标点位置数据进行比较,共七项数值,分别是X、Y、Z坐标值以及工具姿态数据q1、q2、q3、q4里面的偏差值,如X、Y、Z坐标偏差值 “25”可根据实际情况进行调整。每项比较结果成立,则计数Counter加1,七项都满足的话,则Counter数值为7 RETURN Counter=7;

!返回判断式结果,若Count为7,则返回TRUE,若不为7,则返回FALSE ENDFUNC

TRAP tEjectPallet_L

!左侧码盘更换中断程序,当左侧码盘满载后会将满载信号置为1,同时将满载布尔量置为TURE;当满载码盘被取走后,则利用此中断程序将满载输出信号复位,满载布尔量置为FALSE Reset do02_PalletFull_L; !左侧满载输出信号复位 bPalletFull_L:=FALSE;

!左侧满载布尔量置为FALSE ENDTRAP

TRAP tEjectPallet_R

!右侧码盘更换中断程序,同上 Reset do03_PalletFull_R; bPalletFull_R:=FALSE; ENDTRAP

PROC rMoveAbsj()

MoveAbsJ jposHome\\NoEOffs, v100, fine, tGripper\\WObj:=wobj0;

!手动执行该程序,将机器人移动至各关节轴机械零位,在程序运行过程中不被调用 ENDPROC

PROC rModPos()

!专门用于手动示教关键目标点的程序

MoveL pHome,v100,fine,tGripper\\WObj:=Wobj0; !示教Home点,在工件坐标系Wobj0中示教

MoveL pPick_L,v100,fine,tGripper\\WObj:=Wobj0; !示教左侧产品抓取位置,在工件坐标系Wobj0中示教 MoveL pPick_R,v100,fine,tGripper\\WObj:=Wobj0; !示教右侧产品抓取位置,在工件坐标系Wobj0中示教

MoveL pPlaceBase0_L,v100,fine,tGripper\\WObj:=WobjPallet_L; !示教左侧放置基准点(不旋转),在工件坐标系WobjPallet_L中示教 MoveL pPlaceBase90_L,v100,fine,tGripper\\WObj:=WobjPallet_L; !示教左侧放置基准点(旋转90°),在工件坐标系WobjPallet_L中示教 MoveL pPlaceBase0_R,v100,fine,tGripper\\WObj:=WobjPallet_R; !示教右侧放置基准点(不旋转),在工件坐标系WobjPallet_R中示教 MoveL pPlaceBase90_R,v100,fine,tGripper\\WObj:=WobjPallet_R; !示教右侧放置基准点(旋转90°),在工件坐标系WobjPallet_R中示教 ENDPROC ENDMODULE