pos機器人,ABB機器人碼垛程序詳解

 新聞資訊  |   2023-04-23 13:46  |  投稿人:pos機之家

網(wǎng)上有很多關于pos機器人,ABB機器人碼垛程序詳解的知識,也有很多人為大家解答關于pos機器人的問題,今天pos機之家(m.dsth100338.com)為大家整理了關于這方面的知識,讓我們一起來看下吧!

本文目錄一覽:

1、pos機器人

pos機器人

項目要求產(chǎn)生這樣的效果:產(chǎn)品在輸送鏈末端,隨著輸送鏈的運動而運動,并且當產(chǎn)品運動到輸送鏈末端時自動停止。此時機器人通過安裝在法蘭盤末端的夾具夾取產(chǎn)品,放置在垛盤上。然后機器人回到初始位置等待下一個產(chǎn)品的到來,繼續(xù)進行抓取放置在垛盤上。

程序解析如下:

MODULE MainMoudle

程序模塊

PERS wobjdata WobjPallet_L:=[FALSE,TRUE,"",[[-456.216,-2058.49,-233.373],[1,0,0,0]],[[0,0,0],[1,0,0,0]]];

定義左碼盤工件坐標系

PERS wobjdata WobjPallet_R:=[FALSE,TRUE,"",[[-421.764,1102.39,-233.373],[1,0,0,0]],[[0,0,0],[1,0,0,0]]];

定義右碼盤工件坐標系

PERS tooldata tGripper:=[TRUE,[[0,0,527],[1,0,0,0]],[1,[0,0,100],[1,0,0,0],0,0,0]];

定義工具坐標系數(shù)據(jù)

PERS loaddata LoadFull:=[20,[0,0,300],[1,0,0,0],0,0,0.1];

定義載荷數(shù)據(jù)

PERS wobjdata CurWobj;

定義工具坐標系數(shù)據(jù)

