Multiple ABB robots cutting the same programs, TCP Issues

Hi Guys,

New member, great forum with some excellent information!

Just a quick background.. I work for a company that machines flat sheet composite material 'kits' which go into the assembly of a number of different boats. Each 'kit' is machined using a range of rotary tools and can comprise of up to 120 different sheets of material therefore, multiple machines are used for one kit to reduce production time.

We currently have 4 x ABB 6400 robots with tool change spindles attached via an end effector and machine the parts on fabricated beds. We do our best to source the fabricated components (Bed, End Effector, Mounting Plinths etc) to be as accurately the same as we can but we know this is not possible.

We defined the TCP data from a single robot, this was then applied to our post processor in mastercam/robotmaster and is added to the toolpaths. The issue we are having, as you can imagine, is that cutting the same programs on each robot produces inaccuracies due to the TCP being used from one robot on all four. An example is we would cut a straight line with a 10mm end mill with the head not rotated at all and then bevel the edge with a 45 degree tool rotated at 90 degrees and we can get drastically different results from robot to robot.
We can't define the TCP for each robot separately as this would mean savings off thousands of the same programs again for each robot which isn't viable.

I may be being naïve, but is there a way to call the TCP data defined from an individual robot and apply it to a program before machining? or calling specific tooldata for that robot? 

Any help would be greatly appreciated, Thankyou!

Comments

  • I'm not sure I completely understand the problem, but I think this would work.

    Define a new tool and set it to the values of your original TCP

    tool_offset:=tool1;

    Compare the original TCP values with the desired TCP values and subtract/add the difference in an instruction like so

    tool_offset.tframe.trans.x:= tool1.tframe.trans.x+100;
    tool_offset.tframe.trans.y:= tool1.tframe.trans.y+100;
    tool_offset.tframe.trans.z:= tool1.tframe.trans.z+100;

    Then use the tool_offset in your move instructions. 

    Alternatively you could log the TCP data from the FlexPendant into separate tooldata definitions and save it in your user.sys module. 

    PERS tooldata tool1 := [TRUE, [[148,0,326], [0.8339007,0,0.551914,0]], [1,[0,0,100], [1,0,0,0], 0,0,0]]; 

    PERS tooldata tool2 := [TRUE, [[318,0,103], [0.8339007,0,0.94264,0]], [1,[0,0,100], [1,0,0,0], 0,0,0]]; 

    You can then call the TCP you wish you use by specifying the tool in the movement instruction. 
  • lemster68
    lemster68 United States ✭✭✭
    edited May 26
    samj11 said:

    We can't define the TCP for each robot separately as this would mean savings off thousands of the same programs again for each robot which isn't viable.

    Why not?  The correct TCP for each robot should put the program in the same place then.  For example, when one crashes a welding torch and it gets bent, one does not go reteach the entire program.  You reteach the tcp to the bent torch and the program is fixed.
    Lee Justice
  • samj11
    samj11 UK
    xerim said:
    I'm not sure I completely understand the problem, but I think this would work.

    Define a new tool and set it to the values of your original TCP

    tool_offset:=tool1;

    Compare the original TCP values with the desired TCP values and subtract/add the difference in an instruction like so

    tool_offset.tframe.trans.x:= tool1.tframe.trans.x+100;
    tool_offset.tframe.trans.y:= tool1.tframe.trans.y+100;
    tool_offset.tframe.trans.z:= tool1.tframe.trans.z+100;

    Then use the tool_offset in your move instructions. 

    Alternatively you could log the TCP data from the FlexPendant into separate tooldata definitions and save it in your user.sys module. 

    PERS tooldata tool1 := [TRUE, [[148,0,326], [0.8339007,0,0.551914,0]], [1,[0,0,100], [1,0,0,0], 0,0,0]]; 

    PERS tooldata tool2 := [TRUE, [[318,0,103], [0.8339007,0,0.94264,0]], [1,[0,0,100], [1,0,0,0], 0,0,0]]; 

    You can then call the TCP you wish you use by specifying the tool in the movement instruction. 
    Thanks Xerim, I will give this a try!
  • samj11
    samj11 UK
    edited May 27
    lemster68 said:
    samj11 said:

    We can't define the TCP for each robot separately as this would mean savings off thousands of the same programs again for each robot which isn't viable.

    Why not?  The correct TCP for each robot should put the program in the same place then.  For example, when one crashes a welding torch and it gets bent, one does not go reteach the entire program.  You reteach the tcp to the bent torch and the program is fixed.
    Thanks for the response Lee,

    The TCP is defined from one robot and these values are then sent offsite and the 'End Effector' (tool) is created. All of our toolpathing programs are then created in Mastercam and posted using Robotmaster with the specific 'End Effector' added. The program code is created with the TCP values from the single defined robot but is run on 4 different robots, this is where the inaccuracies occur whilst machining.

    If we had an 'End Effector' (tool) created for each robot then the program would have to be saved off 4 separate times with the corresponding robot. This is when the thousands of programs we use for individual sheets would need saving off 4 times each.

    I've attached some pics of our set up to illustrate it a little better. There's also an example of a sheet we machine and its program code if there is something obvious! The defined TCP values are highlighted but I need to find a way so that these are altered for each robot when the program is called up to be ran on the shop floor.

    Really appreciate the help!






















  • samj11
    samj11 UK
    Sorry, the TCP quarternian values are highlighted, these are different for each robot but the program runs from the defined robot meaning that when the head rotates or tilts on another robot, it moves the machining tool away from where it should be. I need a way to call up the robot specific quarternian values for each seprate robot.

    Thanks, Sam 
  • lemster68
    lemster68 United States ✭✭✭
    Do not declare the tool in the download.  Declare it in a module unique to each robot, like the USER module.
    Lee Justice