5.1 背景

有模型方案(含大线扫)与无模型方案的差异:

  • 主程序调用粗定位子程序不一样

5.2 离线软件操作

5.2.1 环境配置

图 187

由于现场环境可能出现重新标定tcp或者外部轴范围变更,因此需要检查并更新tcp和外部轴数据。

  1. 设置焊枪tcp

图 188

点击绿色的工具名称,鼠标右键,点“工具属性”。

图 189

将示教器中工具1的tcp数据输入到红色框中。

图 190

蓝色框中数值可以微调焊枪尖与TCP的相对位置。

  1. 设置激光tcp

图 191

在线激光头名称位置点鼠标右键,点“工具属性”。

图 192

将激光标定结果(先扫后焊标定数据)填入到红色框。

蓝色框中,轨迹TCP偏移表示扫描高度,屏幕TCP偏移表示从标定tcp位置到光源的高度(即传感器视野)。

  1. 设置外部轴范围

图 193

扩展模型绿色的就是外部轴名称,右键,然后点“属性”。

图 194

映射:XYZ正方向代表的值。本项目中,X正方向为-e2,Y正方向为+e3,Z正方向为-e1。

在左右极限位置填入每个方向对应的外部轴值的范围(X为e2范围,Y为e3范围,Z为e1范围)。在设置范围时,需要设置的比实际外部轴范围小一点,这样能避免外部轴刚好运行到极限位置时机器人报警

蓝色框联动设置里,勾选自动规划,联动方向选XYZ。

搜索表示外部轴搜索的方向和范围,按照上图设置即可。

  1. 设置工作台

  2. 工作台库-右键-新建-输入尺寸-确定

  3. 右键-工作衣属性-工作台用途-焊接

注:不设置会出现生产不了程序

图 195

5.2.2 导入模型

图 196

右键点“工件集合”,点“导入”。

图 197

点“模型导入”。三维模型支持stp格式。如果后缀是.STEP,需要手动将后缀改成.stp。

图 198

等待模型格式转换完成后,点“确认”,工件会加载到环境中。

5.2.3 标定

  1. 三点标定

图 199

右键点击工件名称,点“工件标定”。

图 200

三点标定功能中,“原点”(1点)和“X方向”(2点)两个点为精确坐标,故标定精度较高。如果工件有变形,则1、2点所在的边能够最大限度保证精度。因此,1、2点通常选择工件上比较明确的点位(不带圆角)。3点可以选择不与直线12垂直的边上的点。

先点X框,鼠标光标在X框里闪烁时,点模型中1点的位置,数据会自动填入。

图 201

三个数据填满后,用机器人枪尖去对实际工件中同样的位置,并将数据按顺序填入到蓝色框中。

图 202

输入完成后,点“确定”,工件会自动摆放到标定位置。

  1. 大线扫粗定位

参照无模型方案,导模型方案,大线扫只用做粗定位

  1. 飞行标定(激光二合一)

图 203

扫描高度能在1.58米,一来一回扫描宽度1.3米,两次重叠部分14cm

直接运行主程序(LX_WeldMain),通过与导入模型对比进行粗定位。

5.2.4自动提取焊缝

由于导模型无底面信息,需要选择工件底面。 (如果提取不出来,可能是未设置底面)

选择工件-右键-工件属性-更新底面-选择工件底面

图 204

编程-路径焊接-提取-平焊缝(立焊缝)-完成

图 205

5.2.5 自动匹配轨迹参数

快速焊缝编辑-工艺设置-姿态模版匹配方式-按照类型

先设置好选项,在自动提取焊缝过程中会自动匹配轨迹参数(软件有轨迹参数库)

图 206

5.2.6 自动优化轨迹

图 207

  1. 点击右下角快速优化,进入自动优化界面,点击右下角“自动优化”按钮,等待优化完成即可。

  2. 自动优化进度、时间、初始焊缝数量、实际焊缝数量、初始焊缝总长度、实际焊缝总长度及焊达率。

图 208

  1. 自动优化有两种方式

