「絕對乾貨」ABB機器人程式設計技巧!
本文來自於微公號:工業機器人培訓。
1) 如果有下圖兩個產品,已經完成了右邊產品軌跡,左邊產品估計一樣,如何快速生成左邊軌跡(左邊產品可能有平移和旋轉)
2)完成右邊軌跡示教Path_30,如上圖。起點為Target_20。
3) 完成左邊起點的示教,為Target_ref_start,如下圖。
注:如果左邊產品軌跡有旋轉,示教的Target_ref_start相對於左邊產品的姿態要和Target_20相對於右邊產品的姿態一致(此處左邊產品旋轉了30°,示教的角度z方向也旋轉了30°)
4) 插入指令如下
MoveJ pHome,v1000,z100,tWeldGunWObj:=wobj0;//移動到Home位置
Path_30;//運行右邊產品軌跡
MoveJpHome,v1000,z100,tWeldGunWObj:=wobj0;//回到Home
MoveJTarget_ref_start,v1000,fine,tWeldGunWObj:=wobj0;//走到左邊產品起點
ConfJOff;//因為使用偏移,關閉軸配置監控,否則有可能使用原配置參數導致位置走不到而報錯 ConfLOff; //因為使用偏移,
PDispOnRot,Target_20,tWeldGun;//設定當前位置和Target_20的偏差關係(包括平移和旋轉),因為此時機器人停在Target_ref_start起點,即設定左邊軌跡和右邊軌跡的整體偏移關係。使用ot表示平移和旋轉均計算。如果不使用ot,則只使用平移,旋轉不計算
Path_30;//運行原有軌跡,此時軌跡參考座標移動關係,機器人實際走左邊產品軌跡
PDispOff;//軌跡完成,關閉平移關係
MoveJ pHome,v1000,z100,tWeldGunWObj:=wobj0;
2. 單工位元多次預約程式
1) 機器人有程式如下。
2)
3) 工藝過程如下:
機器人在home等待。有人按過di信號,機器人開始執行。人工可以一次性多次預約,即如果人工一次性按過3次,機器人執行三次
4) 我們通過中斷來實現。
5) 中斷的意義為,機器人後臺在不斷掃描(類似PLC),和機器人前臺運動不衝突。
6) 新建一個例行程式,取名tr_1,注意:類型選中斷(trap)
7) 進入中斷程式,插入指令如下,即當機器人執行中斷程式時,給reg1記錄次數加1
8) 進入主程序,設置中斷及對應的io信號
37行的意思是,任何時候di_1信號0變1,就會觸發執行tr_1中斷程式,即置flag1為true
35-37行程式只要運行過一遍即可,類似於設置開關,不需要反復運行
9) 主要程式如下。即如果reg1=0,機器人在home等待
更多視頻講解,也可登錄 www.gkbpx.com
3. 在robotstudio創建兩台機器人的socket連接
1)什麼是socket通訊?
就是TCP/IP通訊,無協定,在微軟環境下稱為socket
2)socket通訊能幹什麼?
可以收發制定的資料,包括sting字串,byte陣列等
3)創建socket機器人需要什麼選項?
機器人需要616-1 PC-INTERFACE選項
4)socket通訊網線插哪個網口?
Service口(IP固定:192.168.125.1)或者Wan口都可以,(可以自己設置)
5)創建client端的實例
通常機器人和相機通訊,機器人作為client端。
1)新建一個機器人系統,注意建立系統時加入pc-interface選項
4)插入建立連接SocketConnect,後面需要制定Server的ip和埠,如果是在電腦和另一台虛擬控制器連接,ip設為“127.0.0.1”,埠自訂,建議不要用默認的1025.
這一步作用為機器人會和server建立連接,如果沒有建立成功會一直等待,如果成功則往下執行
6)接下去可以收發資料,此處示例為client先發送資料給server,再接受server發送回來的資料
7)SocketSend後面可以發送string或者byte陣列,具體可以選擇不同可選變數
8)發送完畢後,client接受到server發回的資料並寫屏
6)以下為server端示例
1)重新創建一個工作站,創建時不要忘記添加pcinterface選項
2)作為server,機器人需要創建2個socketdev變數
3)為了避免之前的連接沒有關閉,同樣建議先socketclose
4)
6)SocketBind為綁定socket要監控的ip和埠,如果是虛擬模擬,ip為127.0.0.1,埠自訂(和client端設置一致)
7)SocketListen為機器人server監聽是否有client連接
8)socketAccept為接受client的連接
9)建立連接後,機器人就可以執行閉環,即一直處於收發狀態
10) 之前client程式為client先發後收,故這裡server先收後發
7)client和server都寫完後,可以運行,注意先運行server端,即server機器人處於監聽狀態,如果連上,兩台相互通訊,效果如下
8)server機器人收到的訊息如下:
9) client機器人收到的訊息如下:
4. ABB機器人雙工位元預約程式
1) 有如下雙工位生產
2) 工藝過程如下:
人工完成1#工位元上料後按按鈕di_1(按鈕不帶保持,即人手鬆開信號為0))機器人焊接1#工位。
此過程中人工對2#工位元上下料,完成後按di_2完成預約(即不需要等機器人完成1#工作)。
機器人完成1#工作後,由於收到過di_2預約信號,機器人自動去完成2#工位
3) 我們通過中斷來實現。
4) 中斷的意義為,機器人後臺在不斷掃描(類似PLC),和機器人前臺運動不衝突。後臺即時掃描到信號就會去執行設定的中斷程式,中斷程式裡沒有運動指令,前臺機器人不停,不影響運動
5) 新建一個例行程式,取名tr_1,注意:類型選中斷(trap)
6) 進入中斷程式,插入指令如下,即當機器人執行中斷程式時,給bool量置true
同理設置第二個中斷程式
7) 進入主程序,設置中斷及對應的io信號
37行的意思是,任何時候di_1信號0變1,就會觸發執行tr_1中斷程式,即置flag1為true
35-40行程式只要運行過一遍即可,類似於設置開關,不需要反復運行
8)主要程式如下。即如果沒有人給di信號,機器人就在home位等待。
9)
5. 與相機通訊的Socket收發資料處理與提取
1)相機通常發送字串給機器人,比如”1.23,4.56,7.89D”,即x為1.23,y為4.56,z的角度為7.89,用D作為結束符,資料之間用“,”隔開。
2)如果機器人收到上述字串,如何把字串提取出來並付給變數deltaX,deltaY,和thetaZ?
3)建立若干num變數,用以存儲過程資料,比如StartBit1,表示x的資料從第幾位元開始,Endbit1表示x的資料結束是第幾位元,Lenbit1表示x資料的長度,s1表示提取的x的值的字串
4)
5)先假設x的第一位是1,給Startbit1賦值為1
6)插入函數strfind,查找第一個“,”在第幾位,得到EndBit1值
7)
8)EndBit1減去StartBit1就是x的資料長度
9)同理得到y和theta的資訊
10)通過StrPart函數,提取從StartBit1開始到LenBit1結束的字串,即x的值的字串
11)
12) 同理得到y和z的字串
13)通過StrToVal函數,把s1轉為num型,付給delta_x, StrToVal函數的回饋值為bool量,即轉換成功為true不成功為false
14)同理得到delta_y和delta_theta
15) 成功後可以寫屏測試,如下圖
6. ABB機器人如何創建陣列
1)什麼是陣列?
將相同資料類型的元素按一定順序排列的集合
2)有什麼用?
比如創建一個robtarget類型的陣列p_array,p_array裡有10個點位,走完10個位置就可以用如下代碼,方便簡潔
FOR i FROM 1 TO 10 DO
MoveL p_array{i},v500,z1,tool0;
ENDFOR
3)哪些資料類型能創建陣列
所有資料類型都可以創建陣列
4)陣列最大幾維?
ABB機器人陣列最大三維!
5)陣列起始序號是0還是1?
是1
6)如何創建
1)程式資料
3)新建,設置名稱,維數(這裡舉例1維),每個維度的元素數量(舉例為10)
7. ABB機器人創建自訂資料類型
1)什麼是資料類型?
諸如robtarget,jointtarget等,把一系列相關元素集合在一起,類似結構體
2)如何查看系統的資料類型
Robotstudio的指令功能資料類型
3)ABB機器人是否可以自訂資料類型?
可以
4)如何創建自訂資料類型
必須在創建在模組的最前面,使用關鍵字RECORD 和ENDRECORD
5)舉例如下:
定義了一種資料類型叫student,裡面包括性別(bool量),班級(num),分數。分數又是一個自訂資料類型,具體內容包括語文和數學分數。
6)可以在程式資料裡查看到這個自訂的資料類型student
7)可以新建一個變數,類型為student,可以對內容設置
8)也可以在示教器進行賦值,類似p10.trans.x
8. ABB機器人資料存儲類型區別
CONST VAR PERS 區別
1)ABB機器人任何資料都有存儲類型,分為常量CONST,變數VAR和可變數PERS
2)常量CONST,即程式內不能賦值
3)變數和可變數程式都能賦值,區別如下
變數-有初值和當前值。在執行打開程式,移動指標到main,移動指標到routine時,變數的當前值會被初始化,即值變為初值
可變數,只有當前值。即任何時候做了修改,其值就修改了。在執行打開程式,移動指標到main,移動指標到routine時,值就是當前值,不會發生變化
4)預設插入的robtarget的存儲類型是const,即常量,此時無法賦值(如下圖,即使類型選到robtarget還是不顯示已經建立的robtarget)
此時,到程式資料,找到這個資料,編輯-更改申明,修改為變數
9. 創建帶參數例行程式
1)什麼是參數例行程式?
例行程式可以輸入參數,使用的時候看起來就像自訂指令
2)有什麼用?
方便使用,用戶不用關心內部實現過程
3)如何創建
1)新建例行程式
2)設置名稱,點擊參數,設置輸入參數
3)添加參數,注意右邊的資料類型即為該參數資料類型,此處舉例輸入為2個robtarget
4)點擊確定。
5)程式內部根據自己需要添加內容
6)帶參數例行程式不能直接使用,必須有人調用,且輸入參數,如下
PROCRoutine2()
pknpl pHome,Target_10;
ENDPROC
PROCpknpl(robtarget pick_pos,robtarget place_pos)
MoveJoffs(pick_pos,0,0,30),v500,z1,tool0;
MoveL pick_pos,v500,fine,tool0;
Set do1;
MoveLoffs(pick_pos,0,0,30),v500,z1,tool0;
MoveJoffs(place_pos,0,0,30),v500,z1,tool0;
MoveL place_pos,v500,fine,tool0;
ReSet do1;
MoveL offs(place_pos,0,0,30),v500,z1,tool0;
ENDPROC
10. ABB機器人創建碼垛程式
1)什麼是碼垛?
有規律的移動機器人進行抓取及放置
2)如何簡便碼垛程式
設置好工件坐標系,工具,對第一個碼垛放置點進行示教,xyz方向的間距和個數可設
3)如何創建
創建m_pallet模組
建立兩個routine
在init 程式裡,設置xyz方向個數和各方向間距
在p_main程式裡,創建機器人移動到pHome點,pPick位置(抓取位置),以及第一個放置點pPlace_ini
通過三層for迴圈,進行碼垛。實例程式為先x方向,再y方向,再z方向
其中偏移如下:
pPlace:=offs(pPlace_ini,(i-1)*dis_x,(j-1)*dis_y,(k-1)*dis_z);
11. 創建有規律的機器人旋轉Robtarget
1)如果有上圖所示6個產品位置要吸取,如何最快速的創建點位?(純示教?Naive,太體力活了。)
2)如下圖,我們可以發現1號位置和0號位置姿態一樣,1號相對於0號就是一個半徑的偏移,2-6號位置相對於0號也都是一個半徑的偏移,2-6號姿態均朝向圓心。由於圖中為6個,即從2號開始,每個點姿態相對於1號旋轉了60°
3)是不是可以只要示教0號點位置,同時已知半徑(未知的話,自己量一下),就能自動算出其他6個點位置而不用示教了呢?答案當然是可以的!!!
4)由於涉及到坐標系偏移和旋轉,所以要做好Tool和工件坐標系
5)創建工具gripper_dual,假設z方向100,工具的Z方向為工具延伸方向
6)如下圖創建坐標系,圓心在中間,0號到1號方向為X,y如圖。下圖中的工件坐標系Z朝下(滿足右手法則)。這樣創建主要是為了計算方便
7)在workwobject2坐標系,gripper_dual工具下,示教中間產品位置Target_center,此時工具的Z必須垂直於產品平面,即工具的Z朝下。(其實只是要用這個點的姿態和z,這個點的xy都是0,因為這個點在workobject2坐標系處於原點,即xy都是0)
8)設置圓心到第一個產品的距離(即半徑radius),這裡舉例21.45mm
9)我們假設第一個位置叫Target1,則在workobject2坐標系下
Target1:=Target_center;!先讓Target1位置和姿態都等於Target_center
Target1.trans.x:=radius*cos(60*0);!重新計算位置的x
Target1.trans.y:=radius*sin(60*0);!重新計算位置的y
Target1:=RelTool(Target1,0,0,0Rz:=0*60);!得到計算後的位置x和y後,tcp繞著工具的Z旋轉60°。
10)通過上述例子,就得到了Target1位置,注意是在workobject2坐標系下。
11)再配合test等流程,就可以比較簡單的完成6個位置的計算和移動,如下
PROC main()
radius:=21.45;
count1:=1;
WHILEcount1<7 DO
rHome;
cal;
routine1;
count1:=count1+1;
ENDWHILE
ENDPROC
PROC routine1()
MoveJoffs(Target_temp,0,0,-30),v500,z1,gripper_dualWObj:=Workobject_2;
MoveLTarget_temp,v500,z1,gripper_dualWObj:=Workobject_2;
WaitTime 1;
MoveLoffs(Target_temp,0,0,-30),v500,z1,gripper_dualWObj:=Workobject_2;
ENDPROC
PROC cal()
Target_temp:=Target_center;
TEST count1
CASE 1:
Target_temp.trans.x:=radius*cos(60*(count1-1));
Target_temp.trans.y:=radius*sin(60*(count1-1));
Target_temp:=RelTool(Target_temp,0,0,0Rz:=(count1-1)*60);
CASE 2:
Target_temp.trans.x:=radius*cos(60*(count1-1));
Target_temp.trans.y:=radius*sin(60*(count1-1));
Target_temp:=RelTool(Target_temp,0,0,0Rz:=60);
CASE 3:
Target_temp.trans.x:=radius*cos(60*(count1-1));
Target_temp.trans.y:=radius*sin(60*(count1-1));
Target_temp:=RelTool(Target_temp,0,0,0Rz:=120);
CASE 4:
Target_temp.trans.x:=radius*cos(60*(count1-1));
Target_temp.trans.y:=radius*sin(60*(count1-1));
Target_temp:=RelTool(Target_temp,0,0,0Rz:=180);
CASE 5:
Target_temp.trans.x:=radius*cos(60*(count1-1));
Target_temp.trans.y:=radius*sin(60*(count1-1));
Target_temp:=RelTool(Target_temp,0,0,0Rz:=-120);
CASE 6:
Target_temp.trans.x:=radius*cos(60*(count1-1));
Target_temp.trans.y:=radius*sin(60*(count1-1));
Target_temp:=RelTool(Target_temp,0,0,0Rz:=-60);
ENDTEST
ENDPROC
PROC rHome()
MoveJpHome,v500,z1,gripper_dualWObj:=wobj0;
ENDPROC
12. Fine與z0的區別
1)什麼是zonedata?
機器人轉彎半徑,即機器人在運行兩句運動指令時,若設置了轉彎半徑,機器人會平滑的過渡,轉彎半徑意義為,機器人進入到設置點半徑內的位置,機器人開始過渡
2)什麼是fine?
如果要準確到達一個位置,使用fine
3)z0和fine的區別?
軌跡上,z0和fine類似。但fine除了準確到達,還有一個阻止程式預讀的功能
圖1 21行使用z0
機器人運行的時候,示教器有2個圖示,一個是左側的箭頭,表示程式已經讀取到哪一行,還有一個是機器人圖示,表示機器人實際在走哪一行。為了要實現平滑過渡等功能,機器人要預讀幾行代碼。
如果使用了圖1的z0,機器人在走第21行,程式已經執行到23行,即機器人還沒走到位置已經打開do
如果使用了圖2 的fine,機器人在走第21行,程式還在21行,即有了fine,程式指標不會預讀,即機器人走完21行後,才會執行打開do。
類似於設置開關,不需要反復運行
9) 主要程式如下。即如果reg1=0,機器人在home等待
更多視頻講解,也可登錄 www.gkbpx.com
3. 在robotstudio創建兩台機器人的socket連接
1)什麼是socket通訊?
就是TCP/IP通訊,無協定,在微軟環境下稱為socket
2)socket通訊能幹什麼?
可以收發制定的資料,包括sting字串,byte陣列等
3)創建socket機器人需要什麼選項?
機器人需要616-1 PC-INTERFACE選項
4)socket通訊網線插哪個網口?
Service口(IP固定:192.168.125.1)或者Wan口都可以,(可以自己設置)
5)創建client端的實例
通常機器人和相機通訊,機器人作為client端。
1)新建一個機器人系統,注意建立系統時加入pc-interface選項
4)插入建立連接SocketConnect,後面需要制定Server的ip和埠,如果是在電腦和另一台虛擬控制器連接,ip設為“127.0.0.1”,埠自訂,建議不要用默認的1025.
這一步作用為機器人會和server建立連接,如果沒有建立成功會一直等待,如果成功則往下執行
6)接下去可以收發資料,此處示例為client先發送資料給server,再接受server發送回來的資料
7)SocketSend後面可以發送string或者byte陣列,具體可以選擇不同可選變數
8)發送完畢後,client接受到server發回的資料並寫屏
6)以下為server端示例
1)重新創建一個工作站,創建時不要忘記添加pcinterface選項
2)作為server,機器人需要創建2個socketdev變數
3)為了避免之前的連接沒有關閉,同樣建議先socketclose
4)
6)SocketBind為綁定socket要監控的ip和埠,如果是虛擬模擬,ip為127.0.0.1,埠自訂(和client端設置一致)
7)SocketListen為機器人server監聽是否有client連接
8)socketAccept為接受client的連接
9)建立連接後,機器人就可以執行閉環,即一直處於收發狀態
10) 之前client程式為client先發後收,故這裡server先收後發
7)client和server都寫完後,可以運行,注意先運行server端,即server機器人處於監聽狀態,如果連上,兩台相互通訊,效果如下
8)server機器人收到的訊息如下:
9) client機器人收到的訊息如下:
4. ABB機器人雙工位元預約程式
1) 有如下雙工位生產
2) 工藝過程如下:
人工完成1#工位元上料後按按鈕di_1(按鈕不帶保持,即人手鬆開信號為0))機器人焊接1#工位。
此過程中人工對2#工位元上下料,完成後按di_2完成預約(即不需要等機器人完成1#工作)。
機器人完成1#工作後,由於收到過di_2預約信號,機器人自動去完成2#工位
3) 我們通過中斷來實現。
4) 中斷的意義為,機器人後臺在不斷掃描(類似PLC),和機器人前臺運動不衝突。後臺即時掃描到信號就會去執行設定的中斷程式,中斷程式裡沒有運動指令,前臺機器人不停,不影響運動
5) 新建一個例行程式,取名tr_1,注意:類型選中斷(trap)
6) 進入中斷程式,插入指令如下,即當機器人執行中斷程式時,給bool量置true
同理設置第二個中斷程式
7) 進入主程序,設置中斷及對應的io信號
37行的意思是,任何時候di_1信號0變1,就會觸發執行tr_1中斷程式,即置flag1為true
35-40行程式只要運行過一遍即可,類似於設置開關,不需要反復運行
8)主要程式如下。即如果沒有人給di信號,機器人就在home位等待。
9)
5. 與相機通訊的Socket收發資料處理與提取
1)相機通常發送字串給機器人,比如”1.23,4.56,7.89D”,即x為1.23,y為4.56,z的角度為7.89,用D作為結束符,資料之間用“,”隔開。
2)如果機器人收到上述字串,如何把字串提取出來並付給變數deltaX,deltaY,和thetaZ?
3)建立若干num變數,用以存儲過程資料,比如StartBit1,表示x的資料從第幾位元開始,Endbit1表示x的資料結束是第幾位元,Lenbit1表示x資料的長度,s1表示提取的x的值的字串
4)
5)先假設x的第一位是1,給Startbit1賦值為1
6)插入函數strfind,查找第一個“,”在第幾位,得到EndBit1值
7)
8)EndBit1減去StartBit1就是x的資料長度
9)同理得到y和theta的資訊
10)通過StrPart函數,提取從StartBit1開始到LenBit1結束的字串,即x的值的字串
11)
12) 同理得到y和z的字串
13)通過StrToVal函數,把s1轉為num型,付給delta_x, StrToVal函數的回饋值為bool量,即轉換成功為true不成功為false
14)同理得到delta_y和delta_theta
15) 成功後可以寫屏測試,如下圖
6. ABB機器人如何創建陣列
1)什麼是陣列?
將相同資料類型的元素按一定順序排列的集合
2)有什麼用?
比如創建一個robtarget類型的陣列p_array,p_array裡有10個點位,走完10個位置就可以用如下代碼,方便簡潔
FOR i FROM 1 TO 10 DO
MoveL p_array{i},v500,z1,tool0;
ENDFOR
3)哪些資料類型能創建陣列
所有資料類型都可以創建陣列
4)陣列最大幾維?
ABB機器人陣列最大三維!
5)陣列起始序號是0還是1?
是1
6)如何創建
1)程式資料
3)新建,設置名稱,維數(這裡舉例1維),每個維度的元素數量(舉例為10)
7. ABB機器人創建自訂資料類型
1)什麼是資料類型?
諸如robtarget,jointtarget等,把一系列相關元素集合在一起,類似結構體
2)如何查看系統的資料類型
Robotstudio的指令功能資料類型
3)ABB機器人是否可以自訂資料類型?
可以
4)如何創建自訂資料類型
必須在創建在模組的最前面,使用關鍵字RECORD 和ENDRECORD
5)舉例如下:
定義了一種資料類型叫student,裡面包括性別(bool量),班級(num),分數。分數又是一個自訂資料類型,具體內容包括語文和數學分數。
6)可以在程式資料裡查看到這個自訂的資料類型student
7)可以新建一個變數,類型為student,可以對內容設置
8)也可以在示教器進行賦值,類似p10.trans.x
8. ABB機器人資料存儲類型區別
CONST VAR PERS 區別
1)ABB機器人任何資料都有存儲類型,分為常量CONST,變數VAR和可變數PERS
2)常量CONST,即程式內不能賦值
3)變數和可變數程式都能賦值,區別如下
變數-有初值和當前值。在執行打開程式,移動指標到main,移動指標到routine時,變數的當前值會被初始化,即值變為初值
可變數,只有當前值。即任何時候做了修改,其值就修改了。在執行打開程式,移動指標到main,移動指標到routine時,值就是當前值,不會發生變化
4)預設插入的robtarget的存儲類型是const,即常量,此時無法賦值(如下圖,即使類型選到robtarget還是不顯示已經建立的robtarget)
此時,到程式資料,找到這個資料,編輯-更改申明,修改為變數
9. 創建帶參數例行程式
1)什麼是參數例行程式?
例行程式可以輸入參數,使用的時候看起來就像自訂指令
2)有什麼用?
方便使用,用戶不用關心內部實現過程
3)如何創建
1)新建例行程式
2)設置名稱,點擊參數,設置輸入參數
3)添加參數,注意右邊的資料類型即為該參數資料類型,此處舉例輸入為2個robtarget
4)點擊確定。
5)程式內部根據自己需要添加內容
6)帶參數例行程式不能直接使用,必須有人調用,且輸入參數,如下
PROCRoutine2()
pknpl pHome,Target_10;
ENDPROC
PROCpknpl(robtarget pick_pos,robtarget place_pos)
MoveJoffs(pick_pos,0,0,30),v500,z1,tool0;
MoveL pick_pos,v500,fine,tool0;
Set do1;
MoveLoffs(pick_pos,0,0,30),v500,z1,tool0;
MoveJoffs(place_pos,0,0,30),v500,z1,tool0;
MoveL place_pos,v500,fine,tool0;
ReSet do1;
MoveL offs(place_pos,0,0,30),v500,z1,tool0;
ENDPROC
10. ABB機器人創建碼垛程式
1)什麼是碼垛?
有規律的移動機器人進行抓取及放置
2)如何簡便碼垛程式
設置好工件坐標系,工具,對第一個碼垛放置點進行示教,xyz方向的間距和個數可設
3)如何創建
創建m_pallet模組
建立兩個routine
在init 程式裡,設置xyz方向個數和各方向間距
在p_main程式裡,創建機器人移動到pHome點,pPick位置(抓取位置),以及第一個放置點pPlace_ini
通過三層for迴圈,進行碼垛。實例程式為先x方向,再y方向,再z方向
其中偏移如下:
pPlace:=offs(pPlace_ini,(i-1)*dis_x,(j-1)*dis_y,(k-1)*dis_z);
11. 創建有規律的機器人旋轉Robtarget
1)如果有上圖所示6個產品位置要吸取,如何最快速的創建點位?(純示教?Naive,太體力活了。)
2)如下圖,我們可以發現1號位置和0號位置姿態一樣,1號相對於0號就是一個半徑的偏移,2-6號位置相對於0號也都是一個半徑的偏移,2-6號姿態均朝向圓心。由於圖中為6個,即從2號開始,每個點姿態相對於1號旋轉了60°
3)是不是可以只要示教0號點位置,同時已知半徑(未知的話,自己量一下),就能自動算出其他6個點位置而不用示教了呢?答案當然是可以的!!!
4)由於涉及到坐標系偏移和旋轉,所以要做好Tool和工件坐標系
5)創建工具gripper_dual,假設z方向100,工具的Z方向為工具延伸方向
6)如下圖創建坐標系,圓心在中間,0號到1號方向為X,y如圖。下圖中的工件坐標系Z朝下(滿足右手法則)。這樣創建主要是為了計算方便
7)在workwobject2坐標系,gripper_dual工具下,示教中間產品位置Target_center,此時工具的Z必須垂直於產品平面,即工具的Z朝下。(其實只是要用這個點的姿態和z,這個點的xy都是0,因為這個點在workobject2坐標系處於原點,即xy都是0)
8)設置圓心到第一個產品的距離(即半徑radius),這裡舉例21.45mm
9)我們假設第一個位置叫Target1,則在workobject2坐標系下
Target1:=Target_center;!先讓Target1位置和姿態都等於Target_center
Target1.trans.x:=radius*cos(60*0);!重新計算位置的x
Target1.trans.y:=radius*sin(60*0);!重新計算位置的y
Target1:=RelTool(Target1,0,0,0Rz:=0*60);!得到計算後的位置x和y後,tcp繞著工具的Z旋轉60°。
10)通過上述例子,就得到了Target1位置,注意是在workobject2坐標系下。
11)再配合test等流程,就可以比較簡單的完成6個位置的計算和移動,如下
PROC main()
radius:=21.45;
count1:=1;
WHILEcount1<7 DO
rHome;
cal;
routine1;
count1:=count1+1;
ENDWHILE
ENDPROC
PROC routine1()
MoveJoffs(Target_temp,0,0,-30),v500,z1,gripper_dualWObj:=Workobject_2;
MoveLTarget_temp,v500,z1,gripper_dualWObj:=Workobject_2;
WaitTime 1;
MoveLoffs(Target_temp,0,0,-30),v500,z1,gripper_dualWObj:=Workobject_2;
ENDPROC
PROC cal()
Target_temp:=Target_center;
TEST count1
CASE 1:
Target_temp.trans.x:=radius*cos(60*(count1-1));
Target_temp.trans.y:=radius*sin(60*(count1-1));
Target_temp:=RelTool(Target_temp,0,0,0Rz:=(count1-1)*60);
CASE 2:
Target_temp.trans.x:=radius*cos(60*(count1-1));
Target_temp.trans.y:=radius*sin(60*(count1-1));
Target_temp:=RelTool(Target_temp,0,0,0Rz:=60);
CASE 3:
Target_temp.trans.x:=radius*cos(60*(count1-1));
Target_temp.trans.y:=radius*sin(60*(count1-1));
Target_temp:=RelTool(Target_temp,0,0,0Rz:=120);
CASE 4:
Target_temp.trans.x:=radius*cos(60*(count1-1));
Target_temp.trans.y:=radius*sin(60*(count1-1));
Target_temp:=RelTool(Target_temp,0,0,0Rz:=180);
CASE 5:
Target_temp.trans.x:=radius*cos(60*(count1-1));
Target_temp.trans.y:=radius*sin(60*(count1-1));
Target_temp:=RelTool(Target_temp,0,0,0Rz:=-120);
CASE 6:
Target_temp.trans.x:=radius*cos(60*(count1-1));
Target_temp.trans.y:=radius*sin(60*(count1-1));
Target_temp:=RelTool(Target_temp,0,0,0Rz:=-60);
ENDTEST
ENDPROC
PROC rHome()
MoveJpHome,v500,z1,gripper_dualWObj:=wobj0;
ENDPROC
12. Fine與z0的區別
1)什麼是zonedata?
機器人轉彎半徑,即機器人在運行兩句運動指令時,若設置了轉彎半徑,機器人會平滑的過渡,轉彎半徑意義為,機器人進入到設置點半徑內的位置,機器人開始過渡
2)什麼是fine?
如果要準確到達一個位置,使用fine
3)z0和fine的區別?
軌跡上,z0和fine類似。但fine除了準確到達,還有一個阻止程式預讀的功能
圖1 21行使用z0
機器人運行的時候,示教器有2個圖示,一個是左側的箭頭,表示程式已經讀取到哪一行,還有一個是機器人圖示,表示機器人實際在走哪一行。為了要實現平滑過渡等功能,機器人要預讀幾行代碼。
如果使用了圖1的z0,機器人在走第21行,程式已經執行到23行,即機器人還沒走到位置已經打開do
如果使用了圖2 的fine,機器人在走第21行,程式還在21行,即有了fine,程式指標不會預讀,即機器人走完21行後,才會執行打開do。