机器人工业应用
"中断停止"是任何工业自动化系统中的一个重要功能,它可以确保在发生异常情况时及时停止机器人,从而保护操作员和设备。但是,中断停止可能会导致机器人停在生产线上的任意位置,这会导致生产线的停滞和生产效率的下降。
为了解决这个问题,我开发了一种新自动返回原点功能。
当机器人被中断停止时,通过自动记录点位的功能块保证机器人返回原点的路径与去往目标点的路径完全吻合,保证机器人不会在回原点的过程中碰撞。
简单运动的机器人回原点很简单
过度点比较多的情况下,大部分情况不能直接回原点,而是选择几个中间的过度点作为节点,回原点程序先回过度节点,再从过度节点返回原点,即回原点的程序中分几层嵌套程序,第一层是从节点回原点,第二层是从停止点回节点,节点越多,程序层的嵌套就越多!
怎么保证回节点的轨迹和去往目标点时候的轨迹完全吻合呢?
去和回的轨迹要高度吻合,这样能避免碰撞,能去就能回!
要实现这个功能就要实时记录运行轨迹,轨迹怎么记录,要用到插补的思维,一段轨迹是由无数个点组成的,从P1到P2点看似是两个点,其实你要把它分成无数个小线段,无数个小线段最后形成这条轨迹!
去和回轨迹一样,比方,就是去的轨迹从P1到P2点的过程中实时记录200个点,那么返回P1点就只要反方向走这200个点!
复杂运动实现自动回原点也复杂
技术关键就是记录轨迹上的点,并计算返回轨迹,就展示这部分;
1、记录点位的功能块程序:
这段功能块最好单独运行,用机器人的扫描周期当计时器,机器人运行时,想记录哪段轨迹的点位,即在开始点把bStartR置TRUE,结束点再变成FALSE;既记录了这段轨迹细分成200个点的点位!
//记录200个点位
bStartR=false
xbProOut=false
delay(0.01)
do
//当startR为TRUE就开始记录轨迹上的点
if bStartR
bCloseSpace=false
Pn=0
//计算步长
nHomeCycTime1=(10*nHomeCycTime)/nl_MonitorSpd
//#
delay(0.01)
do
//隔步长设定的时间就记录一次当前位置,直接记录关节坐标,避免笛卡尔坐标系有奇异点
jC01[Pn]=herej()
Pn=Pn+1
delay(nHomeCycTime1)
until Pn==200 or bStartR==false or !bQ_RemoteAuto
bStartR=false
elseIf !bQ_RemoteAuto
bCloseSpace=true
endIf
until xbProOut
2、计算返回轨迹:
//初始化参数
xl_nStep=0
l_bOut=false
l_nEndStep=999
Pp=0
Pc=0
Pw=0
Ph=0
//延时20ms用于PLC刷新状态信息
delay(0.02)
do
//开始记录点位信号开关
bStartR=false
//开始运行记录运行轨迹的步序
switch xl_nStep
case 0
if !bCloseSpace
//计算停止点位置
call s2_Fb_CalcaulatePSpace()
xl_nStep=5
else
xl_nStep=l_nEndStep
endIf
break
case 5
if !bCloseSpace
//确定停止点位置
call s3_Fb_FindSpace()
xl_nStep=10
else
xl_nStep=l_nEndStep
endIf
break
case 10
if !bCloseSpace
//给原路返回的点赋值
call s4_Fb_CalcaulateHomePos()
if bMSpace[Pp]
xl_nStep=20
else
xl_nStep=l_nEndStep
endIf
else
xl_nStep=l_nEndStep
endIf
break
case 20
//原路返回的轨迹
movej(jH[0],tTCP,mHomeSpeed)
movej(jH[1],tTCP,mHomeSpeed)
movej(jH[2],tTCP,mHomeSpeed)
movej(jH[3],tTCP,mHomeSpeed)
movej(jH[4],tTCP,mHomeSpeed)
movej(jH[5],tTCP,mHomeSpeed)
movej(jH[6],tTCP,mHomeSpeed)
movej(jH[7],tTCP,mHomeSpeed)
movej(jH[8],tTCP,mHomeSpeed)
movej(jH[9],tTCP,mHomeSpeed)
movej(jH[10],tTCP,mHomeSpeed)
movej(jH[11],tTCP,mHomeSpeed)
movej(jH[12],tTCP,mHomeSpeed)
movej(jH[13],tTCP,mHomeSpeed)
movej(jH[14],tTCP,mHomeSpeed)
movej(jH[15],tTCP,mHomeSpeed)
movej(jH[16],tTCP,mHomeSpeed)
movej(jH[17],tTCP,mHomeSpeed)
movej(jH[18],tTCP,mHomeSpeed)
movej(jH[19],tTCP,mHomeSpeed)
movej(jH[20],tTCP,mHomeSpeed)
movej(jH[21],tTCP,mHomeSpeed)
movej(jH[22],tTCP,mHomeSpeed)
movej(jH[23],tTCP,mHomeSpeed)
movej(jH[24],tTCP,mHomeSpeed)
movej(jH[25],tTCP,mHomeSpeed)
movej(jH[26],tTCP,mHomeSpeed)
movej(jH[27],tTCP,mHomeSpeed)
movej(jH[28],tTCP,mHomeSpeed)
movej(jH[29],tTCP,mHomeSpeed)
movej(jH[30],tTCP,mHomeSpeed)
waitEndMove()
xl_nStep=30
break
case 30
xl_nStep=999
break
case l_nEndStep