图 209

  1. 失败立即停止,选择的焊缝有一条不可焊接,自动优化立即停止

  2. 自动过滤掉不可焊接焊缝,自动删除不可达焊缝程序,不可达焊缝会显示红色,便于查看不可达焊缝原因

图 210

5.2.7 程序生成

图 211

在快速优化界面点击“生成程序”。

图 212

在对应轨迹名称位置右键,并点击“生成程序”。

注:用三点标定,运行子程序,即保存名字的程序(LX_WeldPath1);

用大线扫粗定位或者飞行标定,运行主程序(LX_WeldMain)

5.2.8 在线操作方法

离线编程免示教焊接——飞行标定

点“项目”——“在线控制器”,弹出在线控制器界面。

图 213

在坐标工位索引位置选择启动的工位编号,可选择工位1或者工位2,或者所有工位。如果勾选所有工位,则先执行工位1,再执行工位2,再回到工位1持续运行。

图 214

在对应工位位置设置扫描起点和扫描终点,或者勾选全扫。

图 215

5.3 多工位和多工件设置

5.3.1 离线软件设置

  1. 多工位设置

例如,单导轨工作站,需要在导轨另一侧添加工位。

图 216

首先右键工作台库,点“新建”。

图 217

在创建工作台界面,可以设置工作台的长宽高信息。长宽高设置并没有严格要求,可尽量与导轨长度接近。

图 218

创建完成后,右键新建的工作台,点设置坐标。

图 219

设置到与工位1对称的位置即可。

图 220

右键点工作台属性。

图 221

工作台用途选“焊接”。为避免工作台与工件穿模导致工件显示不全,可以设置工作台不透明度。为避免焊枪与工作台碰撞干扰后续自动优化,可不勾选“碰撞检测”。

图 222

对于导轨两侧的工位,机器人在不同工位之间切换可能会撞到焊接等外部设备,需要给每个工位单独设置安全点。

图 223

  1. 多工件设置

在工作台属性的程序列表页面,取消单工件模式和单程序模式的勾选,可启用多工件模式。

  • 单工件模式表示当前工位每次只记录一个工件,新工件名称和程序会覆盖原来工件。

  • 单程序模式表示每个工件只记录一个程序,新程序名称会覆盖原来程序名称。

图 224

程序生成后,工件名和程序名会记录到对应工位的程序列表中。

  • 注意:多工件模式目前每工位最多记录5个工件。

图 225

5.3.2 视觉软件设置

图 226

在软件标准配置里面选择对应的场景进行配置。

图 227

修改工件参数中的工件最近距离,开启多工件定位功能。

5.4 案例说明

5.4.1 单导轨

  1. 工作站配置图

图 228

  1. 离线操作流程图

图 229

  1. 主程序流程图

图 230

  1. 程序示例及变量创建

  2. 多工位在线更新程序示例及释义

ProgCall(ClearData);//清空定位数据

//获取离线生成的多工位程序及工件、程序数量存放到工程变量中

i:=1;

j:=wb1wpProgCount[1]+1;

LOOP(j)DO

g_wb1wpProgCount[i]:=wb1wpProgCount[i];//获取工位1程序及工件数量

i:=i+1;

END_LOOP

i:=1;

j:=wb2wpProgCount[1]+1;

LOOP(j)DO

g_wb2wpProgCount[i]:=wb1wpProgCount[i];//获取工位2程序及工件数量

i:=i+1;

END_LOOP

i:=1;

j:=0;

err:=StringToNum(StrArrayProg1[1],j);

j:=j+1;

LOOP(j)DO

g_StrArrayProg1[i]:=StrArrayProg1[i];//获取工位1程序数量及程序名

i:=i+1;

END_LOOP

i:=1;

j:=0;

err:=StringToNum(StrArrayProg2[1],j);

j:=j+1;

LOOP(j)DO

g_StrArrayProg2[i]:=StrArrayProg2[i];//获取工位2程序数量及程序名

i:=i+1;

END_LOOP

获取在线更新数据板块

flag:=0;//执行双工位标志

BINO_MIS_MATCH:=0; //拍照计数初始化

err:=robotSmart_comm(WorkMode,string1,string2,type);//获取待执行工位

