分享

Robot 码垛程序该怎么写

 钺YUE 2022-02-24



前言


机器人搬运应该是在工业机器人集成中占比非常高的工艺,在搬运中除了一般的机床上下料,码垛则非常的典型。主流的机器人都会配有码垛软件包,但是对于普通的国产机器人没有工艺包或者遇到非常规的跺型,那么就只能自己通过编写代码实现。


吹牛之前,先放一张毒照,该程序是编者刚学习机器人的时候一位同事所写,完成作品后大家都是都是一副崇拜的眼神,这算码垛界的天花板吗?

图片

车轮扇形金字塔码垛

图片

以下就来给大家简单介绍下码垛圈的术语:

按照工艺划分:码垛,拆跺

按照产品划分:箱,包

参数:行,列,层,通常好的码垛程序断电保持后,码垛中发生故障后能够通过设定参数继续完成码垛。

箱参数:箱长,箱宽,箱高,箱间距等,后续在实际的放料点中通过这些参数来实现效果。

剁型:就是码垛出来的形状,这个可是有讲究的,如果能码垛码塌了。。。

图片

剁型的奇数层偶数层

图片某厂饮料箱体码垛

图片

程序搭建:

通常针对某些相对于比较规整的产品,一般都是通过示教1个放料点,其余的点位基于示教点位进行偏移计算。因此,在码垛项目中建议将逻辑程序和点位计算程序进行嵌套,常用的就是使用For循环语句,码垛即为i++,拆剁为i--。

局部代码:

FOR i FROM Start_High  TO 1 STEP -1 DO     Stark_I:=i;     FOR j FROM Start_Long TO 2 DO          Stark_J:=j;          FOR k FROM Start_Wide TO 2 DO              Stark_K:=k;                ......            ENDFOR      ENDFOR        ENDFOR 

在循环嵌套中,通过设定的起始层,列,行在循环递增或者递减的过程中去和点位计算相结合,这样就可以与之对应进行偏移。

抓取产品代码:

!ji suan zhua dian xin wei zhi B_UsingOffs_X:=0-((Stark_K-1)*Batter_X+Vision_X);B_UsingOffs_Y:=0-((Stark_J-1)*Batter_Y+Vision_Y);B_UsingOffs_Z:=((Stark_I)*Batter_Z)-3;
MoveL Offs(PickBatterPos_A{Type,1},B_UsingOffs_X,B_UsingOffs_Y,B_UsingOffs_Z+100),v300,z1,tool1\WObj:=wobj0;MoveL Offs(PickBatterPos_A{Type,1},B_UsingOffs_X,B_UsingOffs_Y,B_UsingOffs_Z+50),v100,fine,tool1\WObj:=wobj0;SetDO Do1,1;SetDO Do2,1;MoveL Offs(PickBatterPos_A{Type,1},B_UsingOffs_X,B_UsingOffs_Y,B_UsingOffs_Z),v50,fine,tool1\WObj:=wobj0;WaitTime 1;Pro_GripperCheck;MoveL Offs(PickBatterPos_A{Type,1},B_UsingOffs_X,B_UsingOffs_Y,B_UsingOffs_Z+50),v300,z1,tool1\WObj:=wobj0;MoveL Offs(PickBatterPos_A{Type,1},B_UsingOffs_X,B_UsingOffs_Y,B_UsingOffs_Z+400),v300,fine,tool1\WObj:=wobj0;
图片

码垛调试难点:

1,带料,好的码垛夹具在放料时,放置后夹具打开的同时不会带料,不影响码垛效果。

2,挤包,因为程序点位基本上通过偏移计算,如果累积误差过大,可能会造成放料时挤压到周边的箱体,比如饮料行业,也许会将饮料挤爆,造成浪费。

3,剁型,形状外立面规整便于后续工位进行打包,目前随着各个厂家都在建立智能化仓储系统,如果保持不了外观规整,也许你码剁出来的产品直接无法放入立库,这样AGV就尴尬了。

