一.干涉的定義
機器人在作業(yè)過程中,或者在運行過程中,兩個或兩個以上的機器人同時占有同一區(qū)間位置而發(fā)生沖突叫干涉。因為干涉可能引起的后果有:
| 機器人的部件損壞 |
任何因干涉而造成的不良后果,都將為客戶帶來不 可估計的損失! |
| 機器人程序混亂 | |
| 加工中的工件損壞 | |
| 周邊其他設備設施的損壞 |
二.干涉區(qū)間
同一工位的機器人,在工作過程中,需要進入到同一個區(qū)域,但在進入的先后次序無嚴格的限定,一臺機器人(Master)具有絕對優(yōu)先的權(quán)利,即該機器人首先進入干涉區(qū),作業(yè)完成之后另一臺機器人(Slave)才可以進入該干涉區(qū)工作。任意一臺機器人先進入(Master),在工藝上都允許(除了影響運行時間外),允許使用干涉區(qū)信號對控制機器人運行,防止機器人之間碰撞。對于有嚴格的工藝時序的干涉,采用互鎖信號來控制。這種干涉區(qū)信號設置方法如圖所示。 ⑴如圖中,Rob2機器人為Master,Rob1機器人為Slave. Rob1和Rob2機器人在進入干涉區(qū)之前首先分別對彼此進行初始化(開啟干涉區(qū)監(jiān)控并釋放干涉區(qū))。 ⑵機器人進入干涉區(qū)三種情形:
| 1 | Rob1機器人進入干涉區(qū)前,發(fā)送從機欲進入干涉區(qū)的請求信號,并檢測Rob2作為主機是否發(fā)送欲進入干涉區(qū)的請求信號。如果主機Rob2進入干涉區(qū)的請求信號被激活,無論此時Rob2進入或則即將進入干涉區(qū),此時Rob1都將停止運動并等待Rob2完成運動退出干涉區(qū)。 |
| 2 | 如果Rob1和Rob2同時發(fā)出欲進入干涉區(qū)的請求信號,Rob2機器人優(yōu)先進入,此時Rob1都將停止運動并等待Rob2完成運動退出干涉區(qū)。 |
| 3 | 如果Rob1作為從機已進入干涉區(qū)時,Rob2若想進入干涉區(qū),Rob2必須停止運動并等待Rob1完成運動退出干涉區(qū)。 |
⑶待進入干涉區(qū)的機器人必須等待已進入干涉區(qū)的機器人完成運動退出干涉區(qū)后方可進入。