IF(!err)THEN////获取工位失败则报错

Message("get WorkMode error!",eError,*,*,TRUE,FALSE);

END_IF

IF(CurStation==1)THEN

LP:work_1;

workpieceNum:=LX_CAM1_GW1();//工位1拍照,若定位成功获取工件号,失败则重复进行,超过两次,程序结束

IF(!workpieceNum)THEN

BINO_MIS_MATCH:=BINO_MIS_MATCH+1;

Message("scan error",eWarning,*,*,TRUE,TRUE);

IF(BINO_MIS_MATCH>2)THEN//拍照次数超过两次报错,程序结束

BINO_MIS_MATCH:=0;

Message("scan error",eError,*,*,TRUE,FALSE);

END_IF

GOTO(work_1);

END_IF

ELSIF(CurStation==2)THEN

LP:work_2;

workpieceNum:=LX_CAM1_GW2();//工位2拍照,若定位成功获取工件号,失败则重复进行,超过两次,程序结束

IF(!workpieceNum)THEN

BINO_MIS_MATCH:=BINO_MIS_MATCH+1;

Message("scan error",eWarning,*,*,TRUE,TRUE);

IF(BINO_MIS_MATCH>2)THEN//拍照次数超过两次报错,程序结束

BINO_MIS_MATCH:=0;

Message("scan error",eError,*,*,TRUE,FALSE);

END_IF

GOTO(work_2);

END_IF

ELSIF(CurStation==-1)THEN//若获取工位是-1,则执行双工位

flag:=1;

CurStation:=1;

GOTO(work_1); //跳转到work_1

END_IF

拍照定位、获取工件编号板块

LP:ReCut;

IF(CurStation==1)THEN

IF(workpieceNum==1)THEN

err:=UpdateProg(workpieceNum,CurStation);//执行工位1第一个工件的在线更新程序

IF(!err)THEN//更新失败则报错

Message("Update Program error!",eError,*,*,TRUE,FALSE);

END_IF

ProgLoad(CutWeld.sr\WeldPath6_exec);//加载程序

ProgCall(CutWeld.sr\WeldPath6_exec);//执行程序

ELSIF(workpieceNum==2)THEN

err:=UpdateProg(workpieceNum,CurStation);//执行工位1第二个工件的在线更新程序

IF(!err)THEN//更新失败则报错

Message("Update Program error!",eError,*,*,TRUE,FALSE);

END_IF

ProgLoad(CutWeld.sr\WeldPath5_exec);//加载程序

ProgCall(CutWeld.sr\WeldPath5_exec);//执行程序

ProgLoad(CutWeld.sr\WeldPath11_exec);//加载程序

ProgCall(CutWeld.sr\WeldPath11_exec);//执行程序

ELSE

Message("not have cutpath",eError,*,*,TRUE,FALSE);

END_IF

workpieceNum:=CalcData();//再次定位计算,检查是否有剩余工件

IF(!workpieceNum)THEN//若没有剩余工件,程序结束

Message("no extra workpieces",eInfo,*,*,TRUE);

GOTO(EndCut);

END_IF

GOTO(ReCut);//若有剩余工件,则跳转到ReCut,继续执行对应的工件号程序

ELSIF(CurStation==2)THEN

IF(workpieceNum==1)THEN

err:=UpdateProg(workpieceNum,CurStation);//执行工位2第一个工件的在线更新程序

IF(!err)THEN//更新失败则报错

Message("Update Program error!",eError,*,*,TRUE,FALSE);

END_IF

ProgLoad(CutWeld.sr\WeldPath12_exec);//加载程序

ProgCall(CutWeld.sr\WeldPath12_exec);//执行程序

ProgLoad(CutWeld.sr\WeldPath13_exec);//加载程序

ProgCall(CutWeld.sr\WeldPath13_exec);//执行程序

ELSE

Message("not have cutpath",eError,*,*,TRUE,FALSE);

END_IF

workpieceNum:=CalcData();//再次定位计算,检查是否有剩余工件

IF(!workpieceNum)THEN//若没有剩余工件,程序结束