4,编程,某些特殊的型,比如上图的车轮金字塔码垛,在算法上自然需要进过优化和测试,但是对于机器人集成而言,吃透工艺始终是难点,编程就是一个循循渐进的过程,项目经历多了,编程手法自然水到渠成,养好编程习惯也是不可或缺的。

图片

以下给大家分享一个电芯码垛程序,有点长,不嫌烦可以看看,每次吸取两个,将下图中的16个吸取完成,吸取2次后将隔板吸取到下方栈板码垛。

图片

PROC Pro_24V_Type6() Pro_SetupData; MoveJ phome, v100, fine, tool1; FOR i FROM Start_High TO 1 STEP -1 DO Stark_I:=i; FOR j FROM Start_Long TO 2 DO Stark_J:=j; FOR k FROM Start_Wide TO 2 DO Stark_K:=k; !kai shi pai zhao\ mei ci pai zhao zhua a b dou yong IF Stark_J=1 AND Stark_K=1 THEN R_CamraCount:=1; ELSEIF Stark_J=1 AND Stark_K=2 THEN R_CamraCount:=2; ELSEIF Stark_J=2 AND Stark_K=1 THEN R_CamraCount:=3; ELSEIF Stark_J=2 AND Stark_K=2 THEN R_CamraCount:=4; ENDIF
IF TriggerVisionModel=0 THEN GOTO Vision1_Pick4; ELSEIF TriggerVisionModel=1 THEN GOTO Vision1_Pick1; ENDIF Vision1_Pick4: !pai 1 ci zhua 4 ge MoveCamraPos:=CamraPos{Type,R_CamraCount}; V_UsingOffs_Z:=((Stark_I)*Batter_Z)+PickBatterPos_A{Type,1}.Trans.Z+63; MoveCamraPos.trans.z:=V_UsingOffs_Z; MoveL Offs(MoveCamraPos,0,0,100),v200,z1,tool1\WObj:=wobj0; MoveL Offs(MoveCamraPos,0,0,0),v50,fine,tool1\WObj:=wobj0; FB_Camra\TriggerNum:=0; WaitTime 0.1; MoveL Offs(MoveCamraPos,0,0,100),v200,fine,tool1\WObj:=wobj0; Vision1_Pick1: !pai 1 ci zhua 1 ge FOR m FROM 1 TO 2 DO stark_M:=m; Reset Do4; WaitDI Di5,1; !WaitDI di6,1; IF Stark_M =1 THEN IF TriggerVisionModel=1 THEN FOR n FROM 1 TO 2 DO Stark_N:=n; MoveCamraPos:=CamraPos{Type,R_CamraCount}; V_UsingOffs_X:=0-((Stark_M-1)*TriggerVision_X); V_UsingOffs_Y:=0-((Stark_N-1)*TriggerVision_Y); V_UsingOffs_Z:=((Stark_I)*Batter_Z)+PickBatterPos_A{Type,1}.Trans.Z+63; MoveCamraPos.trans.x:=CamraPos{Type,R_CamraCount}.trans.x+V_UsingOffs_X; MoveCamraPos.trans.y:=CamraPos{Type,R_CamraCount}.trans.y+V_UsingOffs_Y; MoveCamraPos.trans.z:=V_UsingOffs_Z; MoveL Offs(MoveCamraPos,0,0,100),v200,z1,tool1\WObj:=wobj0; MoveL Offs(MoveCamraPos,0,0,0),v50,fine,tool1\WObj:=wobj0; FB_Camra\TriggerNum:=Stark_N; WaitTime 0.1; MoveL Offs(MoveCamraPos,0,0,100),v200,fine,tool1\WObj:=wobj0; ENDFOR Vision_X:=(VisionResult_X{1}+VisionResult_X{2})/2; Vision_Y:=(VisionResult_Y{1}+VisionResult_Y{2})/2; ENDIF !ji suan zhua dian xin wei zhi B_UsingOffs_X:=0-((Stark_K-1)*Batter_X+Vision_X); B_UsingOffs_Y:=0-((Stark_J-1)*Batter_Y+Vision_Y); B_UsingOffs_Z:=((Stark_I)*Batter_Z)-3;
MoveL Offs(PickBatterPos_A{Type,1},B_UsingOffs_X,B_UsingOffs_Y,B_UsingOffs_Z+100),v300,z1,tool1\WObj:=wobj0; MoveL Offs(PickBatterPos_A{Type,1},B_UsingOffs_X,B_UsingOffs_Y,B_UsingOffs_Z+50),v100,fine,tool1\WObj:=wobj0; SetDO Do1,1; SetDO Do2,1; MoveL Offs(PickBatterPos_A{Type,1},B_UsingOffs_X,B_UsingOffs_Y,B_UsingOffs_Z),v50,fine,tool1\WObj:=wobj0; WaitTime 1; Pro_GripperCheck; MoveL Offs(PickBatterPos_A{Type,1},B_UsingOffs_X,B_UsingOffs_Y,B_UsingOffs_Z+50),v300,z1,tool1\WObj:=wobj0; MoveL Offs(PickBatterPos_A{Type,1},B_UsingOffs_X,B_UsingOffs_Y,B_UsingOffs_Z+400),v300,fine,tool1\WObj:=wobj0; ELSEIF Stark_M =2 THEN IF TriggerVisionModel=1 THEN FOR n FROM 1 TO 2 DO Stark_N:=n; MoveCamraPos:=CamraPos{Type,R_CamraCount}; V_UsingOffs_X:=0-((Stark_M-1)*TriggerVision_X); V_UsingOffs_Y:=0-((Stark_N-1)*TriggerVision_Y); V_UsingOffs_Z:=((Stark_I)*Batter_Z)+PickBatterPos_A{Type,1}.Trans.Z+63; MoveCamraPos.trans.x:=CamraPos{Type,R_CamraCount}.trans.x+V_UsingOffs_X; MoveCamraPos.trans.y:=CamraPos{Type,R_CamraCount}.trans.y+V_UsingOffs_Y; MoveCamraPos.trans.z:=V_UsingOffs_Z; MoveL Offs(MoveCamraPos,0,0,100),v200,z1,tool1\WObj:=wobj0; MoveL Offs(MoveCamraPos,0,0,0),v50,fine,tool1\WObj:=wobj0; FB_Camra\TriggerNum:=Stark_N; WaitTime 0.1; MoveL Offs(MoveCamraPos,0,0,100),v200,fine,tool1\WObj:=wobj0; ENDFOR Vision_X:=(VisionResult_X{1}+VisionResult_X{2})/2; Vision_Y:=(VisionResult_Y{1}+VisionResult_Y{2})/2; ENDIF !ji suan zhua dian xin wei zhi B_UsingOffs_X:=0-((Stark_K-1)*Batter_X+Vision_X); B_UsingOffs_Y:=0-((Stark_J-1)*Batter_Y+Vision_Y); B_UsingOffs_Z:=((Stark_I)*Batter_Z)-3;
MoveL Offs(PickBatterPos_B{Type,1},B_UsingOffs_X,B_UsingOffs_Y,B_UsingOffs_Z+100),v300,z1,tool1\WObj:=wobj0; MoveL Offs(PickBatterPos_B{Type,1},B_UsingOffs_X,B_UsingOffs_Y,B_UsingOffs_Z+50),v100,fine,tool1\WObj:=wobj0; SetDO Do1,1; SetDO Do2,1; MoveL Offs(PickBatterPos_B{Type,1},B_UsingOffs_X,B_UsingOffs_Y,B_UsingOffs_Z),v100,fine,tool1\WObj:=wobj0; WaitTime 1; Pro_GripperCheck; MoveL Offs(PickBatterPos_B{Type,1},B_UsingOffs_X,B_UsingOffs_Y,B_UsingOffs_Z+50),v300,z1,tool1\WObj:=wobj0; MoveL Offs(PickBatterPos_B{Type,1},B_UsingOffs_X,B_UsingOffs_Y,B_UsingOffs_Z+400),v300,fine,tool1\WObj:=wobj0; ENDIF SetDO Do4,1; WaitDI Di4,1; !WaitDI Di10,1; MoveL Offs(PickBatterPos_A{Type,1},-250,-250,600),v300,fine,tool1\WObj:=wobj0; MoveL Offs(PutBatterPos{Type,1},0,0,400),v300,z1,tool1\WObj:=wobj0; MoveL Offs(PutBatterPos{Type,1},0,0,100),v100,z1,tool1\WObj:=wobj0; MoveL Offs(PutBatterPos{Type,1},0,0,5),v50,fine,tool1\WObj:=wobj0; !MoveL PutBatterPos{Type,1},v50,fine,tool1\WObj:=wobj0; Reset Do1; Reset Do2; WaitDI Di1,0; WaitDI Di2,0; MoveL Offs(PutBatterPos{Type,1},0,0,100),v100,z1,tool1\WObj:=wobj0; MoveL Offs(PutBatterPos{Type,1},0,0,400),v300,fine,tool1\WObj:=wobj0; SetDO Do7,1; WaitTime 1; Reset Do7; MoveL Offs(PickBatterPos_A{Type,1},-250,-250,600),v300,fine,tool1\WObj:=wobj0; ENDFOR T_UsingOffs_X:=0-((Stark_K-1)*Tray_X+Vision_X); T_UsingOffs_Y:=0-((Stark_J-1)*Tray_Y+Vision_Y); T_UsingOffs_Z:=((Stark_I)*Batter_Z)+2-BatterCapacity; Reset Do4; WaitDI Di5,1; MoveL Offs(PickTrayPos{Type,1},T_UsingOffs_X,T_UsingOffs_Y,T_UsingOffs_Z+100),v300,z1,tool1\WObj:=wobj0; MoveL Offs(PickTrayPos{Type,1},T_UsingOffs_X,T_UsingOffs_Y,T_UsingOffs_Z+50),v100,fine,tool1\WObj:=wobj0; SetDO Do1,1; SetDO Do2,1; MoveL Offs(PickTrayPos{Type,1},T_UsingOffs_X,T_UsingOffs_Y,T_UsingOffs_Z),v50,fine,tool1\WObj:=wobj0; WaitTime 0.5; Pro_GripperCheck; MoveL Offs(PickTrayPos{Type,1},T_UsingOffs_X,T_UsingOffs_Y,T_UsingOffs_Z+100),v300,fine,tool1\WObj:=wobj0; T_UsingOffs_X:=0-((Stark_K-1)*Tray_X); T_UsingOffs_Y:=0-((Stark_J-1)*Tray_Y); T_UsingOffs_Z:=((Abs(Stark_I-Start_High))+Start_PutTray_High-1)*Tray_Z;
MoveL Offs(PutTrayPos{Type,1},T_UsingOffs_X,T_UsingOffs_Y,T_UsingOffs_Z+100),v300,z1,tool1\WObj:=wobj0; MoveL Offs(PutTrayPos{Type,1},T_UsingOffs_X,T_UsingOffs_Y,T_UsingOffs_Z+50),v100,z1,tool1\WObj:=wobj0; MoveL Offs(PutTrayPos{Type,1},T_UsingOffs_X,T_UsingOffs_Y,T_UsingOffs_Z+10),v50,fine,tool1\WObj:=wobj0; Reset Do1; Reset Do2; WaitDI Di1,0; WaitDI Di2,0; MoveL Offs(PutTrayPos{Type,1},T_UsingOffs_X,T_UsingOffs_Y,T_UsingOffs_Z+100),v300,fine,tool1\WObj:=wobj0; ENDFOR !qiang zhi jiang x-j-hang chu shi zhi gai wei 1 IF Start_Wide= 2 THEN Start_Wide:=1; ENDIF ENDFOR !qiang zhi jiang y-j-lie chu shi zhi gai wei 1 IF Start_Long=2 THEN Start_Long:=1; ENDIF ENDFOR !xun huan jie shu hou suo you shu ju chu shi hua Start_High:=0; Start_Long:=0; Start_Wide:=0; Start_PutTray_High:=0; MoveL Offs(PutTrayPos{Type,1},T_UsingOffs_X,T_UsingOffs_Y,T_UsingOffs_Z+100),v300,fine,tool1\WObj:=wobj0; MoveJ phome, v100, fine, tool1; ENDPROC

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多