库卡机器人编程之干涉区间

一.干涉的定义
机器人在作业过程中,或者在运行过程中,两个或两个以上的机器人同时占有同一区间位置而发生冲突叫干涉。因为干涉可能引起的后果有:
机器人的部件损坏 任何因干涉而造成的不良后果,都将为客户带来不
可估计的损失!
机器人程序混乱
加工中的工件损坏
周边其他设备设施的损坏
二.干涉区间
同一工位的机器人,在工作过程中,需要进入到同一个区域,但在进入的先后次序无严格的限定,一台机器人(master)具有绝对优先的权利,即该机器人首先进入干涉区,作业完成之后另一台机器人(slave)才可以进入该干涉区工作。任意一台机器人先进入(master),在工艺上都允许(除了影响运行时间外),允许使用干涉区信号对控制机器人运行,防止机器人之间碰撞。对于有严格的工艺时序的干涉,采用互锁信号来控制。这种干涉区信号设置方法如图所示。 ⑴如图中,rob2机器人为master,rob1机器人为slave. rob1和rob2机器人在进入干涉区之前首先分别对彼此进行初始化(开启干涉区监控并释放干涉区)。 ⑵机器人进入干涉区三种情形:
1 rob1机器人进入干涉区前,发送从机欲进入干涉区的请求信号,并检测rob2作为主机是否发送欲进入干涉区的请求信号。如果主机rob2进入干涉区的请求信号被激活,无论此时rob2进入或则即将进入干涉区,此时rob1都将停止运动并等待rob2完成运动退出干涉区。
2 如果rob1和rob2同时发出欲进入干涉区的请求信号,rob2机器人优先进入,此时rob1都将停止运动并等待rob2完成运动退出干涉区。
3 如果rob1作为从机已进入干涉区时,rob2若想进入干涉区,rob2必须停止运动并等待rob1完成运动退出干涉区。
⑶待进入干涉区的机器人必须等待已进入干涉区的机器人完成运动退出干涉区后方可进入。
三.干涉区间互锁编程思路:
创建名为interlock的程序主要适用于存在有关联的机器人组之间互锁,该程序包含源代码src文件和数据文件dat两个文件:
1.interlock.dat数据文件说明:
①枚举类型互锁指令e_locktype:
global enum e_locktype enter_lock_m,enter_lock_s,leave_lock,cyc_control,reset_lock
互锁命令 说明
enter_lock_m 作为主机器人进入干涉区
enter_lock_s 作为从机器人进入干涉区
leave_lock 机器人退出干涉区
cyc_control 激活干涉区监控中断
reset_lock 初始化并释放干涉区
②结构体型互锁信号s_locksig:
global struc s_locksig introb_in,introb_out
互锁信号 说明
rob_in 其他机器人许可当前机器人进入干涉区的输入信号:true表示许可
rob_out 当前机器人进入干涉区请求的输出信号:false表示请求
③用于诊断的当前机器人激活干涉区号zlocknumber:
global int zlocknumber=3
④干涉区监控的中断及循环旗帜的定义:
globalconstintczcollinterrupt=1;定义干涉区监控的中断等级globalconstintczcyccollision=1 ;定义干涉区监控的循环旗帜号
⑤信号安全检测时间,与sps扫描周期:
globalconstrealcrdeadtime=0.200000003 ;信号安全检测时间,与sps扫描周期
⑥干涉区互锁信号:
signal girobotinterlock $in[89] to $in[104] ;许可当前机器人进入干涉区的输入信号组signalgorobotinterlock$out[89]to$out[104] ;当前机器人进入干涉区请求的输出信号组decls_locksigtable_lock[16];定义机器人干涉区的互锁表table_lock[1]={rob_in89,rob_out89};机器人干涉区的互锁1table_lock[2]={rob_in 90,rob_out 90} ;机器人干涉区的互锁2table_lock[3]={rob_in 91,rob_out 91} ;机器人干涉区的互锁3table_lock[4]={rob_in 92,rob_out 92} ;机器人干涉区的互锁4table_lock[5]={rob_in93,rob_out93};机器人干涉区的互锁5table_lock[6]={rob_in94,rob_out94};机器人干涉区的互锁6table_lock[7]={rob_in95,rob_out95};机器人干涉区的互锁7table_lock[8]={rob_in 96,rob_out 96} ;机器人干涉区的互锁8table_lock[9]={rob_in 97,rob_out 97} ;机器人干涉区的互锁9table_lock[10]={rob_in 98,rob_out 98} ;机器人干涉区的互锁10table_lock[11]={rob_in 99,rob_out 99} ;机器人干涉区的互锁11table_lock[12]={rob_in 100,rob_out 100} ;机器人干涉区的互锁12table_lock[13]={rob_in 101,rob_out 101} ;机器人干涉区的互锁13table_lock[14]={rob_in 102,rob_out 102} ;机器人干涉区的互锁14table_lock[15]={rob_in103,rob_out103};机器人干涉区的互锁15table_lock[16]={rob_in 104,rob_out 104} ;机器人干涉区的互锁16
2.interlock.src源程序文件说明:
①interlock源程序包含以下子程序:
子程序名 说明
anti_collision 互锁程序
stop_rob 互锁程序中的中断程序
msg_anticoll 互锁激活的信息提示程序
setmsg 设置信息提示的程序
②互锁程序anti_collision(eilocktype:in,zilocknum:in):
传递参数 类型 取值 说明
eilocktype e_locktype #enter_lock_m 作为主机请求进入干涉区
#enter_lock_s 作为从机请求进入干涉区
#leave_lock 离开干涉区
#cyc_control 干涉区初始化:激活互锁中断
#reset_lock 干涉区初始化:重置输出信号
zilocknum int 1…16 互锁序号:与table_lock相对
●#enter_lock_m程序逻辑:
1 禁用干涉区监控中断;
2 判断从站机器人是否已在该干涉区:
1.若该值为真,表示与之对应的机器人不在该干涉区,此时输出进入干涉区请求信号假值;
2.若该值为假,则表示与之对应的机器人在该干涉区,此时中间变量nbok置为假,并提示信息-主机该干涉区被其他从机器人激活,并等待从站机器人在该干涉区的信号为真,输出从站机器人在该干涉区激活多久的信息;在循环中等待从站机器人在该干涉区的信号为真,此时输出进入干涉区请求信号;
3 激活干涉区监控中断;
●#enter_lock_s程序逻辑:
1 禁用干涉区监控中断
2 中间变量nbok置为假,并提示信息-该干涉区被主机器人激活,进入循环判断,判断主机器人是否已激活 该干涉区:
若该值为真,输出进入干涉区请求信号假值;等待一个时间在判断判断主机器人激活该干涉区:如果该值为真,则将中间变量置真,并退出循环;若该值为假,则将输出进入干涉区请求信号真值,让主机器进入干涉区,该从机器人继续等待主机器人激活该干涉区值为真;
3 输出进入干涉区请求信号假值;
4 激活干涉区监控中断;
●#leave_lock程序逻辑:
1 如果机器人不在路径上,则等待机器人在路径上;
2 输出进入干涉区请求信号真值;
●#reset_lock程序逻辑:
1 等待机器人在路径上;
2 输出进入干涉区请求信号真值;
●#cyc_control程序逻辑:
1 定义因互锁引起的停机中断;
2 关闭中断;
3 定义中断中的循环旗帜;
4 开启中断;
5 激活中断;
代码:
def interlock( )end;-------------interlock active----------------------global def anti_collision(eilocktype:in, zilocknum:in)decl e_locktype eilocktypedecl int zilocknumdecl bool nbokcontinueif varstate(zilocknum)#initialized then msgquit(lock area not initialized) halt else if zilocknum>16 or zilocknum<1 then msgquit(lock area msut be 1 to 16!) halt endifendifswitch eilocktype ; --- enter collision zone as master --- case #enter_lock_m wait sec 0 interrupt disable czcollinterrupt ; disable monitoring if ($in[table_lock[zilocknum].rob_in]) then $out[table_lock[zilocknum].rob_out]=false else nbok=false msg_anticoll(zilocknum) repeat if ($in[table_lock[zilocknum].rob_in]) then nbok=true else nbok=false endif wait sec 0.01 ; sampling 100 ms until (instruction_ok==true) $out[table_lock[zilocknum].rob_out]=false endif interrupt enable czcollinterrupt ; enable monitoring ; --- enter collsion zone as slave --- case #enter_lock_s wait sec 0 interrupt disable czcollinterrupt ; disable monitoring nbok=false msg_anticoll(zilocknum) repeat if ($in[table_lock[zilocknum].rob_in]) then $out[table_lock[zilocknum].rob_out]=false wait sec crdeadtime if ($in[table_lock[zilocknum].rob_in]) then nbok=true else nbok=false $out[table_lock[zilocknum].rob_out]=true endif endif wait sec 0.01 ; sampling 100 ms until (nbok==true) $out[table_lock[zilocknum].rob_out]=false interrupt enable czcollinterrupt ; enable monitoring ; --- leave collision zone --- case #leave_lock continue if not $on_path then wait for $on_path endif trigger when distance=1 delay=0 do $out[table_lock[zilocknum].rob_out]=true; --- initialize collision zone --- case #reset_lock wait sec 0 wait for $on_path $out[table_lock[zilocknum].rob_out]=true ; --- prepare for permanent monitoring--- case #cyc_control global interrupt decl czcollinterrupt when not $cycflag[czcyccollision] do stop_rob( ) interrupt off czcollinterrupt $cycflag[czcyccollision]=true $cycflag[czcyccollision]=(((gorobotinterlock b_exor 'b1111111111111111') b_and girobotinterlock) == (gorobotinterlock b_exor 'b1111111111111111')) interrupt on czcollinterrupt interrupt enable czcollinterrupt; --- warning: program failure interlocks --- default halt msgnotify(unknown collision setting!please switch ti mode!) wait for $t1endswitchendglobal def stop_rob ( ); *** stop movement by interlock monitoring*** brake setmsg (99,3,0) wait for $cycflag[czcyccollision]endglobal def msg_anticoll(zilocknum :in)decl int zilocknumdecl real nrtimernrtimer=0.0zlocknumber=zilocknum;message outputsetmsg (zilocknum,1,nztimer) $timer_stop[20]=true$timer[20]=0$timer_stop[20]=falserepeat wait sec .01until ($in[table_lock[zilocknum].rob_in])==true$timer_stop[20]=truenrtimer=$timer[20]nrtimer=nrtimer/1000.0setmsg (zilocknum,2,nrtimer) endglobal def setmsg(zilocknum:in,zimsg:in,ripar:in )decl krlmsg_t msgdecl krlmsgpar_t par[3]decl krlmsgopt_t optdecl int nzhandledecl int zilocknum, zimsgdecl real ripar;select msssage text---------------------switch zimsg case 1 ;interlock is active msg = {modul[] interlock, nr 007, msg_txt[] interlock area %1 is active!} case 2 ;interlock was active msg = {modul[] interlock, nr 008, msg_txt[] interlock area %1 was active %2[s] ago!} case 3 ;interlock cycflag has triggered msg = {modul[] interlock, nr 009, msg_txt[] collision monitoring has triggered!}endswitch;configuration of message parameter --------par[1] = {par_type #value, par_int 0}par[1].par_int = zilockareapar[2] = {par_type #value, par_real 00.0}par[2].par_real = ripar;message options ------------------------------------opt = {vl_stop false, clear_p_reset true, clear_p_saw false, log_to_db true};message generation---------------------------nzhandle = set_krlmsg (#notify, msg, par[], opt)end
四.互锁信号程序的使用:
1.初始化干涉监控:
anti_collision(#cyc_control,0 )
2.重置并释放干涉区信号-依据自己需求:
anti_collision(#reset_lock,1)anti_collision(#reset_lock,2)anti_collision(#reset_lock,3)anti_collision(#reset_lock,4)anti_collision(#reset_lock,5)anti_collision(#reset_lock,6)anti_collision(#reset_lock,7)anti_collision(#reset_lock,8)
3.进入干涉区:
-作为主机器人进入:
anti_collision(#enter_lock_m,3)anti_collision(#enter_lock_m,4) ;三台机器人同时进入该区域anti_collision(#enter_lock_m,5)
-作为从机器人进入:
anti_collision(#enter_lock_s,3)anti_collision(#enter_lock_s,4) ;三台机器人同时进入该区域anti_collision(#enter_lock_s,5)
复杂的互锁建议最好由plc来统一处理;
4.退出干涉区:
anti_collision(#leave_lock,3)
五.说明:
本文主要讲述绝对优先干涉区的设定,此种方法必须区分主次关系,主机器人获得绝对的优先处理的权力,而从机器人在遇到主从机器人同时进入干涉区时,获得的优先级低于主机器人,必须等待主机器人处理完退出干涉区之后才能进入。

视频滤波器与缓存二合一产品TSH345/6(ST)
物联网崛起 助力中国梦
亚马逊云科技实操教学带你注册并使用海外服务器
工信部点名运营商不限量套餐过分宣传,要求立即开展自查
电缆和电线在尺度、用处、特性上都存在着许多的不同
库卡机器人编程之干涉区间
Vishay推出采用TO-252AA封装的整流器
吴锋:智能电池的出现将进一步颠覆电池系统的结构
什么是触摸屏?
TL431芯片的基本使用 tl432与tl431有什么不同
工控机的接口类型都有哪些
一种模拟人类指纹特征的柔性滑觉传感器
空调电源线怎么接
基于GaN芯片的电源转换方案设计
GPIO的推挽输出和开漏输出以及其优缺点分析
人工智能AI在机器人运动控制领域盘点简介
基于可编程逻辑器件实现多电平正交幅度调制系统的设计
新风系统和净化器之间的区别与工作原理
河套IT TALK——TALK 12:编程的技术|艺术|术术 下篇:对着代码解读编程的哲学
三星788DF显示器内部结构电路图分析 浅谈三星788DF显示器电路