Message("no extra workpieces",eInfo,*,*,TRUE);

GOTO(EndCut);

END_IF

GOTO(ReCut);//若有剩余工件,则跳转到ReCut,继续执行对应的工件号程序

END_IF

LP:EndCut;

IF(flag==1)THEN//执行双工位的标志

flag:=0;

CurStation:=2;//重置标志及工位

GOTO(work_2);//跳转到work_2

END_IF

EOF

在线更新、执行程序及多工件检查板块

  1. 子程序示例

PTP(ap0,NULL,NULL,tool_C4D,WORLD); //安全点

PTP(ap20879,NULL,NULL,tool_C4D,WORLD); //过渡点

PTP(ap20880,NULL,NULL,tool_C4D,WORLD); //过渡点

ProgCall(CutWeld.sr\kaihuzhao); //开护罩

linkStatus:=vision_link();//连接视觉软件

IF(!linkStatus)THEN

Pause();

END_IF

Lin(cp20864,sp_trans,NULL,NULL,tool_C4D,WORLD); //接近点

Lin(cp20865,sp_scan,NULL,NULL,tool_C4D,WORLD); //扫描起点

task:=3; //任务编号

loop:=0;

MyStartScan(task,workpiece,loop); //开始扫描

Lin(cp20866,sp_scan,olr0,NULL,tool_C4D,WORLD);

Lin(cp20867,sp_scan,olr0,NULL,tool_C4D,WORLD);

Lin(cp20868,sp_scan,olr0,NULL,tool_C4D,WORLD);

MyStopScan();//停止点

Lin(cp20869,sp_trans,NULL,NULL,tool_C4D,WORLD);

PTP(ap20881,NULL,NULL,tool_C4D,WORLD);

MyParaValues[1]:=50; //焊接点步长

MyParaValues[2]:=-10; //焊接循环点数

MyParaValues[3]:=0; //X向偏移距离

MyParaValues[4]:=0; //Y向偏移距离

MyParaValues[5]:=0; //Z向偏移距离

MyParaValues[6]:=0; //Rx旋转角度

MyParaValues[7]:=0; //Ry旋转角度

MyParaValues[8]:=0; //Rz旋转角度

MyParaValues[9]:=0; //起始焊接偏移量

MyParaValues[10]:=0; //终止焊接偏移量

MyParaValues[11]:=-100000; //焊接段长度,<0时焊接路径反向

MyPosValues[1]:=cp20874; //焊接示教点

MyPosValues[2]:=cp20873; //焊接示教点

MyPosValues[3]:=cp20872; //焊接示教点

MyPosValues[4]:=cp20871; //焊接示教点

Lin(cp20870,sp_trans,NULL,NULL,tool_C4D,WORLD);

PosCount:=4; //焊接示教点个数

MyScanWeld(workpiece,loop,-1,-1,-1,-1,ParamCount,PosCount); //开始计算

vision_dislink();//断开视觉软件

ProgCall(CutWeld.sr\guanhuzhao); //关护罩

cp2087400:=MyGetStartPoint();

cp2087100:=MyGetEndPoint();

Lin(cp2087400,sp_trans,NULL,NULL,tool_C4D,WORLD);

ARCMODE(1);

WaitIsFinished();

ARCON(arcon0,arc0); //起弧

index:=2;

len0:=MyRecvPointLength-2; //获得计算结果

LOOP(len0)DO;

rcp100:=MyRecvPoints[index];

index:=index+1;

WLin(rcp100,NULL,olr0,NULL,wd0,NULL,tool_C4D,WORLD); //焊接

END_LOOP

WLin(cp2087100,NULL,olr0,NULL,wd0,NULL,tool_C4D,WORLD); //焊接

ARCOFF(arcoff0); //关弧

linkStatus:=vision_link();

IF(!linkStatus)THEN

Pause();

END_IF

Lin(cp20875,sp_trans,NULL,NULL,tool_C4D,WORLD);

apTemp := MyAxisOffExt(ap0,ext_e1,ext_e2,ext_e3);

PTP(apTemp,NULL,NULL,tool_C4D,BASE_DATA); //安全点