一.干涉的定義
機器人在作業過程中,或者在運行過程中,兩個或兩個以上的機器人同時占有同一區間位置而發生沖突叫干涉。因為干涉可能引起的后果有:
機器人的部件損壞 |
任何因干涉而造成的不良后果,都將為客戶帶來不 可估計的損失! |
機器人程序混亂 | |
加工中的工件損壞 | |
周邊其他設備設施的損壞 |
二.干涉區間
同一工位的機器人,在工作過程中,需要進入到同一個區域,但在進入的先后次序無嚴格的限定,一臺機器人(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)
五.說明:
本文主要講述絕對優先干涉區的設定,此種方法必須區分主次關系,主機器人獲得絕對的優先處理的權力,而從機器人在遇到主從機器人同時進入干涉區時,獲得的優先級低于主機器人,必須等待主機器人處理完退出干涉區之后才能進入。
-
機器人
+關注
關注
213文章
29706瀏覽量
212623 -
源代碼
+關注
關注
96文章
2953瀏覽量
68288
原文標題:庫卡機器人編程之干涉區間
文章出處:【微信號:gh_a8b121171b08,微信公眾號:機器人及PLC自動化應用】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
當機器人遇上“語言障礙”:CCLINKIE轉Profinet的“破冰外掛”來啦\\!
盤點#機器人開發平臺
【「# ROS 2智能機器人開發實踐」閱讀體驗】機器人入門的引路書
使用 Thonny 對 XRP 機器人進行編程

【「具身智能機器人系統」閱讀體驗】2.具身智能機器人大模型
焊接機器人編程技巧與注意事項
節卡機器人發布JAKA MAX系列新品
里程碑!節卡機器人榮膺SGS最新版安全性能認證——國際領先的安全功能認證項目

工業機器人編程流程及注意事項
工業機器人的四種編程(示教編程、離線編程、自增強現實編程主編程)剖析!

庫卡機器人獲TüV萊茵北美cTUVus及CE指令符合性證書

世界機器人大會這些趨勢值得關注:機器人邁入中高端應用場景,看節卡機器人如何做?

評論