如何抓包pos机(解析 您所在的位置:网站首页 abb机器人confl 如何抓包pos机(解析

如何抓包pos机(解析

2023-03-31 01:25| 来源: 网络整理| 查看: 265

项目要求产生这样的效果:产品在输送链末端,随着输送链的运动而运动,并且当产品运动到输送链末端时自动停止。此时机器人通过安装在法兰盘末端的夹具夹取产品,放置在垛盘上。然后机器人回到初始位置等待下一个产品的到来,继续进行抓取放置在垛盘上。

视频加载中...

程序解析如下:

MODULE MainMoudle

程序模块

PERS wobjdata WobjPallet_L:=[FALSE,TRUE,"",[[-456.216,-2058.49,-233.373],[1,0,0,0]],[[0,0,0],[1,0,0,0]]];

定义左码盘工件坐标系

PERS wobjdata WobjPallet_R:=[FALSE,TRUE,"",[[-421.764,1102.39,-233.373],[1,0,0,0]],[[0,0,0],[1,0,0,0]]];

定义右码盘工件坐标系

PERS tooldata tGripper:=[TRUE,[[0,0,527],[1,0,0,0]],[1,[0,0,100],[1,0,0,0],0,0,0]];

定义工具坐标系数据

PERS loaddata LoadFull:=[20,[0,0,300],[1,0,0,0],0,0,0.1];

定义载荷数据

PERS wobjdata CurWobj;

定义工具坐标系数据

PERS jointtarget jposHome:=[[0,0,0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];

定义关节点数据,各关节轴数据为零,用于手动将机器人运动到各关节机械零位

CONST robtarget pPlaceBase0_L:=[[296.,212.,3.],[0,0.,-0.,0],[-2,0,-3,0],[9E9,9E9,9E9,9E9,9E9,9E9]];

左码盘,不旋转放置基准位置

CONST robtarget pPlaceBase90_L:=[[218.,695.,3.],[0,-0.,1,0],[-2,0,-2,0],[9E9,9E9,9E9,9E9,9E9,9E9]];

左码盘,旋转90°放置基准位置

CONST robtarget pPlaceBase0_R:=[[296.,212.,3.],[0,0.,-0.,0],[1,0,0,0],[9E9,9E9,9E9,9E9,9E9,9E9]];

右码盘,不旋转放置基准位置

CONST robtarget pPlaceBase90_R:=[[218.,695.,3.],[0,-0.,0.,0],[1,0,1,0],[9E9,9E9,9E9,9E9,9E9,9E9]];

右码盘,旋转90°放置基准位置

CONST robtarget pPick_L:=[[1627.,-426.,-26.],[0,0.,-0.,0],[-1,0,-2,0],[9E9,9E9,9E9,9E9,9E9,9E9]];

左码盘,抓取位置

CONST robtarget pPick_R:=[[1611.,442.,-26.],[0,0.,-0.,0],[0,0,-1,0],[9E9,9E9,9E9,9E9,9E9,9E9]];

右码盘,抓取位置

CONST robtarget pHome:=[[1505.00,-0.00,878.55],[1.E-06,0.,-0.,-1.E-06],[0,0,-2,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];

程序起点

PERS robtarget pPlaceBase0;

PERS robtarget pPlaceBase90;

PERS robtarget pPick;

PERS robtarget pPlace;

定义目标点数据,机器人当前使用的目标点

PERS robtarget pPickSafe;安全高度

PERS num nCycleTime:=3.332; 定义数字型数据,用于存储单次节拍的时间

PERS num nCount_L:=1;左码盘,定义数字型数据,用于计数

PERS num nCount_R:=1;右码盘,定义数字型数据,用于计数

PERS num nPallet:=1;定义数字型数据,利用TEST指令判断,当其为1,进行码垛

PERS num nPalletNo:=2;定义数字型数据,利用TEST指令判断,当其为2,进行码垛

PERS num nPickH:=300;定义数字型数据,抓取时的安全高度

PERS num nPlaceH:=400;定义数字型数据,放置时的安全高度

PERS num nBoxL:=605;定义数字型数据,产品的长

PERS num nBoxW:=405;定义数字型数据,产品的宽

PERS num nBoxH:=300;定义数字型数据,产品的高

VAR clock Timer1;定义时钟型数据,用于计时

PERS bool bReady:=FALSE;定义布尔型数据,判断是否满足码垛条件

PERS bool bPalletFull_L:=FALSE;定义布尔型数据,判断左码盘是否已满

PERS bool bPalletFull_R:=TRUE;定义布尔型数据,判断右码盘是否已满

PERS bool bGetPosition:=TRUE;定义布尔型数据,判断是否已计算出当前的取放位置

VAR triggdata HookAct;定义触发数据,夹具上钩爪的夹紧动作

VAR triggdata HookOff;定义触发数据,夹具上钩爪的松开动作

VAR intnum iPallet_L;定义中断型符,左码垛,复位操作

VAR intnum iPallet_R;定义数字型数据,右码垛,复位操作

PERS speeddata vMinEmpty:=[2000,400,6000,1000];

PERS speeddata vMidEmpty:=[3000,400,6000,1000];

PERS speeddata vMaxEmpty:=[5000,500,6000,1000];

PERS speeddata vMinLoad:=[1000,200,6000,1000];

PERS speeddata vMidLoad:=[2500,500,6000,1000];

PERS speeddata vMaxLoad:=[4000,500,6000,1000];

定义多种速度数据,分别对应空载时的高、中、低速和满载时的高、中、低速,便于对各个动作进行速度控制

PERS num Compensation{15,3}:=[[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0]];

定义,二维数组,用于各摆放位置的偏差调整;15组数据,对应15个摆放位置,每组数据3个数值,对应xyz的偏差值

PROC main()

主程序

rInitAll;

调用初始化子程序、包括复位、复位程序数据、初始化中断

WHILE TRUE DO

IF bReady THEN

rPick;

调用抓取程序

rPlace;

调用放置程序

ENDIF

rCycleCheck;

调用循环检测程序

ENDWHILE

ENDPROC

PROC rInitAll()

初始化程序

rCheckHomePos;

ConfL\OFF;

ConfJ\OFF;

nCount_R:=1;

nPallet:=1;

nPalletNo:=1;

bPalletFull_R:=FALSE;

bGetPosition:=FALSE;

Reset do00_ClampAct;

Reset do01_HookAct;

ClkStop Timer1;

ClkReset Timer1;

TriggEquip HookAct,100,0.1\DOp:=do01_HookAct,1;

TriggEquip HookOff,100\Start,0.1\DOp:=do01_HookAct,0;

IDelete iPallet_R;

CONNECT iPallet_R WITH tEjectPallet_R;

ISignalDI di03_PalletInPos_R,0,iPallet_R;

ENDPROC

PROC rPick()

抓取程序

ClkReset Timer1;

ClkStart Timer1;

rCalPosition;

MoveJ Offs(pPick,0,0,nPickH),vMaxEmpty,z50,tGripper\WObj:=wobj0;

MoveL pPick,vMinLoad,fine,tGripper\WObj:=wobj0;

Set do00_ClampAct;

Waittime 0.3;

GripLoad LoadFull;

TriggL Offs(pPick,0,0,nPickH),vMinLoad,HookAct,z50,tGripper\WObj:=wobj0;

MoveL pPickSafe,vMaxLoad,z100,tGripper\WObj:=wobj0;

ENDPROC

PROC rPlace()

放置程序

MoveJ Offs(pPlace,0,0,nPlaceH),vMaxLoad,z50,tGripper\WObj:=CurWobj;

TriggL pPlace,vMinLoad,HookOff,fine,tGripper\WObj:=CurWobj;

Reset do00_ClampAct;

Waittime 0.3;

GripLoad Load0;

MoveL Offs(pPlace,0,0,nPlaceH),vMinEmpty,z50,tGripper\WObj:=CurWobj;

rPlaceRD;

MoveJ pPickSafe,vMaxEmpty,z50,tGripper\WObj:=wobj0;

ClkStop Timer1;

nCycleTime:=ClkRead(Timer1);

ENDPROC

PROC rCycleCheck()

周期循环检查

TPErase;

TPWrite "The Robot is running!";

TPWrite "Last cycle time is : "\Num:=nCycleTime;

TPWrite "The number of the Boxes in the Right pallet is:"\Num:=nCount_R-1;

IF (bPalletFull_R=FALSE AND di03_PalletInPos_R=1 AND di01_BoxInPos_R=1) THEN

bReady:=TRUE;

ELSE

bReady:=FALSE;

WaitTime 0.1;

ENDIF

ENDPROC

PROC rCalPosition()

计算位置程序

bGetPosition:=FALSE;

WHILE bGetPosition=FALSE DO

IF bPalletFull_R=FALSE AND di03_PalletInPos_R=1 AND di01_BoxInPos_R=1 THEN

pPick:=pPick_R;

pPlaceBase0:=pPlaceBase0_R;

pPlaceBase90:=pPlaceBase90_R;

CurWobj:=WobjPallet_R;

pPlace:=pPattern(nCount_R);

bGetPosition:=TRUE;

nPalletNo:=2;

ELSE

bGetPosition:=FALSE;

ENDIF

ULT:

TPERASE;

TPWRITE "The data 'nPallet' is error,please check it!";

ENDWHILE

ENDPROC

FUNC robtarget pPattern(num nCount)

计算摆放位置功能程序,此程序为带参数的例行程序

VAR robtarget pTarget;

IF nCount>=1 AND nCount

ELSEIF nCount>=6 AND nCount

pPickSafe:=Offs(pPick,0,0,600);

ELSEIF nCount>=11 AND nCount

pPickSafe:=Offs(pPick,0,0,800);

ENDIF

TEST nCount

CASE 1:

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

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

pTarget.trans.z:=pPlaceBase0.trans.z;

pTarget.rot:=pPlaceBase0.rot;

pTarget.robconf:=pPlaceBase0.robconf;

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

CASE 2:

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

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

pTarget.trans.z:=pPlaceBase0.trans.z;

pTarget.rot:=pPlaceBase0.rot;

pTarget.robconf:=pPlaceBase0.robconf;

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

CASE 3:

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

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

pTarget.trans.z:=pPlaceBase90.trans.z;

pTarget.rot:=pPlaceBase90.rot;

pTarget.robconf:=pPlaceBase90.robconf;

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

CASE 4:

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

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

pTarget.trans.z:=pPlaceBase90.trans.z;

pTarget.rot:=pPlaceBase90.rot;

pTarget.robconf:=pPlaceBase90.robconf;

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

CASE 5:

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

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

pTarget.trans.z:=pPlaceBase90.trans.z;

pTarget.rot:=pPlaceBase90.rot;

pTarget.robconf:=pPlaceBase90.robconf;

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

CASE 6:

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

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

pTarget.trans.z:=pPlaceBase0.trans.z+nBoxH;

pTarget.rot:=pPlaceBase0.rot;

pTarget.robconf:=pPlaceBase0.robconf;

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

CASE 7:

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

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

pTarget.trans.z:=pPlaceBase0.trans.z+nBoxH;

pTarget.rot:=pPlaceBase0.rot;

pTarget.robconf:=pPlaceBase0.robconf;

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

CASE 8:

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

pTarget.trans.y:=pPlaceBase90.trans.y-nBoxW;

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

pTarget.rot:=pPlaceBase90.rot;

pTarget.robconf:=pPlaceBase90.robconf;

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

CASE 9:

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

pTarget.trans.y:=pPlaceBase90.trans.y-nBoxW;

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

pTarget.rot:=pPlaceBase90.rot;

pTarget.robconf:=pPlaceBase90.robconf;

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

CASE 10:

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

pTarget.trans.y:=pPlaceBase90.trans.y-nBoxW;

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

pTarget.rot:=pPlaceBase90.rot;

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 "The data 'nCount' is error,please check it !";

stop;

ENDTEST

Return pTarget;

ENDFUNC

PROC rPlaceRD()

码垛产品计数程序

TEST nPalletNo

CASE 1:

Incr nCount_L;

IF nCount_L>15 THEN

Set do02_PalletFull_L;

bPalletFull_L:=TRUE;

nCount_L:=1;

ENDIF

CASE 2:

Incr nCount_R;

IF nCount_R>15 THEN

Set do03_PalletFull_R;

bPalletFull_R:=TRUE;

nCount_R:=1;

ENDIF

DEFAULT:

TPERASE;

TPWRITE "The data 'nPalletNo' is error,please check it!";

Stop;

ENDTEST

ENDPROC

PROC rCheckHomePos()

检测机器人是否在Home

VAR robtarget pActualPos;

IF NOT CurrentPos(pHome,tGripper) THEN

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

pActualpos.trans.z:=pHome.trans.z;

MoveL pActualpos,v500,z10,tGripper;

MoveJ pHome,v1000,fine,tGripper;

ENDIF

ENDPROC

FUNC bool CurrentPos(robtarget ComparePos,INOUT tooldata TCP)

比较机器人的位置是否在给定目标点的偏差范围内

VAR num Counter:=0;

VAR robtarget ActualPos;

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

IF ActualPos.trans.x>ComparePos.trans.x-25 AND ActualPos.trans.x

IF ActualPos.trans.y>ComparePos.trans.y-25 AND ActualPos.trans.y

IF ActualPos.trans.z>ComparePos.trans.z-25 AND ActualPos.trans.z

IF ActualPos.rot.q1>ComparePos.rot.q1-0.1 AND ActualPos.rot.q1

IF ActualPos.rot.q2>ComparePos.rot.q2-0.1 AND ActualPos.rot.q2

IF ActualPos.rot.q3>ComparePos.rot.q3-0.1 AND ActualPos.rot.q3

IF ActualPos.rot.q4>ComparePos.rot.q4-0.1 AND ActualPos.rot.q4

RETURN Counter=7;

ENDFUNC

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;

MoveL pPick_L,v100,fine,tGripper\WObj:=Wobj0;

MoveL pPick_R,v100,fine,tGripper\WObj:=Wobj0;

MoveL pPlaceBase0_L,v100,fine,tGripper\WObj:=WobjPallet_L;

MoveL pPlaceBase90_L,v100,fine,tGripper\WObj:=WobjPallet_L;

MoveL pPlaceBase0_R,v100,fine,tGripper\WObj:=WobjPallet_R;

MoveL pPlaceBase90_R,v100,fine,tGripper\WObj:=WobjPallet_R;

ENDPROC

ENDMODULE



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有