Hi all ABB friends. I have a ABB IRC5 Robot with a lincoln welder. We currently define the worgobject by jogging the robot manually. I would like to create a program to define the work object in automatic, Any help is appreciated
ABB Workobject
-
NorthWelder -
September 18, 2018 at 6:03 PM -
Thread is Resolved
-
-
Seeing as it is a welder I feel inclined to ask what type of work-object it is ? Is it for a turn table / positioner (i.e. rotating baseframe) or is it related to the part / tooling ?
A workobject is basically two frames (user and object) stacked on top of each other. In order to create them through a program you need to define three reference positions and then use the function DefFrame.
myWobj.uFrame := DefFrame (p1, p2, p3);Defining the three positions, and doing so accurately will be your bigger problem / headache and it will require you to have the ability to search via some type of sensor (wire touch, laser sensor, etc).
-
Thanks for the Reply.
It is a IRBP R positioner. We design all fixtures with 3 points on them to define the workobject. Every time we do a set up we define the work object ( X1, X2 and Y1) -
we use wire touch for searching
-
So are you integrating these positioners and fixtures for an end user/customer? Or are you saying that every time you change a fixture you re-teach the workobject?
-
We reteach the workobject every time we change the fixture.
-
Hopefully you'll get something out of this, but what you want to do is not entirely uncomplicated so explaining it in a short way is next to impossible....
Below is a snippet used on a project I did many years ago...The short of it is that rather than you pointing out those three positions you need to have the robot do so and in order for the robot to point out a varying position you need to search for it.
The Z/X trans calculations below are used to compensate for the width of the gascup and the plate thickness (yes, heavy welding )
You can probably get away with using the built in DefFrame instruction and only three positions, but this was a fairly large part so it was easier to search two points on each plane rather than trying to pinpoint the corner.These two lines are what creates the frame and applies it to the workobject.
poseSupport90:=Def4Frame(pW1,pW2,pW3,pW4);
wobjActive.oframe:=poseSupport90;Code
Display MorePROC rmSupport90() MoveJ [[-409.52,-1503.84,-2327.11],[0.482253,-0.515004,0.484899,-0.516794],[0,0,1,1],[9E+09,89.9998,3380,18900,9E+09,1000]],vORBIT,z5,tPKI500\WObj:=wobjActive; SMA_SearchL\INIT\KeepOpen,[[-15,-1200,-2175],[0.483321,-0.515372,0.484185,-0.5161],[0,-1,1,1],[9E+09,89.9999,3300,18900,9E+09,1100]],[[-15,-1200,-2190],[0.483321,-0.515372,0.484185,-0.5161],[0,-1,1,1],[9E+09,89.9999,3300,18900,9E+09,1100]],15,0,vORBIT,vSRCH,1,tPKI500\WObj:=wobjActive; pW4:=CRobT(\Tool:=tPKI500\WObj:=wobjActive); pW4.trans.z:=pW4.trans.z-14; SMA_SearchL\INIT\KeepOpen,[[-15,-1460,-2175],[0.483319,-0.515405,0.484166,-0.516086],[0,-1,1,1],[9E+09,90.0002,3380,18900,9E+09,1100]],[[-15,-1460,-2190],[0.483319,-0.515405,0.484166,-0.516086],[0,-1,1,1],[9E+09,90.0002,3380,18900,9E+09,1100]],15,0,vORBIT,vSRCH,1,tPKI500\WObj:=wobjActive; pW3:=CRobT(\Tool:=tPKI500\WObj:=wobjActive); pW3.trans.z:=pW3.trans.z-14; MoveL [[-15.01,-1500,-2175],[0.483348,-0.51538,0.48419,-0.516062],[0,-1,1,1],[9E+09,90.0002,3380,18900,9E+09,1100]],vORBIT,fine,tPKI500\WObj:=wobjActive; SMA_SearchL\INIT\KeepOpen,[[-15.01,-1525,-2225],[0.483349,-0.515381,0.484187,-0.516063],[0,-1,1,1],[9E+09,90.0002,3380,18900,9E+09,1100]],[[-15.01,-1500,-2225.01],[0.483337,-0.51538,0.484186,-0.516075],[0,0,1,1],[9E+09,90.0003,3380,18900,9E+09,1100]],15,0,vORBIT,vSRCH,1,tPKI500\WObj:=wobjActive; pW2:=CRobT(\Tool:=tPKI500\WObj:=wobjActive); pW2.trans.y:=pW2.trans.y+14; MoveL [[-15.05,-1517.94,-2225.01],[0.483361,-0.515402,0.484125,-0.516088],[0,0,1,1],[9E+09,90.0002,3380,18900,9E+09,1100]],vORBIT,z20,tPKI500\WObj:=wobjActive; SMA_SearchL\INIT\KeepOpen,[[-15.03,-1524.99,-2450],[0.483353,-0.515381,0.484147,-0.516097],[0,0,1,1],[9E+09,90.0005,3380,18700,9E+09,1100]],[[-15.03,-1500,-2450],[0.483353,-0.515381,0.484147,-0.516097],[0,0,1,1],[9E+09,90.0005,3380,18700,9E+09,1100]],15,0,vORBIT,vSRCH,1,tPKI500\WObj:=wobjActive; pW1:=CRobT(\Tool:=tPKI500\WObj:=wobjActive); pW1.trans.y:=pW1.trans.y+14; MoveL [[-236.15,-1519.93,-2449.99],[0.48335,-0.515404,0.48415,-0.516074],[0,0,1,1],[9E+09,90.0005,3382.86,18513.8,9E+09,1059.58]],vORBIT,z10,tPKI500\WObj:=wobjActive; MoveJ [[-326.14,-1434.52,-2423.88],[0.115421,-0.116462,-0.697242,-0.697832],[0,0,-1,1],[9E+09,90.0005,3382.86,18513.8,9E+09,1059.58]],vORBIT,z10,tPKI500\WObj:=wobjActive; SMA_SearchL\INIT\KeepOpen,[[-100,-1430,-2450],[0.115435,-0.116484,-0.697251,-0.697817],[0,0,-1,1],[9E+09,90.0006,3382.86,18513.8,9E+09,1059.58]],[[-80,-1430,-2450],[0.115445,-0.116473,-0.697254,-0.697813],[0,0,-1,1],[9E+09,90.0006,3382.86,18513.8,9E+09,1059.58]],15,0,vORBIT,vSRCH,1,tPKI500\WObj:=wobjActive; pW5:=CRobT(\Tool:=tPKI500\WObj:=wobjActive); pW1.trans.x:=pW5.trans.x+34; MoveL [[-100,-1429.98,-2449.96],[0.115437,-0.116441,-0.697259,-0.697816],[0,0,-1,1],[9E+09,90.0007,3382.86,18513.8,9E+09,1059.58]],vORBIT,z10,tPKI500\WObj:=wobjActive; SMA_SearchL\INIT\KeepOpen,[[-100.01,-1429.96,-2225],[0.115439,-0.116396,-0.697268,-0.697814],[-1,-1,0,1],[9E+09,90.0007,3382.85,18513.8,9E+09,1059.58]],[[-80,-1429.94,-2225],[0.115445,-0.116389,-0.69727,-0.697812],[-1,-1,0,1],[9E+09,90.0007,3382.85,18513.8,9E+09,1059.58]],15,0,vORBIT,vSRCH,1,tPKI500\WObj:=wobjActive; pW5:=CRobT(\Tool:=tPKI500\WObj:=wobjActive); pW2.trans.x:=pW5.trans.x+34; MoveL [[-127.84,-1429.97,-2117.16],[0.115428,-0.116423,-0.697297,-0.697782],[-1,-1,0,1],[9E+09,90.0008,3382.85,18513.8,9E+09,1059.58]],vORBIT,z10,tPKI500\WObj:=wobjActive; MoveJ [[-153.25,-1612.12,-2133.14],[0.000116,-0.083306,-0.996525,-0.000249],[-1,-1,-1,1],[9E+09,90.0008,3190.2,18796,9E+09,1059.58]],vORBIT,z10,tPKI500\WObj:=wobjActive; SMA_SearchL\INIT\KeepOpen,[[-100,-1460,-2255],[0.000127,-0.083294,-0.996526,-0.000237],[0,-2,0,1],[9E+09,90.0008,3190.2,18796,9E+09,1059.58]],[[-80,-1460,-2255],[0.000127,-0.083294,-0.996526,-0.000237],[0,-2,0,1],[9E+09,90.0008,3190.2,18796,9E+09,1059.58]],15,0,vORBIT,vSRCH,1,tPKI500\WObj:=wobjActive; pW5:=CRobT(\Tool:=tPKI500\WObj:=wobjActive); pW3.trans.x:=pW5.trans.x+34; MoveL [[-100,-1460.05,-2255],[0.000138,-0.083291,-0.996526,-0.000193],[0,-2,0,1],[9E+09,90.0009,3190.21,18796,9E+09,1059.57]],vORBIT,z10,tPKI500\WObj:=wobjActive; SMA_SearchL\INIT,[[-99.97,-1200,-2254.97],[8.8E-05,-0.083249,-0.996529,-0.000233],[0,-2,0,1],[9E+09,90.0008,2950,18796,9E+09,1059.57]],[[-80,-1200,-2254.97],[8.8E-05,-0.083249,-0.996529,-0.000233],[0,-2,0,1],[9E+09,90.0008,2950,18796,9E+09,1059.57]],15,0,vORBIT,vSRCH,1,tPKI500\WObj:=wobjActive; pW5:=CRobT(\Tool:=tPKI500\WObj:=wobjActive); pW4.trans.x:=pW5.trans.x+34; MoveL [[-100,-1200.07,-2254.95],[8.5E-05,-0.08324,-0.99653,-0.000128],[0,-2,0,1],[9E+09,90.0008,2950,18796,9E+09,1059.57]],vORBIT,z10,tPKI500\WObj:=wobjActive; poseSupport90:=Def4Frame(pW1,pW2,pW3,pW4); wobjActive.oframe:=poseSupport90; PDispOff; ENDPROC
Code
Display MoreFUNC pose Def4Frame( robtarget Pos1, robtarget Pos2, robtarget Pos3, robtarget Pos4) VAR robtarget pPosC1; VAR robtarget pPosC2; VAR pose Frame; pPosC1:=CalcCorner(Pos2,Pos1,Pos3); pPosC2:=CalcCorner(Pos3,Pos4,Pos2); ! Make average pPosC1.trans:=pPosC1.trans+pPosC2.trans; pPosC1.trans:=pPosC1.trans*0.5; ! Calculate frame for calibration plate Frame:=DefFrame(pPosC1,Pos1,Pos4); RETURN Frame; ERROR RAISE; ENDFUNC LOCAL FUNC robtarget CalcCorner( robtarget pPosOrig, robtarget pPosX, robtarget pPos2) VAR robtarget pPosZ; VAR pose peSeamFrame; VAR pose peSeamFrameInv; CONST orient orTurnBack:=[0.707107,-0.707107,0,0]; VAR pose pePos1; !Set up seam coordinate system pPosZ:=RelTool(pPosOrig,0,0,-100\Rx:=0\Ry:=0\Rz:=0); peSeamFrame:=DefFrame(pPosOrig,pPosX,pPosZ); peSeamFrame.rot:=peSeamFrame.rot*orTurnBack; !Get position up to a seam coorinate system pePos1.trans:=pPos2.trans; pePos1.rot:=pPos2.rot; peSeamFrameInv:=PoseInv(peSeamFrame); pePos1:=PoseMult(peSeamFrameInv,pePos1); ! Use only X component pePos1.trans.y:=0; pePos1.trans.z:=0; !Convert back to original frame pePos1:=PoseMult(peSeamFrame,pePos1); pPos2.trans:=pePos1.trans; pPos2.rot:=pePos1.rot; RETURN pPos2; ERROR RAISE; ENDFUNC
-
OK, next question. Are you using the same workobject for the different fixtures? That should be a NO. And, have they not designed in locating pins such that your fixtures can be removed and replaced repeatably? Then you should not have to reteach.
-
No we're not using the same workobject for different fixtures. Fixtures are designed to be removed and placed repeatedly.
-
Thank You SAABoholic and everybody else.
-
Repeatably, not repeatedly, was what I asked, does the design allow for exact positioning upon reinstallation? Well, I guess that kind of begs the question, you wouldn't need to reteach if it were replaced in exactly the same location.
-
All I'm looking for is how to write a program that will do the work object define.
-
All I'm looking for is how to write a program that will do the work object define.wobjMyWobj.oframe:=DefFrame(p1,p2,p3);
-
Modify and store each position for each point of the wobj, ex. X1=pWobj_O_PointX1, X2=pWobj_O_PointX2 and Y1=pWobj_O_PointY1.
When loading the new fixture, run the routine for these positions and manually jog to fine tune the wobj. No more heavy manual jogging
Program the routine something like this:
! Points are read in order of declaration.
! Please do not change the order of points!
LOCAL PERS robtarget pWobj_O_PointX1:=[[4740.57,975.81,574.97],[0.00162589,-0.707593,0.706561,-0.00903695],[0,1,-2,0],
[4625.08,9E+09,9E+09,9E+09,9E+09,9E+09]];
LOCAL PERS robtarget pWobj_O_PointX2:=[[4734.34,1994.04,569.21],[0.00162876,-0.707594,0.706559,-0.00903434],[0,1,-2,0],
[4625.08,9E+09,9E+09,9E+09,9E+09,9E+09]];
LOCAL PERS robtarget pWobj_O_PointY1:=[[861.92,978.29,592.72],[0.000285452,-0.803456,0.595294,-0.00917913],[0,1,-2,0],
[840.241,9E+09,9E+09,9E+09,9E+09,9E+09]];
CONST jointtarget Part_SafePos:=[[90.1096,-58.6954,33.1946,-0.190265,56.8059,0.138645],
[2434.52,9E+09,9E+09,9E+09,9E+09,9E+09]];
VAR num Part_Select;
PROC Part_WobjSetup()
TPErase;
TPReadFK Part_Select,"Setup Work Object ?","","",sAnswer_YES,"","";
IF Part_Select=3 THEN
Part_SafePos_Rout;
MoveJ Offs(pWobj_O_PointX1,0,0,100),v2500,fine,tWeldGun_Short\WObj:=wobj0;
MoveJ pWobj_O_PointX1,v2500,fine,tWeldGun_Short\WObj:=wobj0;
Stop\NoRegain;
MoveJ Offs(pWobj_O_PointX1,0,0,100),v2500,fine,tWeldGun_Short\WObj:=wobj0;
MoveJ Offs(pWobj_O_PointX2,0,0,100),v2500,fine,tWeldGun_Short\WObj:=wobj0;
MoveJ pWobj_O_PointX2,v2500,fine,tWeldGun_Short\WObj:=wobj0;
Stop\NoRegain;
MoveJ Offs(pWobj_O_PointX2,0,0,100),v2500,fine,tWeldGun_Short\WObj:=wobj0;
MoveJ Offs(pWobj_O_PointY1,0,0,100),v2500,fine,tWeldGun_Short\WObj:=wobj0;
MoveJ pWobj_O_PointY1,v2500,fine,tWeldGun_Short\WObj:=wobj0;
Stop\NoRegain;
MoveJ Offs(pWobj_O_PointY1,0,0,100),v2500,fine,tWeldGun_Short\WObj:=wobj0;
Part_SafePos_Rout;
ENDIF
ENDPROCPROC Part_SafePos_Rout()
MoveAbsJ Part_SafePos,v1000,fine,tWeldGun_Short\WObj:=wobj0;
ENDPROC -
.... 7 months later ....
-
... 7 months later .
Hello. And this code needs to be written in a robot studio or possibly a flexpendant.?thanks