ABB机器人程序实例ROBOT studio 6.01(附带与工业相机网络通讯实例)
ABB机器人(ROBOT studio 6.01)程序实例MODULE MainModule
PERS tooldata
tGripper:=[TRUE,[[0.533078,1.51617,583.739],[1,0,0,0]],[30,[0,0,50],[1,0,0,0],0,0,0] ];
TASK PERS wobjdata
VisionWobj:=[FALSE,TRUE,"",[[0,0,0],[1,0,0,0]],[[-934.534,1807.34,-76.7707],[0.4 00996,0.0128267,-0.0292473,-0.915523]]];
TASK PERS wobjdata
WobjCompressor1:=[FALSE,TRUE,"",[[518.656,-1088.9,164.25],[0,0,0,1]],[[686.65 1,296.298,-588.529],[0.917114,1.69419E-06,-7.35001E-05,-0.398626]]];
TASK PERS wobjdata
WobjCompressor2:=[FALSE,TRUE,"",[[518.656,-1088.9,164.25],[0,0,0,1]],[[-944.87 1,-657.402,-323.406],[0.918098,-1.98999E-05,-6.49686E-06,0.396353]]];
PERS wobjdata WobjCompressor;
VAR robtarget pActualPos;
VAR socketdev server_socket;
VAR socketdev client_socket;
VAR string client_ip;
VAR string stReceived;
VAR num NumCharacters:=9;
VAR bool bOK;
PERS num nXOffs;
PERS num nYOffs;
PERS num nAngleOffs;
VAR string XData:="";
VAR string YData:="";
VAR string AngleData:="";
VAR num nPresenceOrAbsence;
PERS num nPickH:=-400;
PERS num nCountX;
PERS num nCountY;
PERS num nCountZ;
PERS num nCount;
VAR num nPlaceNo;
PERS bool bSMPreOrAbs;
PERS bool bInpos;
VAR robtarget PVision;
VAR robtarget Vision;
VAR robtarget ppPick;
VAR robtarget pPick;
PERS robtarget Pick;
PERS robtarget ErCiDingWeiPlace;
PERS robtarget ErCiDingWeiPick;
PERS robtarget pPlace;
PERS robtarget PlaceVision;
PERS robtarget PZhanban;
PERS robtarget PZhanbanUp;
PERS robtarget PZhanbanDown;
PERS robtarget PlaceZhanban;
PERS robtarget Place;
PERS bool bKindChoose;
VAR num nAngle;
VAR num nX;
VAR num nCamOut;
VAR num nInpos;
VAR num nTotalPalletHigh;
VAR num nPalletHigh;
PERS num nPalletHighUp;
PERS num nPalletHighDown;
VAR num Compensation{8,3};
VAR num CompensationTwo{8,3};
PERS num
CompensationErr{8,3}:=[[999999,999999,999999],[999999,999999,999999],[999999 ,999999,999999],[999999,999999,999999],[999999,999999,999999],[999999,999999 ,999999],[999999,999999,999999],[999999,999999,999999]];
PERS jointtarget
jposHome:=[[0,0,0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
CONST robtarget
pHome:=[[621.23,-975.96,1166.44],[0.00703884,-0.385671,-0.922573,-0.00826231], [-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
CONST robtarget
PZhanbanSafe:=[[-162.69,-1703.07,2270.38],[0.0109452,-0.955357,-0.295179,-0.006 45602],[-1,-1,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
CONST robtarget
VisionA:=[[-228.96,94.47,643.11],[0.00434955,-0.699954,0.714102,-0.0101798],[-2, -1,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
CONST robtarget
PickA:=[[90.09,79.65,61.29],[0.0102135,0.00299714,0.999935,-0.00417093],[-2,-1,1, 0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
CONST robtarget
PlaceA:=[[-644.46,-1019.60,396.56],[0.00841448,-0.692574,0.721298,0.000680825], [-1,-1,1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
CONST robtarget
PZhanbanUpA:=[[549.64,541.39,821.21],[0.000808037,-0.999985,-0.00498684,-0.00 209158],[-2,-1,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
CONST robtarget
PZhanbanDownA:=[[548.40,560.53,179.18],[0.00417276,0.999929,-0.00436864,0.01 02239],[-2,-1,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
CONST robtarget
PlaceZhanbanA:=[[2456.73,-1154.76,205.32],[0.0106126,-0.0247295,-0.999603,0.00 838785],[1,-1,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
PERS num
CompensationA{8,3}:=[[0,0,0],[210,136,0],[430,264,99999999],[645,403,99999999], [855,533,99999999],[99999999,670,99999999],[99999999,800,99999999],[99999999 ,936,99999999]];
PERS num
CompensationA1{8,3}:=[[860,936,0],[0,0,0],[215,133,99999999],[430,264,99999999 ],[645,403,99999999],[99999999,533,99999999],[99999999,670,99999999],[999999 99,800,99999999]];
PERS num
CompensationA2{8,3}:=[[860,0,0],[0,133,0],[215,264,99999999],[430,403,99999999 ],[645,533,99999999],[99999999,670,99999999],[99999999,800,99999999],[999999 99,936,99999999]];
CONST num nPalletHighUpA:=100;
CONST num nPalletHighDownA:=200;
CONST robtarget
VisionB:=[[936.63,959.75,378.90],[0.00373262,0.105479,-0.994406,-0.00407233],[-1,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
CONST robtarget
PickB:=[[1180.22,1009.95,213.74],[0.00373443,0.1055,-0.994404,-0.00406331],[-1,0 ,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
CONST robtarget
PlaceB:=[[-1194.30,-1552.83,582.17],[0.0062614,0.795938,-0.605346,-0.000999941] ,[0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
CONST robtarget
PZhanbanUpB:=[[511.86,550.08,92.05],[0.00172284,-0.00758955,-0.99997,-0.00060 6164],[-1,0,1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
CONST robtarget
PZhanbanDownB:=[[511.86,550.08,92.05],[0.00172284,-0.00758955,-0.99997,-0.000 606164],[-1,0,1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
CONST robtarget
PlaceZhanbanB:=[[511.86,550.08,92.05],[0.00172284,-0.00758955,-0.99997,-0.0006 06164],[-1,0,1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
PERS num
CompensationB{8,3}:=[[0,0,300],[210,136,0],[430,264,99999999],[645,403,9999999 9],[855,533,99999999],[99999999,670,99999999],[99999999,800,99999999],[99999
999,936,99999999]];
PERS num
CompensationB1{8,3}:=[[860,936,300],[0,0,0],[215,133,99999999],[430,264,999999 99],[645,403,99999999],[99999999,533,99999999],[99999999,670,99999999],[9999 9999,800,99999999]];
PERS num
CompensationB2{8,3}:=[[860,0,300],[0,133,0],[215,264,99999999],[430,403,999999 99],[645,533,99999999],[99999999,670,99999999],[99999999,800,99999999],[9999 9999,936,99999999]];
CONST num nPalletHighUpB:=100;
CONST num nPalletHighDownB:=200;
PERS speeddata vMinEmpty:=[1300,100,6000,1000];
PERS speeddata vMidEmpty:=[1400,100,6000,1000];
PERS speeddata vMaxEmpty:=[1500,100,6000,1000];
PERS speeddata vBigMaxEmpty:=[1500,100,6000,1000];
PERS speeddata vMinLoad:=[1200,100,6000,1000];
PERS speeddata vMaxLoad:=[1300,100,6000,1000];
PERS speeddata vBigMaxLoad:=[1400,100,6000,1000];
TASK PERS wobjdata
wobj1:=[FALSE,TRUE,"",[[0,0,0],[1,0,0,0]],[[1984.06,-1180.48,453.803],[0.661114, -0.659907,-0.252753,0.252124]]];
PROC Main()
rInitAll;
WHILE TRUE DO
rPickCal;
rPick;
ENDWHILE
WaitTime 0.3;
ENDPROC
PROC rInitAll()
AccSet 60,100;
Compensation:=CompensationErr;
CompensationTwo:=CompensationErr;
reg1 :=0;
reg2 :=0;
nCountX:=1;
nCountY:=1;
nCount:=0;
nCountZ:=1;
nTotalPalletHigh:=0;
nPalletHigh:=0;
nInpos:=0;
rKindChoose;
rCheckHomePos;
Reset do00_JawsOpen ;
Reset do01_JawsClose ;
Set do00_JawsOpen ;
Reset do02_BigJaws1 ;
WaitTime 0.3;
Reset do03_BigJaws2;
Reset do00_JawsOpen ;
Reset do13_Placing;
Reset do12_PlaceOK;
ENDPROC
PROC rPickCal ()
Set do00_JawsOpen ;
bSMPreOrAbs:=TRUE;
IF nCount =0 THEN
rCompressorInPos;
ENDIF
WHILE bSMPreOrAbs=TRUE DO
Incr nCount ;
IF nCount =1 THEN
MoveL Offs
(Vision ,0,0,Compensation{nCountZ,3}+100) ,vBigMaxEmpty ,z20 ,tGripper\WOb j:=WobjCompressor ;
MoveJ Offs
(Vision ,0,0,Compensation{nCountZ,3}),vBigMaxEmpty ,fine ,tGripper\WObj:=W objCompressor ;
GOTO C;
ENDIF
Incr reg2 ;
rnXCal ;
pVision:=Offs
(Vision ,Compensation{nCountX,1} ,Compensation{nCountY,2} ,Compensation{ nCountZ,3});
MoveL
pVision,vMidEmpty ,fine,tGripper\WObj:=WobjCompressor;
C:
nPresenceOrAbsence:=1;
! rServer;
! socketsend client_socket \Str:="T1";
! socketReceive client_socket \Str:=stReceived;
! bOK:=StrToVal(stReceived,nPresenceOrAbsence);
! IF nPresenceOrAbsence =2 OR nPresenceOrAbsence =3 THEN ! bSMPreOrAbs:=FALSE ;
! ELSEIF nPresenceOrAbsence =5 THEN
! bSMPreOrAbs:=TRUE ;
! IF di02_PhotoelectricSensor =1 THEN
! TPErase ;
! TPWrite "The camera get picture there is a problem, Please check it!(2) ";
! SystemStopAction \Halt ;
! ELSEIF di02_PhotoelectricSensor =0 THEN
! reg2 :=0;
! ENDIF
! ELSEIF nPresenceOrAbsence =1 OR nPresenceOrAbsence =4 THEN
! TPErase ;
! TPWrite "The Camera is wrong, and camera will restart ,"; ! TPWrite "after a few seconds the robot will continue ";
! Stop ;
! ENDIF
WaitTime 1;
IF di02_PhotoelectricSensor =1 THEN
bSMPreOrAbs:=FALSE ;
ELSE
bSMPreOrAbs:=TRUE ;
ENDIF
Incr nCountX;
! TEST di16_giBCD
! CASE 1:
IF nCountX=6 THEN
nCountX :=1;
Incr nCountY;
IF nCountY=9 THEN
nCountY :=1;
SystemStopAction \Halt;
ENDIF
ENDIF
IF nCount =40 THEN
nCount :=0;
Incr nCountZ;
nCountX:=1;
nCountY:=1;
nInpos:=0;
IF reg2=0 THEN
rZhanban ;
IF nCountZ=2 THEN
rCompressorOutPos;
nCountZ:=1;
ENDIF
ENDIF
reg2:=0;
ENDIF
! DEFAULT:
! TPErase ;
! TPWrite " The PLC communication there is a problem ,Please check it ";
! ENDTEST
ENDWHILE
ENDPROC
PROC rPick ()
! TEST di16_giBCD
! CASE 1:
IF nCountX=1 THEN
CompensationTwo:=CompensationA1;
ELSE
CompensationTwo:=CompensationA2;
ENDIF
pPick:=Offs
(Pick,CompensationTwo{nCountX,1}+nX ,CompensationTwo{nCountY,2},Compe nsationTwo{nCountZ,3});
! CASE 2:
! pPick:=Offs
(Pick,CompensationTwo{nCountX,1}+nX ,CompensationTwo{nCountY,2},Compe nsationTwo{nCountZ,3});
! DEFAULT:
! TPErase ;
! TPWrite " The PLC communication there is a problem ,Please check it ";
! ENDTEST
WaitTime 0.2;
nCamOut:=1;
! rServer;
! socketsend client_socket \Str:="T2";
! socketReceive client_socket \Str:=stReceived;
! XData:= StrPart(stReceived, 3, NumCharacters);
! YData:= StrPart(stReceived, NumCharacters, NumCharacters);
! AngleData:= StrPart(stReceived, 2*NumCharacters, NumCharacters);
! bOK:=StrToVal(XData,nXOffs);
! bOK:=StrToVal(YData,nYOffs);
! bOK:=StrToVal(AngleData,nAngleOffs);
rAngle;
! ppPick :=RelTool (pPick,0,0,0\Rz:= -nAngleOffs+nAngle);
ppPick :=RelTool (pPick,0,0,0\Rz:= nAngle);
ConfL\Off;
! MoveL Offs (ppPick,nXOffs ,nYOffs,120), vMinEmpty, fine , tGripper\WObj:=WobjCompressor;
! MoveL Offs (ppPick,nXOffs ,nYOffs,0), v100, fine ,
tGripper\WObj:=WobjCompressor;
MoveL Offs(ppPick,0 ,0,200), vMinEmpty, fine ,
tGripper\WObj:=WobjCompressor;
MoveL Offs(ppPick,0 ,0,0), v100, fine ,
tGripper\WObj:=WobjCompressor;
Reset do00_JawsOpen ;
Set do01_JawsClose ;
WaitDI di00_JawsInClose,1;
! MoveL Offs
(ppPick,nXOffs,nYOffs,80),vMinLoad ,z10 ,tGripper\WObj:=WobjCompressor ; ! MoveL Offs
(ppPick,nXOffs,nYOffs,400),vMaxLoad ,fine ,tGripper\WObj:=WobjCompressor ;
MoveL Offs
(ppPick,0,0,80),vMinLoad ,z10 ,tGripper\WObj:=WobjCompressor ;
MoveL Offs
(ppPick,0,0,400),vMaxLoad ,fine ,tGripper\WObj:=WobjCompressor ;
ConfL\On;
rPlace;
! TEST di16_giBCD
! CASE 1:
IF nCount =40 THEN
nCount :=0;
nCountX:=1;
nCountY:=1;
reg2:=0;
nInpos:=0;
rZhanban ;
IF nCountZ=2 THEN
rCompressorOutPos;
nCountZ:=1;
ENDIF
ENDIF
! DEFAULT:
! TPErase ;
! TPWrite " The PLC communication there is a problem ,Please check it ";
! ENDTEST
ENDPROC
PROC rPlace ()
MoveJ Offs (Place,0,0,200) ,vMaxLoad ,z40 , tGripper\WObj:= WobjCompressor ;
Set do13_Placing;
Waitdi di06_AssemblyLineOK, 0;
MoveL Offs (Place,0,0,50) ,vMinLoad ,z5 , tGripper\WObj:= WobjCompressor;
MoveL Place ,v100 ,fine , tGripper\WObj:= WobjCompressor;
Reset do01_JawsClose ;
Set do00_JawsOpen ;
WaitDI di01_JawsInOpen ,1;
MoveL Offs (Place,0,0,300) ,vMinEmpty ,fine, tGripper\WObj:= WobjCompressor;
Reset do13_Placing ;
WaitTime 0.4;
Reset do00_JawsOpen ;
ENDPROC
PROC rnXCal()
! TEST di16_giBCD
! CASE 1:
TEST nCount
CASE 1,2,3,4,5,11,12,13,14,15,21,22,23,24,25,31,32,33,34,35 :
nX:=0;
CASE 6,7,8,9,10,16,17,18,19,20, 26,27,28,29,30,36,37,38,39,40 :
nX:=65;
ENDTEST
! ENDTEST
ENDPROC
PROC rAngle()
! TEST di16_giBCD
! CASE 1:
TEST nCount
CASE 1,2,3,4,5,11,12,13,14,15,21,22,23,24,25,31,32,33,34,35 :
nAngle:=0;
CASE 6,7,8,9,10,16,17,18,19,20, 26,27,28,29,30,36,37,38,39,40 :
nAngle:=180;
ENDTEST
! ENDTEST
ENDPROC
PROC rZhanban ()
nTotalPalletHigh:=nTotalPalletHigh+nPalletHigh;
TEST nCountZ
CASE 1:
PZhanban:=PZhanbanUp;
nPalletHigh:=nPalletHighUp;
CASE 2:
PZhanban:=PZhanbanDown;
nPalletHigh:=nPalletHighDown;
DEFAULT :
TPErase ;
TPWrite" The 'nCountZ' have a trouble ,Please check it ";
ENDTEST
MoveJ Offs ( PZhanban,0,0,300) ,vBigMaxEmpty ,fine , tGripper
\WObj:= WobjCompressor ;
Set do02_BigJaws1 ;
WaitTime 0.6;
Set do03_BigJaws2;
WaitDI di08_BigJawsInOpen, 1;
MoveL PZhanban ,vMinEmpty ,fine, tGripper\WObj:= WobjCompressor ;
WaitTime 0.5;
Reset do02_BigJaws1 ;
Reset do03_BigJaws2 ;
WaitTime 0.3;
WaitDI di08_BigJawsInOpen,1;
pActualpos:=CRobT(\Tool:=tGripper\WObj:=WobjCompressor1);
pActualpos.trans.z:=2000;
MoveL pActualpos,vMinEmpty,z20,tGripper\WObj:=WobjCompressor1 ; ! MoveL Offs ( PZhanban,0,0,400) ,vMinEmpty ,z20 ,
tGripper\WObj:= WobjCompressor ;
WaitDI di05_PalletInPos ,1;
IF nInpos =2 THEN
MoveJ PZhanbanSafe ,vMinEmpty ,z20 , tGripper\WObj:= WobjCompressor ;
ENDIF
pActualpos:=PlaceZhanban;
pActualpos.trans.z:=2000;
MoveJ pActualpos,vMinLoad,z20,tGripper\WObj:=WobjCompressor1 ;
! MoveJ Offs ( PlaceZhanban ,0,0,nTotalPalletHigh+700 ) ,v500 ,z5 , tGripper\WObj:= WobjCompressor ;
MoveL Offs ( PlaceZhanban ,0,0,nTotalPalletHigh) ,vMinLoad ,fine, tGripper\WObj:= WobjCompressor ;
WaitTime 0.5;
Set do02_BigJaws1 ;
Set do03_BigJaws2;
WaitDI di08_BigJawsInOpen,1;
MoveL Offs
( PlaceZhanban ,0,0,nTotalPalletHigh+700 ) ,vMaxEmpty ,fine,
tGripper\WObj:= WobjCompressor ;
Reset do03_BigJaws2;
WaitTime 0.6;
Reset do02_BigJaws1;
WaitDI di07_BigJawsInClose, 1;
rCompressorOutPos;
IF nTotalPalletHigh>1200 THEN
set do06_PalletEmpty ;
waittime 1;
reset do06_PalletEmpty;
nTotalPalletHigh:=0;
nPalletHigh:=0;
ENDIF
ENDPROC
PROC rCompressorInPos()
! bInpos:=TRUE;
! WHILE bInpos=TRUE DO
! IF di03_Compressor1InPos =1 THEN
WobjCompressor:=WobjCompressor1;
bInpos:= FALSE;
nInpos:=2;
! ELSEIF di04_Compressor2InPos =1 THEN
! WobjCompressor:=WobjCompressor2;
! bInpos:=FALSE;
! nInpos:=3;
! ELSE
! bInpos:=TRUE;
! ENDIF
! WaitTime 0.3;
! ENDWHILE
ENDPROC
PROC rCompressorOutPos()
IF WobjCompressor=WobjCompressor1 THEN
Set do04_Compressor1Empty ;
WaitTime 1;
Reset do04_Compressor1Empty;
ELSEIF WobjCompressor=WobjCompressor1 THEN
Set do05_Compressor2Empty ;
WaitTime 1;
Reset do05_Compressor2Empty;
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 IF ActualPos.trans.y>ComparePos.trans.y-25 AND ActualPos.trans.y IF ActualPos.trans.z>ComparePos.trans.z-25 AND ActualPos.trans.z IF ActualPos.rot.q1>ComparePos.rot.q1-0.1 AND ActualPos.rot.q1 IF ActualPos.rot.q2>ComparePos.rot.q2-0.1 AND ActualPos.rot.q2 IF ActualPos.rot.q3>ComparePos.rot.q3-0.1 AND ActualPos.rot.q3 IF ActualPos.rot.q4>ComparePos.rot.q4-0.1 AND ActualPos.rot.q4 RETURN Counter=7; ENDFUNC PROC rCheckHomePos() IF NOT CurrentPos(pHome,tGripper) THEN pActualpos:=CRobT(\Tool:=tGripper\WObj:=wobj0); pActualpos.trans.z:=pHome.trans.z; MoveL pActualpos,v300,z30,tGripper; MoveJ pHome,v500,fine,tGripper; ENDIF ENDPROC PROC rKindChoose() ! IF di16_giBCD=1 THEN Compensation:=CompensationA; nPalletHighUp:=nPalletHighUpA; nPalletHighDown:=nPalletHighDownA; Pick:= PickA; Vision :=VisionA; Place:=PlaceA; PZhanbanUp:=PZhanbanUpA; PZhanbanDown:=PZhanbanDownA; PlaceZhanban:=PlaceZhanbanA; ! ELSEIF di16_giBCD=2 THEN ! Compensation:=CompensationB; ! nPalletHighUp:=nPalletHighUpB; ! nPalletHighDown:=nPalletHighDownB; ! Pick:= PickB; ! Vision :=VisionB; ! Place:=PlaceB; ! PZhanbanUp:=PZhanbanUpB; ! PZhanbanDown:=PZhanbanDownB; ! PlaceZhanban:=PlaceZhanbanB; ! ELSE ! TPErase; ! TPWrite "Please select product type in the PLC"; ! ENDIF ENDPROC PROC rModPos () MoveJ pHome, v1000, fine, tGripper\WObj:=Wobj0; MoveJ PZhanbanSafe, v1000, fine, tGripper\WObj:=WobjCompressor1; MoveJ PickA, v1000, fine, tGripper\WObj:= WobjCompressor1; MoveJ VisionA , v1000, fine, tGripper\WObj:=WobjCompressor1 ; MoveJ PlaceA, v1000, fine, tGripper\WObj:=WobjCompressor1; MoveJ PZhanbanUpA, v1000, fine, tGripper\WObj:= WobjCompressor1; MoveJ PZhanbanDownA, v1000, fine, tGripper\WObj:= WobjCompressor1; MoveJ PlaceZhanbanA, v1000, fine, tGripper\WObj:= WobjCompressor1; MoveJ PickB, v1000, fine, tGripper\WObj:= WobjCompressor1; MoveJ VisionB , v1000, fine, tGripper\WObj:=WobjCompressor1 ; MoveJ PlaceB, v1000, fine, tGripper\WObj:=WobjCompressor1; MoveJ PZhanbanUpB, v1000, fine, tGripper\WObj:= WobjCompressor1; MoveJ PZhanbanDownB, v1000, fine, tGripper\WObj:= WobjCompressor1; MoveJ PlaceZhanbanB, v1000, fine, tGripper\WObj:= WobjCompressor1; ENDPROC PROC rMoveAbsj() MoveAbsJ jposHome, v1000, fine, tGripper\WObj:=wobj0; ENDPROC PROC rServer() SocketClose server_socket; SocketClose client_socket; SocketCreate server_socket; SocketBind server_socket, "192.168.125.1", 3001; SocketListen server_socket; SocketAccept server_socket, client_socket\ClientAddress:=client_ip; ENDPROC PROC rClient() SocketClose client_socket; SocketCreate client_socket; SocketConnect client_socket, "192.168.125.120", 1000; SocketReceive client_socket \Str:=stReceived; ENDPROC ENDMODULE ABB[a]-J-6ABB 机器人的程序编程 6.1 任务目标 ?掌握常用的 PAPID 程序指令。 ?掌握基本 RAPID 程序编写、调试、自动运行和保存模块。 6.2 任务描述 ?建立程序模块test12.24,模块test12.24 下建立例行程序main 和Routine1,在main 程序下进行运动指令的基本操作练习。 ?掌握常用的RAPID 指令的使用方法。 ?建立一个可运行的基本 RAPID 程序,内容包括程序编写、调试、自动运行和保存模块。 6.3 知识储备 6.3.1 程序模块与例行程序 RAPID 程序中包含了一连串控制机器人的指令,执行这些指令可以实现对机器人的控制操作。应用程序是使用称为RAPID 编程语言的特定词汇和语法编写而成的。RAPID 是一种英文编程语言,所包 含的指令可以移动机器人、设置输出、读取输入,还能实现决策、重复其他指令、构造程序、与系统操作 员交流等功能。RAPID 程序的基本架构如图所示: RAPID 程序的架构说明: 1)RAPID 程序是由程序模块与系统模块组成。一般地,只通过新建程序模块来构建机器人的程序,而系统模块多用于系统方面的控制。2)可以根据不同的用途创建多个程序模块,如专门用于主控制的程序模块,用于位置计算的程序模块,用于存放数据的程序模块,这样便于归类管理不同用途的例行程序与数据。 3)每一个程序模块包含了程序数据、例行程序、中断程序和功能四种对象, 但不一定在一个模块中都 有这四种对象,程序模块之间的数据、例行程序、中断程序和功能是可以互相调用的。 4)在RAPID 程序中,只有一个主程序main,并且存在于任意一个程序模块中,并且是作为整个RAPID 程序执行的起点。操作步骤:1. 单击“程序编辑器”,查看 RAPID 程序。文 6.3.2 在示教器上进行指令编程的基本操作 ABB 机器人的RAPID 编程提供了丰富的指令来完成各种简单与复 杂的应用。下面就从最常用的指令开始 一、SmarTac 程序实例 在实际的应用中,smartac有两种方法对焊缝进行纠偏,第一种是用search1D指令检测单个焊缝的偏移,比如寻找起弧点和收弧点,寻找的方向可以使1维的也可以是2维和3维的。这种方法适用于每一条焊缝的变化都是相对对立的并且焊缝相对于检测方向不能有太大的角度变化,比如开关柜。这种方法是直接找到偏移量然后用P-disp frame(P-DispSet指令)直接在工件坐标系里面偏移相应的坐标值。例如: 找点程序 PDispOff; MoveJ *, v1000, z5, tSensor\WObj:=Wobj_StnA; MoveJ *, v1000, z5, tSensor\WObj:=Wobj_StnA; Search_1D Cs2401, *, scp2_4_x, v100, tSensor\WObj:=Wobj_StnA\SchSpeed:=3; MoveL *, v1000, z5, tSensor\WObj:=Wobj_StnA; MoveL *, v1000, z5, tSensor\WObj:=Wobj_StnA; Search_1D Cs2401,*,scp2_4_z,v100, tSensor\WObj:=Wobj_StnA\PrePDisp:=Cs2401\SchSpeed:=3; MoveL *, v1000, z5, tSensor\WObj:=Wobj_StnA; MoveL *, v1000, z5, tSensor\WObj:=Wobj_StnA; MoveL *, v1000, z5, tSensor\WObj:=Wobj_StnA; Search_1DCs2401,*,scp2_4_y,v100, tSensor\WObj:=Wobj_StnA\PrePDisp:=Cs2401\SchSpeed:=3; MoveL *, v1000, z5, tSensor\WObj:=Wobj_StnA; MoveJ *, v1000, z5, tSensor\WObj:=Wobj_StnA; Search_1D s2400,*, sp2400_x, v100, tSensor\WObj:=Wobj_StnA\SchSpeed:=3; MoveJ *, v1000, z5, tSensor\WObj:=Wobj_StnA; Search_1D s2400, *, sp2400_y, v100, tSensor\WObj:=Wobj_StnA\PrePDisp:=s2400\SchSpeed:=3; PDispSet Cs2401 MoveJ *, v1000, z5, tSensor\WObj:=Wobj_StnA; MoveJ *, v1000, z5, tSensor\WObj:=Wobj_StnA; ArcLStart p2401, v1000, seam1,wd01_16\Weave:=Weave1,fine, tWeldGun\Wobj:=Wobj_StnA; PDispoff; PDispSet Cs2400; ArcLEnd p2400, v1000, seam1, wd01_16\Weave:=weave1, fine, tWeldGun\WObj:=Wobj_StnA; PDispOff; MODULE MainModule CONST robtarget pHome:=[[1525.42,272.18,1873.69],[4.42963E-05,0.699969,-0.7141 73,-2.80277E-05],[0,-1,- 1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9 E+09]]; CONST robtarget pPrePickMould:=[[1653.99,272.19,1779.41],[5.83312E-05,0.69997, -0.714172,-3.47922E-05],[0,-1,-1,0],[9E+09,9E+09,9E+09,9E+09,9 E+09,9E+09]]; CONST robtarget pPrePickClapboard:=[[2036.17,- 741.24,1235.05],[0.678651,0.73435 ,-0.0119011,0.00467586],[-1,-2,2,0],[9E+09,9E+09,9E+09,9E+09,9 E+09,9E+09]]; CONST robtarget pPickMould:=[[1943.13,173.08,630.89],[4.66987E-05,0.699977,-0.7 14166,-3.24109E-05],[0,-1,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+0 9,9E+09]]; CONST robtarget pPickClapboard:=[[1943.19,173.08,620.72],[1.61422E-05,0.699977, -0.714165,-7.62858E-06],[0,-1,-1,0],[9E+09,9E+09,9E+09,9E+09,9 E+09,9E+09]]; robtarget pPrePlace:=[[785.90,- CONST 957.40,1722.38],[0.00231652,0.0492402,-0.99 8779,-0.00310842],[-1,-1,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09, 9E+09]]; CONST robtarget pPrePlace10:=[[-277.40,- ABB机器人(ROBOT studio 6.01)程序实例MODULE MainModule PERS tooldata tGripper:=[TRUE,[[0.533078,1.51617,583.739],[1,0,0,0]],[30,[0,0,50],[1,0,0,0],0,0,0] ]; TASK PERS wobjdata VisionWobj:=[FALSE,TRUE,"",[[0,0,0],[1,0,0,0]],[[-934.534,1807.34,-76.7707],[0.4 00996,0.0128267,-0.0292473,-0.915523]]]; TASK PERS wobjdata WobjCompressor1:=[FALSE,TRUE,"",[[518.656,-1088.9,164.25],[0,0,0,1]],[[686.65 1,296.298,-588.529],[0.917114,1.69419E-06,-7.35001E-05,-0.398626]]]; TASK PERS wobjdata WobjCompressor2:=[FALSE,TRUE,"",[[518.656,-1088.9,164.25],[0,0,0,1]],[[-944.87 1,-657.402,-323.406],[0.918098,-1.98999E-05,-6.49686E-06,0.396353]]]; PERS wobjdata WobjCompressor; VAR robtarget pActualPos; VAR socketdev server_socket; VAR socketdev client_socket; VAR string client_ip; VAR string stReceived; VAR num NumCharacters:=9; VAR bool bOK; PERS num nXOffs; PERS num nYOffs; PERS num nAngleOffs; VAR string XData:=""; VAR string YData:=""; VAR string AngleData:=""; VAR num nPresenceOrAbsence; PERS num nPickH:=-400; PERS num nCountX; PERS num nCountY; PERS num nCountZ; PERS num nCount; VAR num nPlaceNo; PERS bool bSMPreOrAbs; PERS bool bInpos; VAR robtarget PVision; VAR robtarget Vision; VAR robtarget ppPick; VAR robtarget pPick; ABB[a]-J-8ABB机器人高级编程 8.1任务目标 ?掌握ABB机器人RAPID高级编程方法。 ?掌握常用的RAPID程序指令。 8.2任务实施 8.2.1事件程序EventRoutine Event Routine是使用RAPID指令编写的例行程序去响应系统事件的功能。 比如在系统启动时,检查IO输入信号的状态,就可通过Event Routine来完成。 要注意的是,在Event Routine中不能有移动指令,也不能有太复杂的逻辑判断,防止程序死循环,影响系统的正常运行。 下面我们就以响应系统事件POWER_ON为例子,进行此功能的说明。 任务描述:编写rEvent例行程序,打印“Start OK”字样,如果在开启后屏幕上显示,则说明这个例行程序与POWER_ON系统事件关联。 MultiTasking就是在有一个在前台运行用于控制机器人逻辑运算和运动的RAPID程序的同时,后台还有与前台并行运行的RAPID程序,也就是我们所说的多任务程序了。 *系统需要623-1 MultiTasking选项。 多任务程序最多可以有20个不带机器人运动指令的后台并行的RAPID程序。多任务程序可用于机器人与PC之间不间断的通讯处理,或作为一个简单的PLC进行逻辑运算。后台的多任务程序在系统启动的同时就开始连续的运行,不受机器人控制状态的影响。 多任务程序——任务间数据通讯的方法: ◆任务间是可以通过程序数据进行数据的交换。 ◆在需要数据交换的任务中建立存储类型为可变量而且名字相同的程序数据。 ◆在一个任务中修改了这个数据的数值,在另一个任务中名字相同的数据也会随之更新。 6.8高级编程 6.8.1.映射程序、模块或例行程序 映射 映射可在特定的映射面上创建程序、模块或例行程序的副本。映射功能可以应用于任何程序、模块或例行程序。映射可以通过两种不同的方法完成: ?基础框架坐标系上的默认值。映射过程将在基础框架坐标系的xz平面上进行。特定程序、模块或者例行程序的指令使用过的所有位置和工件框架都将 被映射。定位定向轴x和y将被映射。 ?趋近于一个特定的映射框架。将在一个特定的工件框架的xy平面内进行映射操作,影射框架。映射特定程序、模块和例行程序中的所有位置。如果指令中的工件变元并非映射对话中的特定变元,影射操作中将会使用指令中的工件。也可能会确定定位定向系中那两条轴(x和z或者y和z)将被映射。 6.8.2.修改和调节位置 概述 位置是robtarget或jointtarget数据类型实例。只要您在软键盘上输入偏移值就可以通过HotEdit调节位置。偏移值与位置初始值一起使用。您也可以利程序编辑器或运行时窗口中的修改位置功能进行位置修改,将机器人步进或微调至新位置。位置的修改值将覆盖初始值。 注意 更改预设位置可能会显著改变机器人移动模式。请始终确保任何更改考虑到设备和人员的安全。数组中的位置当位置被列为数组时,根据数组在移动指令中的索引方式,修改或调节的步骤可能稍有不同。 注意:jointtargets只能使用程序编辑器以及运行时窗口中的修改位置方法进行修改,而不能使用HotEdit修改。 附注 您的系统可能在位置修改方式上受限。您可以使用系统参数(主题Controller,类 型ModPos Settings)对距离进行限制,并限制哪些位置可使用UAS修改。 6.8.3.在程序编辑器或运行时窗口 概述 如对您有帮助,请购买打赏,谢谢您!MODULE MainModule CONST robtarget pHome:=[[1525.42,272.18,1873.69],[4.42963E-05,0.699969,-0.7141 73,-2.80277E-05],[0,-1,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9 E+09]]; CONST robtarget pPrePickMould:=[[1653.99,272.19,1779.41],[5.83312E-05,0.69997, -0.714172,-3.47922E-05],[0,-1,-1,0],[9E+09,9E+09,9E+09,9E+09,9 E+09,9E+09]]; CONST robtarget pPrePickClapboard:=[[2036.17,-741.24,1235.05],[0.678651,0.73435 ,-0.0119011,0.00467586],[-1,-2,2,0],[9E+09,9E+09,9E+09,9E+09,9 E+09,9E+09]]; CONST robtarget pPickMould:=[[1943.13,173.08,630.89],[4.66987E-05,0.699977,-0.7 14166,-3.24109E-05],[0,-1,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+0 9,9E+09]]; CONST robtarget pPickClapboard:=[[1943.19,173.08,620.72],[1.61422E-05,0.699977, -0.714165,-7.62858E-06],[0,-1,-1,0],[9E+09,9E+09,9E+09,9E+09,9 E+09,9E+09]]; CONST robtarget ABB[a]-J-6ABB机器人的程序编程 6.1任务目标 ?掌握常用的PAPID程序指令。 ?掌握基本RAPID程序编写、调试、自动运行和保存模块。 6.2任务描述 ◆建立程序模块test12.24,模块test12.24下建立例行程序main和Routine1,在main程序下进行运 动指令的基本操作练习。 ◆掌握常用的RAPID指令的使用方法。 ◆建立一个可运行的基本RAPID程序,内容包括程序编写、调试、自动运行和保存模块。 6.3知识储备 6.3.1程序模块与例行程序 RAPID程序中包含了一连串控制机器人的指令,执行这些指令可以实现对机器人的控制操作。 应用程序是使用称为RAPID编程语言的特定词汇和语法编写而成的。RAPID是一种英文编程语言,所包含的指令可以移动机器人、设置输出、读取输入,还能实现决策、重复其他指令、构造程序、与系统操作员交流等功能。RAPID程序的基本架构如图所示: RAPID程序的架构说明: 1)RAPID程序是由程序模块与系统模块组成。一般地,只通过新建程序模块来构建机器人的程序,而系统模块多用于系统方面的控制。 2)可以根据不同的用途创建多个程序模块,如专门用于主控制的程序模块,用于位置计算的程序模块,用于存放数据的程序模块,这样便于归类管理不同用途的例行程序与数据。 3)每一个程序模块包含了程序数据、例行程序、中断程序和功能四种对象,但不一定在一个模块中都有这四种对象,程序模块之间的数据、例行程序、中断程序和功能是可以互相调用的。 4)在RAPID程序中,只有一个主程序main,并且存在于任意一个程序模块中,并且是作为整个RAPID 程序执行的起点。 操作步骤: 1.ABB机器人Pdisp轨迹偏移使用 1)如果有下图两个产品,已经完成了右边产品轨迹,左边产品估计一样,如何快速生成左边轨迹(左边产品可能有平移和旋转) 2)完成右边轨迹示教Path_30,如上图。起点为Target_20。 3)完成左边起点的示教,为Target_ref_start,如下图。 注:如果左边产品轨迹有旋转,示教的Target_ref_start相对于左边产品的姿态要和Target_20相对于右边产品的姿态一致(此处左边产品旋转了30°,示教的角度z方向也旋转了30°) 4)插入指令如下 MoveJ pHome,v1000,z100,tWeldGun\WObj:=wobj0;//移动到Home位置 Path_30;//运行右边产品轨迹 MoveJpHome,v1000,z100,tWeldGun\WObj:=wobj0;//回到Home MoveJTarget_ref_start,v1000,fine,tWeldGun\WObj:=wobj0;//走到左边产品起点 ConfJ\Off;//因为使用偏移,关闭轴配置监控,否则有可能使用原配置参数导致位置走不到而报 错ConfL\Off;//因为使用偏移,关闭轴配置监控,否则有可能使用原配置参数导致位置走不到而报错PDispOn\Rot,Target_20,tWeldGun;//设定当前位置和Target_20的偏差关系(包括平移和旋转),因为此时机器人停在Target_ref_start起点,即设定左边轨迹和右边轨迹的整体偏移关系。使用\rot表示平移和旋转均计算。如果不使用\rot,则只使用平移,旋转不计算 Path_30;//运行原有轨迹,此时轨迹参考坐标移动关系,机器人实际走左边产品轨迹 PDispOff;//轨迹完成,关闭平移关系 MoveJ pHome,v1000,z100,tWeldGun\WObj:=wobj0; 2.单工位多次预约程序 1)机器人有程序如下。 2) 3)工艺过程如下: 机器人在home等待。有人按过di信号,机器人开始执行。人工可以一次性多次预约,即如果人工一次性按过3次,机器人执行三次 4)我们通过中断来实现。 5)中断的意义为,机器人后台在不断扫描(类似PLC),和机器人前台运动不冲突。后台实时扫描到信号就会去执行设定的中断程序,中断程序里没有运动指令,前台机器人不停,不影响运动 6)新建一个例行程序,取名tr_1,注意:类型选中断(trap) SmarTac 程序实例在实际的应用中,smartac有两种方法对焊缝 进行纠偏,第一种是用searchlD指令检测单个焊缝的偏移,比如寻找起弧点和收弧点,寻找的方向可以使 1 维的也可以是2维和3维的。这种方法适用于每一条焊缝的变化都是相对对立的并且 焊缝相对于检测方向不能有太大的角度变化,比如开关柜。这种 方法是直 接找到偏移量然后用P-disp frame(P-DispSet指令)直接在工 件坐标系里面偏移相应的坐标值。例如: 找点程序 PDispOff; MoveJ *, v1000, z5, tSensor\WObj:=Wobj_StnA; MoveJ *, v1000, z5, tSensor\WObj:=Wobj_StnA; Search_1D Cs2401, *, scp2_4_x, v100, tSensor\WObj:=Wobj_StnA\SchSpeed:=3; MoveL *, v1000, z5, tSensor\WObj:=Wobj_StnA; MoveL *, v1000, z5, tSensor\WObj:=Wobj_StnA; Search_1D Cs2401,*,scp2_4_z,v100, tSensor\WObj:=Wobj_StnA\PrePDisp:=Cs2401\SchSpeed:=3; MoveL *, v1000, z5, tSensor\WObj:=Wobj_StnA; MoveL *, v1000, z5, tSensor\WObj:=Wobj_StnA; MoveL *, v1000, z5, tSensor\WObj:=Wobj_StnA; Search_1DCs2401,*,scp2_4_y,v100, tSensor\WObj:=Wobj_StnA\PrePDisp:=Cs2401\SchSpeed:=3; MoveL *, v1000, z5, tSensor\WObj:=Wobj_StnA; MoveJ *, v1000, z5, tSensor\WObj:=Wobj_StnA; Search_1D s2400,*, sp2400_x, v100, tSensor\WObj:=Wobj_StnA\SchSpeed:=3; MoveJ *, v1000, z5, tSensor\WObj:=Wobj_StnA; Search_1D s2400, *, sp2400_y, v100, tSensor\WObj:=Wobj_StnA\PrePDisp:=s2400\SchSpeed:=3; PDispSet Cs2401 MoveJ *, v1000, z5, tSensor\WObj:=Wobj_StnA; MoveJ *, v1000, z5, tSensor\WObj:=Wobj_StnA; ArcLStart p2401, v1000, seam1,wd01_16\Weave:=Weave1,fine, tWeldGun\Wobj:=Wobj_StnA; PDispoff; PDispSet Cs2400; ArcLEnd p2400, v1000, seam1, wd01_16\Weave:=weave1, fine, tWeldGun\WObj:=Wobj_StnA; PDispOff; 方法2:通过计算工件坐标(oframe)的变化来进行焊缝纠正,原理是当工件坐标系发生变化后,通过寻找在新的工件坐标系中相同坐标点的位置来纠正位置的变化。这个变化指的是焊缝在新坐标系里面的位置和原来的坐标系并没有发生变化而是随着坐标系整体进行了偏移。例如工件整体发生了平移(比如由夹具的定位引起的平移)如果焊缝相对于坐标系的位置发生了变化就不适用了。注:这个程序是通过计算相对坐标系的变化来对焊缝就行纠正的,并不适合所有的焊缝偏移形势。 %%% VERSION:1 一指令格式 二指令及其参数 Data := Value AccSet Acc Ramp ActUnit MecUnit Add Name A ddValue Break CallBy Var Name Number Clear Name ClkReset Clock ClkStart Clock ClkStop Clock Close IODevice ! Comment ConfJ [\On] | [\Off] ConfL [\On] | [\Off] CONNECT Interrupt WITH Trap routine CorrCon Descr CorrDiscon Descr CorrWrite Descr Data CorrClear DeactUnit MecUnit Decr Name EOffsSet EaxOffs ErrWrite [ \W ] Header Reason [ \RL2] [ \RL3] [ \RL4] Exit ExitCycle FOR Loop counter FROM S tart value TO End value [STEP Step value] DO ... ENDFOR GOTO L abel GripLoad Load IDelete Interrupt IF Condition ... IF Condition THEN ... {ELSEIF Condition THEN ...} [ELSE ...] ENDIF Incr Name IndAMove MecUnit Axis [ \ToAbsPos ] | [ \ToAbsNum ] Speed[ \Ramp ] ABB[a]-J-5ABB机器人的程序数据 5.1任务目标 ?掌握程序数据的建立方法。 ?掌握三个关键程序数据的设定。 ?了解机器人工具自动识别功能。 5.2任务描述 ◆以bool为例,建立程序数据,练习建立num、robtarget程序数据。 ◆设定机器人的工具数据tooldata、工件坐标wobjdata、负荷数据loaddata。 ◆使用LoadIdentify工具自动识别安装在六轴法兰盘上的工具(tooldata)和载荷(loaddata)的重量,以 及重心。 5.3知识储备 5.3.1程序数据 程序数据是在程序模块或系统模块中设定的值和定义的一些环境数据。创建的程序数据由同一个模块或其他模块中的指令进行引用。图中是一条常用的机器人关节运动的指令MoveJ,调用了四个程序数据。 图中所使用的程序数据的说明见表: 程序数据数据类型说明 p10 robtarget 机器人运动目标位置数据 v1000 speeddata 机器人运动速度数据 z50 zonedata 机器人运动转弯数据 tool0 tooldata 机器人工作数据TCP 5.3.2程序数据的类型与分类 1.程序数据的类型分类 ABB机器人的程序数据共有76个,并且可以根据实际情况进行程序数据的创建,为ABB机器人的程序设计带来了无限可能性。 在示教器的“程序数据”窗口可查看和创建所需要的程序数据。 2.程序数据的存储类型 (1)变量VAR 变量型数据在程序执行的过程中和停止时,会保持当前的值。但如果程序指针被移到主程序后,数值会丢失。 举例说明: VAR num length:=0;名称为length的数字数据 VAR string name:=”John”;名称为name的字符数据 VAR bool finish:=FALSE;名称为finish的布尔量数据 在程序编辑窗口中的显示如图: 在机器人执行的RAPID程序中也可以对变量存储类型程序数据进行赋值的操作,如图: ABB 机器人培训资料 1、安全 自动模式中,任何人不得进入机器人工作区域 长时间待机时,夹具上不宜放置任何工件。 机器人动作中发生紧急情况或工作不正常时,均可使用E-stop键,停止运行(但这将直接使程序终止不可继续) 进行编程、测试及维修等工作时,必须将机器人置于手动模式。 调试机器人过程中,不需要移动机器人时,必须释放使能器。 调试人员进入工作区域时,必须随携带使能器,以防他人操作。 突然停电时,必须立即关闭机器人主电源开头,并取下夹具上的工件。 严禁非授权人员操作机器人。 2、简介 1974 ABB第一台机器人诞生,IRC5为目前最新推出的控制系统。所属机器人大部分用于焊接、喷涂及搬运用。 当前使用的机器人型号为IRB1410,其承重能力为5KG,上臂可承受18KG的附加载荷,这在同类机器人中绝无仅有。最大工作半径1444mm,常用于焊接与范围搬运,具可再扩展一个外部轴的能力。 3、机器人系统简介 机械手为六轴组成的空间六杆开链机构,理论上可达到运动范围内任何一点。每个转轴均带一个齿轮箱,机械手运动精度(综合)达正负0.05mm至正负 0.2mm。六轴均带AC伺服电机驱动,每个电机后均有编码器与刹车。机械手带有串口测量板(SMB),测量板上带有六节可充电的镍铬电池,起到保存数据的作用。机械手带有手动松闸按钮,维修时使用,非正常使用会造成设备或人员被伤害。机械手带有平衡气缸或弹簧。 4、伺服驱动系统 5、IRC5 系统介绍 主电源、计算机供电单元、计算机控制模块(计算机主体)、输入/输出板、Customer connections(用户连接端口)、FlexPendant接口(示教盒接线端)、轴计算机板、驱动单元(机器人本体、外部轴)。 一.手动操纵工业机器人 1.单轴运动控制 (1)左手持机器人示教器,右手点击示教器界面左上角的“”来打开ABB 菜单栏;点击“手动操纵”,进入手动操纵界面;如图1-1所示。 图1-1 进入手动操纵界面 (2)点击“动作模式”,进入模式选择界面。选择“轴1-3”,点击“确定”,动作模式设置成了轴1-3,如图1-2所示。 图1-2 模式选择界面 (3)移动示教器上的操纵杆,发现左右摇杆控制1轴运动,前后摇杆控制2轴运动,逆时针或顺时针旋转摇杆控制3轴运动。 (4)点击“动作模式”,进入模式选择界面。选择“轴4-6”,点击“确定”,动作模式设置成了轴4-6,如图1-3所示。 图1-3 “动作模式”的选择 (5)移动示教器上的操纵杆,发现左右摇杆控制4轴运动,前后摇杆控制5轴运动,逆时针或顺时针旋转摇杆控制6轴运动。 【提示】轴切换技巧:示教器上的按键能够完成“轴1-3”和“轴4-6”轴组的切换。 2.线性运动与重定位运动控制 (1)点击“动作模式”,进入模式选择界面。选择“线性”,点击“确定”,动作模式设置成了线性运动,如图1-4所示。 (2)移动示教器上的操纵杆,发现左右摇杆控制机器人TCP点左右运动,前后摇杆控制机器人TCP点前后运动,逆时针或顺时针旋转摇杆控制机器人TCP 点上下运动。 图1-4 线性运动模式操纵界面 (3)点击“动作模式”,进入模式选择界面。选择“重定位”,点击“确定”,动作模式设置成了重定位运动,如图1-5所示。 图1-5 “重定位”动作模式的选择 (4)移动示教器上的操纵杆,发现机器人围绕着TCP运动。 3.工具坐标系建立 工业机器人是通过末端安装不同的工具完成各种作业任务。要想让机器人正常作业,就要让机器人末端工具能够精确地达到某一确定位姿,并能够始终保持这一状态。从机器人运动学角度理解,就是在工具中心点(TCP)固定一个坐标系,控制其相对于基座坐标系或世界坐标系的姿态,此坐标系称为末端执行器坐标系(Tool/Terminal Control Frame,TCF),也就是工具坐标系。默认工具坐标系的原点位于机器人安装法兰的中心,当接装不同的工具(如焊枪)时,工具需获得一个用户定义的工具坐标系,其原点在用户定义的参考点(TCP)上,如图2-1-4所示,这一过程的实现就是工具坐标系的标定。它是机器人控制器所必需具备的一项功能。 a) b) 图1-6 机器人工具坐标系的标定 大多数工业机器人都具备工具坐标系多点标定功能。这类标定包含工具中心点(TCP)位置多点标定和工具坐标系(TCF)姿态多点标定。TCP位置标定是使几个标定点TCP位置重合,从而计算出TCP,即工具坐标系原点相对于末端关节坐标系的位置,如四点法;而TCF姿态标定是使几个标定点之间具有特殊的方位关系,从而计算出工具坐标系相对于末端关节坐标系的姿态,如五点法(在四点法的基础上,除能确定工具坐标系的位置外还能确定工具坐标系的Z轴方向)、六点法(在四点、五点的基础上,能确定工具坐标系的位置和工具坐标系X、Y、Z三轴的姿态)。 为获得准确的TCP,下面分别以四点法和六点法为例进行操作。 一运动指令MoveJ MoveJ[\Conc,]ToPoint,Speed[\V]│[\T],Zone[\Z][\Inpos], Tool[\WObj]; 1 [\Conc,]:协作运动开关。(switch) 2 ToPoint:目标点,默认为*。(robotarget) 3 Speed:运行速度数据。(speeddata) 4 [\V]:特殊运行速度mm/s。(num) 5 [\T]:运行时间控制s。(num) 6 Zone:运行转角数据。(zonedata) 7 [\Z]:特殊运行转角mm。(num) 8 [\Inpos]:运行停止点数据。(stoppointdata) 9 Tool:工具中心点(TCP)。(tooldata) 10 [\WObj]:工件坐标系。(wobjdata) 11 应用 机器人以最快捷的方式运动至目标点,机器人运动状态不完全可控,但运动路径保持唯一,常用于机器人在空间大范围移动。 12 实例 MoveJ p1,v2000,fine,grip1; MoveJ \Conc,p1,v2000,fine,grip1; MoveJ p1,v2000\V:=2200,z40\Z:=45,grip1; MoveJ p1,v2000,z40,grip1\WObj:=wobjTable; MoveJ p1,v2000,fine\Inpos:=inpos50,grip1; 二运动指令MoveL MoveL[\Conc,]ToPoint,Speed[\V]│[\T],Zone[\Z][\Inpos], Tool[\WObj][\Corr]; 1 [\Conc,]:协作运动开关。(switch) 2 ToPoint:目标点,默认为*。(robotarget) 3 Speed:运行速度数据。(speeddata) 4 [\V]:特殊运行速度mm/s。(num) 5 [\T]:运行时间控制s。(num) 6 Zone:运行转角数据。(zonedata) 7 [\Z]:特殊运行转角mm。(num) 8 [\Inpos]:运行停止点数据。(stoppointdata) 9 Tool:工具中心点(TCP)。(tooldata) 10 [\WObj]:工件坐标系。(wobjdata) 11[\Corr]:修正目标点开关。(switch) 12 应用ABB机器人的程序编程
ABB机器人SmarTac程序实例.doc
ABB机器人程序实例
ABB机器人程序实例ROBOT studio 6.01(附带与工业相机网络通讯实例)
ABBaJABB机器人高级编程
ABB机器人-高级编程
abb机器人程序实例
ABB机器人的程序编程
ABB机器人编程技巧
(完整版)ABB机器人SmarTac程序实例
ABB机器人程序指令汇总
ABB机器人的程序数据
ABB机器人学习_主要看这个讲解
ABB机器人培训内容
ABB机器人~编程基本指令之运动指令