一、课题介绍

1.1 简介

随着当今社会的不断发展,以工业机器人智能制造为主导的新科技浪潮不断推进,相关工业机器人的应用需求和与之伴随的相关应用型人才的需求也越来越大。在工业机器人编程与操作的实习中,本报告选择工业弧焊机器人进行展开讨论与建模仿真。因新冠疫情的因素影响,学生无法返校进行工业机器人的实际操作,故实验主要是使用SolidWorks建模软件与ABB RobotStudio仿真软件进行工作空间的搭建与仿真。
本次课题旨在通过RobotStudio虚拟仿真平台上搭建焊接机器人工作站的过程,让我们掌握工业机器人三维建模、离线编程、程序调试、实验仿真以及验证的有关操作。

1.2 工艺要求

本次实习要求使用RobotStudio进行弧焊工业机器人的仿真,使用SolidWorks对焊件以及周边器件进行建模,需要整个工作系统能够平稳运行,能够应用于生产实践;需要考虑实际情况进行设计,不能出现穿模,碰撞等现实中不可行的方案,需要使用恰当的方式方法进行工作站的搭建。

二、总体方案设计

2.1 总体方案

总体方案如图2.1所示:

图2.1 弧焊机器人设计总体方案

在弧焊工业机器人的仿真设计中,开始需要分为两个步骤,分别为SolidWorks建模和RobotStudio机器人的选型与工作站的初步搭建。当这两个步骤完成后,将模型导入RobotStudio中,进行机器人模型的装配并且完善场景的搭建。随后进行机器人系统的自动生成,添加相关的Smart组件,给仿真动画加上相应的反馈组件与环节。完成后,使用RobotStudio内的目标点和自动路径的创建功能生成机器人轨迹,在这个过程中要防止机器人移动到奇异点,保证工作区始终不超过机器人的活动范围。
完成以上搭建后进行机器人工作站的调试过程,可以通过修改RAPID有关的代码细化机器人的运动过程,检查弧焊机器人是否能够达到预想的效果,如果能达到预期的效果则完成本次的仿真设计过程,若没有达到预期效果,需要查找有关原因并记录,进行模型或代码的修改,直到达到设计要求。

2.2 机器人选型与布局

弧焊机器人的仿真部件设计构成有:IRB 1660ID机器人本体一台、Binzel ID 22焊枪一个、IRC5控制柜模块一个,CAM传感器一台,聚光灯一台,焊枪清洗器一台,焊接保护气罐一瓶,传送体一个,焊件若干,隔离保护架若干,电缆若干。

工作站布局如图2.2所示。

图2.2 弧焊机器人工作站布局

三、弧焊机器人工作站

3.1 SolidWorks建模

除了RobotStudio自带的机器人与控制柜等模组之外,还需要建模的组件还有自己设置的焊件,保护气罐,聚光灯和焊枪清洗器;其中焊件的建模比较简单,利用普通的工件建模即可,其他部件都需要在工件建模的基础上进行装配。

首先打开SolidWorks软件,选择工件建模,先画草图然后进行特征的拉伸,裁切,倒圆角和打孔等操作进行建模,首先绘制好焊件的模型。随后再进行保护气罐和聚光灯零件的建模,建模并组装完成后,建模图如图3.1所示。

图3.1 焊件,保护气瓶,焊枪清洗器(从左到右)

3.2 弧焊机器人工作站

首先需要在RobotStudio中添加一个一个RobotStudio自带的机器人模型,在此我选择的是IRB1660ID,通过ABB Industrial的官方数据可以知道这个机械手臂是专门应用于弧焊的机械手臂,它的处理能力是6kg,能到达的长度为1.55m,操作空间与数据如附录2所示。

完成机械手模型的导入,我们选择从布局创建机器人系统,在选项里面添加606-1 Conveyor Tracking和1552-1 Tracking Unit Interface的合作跟踪模块与控制系统,随后完成机器人布局的搭建。

在设备模型中选择焊枪组件Binzel ID 22,拖动到设备区,随后将焊枪拖动到机器人模型上,组成一个机械弧焊臂,在工作站内添加一个IRC5工作控制器,并且进行围栏的搭建,通过建模中的电缆创建焊枪连接线,在建模里将SolidWorks已经建模的工件导入进来,并且进行位置的摆放确定。

3.3 组件设计

