網(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機器人的知識,希望能夠幫助到大家!