PERS jointtarget jposHome:=[[0,0,0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];

定義關節(jié)點數(shù)據(jù),各關節(jié)軸數(shù)據(jù)為零,用于手動將機器人運動到各關節(jié)機械零位

CONST robtarget pPlaceBase0_L:=[[296.473529255,212.21064316,3.210904169],[0,0.70711295,-0.707100612,0],[-2,0,-3,0],[9E9,9E9,9E9,9E9,9E9,9E9]];

左碼盤,不旋轉放置基準位置

CONST robtarget pPlaceBase90_L:=[[218.407102669,695.953395421,3.210997808],[0,-0.000001669,1,0],[-2,0,-2,0],[9E9,9E9,9E9,9E9,9E9,9E9]];

左碼盤,旋轉90°放置基準位置

CONST robtarget pPlaceBase0_R:=[[296.473529255,212.21064316,3.210904169],[0,0.707221603,-0.70699194,0],[1,0,0,0],[9E9,9E9,9E9,9E9,9E9,9E9]];

右碼盤,不旋轉放置基準位置

CONST robtarget pPlaceBase90_R:=[[218.407102669,695.953395421,3.210997808],[0,-0.00038594,0.999999926,0],[1,0,1,0],[9E9,9E9,9E9,9E9,9E9,9E9]];

右碼盤,旋轉90°放置基準位置

CONST robtarget pPick_L:=[[1627.550991372,-426.974661352,-26.736921885],[0,0.707109873,-0.707103689,0],[-1,0,-2,0],[9E9,9E9,9E9,9E9,9E9,9E9]];

左碼盤,抓取位置

CONST robtarget pPick_R:=[[1611.055992534,442.364097921,-26.736584068],[0,0.707220363,-0.706993181,0],[0,0,-1,0],[9E9,9E9,9E9,9E9,9E9,9E9]];

右碼盤,抓取位置

CONST robtarget pHome:=[[1505.00,-0.00,878.55],[1.28548E-06,0.707107,-0.707107,-1.26441E-06],[0,0,-2,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];

程序起點

PERS robtarget pPlaceBase0;

PERS robtarget pPlaceBase90;

PERS robtarget pPick;

PERS robtarget pPlace;

定義目標點數(shù)據(jù),機器人當前使用的目標點

PERS robtarget pPickSafe;安全高度

PERS num nCycleTime:=3.332; 定義數(shù)字型數(shù)據(jù),用于存儲單次節(jié)拍的時間

PERS num nCount_L:=1;左碼盤,定義數(shù)字型數(shù)據(jù),用于計數(shù)

PERS num nCount_R:=1;右碼盤,定義數(shù)字型數(shù)據(jù),用于計數(shù)

PERS num nPallet:=1;定義數(shù)字型數(shù)據(jù),利用TEST指令判斷,當其為1,進行碼垛

PERS num nPalletNo:=2;定義數(shù)字型數(shù)據(jù),利用TEST指令判斷,當其為2,進行碼垛

PERS num nPickH:=300;定義數(shù)字型數(shù)據(jù),抓取時的安全高度

PERS num nPlaceH:=400;定義數(shù)字型數(shù)據(jù),放置時的安全高度

PERS num nBoxL:=605;定義數(shù)字型數(shù)據(jù),產(chǎn)品的長

PERS num nBoxW:=405;定義數(shù)字型數(shù)據(jù),產(chǎn)品的寬

PERS num nBoxH:=300;定義數(shù)字型數(shù)據(jù),產(chǎn)品的高

VAR clock Timer1;定義時鐘型數(shù)據(jù),用于計時

PERS bool bReady:=FALSE;定義布爾型數(shù)據(jù),判斷是否滿足碼垛條件

PERS bool bPalletFull_L:=FALSE;定義布爾型數(shù)據(jù),判斷左碼盤是否已滿

PERS bool bPalletFull_R:=TRUE;定義布爾型數(shù)據(jù),判斷右碼盤是否已滿

PERS bool bGetPosition:=TRUE;定義布爾型數(shù)據(jù),判斷是否已計算出當前的取放位置

VAR triggdata HookAct;定義觸發(fā)數(shù)據(jù),夾具上鉤爪的夾緊動作

VAR triggdata HookOff;定義觸發(fā)數(shù)據(jù),夾具上鉤爪的松開動作

VAR intnum iPallet_L;定義中斷型符,左碼垛,復位操作

VAR intnum iPallet_R;定義數(shù)字型數(shù)據(jù),右碼垛,復位操作

PERS speeddata vMinEmpty:=[2000,400,6000,1000];

PERS speeddata vMidEmpty:=[3000,400,6000,1000];

PERS speeddata vMaxEmpty:=[5000,500,6000,1000];

PERS speeddata vMinLoad:=[1000,200,6000,1000];

PERS speeddata vMidLoad:=[2500,500,6000,1000];

PERS speeddata vMaxLoad:=[4000,500,6000,1000];

定義多種速度數(shù)據(jù),分別對應空載時的高、中、低速和滿載時的高、中、低速,便于對各個動作進行速度控制

PERS num Compensation{15,3}:=[[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0]];

定義,二維數(shù)組,用于各擺放位置的偏差調整;15組數(shù)據(jù),對應15個擺放位置,每組數(shù)據(jù)3個數(shù)值,對應xyz的偏差值

PROC main()

主程序

rInitAll;

調用初始化子程序、包括復位、復位程序數(shù)據(jù)、初始化中斷

WHILE TRUE DO

IF bReady THEN

rPick;

調用抓取程序

rPlace;

調用放置程序

ENDIF

rCycleCheck;

調用循環(huán)檢測程序

ENDWHILE

ENDPROC

PROC rInitAll()

初始化程序

rCheckHomePos;

ConfL\\OFF;

ConfJ\\OFF;

nCount_R:=1;

nPallet:=1;

nPalletNo:=1;

bPalletFull_R:=FALSE;

bGetPosition:=FALSE;

Reset do00_ClampAct;

Reset do01_HookAct;

ClkStop Timer1;

ClkReset Timer1;

TriggEquip HookAct,100,0.1\\DOp:=do01_HookAct,1;

TriggEquip HookOff,100\\Start,0.1\\DOp:=do01_HookAct,0;

IDelete iPallet_R;

CONNECT iPallet_R WITH tEjectPallet_R;

ISignalDI di03_PalletInPos_R,0,iPallet_R;

ENDPROC

PROC rPick()

抓取程序

ClkReset Timer1;

ClkStart Timer1;

rCalPosition;

MoveJ Offs(pPick,0,0,nPickH),vMaxEmpty,z50,tGripper\\WObj:=wobj0;

MoveL pPick,vMinLoad,fine,tGripper\\WObj:=wobj0;

Set do00_ClampAct;

Waittime 0.3;

GripLoad LoadFull;

TriggL Offs(pPick,0,0,nPickH),vMinLoad,HookAct,z50,tGripper\\WObj:=wobj0;

MoveL pPickSafe,vMaxLoad,z100,tGripper\\WObj:=wobj0;

ENDPROC

PROC rPlace()

放置程序

MoveJ Offs(pPlace,0,0,nPlaceH),vMaxLoad,z50,tGripper\\WObj:=CurWobj;

TriggL pPlace,vMinLoad,HookOff,fine,tGripper\\WObj:=CurWobj;

Reset do00_ClampAct;

Waittime 0.3;

GripLoad Load0;

MoveL Offs(pPlace,0,0,nPlaceH),vMinEmpty,z50,tGripper\\WObj:=CurWobj;

rPlaceRD;

MoveJ pPickSafe,vMaxEmpty,z50,tGripper\\WObj:=wobj0;

ClkStop Timer1;

nCycleTime:=ClkRead(Timer1);

ENDPROC

PROC rCycleCheck()

周期循環(huán)檢查

TPErase;

TPWrite "The Robot is running!";

TPWrite "Last cycle time is : "\\Num:=nCycleTime;

TPWrite "The number of the Boxes in the Right pallet is:"\\Num:=nCount_R-1;

IF (bPalletFull_R=FALSE AND di03_PalletInPos_R=1 AND di01_BoxInPos_R=1) THEN

bReady:=TRUE;

ELSE

bReady:=FALSE;

WaitTime 0.1;

ENDIF

ENDPROC

PROC rCalPosition()

計算位置程序

bGetPosition:=FALSE;

WHILE bGetPosition=FALSE DO

IF bPalletFull_R=FALSE AND di03_PalletInPos_R=1 AND di01_BoxInPos_R=1 THEN

pPick:=pPick_R;

pPlaceBase0:=pPlaceBase0_R;

pPlaceBase90:=pPlaceBase90_R;

CurWobj:=WobjPallet_R;

pPlace:=pPattern(nCount_R);

bGetPosition:=TRUE;

nPalletNo:=2;

ELSE

bGetPosition:=FALSE;

ENDIF

ULT:

TPERASE;

TPWRITE "The data \'nPallet\' is error,please check it!";

ENDWHILE

ENDPROC

FUNC robtarget pPattern(num nCount)

計算擺放位置功能程序,此程序為帶參數(shù)的例行程序

VAR robtarget pTarget;

IF nCount>=1 AND nCount<=5 THEN

ELSEIF nCount>=6 AND nCount<=10 THEN

pPickSafe:=Offs(pPick,0,0,600);

ELSEIF nCount>=11 AND nCount<=15 THEN

pPickSafe:=Offs(pPick,0,0,800);

ENDIF

TEST nCount

CASE 1:

pTarget.trans.x:=pPlaceBase0.trans.x;

pTarget.trans.y:=pPlaceBase0.trans.y;

pTarget.trans.z:=pPlaceBase0.trans.z;

pTarget.rot:=pPlaceBase0.rot;

pTarget.robconf:=pPlaceBase0.robconf;

pTarget:=Offs(pTarget,Compensation{nCount,1},Compensation{nCount,2},Compensation{nCount,3});

CASE 2:

pTarget.trans.x:=pPlaceBase0.trans.x+nBoxL;

pTarget.trans.y:=pPlaceBase0.trans.y;

pTarget.trans.z:=pPlaceBase0.trans.z;

pTarget.rot:=pPlaceBase0.rot;

pTarget.robconf:=pPlaceBase0.robconf;

pTarget:=Offs(pTarget,Compensation{nCount,1},Compensation{nCount,2},Compensation{nCount,3});

CASE 3:

pTarget.trans.x:=pPlaceBase90.trans.x;

pTarget.trans.y:=pPlaceBase90.trans.y;

pTarget.trans.z:=pPlaceBase90.trans.z;

pTarget.rot:=pPlaceBase90.rot;

pTarget.robconf:=pPlaceBase90.robconf;

pTarget:=Offs(pTarget,Compensation{nCount,1},Compensation{nCount,2},Compensation{nCount,3});

CASE 4:

pTarget.trans.x:=pPlaceBase90.trans.x+nBoxW;

pTarget.trans.y:=pPlaceBase90.trans.y;

pTarget.trans.z:=pPlaceBase90.trans.z;

pTarget.rot:=pPlaceBase90.rot;

pTarget.robconf:=pPlaceBase90.robconf;

pTarget:=Offs(pTarget,Compensation{nCount,1},Compensation{nCount,2},Compensation{nCount,3});

CASE 5:

pTarget.trans.x:=pPlaceBase90.trans.x+2*nBoxW;

pTarget.trans.y:=pPlaceBase90.trans.y;

pTarget.trans.z:=pPlaceBase90.trans.z;

pTarget.rot:=pPlaceBase90.rot;

pTarget.robconf:=pPlaceBase90.robconf;

pTarget:=Offs(pTarget,Compensation{nCount,1},Compensation{nCount,2},Compensation{nCount,3});

CASE 6:

pTarget.trans.x:=pPlaceBase0.trans.x;

pTarget.trans.y:=pPlaceBase0.trans.y+nBoxL;

pTarget.trans.z:=pPlaceBase0.trans.z+nBoxH;

pTarget.rot:=pPlaceBase0.rot;

pTarget.robconf:=pPlaceBase0.robconf;

pTarget:=Offs(pTarget,Compensation{nCount,1},Compensation{nCount,2},Compensation{nCount,3});

CASE 7:

pTarget.trans.x:=pPlaceBase0.trans.x+nBoxL;

pTarget.trans.y:=pPlaceBase0.trans.y+nBoxL;

pTarget.trans.z:=pPlaceBase0.trans.z+nBoxH;

pTarget.rot:=pPlaceBase0.rot;

pTarget.robconf:=pPlaceBase0.robconf;

pTarget:=Offs(pTarget,Compensation{nCount,1},Compensation{nCount,2},Compensation{nCount,3});

CASE 8:

pTarget.trans.x:=pPlaceBase90.trans.x;

pTarget.trans.y:=pPlaceBase90.trans.y-nBoxW;

pTarget.trans.z:=pPlaceBase90.trans.z+nBoxH;

pTarget.rot:=pPlaceBase90.rot;

pTarget.robconf:=pPlaceBase90.robconf;

pTarget:=Offs(pTarget,Compensation{nCount,1},Compensation{nCount,2},Compensation{nCount,3});

CASE 9:

pTarget.trans.x:=pPlaceBase90.trans.x+nBoxW;

pTarget.trans.y:=pPlaceBase90.trans.y-nBoxW;

pTarget.trans.z:=pPlaceBase90.trans.z+nBoxH;

pTarget.rot:=pPlaceBase90.rot;

pTarget.robconf:=pPlaceBase90.robconf;

pTarget:=Offs(pTarget,Compensation{nCount,1},Compensation{nCount,2},Compensation{nCount,3});

CASE 10:

pTarget.trans.x:=pPlaceBase90.trans.x+2*nBoxW;

pTarget.trans.y:=pPlaceBase90.trans.y-nBoxW;

pTarget.trans.z:=pPlaceBase90.trans.z+nBoxH;

pTarget.rot:=pPlaceBase90.rot;

pTarget.robconf:=pPlaceBase90.robconf;

pTarget:=Offs(pTarget,Compensation{nCount,1},Compensation{nCount,2},Compensation{nCount,3});

CASE 11:

pTarget.trans.x:=pPlaceBase0.trans.x;

pTarget.trans.y:=pPlaceBase0.trans.y;

pTarget.trans.z:=pPlaceBase0.trans.z+2*nBoxH;

pTarget.rot:=pPlaceBase0.rot;

pTarget.robconf:=pPlaceBase0.robconf;

pTarget:=Offs(pTarget,Compensation{nCount,1},Compensation{nCount,2},Compensation{nCount,3});

CASE 12:

pTarget.trans.x:=pPlaceBase0.trans.x+nBoxL;

pTarget.trans.y:=pPlaceBase0.trans.y;

pTarget.trans.z:=pPlaceBase0.trans.z+2*nBoxH;

pTarget.rot:=pPlaceBase0.rot;

pTarget.robconf:=pPlaceBase0.robconf;

pTarget:=Offs(pTarget,Compensation{nCount,1},Compensation{nCount,2},Compensation{nCount,3});

CASE 13:

pTarget.trans.x:=pPlaceBase90.trans.x;

pTarget.trans.y:=pPlaceBase90.trans.y;

pTarget.trans.z:=pPlaceBase90.trans.z+2*nBoxH;

pTarget.rot:=pPlaceBase90.rot;

pTarget.robconf:=pPlaceBase90.robconf;

pTarget:=Offs(pTarget,Compensation{nCount,1},Compensation{nCount,2},Compensation{nCount,3});

CASE 14:

pTarget.trans.x:=pPlaceBase90.trans.x+nBoxW;

pTarget.trans.y:=pPlaceBase90.trans.y;

pTarget.trans.z:=pPlaceBase90.trans.z+2*nBoxH;

pTarget.rot:=pPlaceBase90.rot;

pTarget.robconf:=pPlaceBase90.robconf;

pTarget:=Offs(pTarget,Compensation{nCount,1},Compensation{nCount,2},Compensation{nCount,3});

CASE 15:

pTarget.trans.x:=pPlaceBase90.trans.x+2*nBoxW;

pTarget.trans.y:=pPlaceBase90.trans.y;

pTarget.trans.z:=pPlaceBase90.trans.z+2*nBoxH;

pTarget.rot:=pPlaceBase90.rot;

pTarget.robconf:=pPlaceBase90.robconf;

pTarget:=Offs(pTarget,Compensation{nCount,1},Compensation{nCount,2},Compensation{nCount,3});

DEFAULT:

TPErase;

TPWrite "The data \'nCount\' is error,please check it !";

stop;

ENDTEST

Return pTarget;

ENDFUNC

PROC rPlaceRD()

碼垛產(chǎn)品計數(shù)程序

TEST nPalletNo

CASE 1:

Incr nCount_L;

IF nCount_L>15 THEN

Set do02_PalletFull_L;

bPalletFull_L:=TRUE;

nCount_L:=1;

ENDIF

CASE 2:

Incr nCount_R;

IF nCount_R>15 THEN

Set do03_PalletFull_R;

bPalletFull_R:=TRUE;

nCount_R:=1;

ENDIF

DEFAULT:

TPERASE;

TPWRITE "The data \'nPalletNo\' is error,please check it!";

Stop;

ENDTEST

ENDPROC

PROC rCheckHomePos()

檢測機器人是否在Home

VAR robtarget pActualPos;

IF NOT CurrentPos(pHome,tGripper) THEN

pActualpos:=CRobT(\\Tool:=tGripper\\WObj:=wobj0);

pActualpos.trans.z:=pHome.trans.z;

MoveL pActualpos,v500,z10,tGripper;

MoveJ pHome,v1000,fine,tGripper;

ENDIF

ENDPROC

FUNC bool CurrentPos(robtarget ComparePos,INOUT tooldata TCP)

比較機器人的位置是否在給定目標點的偏差范圍內

VAR num Counter:=0;

VAR robtarget ActualPos;

ActualPos:=CRobT(\\Tool:=TCP\\WObj:=wobj0);

IF ActualPos.trans.x>ComparePos.trans.x-25 AND ActualPos.trans.x<ComparePos.trans.x+25 Counter:=Counter+1;

IF ActualPos.trans.y>ComparePos.trans.y-25 AND ActualPos.trans.y<ComparePos.trans.y+25 Counter:=Counter+1;

IF ActualPos.trans.z>ComparePos.trans.z-25 AND ActualPos.trans.z<ComparePos.trans.z+25 Counter:=Counter+1;

IF ActualPos.rot.q1>ComparePos.rot.q1-0.1 AND ActualPos.rot.q1<ComparePos.rot.q1+0.1 Counter:=Counter+1;

IF ActualPos.rot.q2>ComparePos.rot.q2-0.1 AND ActualPos.rot.q2<ComparePos.rot.q2+0.1 Counter:=Counter+1;

IF ActualPos.rot.q3>ComparePos.rot.q3-0.1 AND ActualPos.rot.q3<ComparePos.rot.q3+0.1 Counter:=Counter+1;

IF ActualPos.rot.q4>ComparePos.rot.q4-0.1 AND ActualPos.rot.q4<ComparePos.rot.q4+0.1 Counter:=Counter+1;

RETURN Counter=7;

ENDFUNC

TRAP tEjectPallet_R

Reset do03_PalletFull_R;

bPalletFull_R:=FALSE;

ENDTRAP

PROC rMoveAbsj()

機器人回零。手動將機器人移動至各關節(jié)軸機械零點,在程序運行過程中不調用

MoveAbsJ jposHome\\NoEOffs, v100, fine, tGripper\\WObj:=wobj0;

ENDPROC

PROC rModPos()

MoveL pHome,v100,fine,tGripper\\WObj:=Wobj0;

MoveL pPick_L,v100,fine,tGripper\\WObj:=Wobj0;

MoveL pPick_R,v100,fine,tGripper\\WObj:=Wobj0;

MoveL pPlaceBase0_L,v100,fine,tGripper\\WObj:=WobjPallet_L;

MoveL pPlaceBase90_L,v100,fine,tGripper\\WObj:=WobjPallet_L;

MoveL pPlaceBase0_R,v100,fine,tGripper\\WObj:=WobjPallet_R;

MoveL pPlaceBase90_R,v100,fine,tGripper\\WObj:=WobjPallet_R;

ENDPROC

ENDMODULE

以上就是關于pos機器人,ABB機器人碼垛程序詳解的知識,后面我們會繼續(xù)為大家整理關于pos機器人的知識,希望能夠幫助到大家!

轉發(fā)請帶上網(wǎng)址:http://m.dsth100338.com/news/31831.html

你可能會喜歡:

版權聲明:本文內容由互聯(lián)網(wǎng)用戶自發(fā)貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權/違法違規(guī)的內容, 請發(fā)送郵件至 babsan@163.com 舉報,一經(jīng)查實,本站將立刻刪除。