(1)传输带搭建:
首先在建模中创建一个长4000毫米,宽800毫米,高500毫米的长矩形块,将长矩形块进行适当的位置偏移,让其大部分区域处于机械臂的工作空间之内,随后添加在SolidWorks中已经完成建模的焊件。创建传送带,选择刚刚建立的长矩形为传送带本体,将焊件添加进传送带的传送对象之中,随后调整焊件在传送带上的位置,让其刚好位于传送带起始端的位置,随后确定传送带的工作空间,传送距离。工作空间要保证位于机械臂的工作范围之内,传送距离应该小于长矩形的长减去焊件的长度,这样才能保证焊件到达传送带长矩形的末尾的时候会消失,而不会溢出传送带。
(2)焊头灯光Smart组件设计:
打开RobotStudio的高级显示,其中有创建点光源的选项,选择点光源后在左侧的视图中选择新建的点光源,调节到焊枪的头部位置,随后右击选择安装即可让光源沿着焊枪的头部运动,随后添加一个光源控制的Smart组件,将其控制的光源选择为刚刚创建的点光源,随后在Smart组件中的设计面板中新建一个输入数字变量为kk,这个输入变量指的是控制焊枪火光开关的数字信号,将其连接到光源控制的Smart组件的Enable上,即可实现控制。

图3.2 添加光源后效果

3.4 仿真设计

将焊件通过控制传送带设置进入工作区,随后切换到传送带的坐标系进行轨迹的规划,按照如图3.3的方式规划两条包含直线运动与圆弧运动的轨迹线。

图3.3 设计的仿真仿真弧焊运动轨迹

随后让机械臂重回机械原点,将坐标系变为机械臂的世界坐标系,然后建立一个坐标原点的示教目标点,将示教器原点拖进路径中建立路径,并进行RAPID的同步,同步完成后可在RAPID代码中加入灯光管理Smart组件的SetDO代码控制灯光,在工作站逻辑内将RAPID代码的信号传输到Smart组件的控制中,随后重启控制器即可进行仿真,相关机器人源代码可参照附录1。

3.5 结论

在机器人重复工作时,当传送带将物体送入工作区域时,机械臂将自动进行跟踪并且自动弧焊,完成后则回到机械原点,等待下一个焊件的进入,如此重复运行。

参考文献

[1] Connolly C. Technology and applications of ABB RobotStudio[J]. Industrial Robot: An International Journal, 2009.</br>
[2] Shimogama S. Apparatus and method for controlling an arc welding robot: U.S. Patent 6,107,601[P]. 2000-8-22.</br>
[3] 王克鸿, 刘永, 徐越兰等. 弧焊机器人离线编程系统[J]. 焊接学报, 2001, 22(4): 84-86.</br>
[4] ABB Industrial. Introduction of IRB 1660ID[DB/OL]. (DA), 2019-09-16.
DA: https://new.abb.com/products/robotics/industrial-robots/irb-1660id
[5] Craig J J. Introduction to robotics: mechanics and control, 3/E[M]. Pearson Education India, 2009.</br>
[6] 张文增, 陈强, 孙振国, 等. 弧焊机器人工件坐标系快速标定方法[J]. 焊接学报, 2005, 26(7): 1-4.</br>
[7] 朱大奇, 颜明重. 移动机器人路径规划技术综述[J]. 控制与决策, 2010 (7): 961-967.</br>
[8] 王伟, 谢明红, 周国义. 6-DOF 工业机器人逆解优化及其工作空间的研究[J]. 机械与电子, 2011 (1): 57-60. </br>