三.干涉區(qū)間互鎖編程思路:
創(chuàng)建名為Interlock的程序主要適用于存在有關聯(lián)的機器人組之間互鎖,該程序包含源代碼SRC文件和數(shù)據(jù)文件DAT兩個文件:
1.Interlock.dat數(shù)據(jù)文件說明:
①枚舉類型互鎖指令E_LOCKTYPE:
GLOBAL ENUM E_LOCKTYPE ENTER_LOCK_M,ENTER_LOCK_S,LEAVE_LOCK,CYC_CONTROL,RESET_LOCK
| 互鎖命令 | 說明 |
| ENTER_LOCK_M | 作為主機器人進入干涉區(qū) |
| ENTER_LOCK_S | 作為從機器人進入干涉區(qū) |
| LEAVE_LOCK | 機器人退出干涉區(qū) |
| CYC_CONTROL | 激活干涉區(qū)監(jiān)控中斷 |
| RESET_LOCK | 初始化并釋放干涉區(qū) |
②結(jié)構(gòu)體型互鎖信號S_LOCKSIG:
GLOBAL STRUC S_LOCKSIG INTROB_IN,INTROB_OUT
| 互鎖信號 | 說明 |
| ROB_IN | 其他機器人許可當前機器人進入干涉區(qū)的輸入信號:TRUE表示許可 |
| ROB_OUT | 當前機器人進入干涉區(qū)請求的輸出信號:FALSE表示請求 |
③用于診斷的當前機器人激活干涉區(qū)號zLockNumber:
GLOBAL INT zLockNumber=3
④干涉區(qū)監(jiān)控的中斷及循環(huán)旗幟的定義:
GLOBALCONSTINTczCollInterrupt=1;定義干涉區(qū)監(jiān)控的中斷等級GLOBALCONSTINTczCycCollision=1 ;定義干涉區(qū)監(jiān)控的循環(huán)旗幟號
⑤信號安全檢測時間,與SPS掃描周期:
GLOBALCONSTREALcrDeadtime=0.200000003 ;信號安全檢測時間,與SPS掃描周期
⑥干涉區(qū)互鎖信號:
SIGNAL giRobotInterlock $IN[89] TO $IN[104] ;許可當前機器人進入干涉區(qū)的輸入信號組SIGNALgoRobotInterlock$OUT[89]TO$OUT[104] ;當前機器人進入干涉區(qū)請求的輸出信號組DECLS_LOCKSIGTABLE_LOCK[16];定義機器人干涉區(qū)的互鎖表TABLE_LOCK[1]={ROB_IN89,ROB_OUT89};機器人干涉區(qū)的互鎖1TABLE_LOCK[2]={ROB_IN 90,ROB_OUT 90} ;機器人干涉區(qū)的互鎖2TABLE_LOCK[3]={ROB_IN 91,ROB_OUT 91} ;機器人干涉區(qū)的互鎖3TABLE_LOCK[4]={ROB_IN 92,ROB_OUT 92} ;機器人干涉區(qū)的互鎖4TABLE_LOCK[5]={ROB_IN93,ROB_OUT93};機器人干涉區(qū)的互鎖5TABLE_LOCK[6]={ROB_IN94,ROB_OUT94};機器人干涉區(qū)的互鎖6TABLE_LOCK[7]={ROB_IN95,ROB_OUT95};機器人干涉區(qū)的互鎖7TABLE_LOCK[8]={ROB_IN 96,ROB_OUT 96} ;機器人干涉區(qū)的互鎖8TABLE_LOCK[9]={ROB_IN 97,ROB_OUT 97} ;機器人干涉區(qū)的互鎖9TABLE_LOCK[10]={ROB_IN 98,ROB_OUT 98} ;機器人干涉區(qū)的互鎖10TABLE_LOCK[11]={ROB_IN 99,ROB_OUT 99} ;機器人干涉區(qū)的互鎖11TABLE_LOCK[12]={ROB_IN 100,ROB_OUT 100} ;機器人干涉區(qū)的互鎖12TABLE_LOCK[13]={ROB_IN 101,ROB_OUT 101} ;機器人干涉區(qū)的互鎖13TABLE_LOCK[14]={ROB_IN 102,ROB_OUT 102} ;機器人干涉區(qū)的互鎖14TABLE_LOCK[15]={ROB_IN103,ROB_OUT103};機器人干涉區(qū)的互鎖15TABLE_LOCK[16]={ROB_IN 104,ROB_OUT 104} ;機器人干涉區(qū)的互鎖16
2.Interlock.src源程序文件說明:
①Interlock源程序包含以下子程序:
| 子程序名 | 說明 |
| ANTI_COLLISION | 互鎖程序 |
| STOP_ROB | 互鎖程序中的中斷程序 |
| Msg_Anticoll | 互鎖激活的信息提示程序 |
| SetMsg | 設置信息提示的程序 |
②互鎖程序ANTI_COLLISION(eiLockType:IN,ziLockNum:IN):
| 傳遞參數(shù) | 類型 | 取值 | 說明 |
| eiLockType | E_LOCKTYPE | #ENTER_LOCK_M | 作為主機請求進入干涉區(qū) |
| #ENTER_LOCK_S | 作為從機請求進入干涉區(qū) | ||
| #LEAVE_LOCK | 離開干涉區(qū) | ||
| #CYC_CONTROL | 干涉區(qū)初始化:激活互鎖中斷 | ||
| #RESET_LOCK | 干涉區(qū)初始化:重置輸出信號 | ||
| ziLockNum | INT | 1…16 | 互鎖序號:與TABLE_LOCK相對 |
●#ENTER_LOCK_M程序邏輯:
| 1 | 禁用干涉區(qū)監(jiān)控中斷; |
| 2 |
判斷從站機器人是否已在該干涉區(qū): 1.若該值為真,表示與之對應的機器人不在該干涉區(qū),此時輸出進入干涉區(qū)請求信號假值; 2.若該值為假,則表示與之對應的機器人在該干涉區(qū),此時中間變量nbOK置為假,并提示信息-主機該干涉區(qū)被其他從機器人激活,并等待從站機器人在該干涉區(qū)的信號為真,輸出從站機器人在該干涉區(qū)激活多久的信息;在循環(huán)中等待從站機器人在該干涉區(qū)的信號為真,此時輸出進入干涉區(qū)請求信號; |
| 3 | 激活干涉區(qū)監(jiān)控中斷; |
●#ENTER_LOCK_S程序邏輯:
| 1 | 禁用干涉區(qū)監(jiān)控中斷 |
| 2 |
中間變量nbOK置為假,并提示信息-該干涉區(qū)被主機器人激活,進入循環(huán)判斷,判斷主機器人是否已激活 該干涉區(qū): 若該值為真,輸出進入干涉區(qū)請求信號假值;等待一個時間在判斷判斷主機器人激活該干涉區(qū):如果該值為真,則將中間變量置真,并退出循環(huán);若該值為假,則將輸出進入干涉區(qū)請求信號真值,讓主機器進入干涉區(qū),該從機器人繼續(xù)等待主機器人激活該干涉區(qū)值為真; |
| 3 | 輸出進入干涉區(qū)請求信號假值; |
| 4 | 激活干涉區(qū)監(jiān)控中斷; |
●#LEAVE_LOCK程序邏輯:
| 1 | 如果機器人不在路徑上,則等待機器人在路徑上; |
| 2 | 輸出進入干涉區(qū)請求信號真值; |
●#RESET_LOCK程序邏輯:
| 1 | 等待機器人在路徑上; |
| 2 | 輸出進入干涉區(qū)請求信號真值; |
●#CYC_CONTROL程序邏輯:
| 1 | 定義因互鎖引起的停機中斷; |
| 2 | 關閉中斷; |
| 3 | 定義中斷中的循環(huán)旗幟; |
| 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.初始化干涉監(jiān)控:
ANTI_COLLISION(#CYC_CONTROL,0 )
2.重置并釋放干涉區(qū)信號-依據(jù)自己需求:
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.進入干涉區(qū):
-作為主機器人進入:
ANTI_COLLISION(#ENTER_LOCK_M,3)ANTI_COLLISION(#ENTER_LOCK_M,4) ;三臺機器人同時進入該區(qū)域ANTI_COLLISION(#ENTER_LOCK_M,5)
-作為從機器人進入:
ANTI_COLLISION(#ENTER_LOCK_S,3)ANTI_COLLISION(#ENTER_LOCK_S,4) ;三臺機器人同時進入該區(qū)域ANTI_COLLISION(#ENTER_LOCK_S,5)
復雜的互鎖建議最好由PLC來統(tǒng)一處理;
4.退出干涉區(qū):
ANTI_COLLISION(#LEAVE_LOCK,3)
五.說明:
本文主要講述絕對優(yōu)先干涉區(qū)的設定,此種方法必須區(qū)分主次關系,主機器人獲得絕對的優(yōu)先處理的權(quán)力,而從機器人在遇到主從機器人同時進入干涉區(qū)時,獲得的優(yōu)先級低于主機器人,必須等待主機器人處理完退出干涉區(qū)之后才能進入。
-
機器人
+關注
關注
213文章
31073瀏覽量
222162 -
源代碼
+關注
關注
96文章
2953瀏覽量
70299
原文標題:庫卡機器人編程之干涉區(qū)間
文章出處:【微信號:gh_a8b121171b08,微信公眾號:機器人及PLC自動化應用】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
疆鴻智能EtherCAT牽手DeviceNet庫卡機器人:汽車玻璃產(chǎn)線的無界對話
RK3576機器人核心:三屏異顯+八路攝像頭,重塑機器人交互與感知
小蘿卜機器人的故事
工業(yè)人形機器人價格區(qū)間:賦能智能制造的新選擇
節(jié)卡機器人將攜具身智能成果亮相2025世界機器人大會 面向真實場景多點落地
庫卡機器人編程之干涉區(qū)間
評論