概述
如上图所示,利用RobotStudio仿真软件,在工作台上产生随机物料,用机器人夹取物料至环形码盘中。需要建立两个Smart组件来实现该动画的仿真效果,实现思路:1、机器人夹具的夹紧与松开,以及工件安装与拆除。2、随机物料的产生,以及实时工件坐标位置转换。3、程序实现环形码垛,已知圆心位置坐标,半径大小,以及每个点和圆心所处夹角为45°(360除8个位置得出),利用三角函数关系,算出每个点的坐标然后保存至数组中。
1、建立夹爪Smart组件
1、利用仿真软件中自带的爪手,导入至视图中。操作步骤,点击基本菜单,点击导入模型库,选择设备这一栏,拖动鼠标滚轮,选择ABB Smart Gripper 。如下图所示:
2、右键选择工具Smart_Gripper_Servo,断开与库的连接,并且去掉可由传感器检测,点击选择修改机械装置,设置同步位置为25,原点位置为0。如图所示:
3、建立Smart组件,点击建模菜单,点击Smart组件,修改名字为夹爪,点击添加组件,选择本体中PoseMove组件,一共添加两个PoseMove组件,重命名为PoseMove夹紧和松开,再添加一个取反信号LogicGate组件属性Operator选项为NOT非。以及新建一个DI_Open信号。编辑一下组件属性,机械装置为上一步的Smart_Gripper_Servo工具,Pose为同步位置和远点位置。相关组件设计如下图所示,用线连接即可,不用再去设置属性和连接以及信号和连接。最后把上一步的工具拖入至Smart组件中,点击信号仿真,看是否有夹紧松开的动作。
4、自行选择机器人并创建机器人系统,我这里选择1200这款机器人,这里不详细介绍怎么创系统及建I\O板及信号,新建两个DI和两个DO信号,目的是控制随机物料的产生和夹爪夹取动作。接下来介绍把夹爪工具安装到机器人六轴法兰盘上,设置好夹爪的本地原点后,右键点击安装至机器人中即可。
5、在建模菜单,建立工作台和工件,以及事先准备好的码盘导入库文件即可,相关素材关注并私聊给出。完善夹爪Smart组件安装与拆除功能,新添加组件Attacher和Detacher。以及新添加一个信号锁定组件LogicSRLatch,作用是线传感器感应到信号就 往外输出一个信号。相关组件连接设计看下图,连接好设计后测试一下夹爪的夹取工件动作是否正常。
2、建立产生随机物料Smart组件
1、新建一个smart组件,把工件拖入至组件中,我们需要添加两个随机数组件Random,产生X和Y方向的偏移,需要一个产生位移组件Positioner以及向量与XY之间的数值VectorConverter,还需要一个设置Rapid中工件坐标的Pos值RapidVariable以及一个复制对象Source,并在Rapid程序中新建变量PERS pos PosXY:=[0,0,0];
2、设置Random组件属性,2个Random组件属性,如下图设置,Min和Max最大最小值设置为0.1米也就是100mm,X和Y设置一样即可。
设置Source属性,如下图所示
设置RapidVariable属性,数据类型为pos,控制器为默认新建的控制器,任务为默认T_ROB1,模块也为默认Module1,值为新建变量值PosXY。如图所示:
设置Positioner属性,这里需要新建一个框架,在工作台中心,安装至工件,然后点击是。目的是已该框架为中心进行位置移动。
2、Smart组件设计连接,需要先建立一个启动信号触发随机物料产生,相关连接如下图所示:
3、建立一个工件坐标,并安装至工件上,然后点击否。
4、仿真设定及工作站逻辑设计,仿真设定选择连续,全部勾选。
工作站逻辑设计如下图,要事先建立好IO板及IO输入输出信号,然后才能添加连接。目的是为了机器人程序控制。
测试工件是否随机产生,点击di输入信号,会产生如下图所示效果:
3、实现机器人抓取码垛
1、创建原点,以及取料点和放料点。取料点需要带上工件坐标创建,其他的用默认wobj0就好。放料点需要创建在码盘的中心,也就是8个点的圆心上,半径这里测量为70mm,夹角为45度。点位示意如下图所示:
创建点位时每个点绕Y轴旋转180度。
最后记得同步到工作站中,选择为Module1中,包括工件坐标工具坐标。
2、程序编写,解释请看注释
MODULE Module1
PERS pos PosXY:=[-24.6073,35.4348,0];
PERS tooldata Servo:=[TRUE,[[0,0,114.2],[1,0,0,0]],[0.215,[8.7,12.3,49.2],[1,0,0,0],0.00021,0.00024,0.00009]];
TASK PERS wobjdata Workobject_1:=[FALSE,TRUE,"",[[500,-300,600],[1,0,0,0]],[[35.7578,-98.6632,0],[1,0,0,0]]];
CONST robtarget Target_20:=[[413.722,-2.479,690.887],[0,0,1,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
VAR num nCount:=0;
VAR num nOffs_Rz:=1;
VAR num number_count;
CONST robtarget Target_30:=[[455,166.24,230.83],[9.29468E-08,-5.25318E-08,1,3.41642E-09],[0,-1,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
PERS robtarget P_Place{8}:=[[[504.497,215.737,230.83],[8.45642E-8,0.382683,0.92388,3.87256E-8],[0,-1,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],[[455,236.24,230.83],[6.33075E-8,0.707107,0.707107,6.81391E-8],[0,-1,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],[[405.503,215.737,230.83],[3.24128E-8,0.92388,0.382683,8.71791E-8],[0,-1,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],[[385,166.24,230.83],[3.41642E-9,-1,-8.82041E-9,-9.29468E-8],[0,-1,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],[[405.503,116.743,230.83],[3.87256E-8,-0.92388,0.382683,-8.45642E-8],[0,-1,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],[[455,96.24,230.83],[6.81391E-8,-0.707107,0.707107,-6.33075E-8],[0,-1,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],[[504.497,116.743,230.83],[8.71791E-8,-0.382684,0.92388,-3.24128E-8],[0,-1,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],[[525,166.24,230.83],[9.29468E-8,3.4891E-8,1,3.41643E-9],[0,-1,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]]];
CONST robtarget Target_50:=[[0,0,0],[0,0,1,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
PROC main()
Reset doOpen;
Reset do_Start;
nCount:=1;
nOffs_Rz:=1;
number_count:=1;
nOffs_Rz:=1;
!产生8个放料点位放到数组中保存
FOR index FROM 1 TO 8 DO
P_Place{nOffs_Rz}:=Target_30;
P_Place{nOffs_Rz}.trans.x:=P_Place{nOffs_Rz}.trans.x+70*cos(index*45);
P_Place{nOffs_Rz}.trans.y:=P_Place{nOffs_Rz}.trans.y+70*sin(index*45);
P_Place{nOffs_Rz}:=RelTool(P_Place{nOffs_Rz}, 0, 0, 0 \Rz:= index*45);
Incr nOffs_Rz;
ENDFOR
WHILE nCount<=8 DO
!原点
MoveJ Target_20,v1000,z100,Servo\WObj:=wobj0;
!产生随机工件
PulseDO\PLength:=0.5, do_Start;
WaitDI di_End,1;
!把偏移产生的数值转换到工件坐标中去
Workobject_1.oframe.trans:=PosXY;
WaitTime 0.5;
MoveJ offs(Target_50,0,0,100),v500,fine,Servo\WObj:=Workobject_1;
!取料
MoveJ Target_50,v1000,fine,Servo\WObj:=Workobject_1;
Set doOpen;
WaitTime 0.5;
MoveJ offs(Target_50,0,0,100),v1000,z100,Servo\WObj:=Workobject_1;
MoveJ Offs(P_Place{number_count},0,0,250),v1000,fine,Servo\WObj:=wobj0;
! 放料
MoveL P_Place{number_count},v500,fine,Servo\WObj:=wobj0;
Reset doOpen;
WaitDI diClose,0;
WaitTime 0.5;
MoveJ Offs(P_Place{number_count},0,0,100),v1000,z10,Servo\WObj:=wobj0;
Incr number_count;
Incr nCount;
ENDWHILE
MoveJ Target_20,v1000,fine,Servo\WObj:=wobj0;
Stop;
ENDPROC
ENDMODULE
3、同步到工作站中,仿真运行,看运行逻辑是否 达到想要的效果,最终展示效果如下视频,如有疑问可在文章下评论。