附录1:程序代码


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
MODULE Module1
CONST robtarget Target_310:=[[601.992337021,17.494365275,999.738524269],[0.23021145,0.668582596,0.668582596,-0.23021145],[0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_10:=[[72.426406871,70,350],[0,0.707106781,0.707106781,0],[0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_20:=[[450,70,350],[0,0.707106781,0.707106781,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_30:=[[450,70,350],[0,0.707106781,0.707106781,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_40:=[[471.213203436,78.786796565,350],[0,0.70710678,0.707106782,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_50:=[[480,100,350],[0,0.707106781,0.707106781,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_60:=[[480,100,350],[0,0.707106781,0.707106781,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_70:=[[480,477.573593129,350],[0,0.707106781,0.707106781,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_80:=[[480,477.573593129,350],[0,0.707106781,0.707106781,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_90:=[[473.826834324,486.812388454,350],[0,0.659345815,0.751839808,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_100:=[[462.928932188,484.644660941,350],[0,0.70710678,0.707106782,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_110:=[[462.928932188,484.644660941,350],[0,0.70710678,0.707106782,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_120:=[[65.355339059,87.071067812,350],[0,0.70710678,0.707106782,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_130:=[[65.355339059,87.071067812,350],[0,0.70710678,0.707106782,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_140:=[[63.187611546,76.173165677,350],[0,0.751839807,0.659345815,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_150:=[[72.426406871,70,350],[0,0.70710678,0.707106782,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_160:=[[20,122.426406871,350],[0,0.707106782,0.707106781,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_170:=[[26.173165676,113.187611546,350],[0,0.831469612,0.555570233,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_180:=[[37.071067812,115.35533906,350],[0,0.70710678,0.707106782,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_190:=[[37.071067812,115.35533906,350],[0,0.70710678,0.707106782,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_200:=[[434.644660941,512.928932188,350],[0,0.70710678,0.707106782,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_210:=[[437.573593129,520,350],[0,0.707106782,0.707106781,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_220:=[[434.644660941,527.071067812,350],[0,0.707106782,0.707106781,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_230:=[[427.573593129,530,350],[0,0.707106781,0.707106782,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_240:=[[427.573593129,530,350],[0,0.707106781,0.707106782,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_250:=[[50,530,350],[0,0.707106781,0.707106782,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_260:=[[50,530,350],[0,0.707106781,0.707106782,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_270:=[[28.786796565,521.213203436,350],[0,0.70710678,0.707106782,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_280:=[[20,500,350],[0,0.707106782,0.707106781,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_290:=[[20,500,350],[0,0.707106782,0.707106781,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
CONST robtarget Target_300:=[[20,122.426406871,350],[0,0.707106782,0.707106781,0],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
!***********************************************************
!
! Module: Module1
!
! Description:
! <Insert description here>
!
! Author: ROBOTSTUDIO
!
! Version: 1.0
!
!***********************************************************

!***********************************************************
!
! Procedure main
!
! This is the entry point of your program
!
!***********************************************************
PROC main()
ActUnit CNV1;
WHILE 2>1 DO
WaitWObj wobj_cnv1;
Path_10;
DropWObj wobj_cnv1;
ENDWHILE
ENDPROC
PROC Path_10()
MoveL Target_310,v1000,fine,tWeldGun\WObj:=wobj0;
MoveL Target_10,v1000,fine,tWeldGun\WObj:=wobj_cnv1;
SetDO awo0,1;
MoveL Target_20,v150,z0,tWeldGun\WObj:=wobj_cnv1;
MoveC Target_40,Target_50,v150,z0,tWeldGun\WObj:=wobj_cnv1;
MoveL Target_70,v150,z0,tWeldGun\WObj:=wobj_cnv1;
MoveC Target_90,Target_100,v150,z0,tWeldGun\WObj:=wobj_cnv1;
MoveL Target_120,v150,z0,tWeldGun\WObj:=wobj_cnv1;
MoveC Target_140,Target_150,v150,z0,tWeldGun\WObj:=wobj_cnv1;
MoveL Target_160,v150,z0,tWeldGun\WObj:=wobj_cnv1;
SetDO awo0,0;
MoveC Target_170,Target_180,v150,z0,tWeldGun\WObj:=wobj_cnv1;
SetDO awo0,1;
MoveL Target_200,v150,z0,tWeldGun\WObj:=wobj_cnv1;
MoveC Target_220,Target_230,v150,z0,tWeldGun\WObj:=wobj_cnv1;
MoveL Target_250,v150,z0,tWeldGun\WObj:=wobj_cnv1;
MoveC Target_270,Target_280,v150,z0,tWeldGun\WObj:=wobj_cnv1;
MoveL Target_300,v150,z0,tWeldGun\WObj:=wobj_cnv1;
SetDO awo0,0;
MoveL Target_300,v150,z0,Tooldata_1\WObj:=wobj_cnv1;
MoveL Target_310,v1000,fine,tWeldGun\WObj:=wobj0;
ENDPROC
ENDMODULE


附录2:ABB_IRB_1660ID工作空间