June 18, 2019, 03:15:00 PM
Robotforum | Industrial Robots Community

 ABB Workobject

normal_post Author Topic:  ABB Workobject  (Read 1244 times)

0 Members and 1 Guest are viewing this topic.

September 18, 2018, 04:03:37 PM
Read 1244 times
Offline

NorthWelder


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 :help:

Today at 03:15:00 PM
Reply #1

Advertisement

Guest

September 18, 2018, 04:24:00 PM
Reply #1
Offline

SAABoholic


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).

September 19, 2018, 03:43:43 PM
Reply #2
Offline

NorthWelder


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)

September 19, 2018, 04:48:23 PM
Reply #3
Offline

NorthWelder


we use wire touch for searching

September 19, 2018, 07:00:52 PM
Reply #4
Online

Lemster68

Global Moderator
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?

September 19, 2018, 09:36:33 PM
Reply #5
Offline

NorthWelder


We reteach the workobject every time we change the fixture.

September 20, 2018, 10:23:38 AM
Reply #6
Offline

SAABoholic


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  :yesyesyes: )
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: [Select]
  PROC 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: [Select]
  FUNC 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

Today at 03:15:00 PM
Reply #7

Advertisement

Guest

September 20, 2018, 11:54:17 AM
Reply #7
Online

Lemster68

Global Moderator
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.

September 20, 2018, 12:01:34 PM
Reply #8
Offline

NorthWelder


No we're not using the same workobject for different fixtures. Fixtures are designed to be removed and placed repeatedly.

September 20, 2018, 12:03:13 PM
Reply #9
Offline

NorthWelder


Thank You SAABoholic and everybody else.

September 20, 2018, 01:57:52 PM
Reply #10
Online

Lemster68

Global Moderator
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.
« Last Edit: September 20, 2018, 02:02:49 PM by Lemster68 »

September 21, 2018, 02:11:38 PM
Reply #11
Offline

NorthWelder


All I'm looking for is how to write a program that will do the work object define.

September 21, 2018, 02:15:26 PM
Reply #12
Offline

SAABoholic



    wobjMyWobj.oframe:=DefFrame(p1,p2,p3);

April 10, 2019, 09:40:32 AM
Reply #13
Offline

JMF


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
    ENDPROC

    PROC Part_SafePos_Rout()
        MoveAbsJ Part_SafePos,v1000,fine,tWeldGun_Short\WObj:=wobj0;
    ENDPROC




Today at 03:15:00 PM
Reply #14

Advertisement

Guest

April 10, 2019, 01:23:09 PM
Reply #14
Offline

SAABoholic


.... 7 months later ....


Share via facebook Share via linkedin Share via pinterest Share via reddit Share via twitter

xx
Workobject

Started by Plc_User on ABB Robot Forum

2 Replies
468 Views
Last post November 08, 2018, 06:21:34 PM
by Lemster68
xx
workobject copy

Started by smarci96 on ABB Robot Forum

5 Replies
709 Views
Last post September 03, 2018, 03:28:38 PM
by jarm
xx
Creat Tool And Workobject

Started by Royston on ABB Robot Forum

1 Replies
211 Views
Last post March 12, 2019, 11:39:33 AM
by Gilldur
xx
workobject and the robtarget module

Started by irc5rj30iadx100 on ABB Robot Forum

1 Replies
1312 Views
Last post May 09, 2016, 11:58:07 AM
by SharplesR