Is there a way to transfer a program from STN1 work object to STN2 work object?
We have an ABB IRC5 2600ID welding robot with 2 back-to-back headstock/tailstock stations.
My question is how would I go about copy and transfer of program that was written on STN1 work object and get it to "convert" over to STN2 work object? Let it be noted that I do not have RobotStudio, neither free or licensed software version. I am looking for any potential ways of doing this out on the real controller. I read a code routine called MoveExChange that was posted somewhere. It seems to use CalcT . . . or something of that nature. I have never dealt with that type of coding and wasn't sure if it applied to what I'm looking for.
On my laptop, I did copy the part program module I want to transfer and I edited any tags or labels for STN1 into STN2 in notepad. This loaded fine into my controller, but obviously doesn't translate positions to the other work object properly without errors or still trying to go to STN1.
Any help or insight is appreciated.
Answers
-
are they back to back so they are in reversed positions? so tail-head-head-tail0
-
The headstock and tailstock for both STN1 and STN2 are in the same orientation direction on both sides. So essentially "head-tail and head-tail". The robot is on a track in between both STN1 and STN2, the track and stations are parallel with each other.jarmster said:are they back to back so they are in reversed positions? so tail-head-head-tail0 -
i have some ideas but i think my lack of experience with track systems leaves me at a disadvantage in this topic..i'll leave it to someone else. i dont want to waste your time
If you could give me a little info in regards to how the track system operates. Is it considered a 7th axis? . I'd be interested in seeing a point declaration with a 7th axis and an external axis. I may be able to help if i understood your setup better
Post edited by jarmster on0 -
The track axis is considered a 7th axis of the robot, but can be selected by itself in the Jogging window like STN1 and STN2 mech units. However, it's always active like the robot. And this system operates under one task only TROB1.jarmster said:i have some ideas but i think my lack of experience with track systems leaves me at a disadvantage in this topic..i'll leave it to someone else. i dont want to waste your time
If you could give me a little info in regards to how the track system operates. Is it considered a 7th axis? . I'd be interested in seeing a point declaration with a 7th axis and an external axis. I may be able to help if i understood your setup better
I copied a robtarget here from one of our programs in notepad:
CONST robtarget p95_STN2_r2_511:=[[367.14,4152.50,418.89],[0.00290258,0.319632,-0.214203,-0.923008],[-2,1,-3,0],[2573.47,9E+09,9E+09,9E+09,160.004,9E+09]];0 -
Hi...If the machines are mirrored, my suggestion is to use the mirror function.In Teach Pendent - ABB > Program Editor > Program X.In the Edit menu there is the option "Mirror..." This option allows you to mirror your program.Maybe it will work for you.Good Job0
-
[2573.47,9E+09,9E+09,9E+09,160.004,9E+09]]
so the 2573.47 is the position of the positioner and the 160.004 is the position along the track?
or opposite?
i would start by creating a new work object by copying the first one and attach it to STN2
TASK PERS wobjdata Wobj_PART_STN1:=[FALSE,FALSE,"STN1",[[0,0,0],[1,0,0,0]],[[173.645,-174.205,220.132],[1,0,0,0]]];
TASK PERS wobjdata Wobj_PART_STN2:=[FALSE,FALSE,"STN2",[[0,0,0],[1,0,0,0]],[[173.645,-174.205,220.132],[1,0,0,0]]];
The station userframe is taught when the robot was set up. The object frame is taught off the part you put in the positioner. The object frame is placed on the userframe and attached so the objectframe rotates as the positioner rotates. Make sure you copy the proper workobject for the part that your trying to move to a new positioner. All parts should have their own workobjects unless your using the same workobject for all the parts used on stn1. not a smart idea tbh
The workobject used in the program your moving is the one to copy.
If the mounting of the part varies from positioner to postioner then you may need to reteach the new workobject in the new positioner. you'll need to know where the 3 points were taken for the original workobject so you can reteach them for the new workobject but if the mounting of the part is the same then you may get away with just copying the original workobject to the new positioner. The more your mount is different the more your points will be off. Its probably a better idea to reteach the workobject for stn2 if you know where the original workobject was defined.. I would copy the original workoject for stn2 in the calibdata and then set the part up in stn2 and redefine that workobject.
Then copy your program and change all the work objects in the copy to your new workobject using find/replace
Next would be to edit the track position for each instruction in the copy....The problem here is all your points are declared and you cant use the same declarations for both programs because the track position needs edited for your copy.
This is where i would use the studio and convert all my points to inline points so we wouldn't need to use declarations. All the position data would end up on each line of code. Then you could go through your copied program and edit the track positions.
inline example
MoveL [[-5.54,169.25,106.36],[0.228615,0.670302,-0.66034,0.249763],[-1,-1,1,0],[9E+09,-45,15.0002,9E+09,9E+09,9E+09]],v500,z10,tWeldGun\WObj:=wobj00757914_2;
The point names will be replaced with an astrick on the pendant.
I usually use inline points instead of named points just because of the ability to copy and edit the new point without affecting the orginal point. There are times where named points are necessary like if your trying to copy point data to a variable in program so you need to be aware if things like that are happening in your program. If that kind of thing is in your program then i would copy and rename the declaration and change the instruction to use the new name for that position. But if your whole program is movel,movej, arcstart, arcl and arcends then conversion to inline is the way to go
BUT....since you dont use robotstudio.
work around without the studio...
You could copy and rename the declarations and edit the track positions and then edit the point names in the copied program to use the copied declaration.
or...
copy the declaration data for each point over top of the name of each point in your copy, essentially making them inline points and then editing the track position for each point. I would probably do this being its all copy and paste. If the robot sits in one spot along the track, you may get away with find/replace for the track data. You would only need to do this for the copy. you could keep the original program unchanged using the original point declarations.
copy this from declaration....[[-5.54,169.25,106.36],[0.228615,0.670302,-0.66034,0.249763],[-1,-1,1,0],[9E+09,-45,15.0002,9E+09,9E+09,9E+09]] overtop of point name to convert to inline
You could do all of that in a txt editor using a backup but this would be a very tedious job but very doable.
You would also need to calculate the offset you need to add to the track data for station 2.
Does the robot move on the track during program execution in stn1? Or does it just sit in one spot?
You could calculate the offset by looking at the stn positions in the baseframe and just add the difference to the track data, i imagine. If they use the same unit of measurement. If not you will need to figure out a conversion factor. This i dont know because of the lack of experience with tracks.
You might be able to get away with putting the robot into a postion where the migwire touches the faceplate on stn1 and then read the track position, then pull the arm out vertically move the robot down the track past the faceplate on stn2. then bring the arm back down and move the robot back along the track untill the wire touches the faceplate and read that track position, the difference is your offset to add to the track data.
i might add this will only work if the cell is as follows
===Robot====================
Stn1 Stn2
Head------Tail Head------Tail
Track : ===
I hope my explaination has been clear. I've done this kind of shift of code from one workobj to another multiple times. never with a track but on a sky hook positioner where i have multiple weld stations on one plate. If the jig holds 2 parts, ill teach 2 workobjects (The 2nd wobj needs to be oriented the same as the first when i rotate the fixture 180), program the one part. copy the program and change the workobject in the copy. Then i'll add 180 degress to all my positioner data in the copy so the 2nd part has rotated into the same position as the first part. Same concept as what ive described above except all on the same positioner. The only difference is you'll only need to edit the workobject and the track data in your copy. Everything else remains the same besides a new routine name for your copy and the way you load it. You'll still need to walk through it and tweak the points afterwards but everything should be pretty close.
Post edited by jarmster on0 -
mandolas said:Hi...If the machines are mirrored, my suggestion is to use the mirror function.In Teach Pendent - ABB > Program Editor > Program X.In the Edit menu there is the option "Mirror..." This option allows you to mirror your program.Maybe it will work for you.Good Job
I never tried mirror function, but it's worth a shot.jarmster said:[2573.47,9E+09,9E+09,9E+09,160.004,9E+09]]
so the 2573.47 is the position of the positioner and the 160.004 is the position along the track?or opposite?
i would start by creating a new work object by copying the first one and attach it to STN2
TASK PERS wobjdata Wobj_PART_STN1:=[FALSE,FALSE,"STN1",[[0,0,0],[1,0,0,0]],[[173.645,-174.205,220.132],[1,0,0,0]]];
TASK PERS wobjdata Wobj_PART_STN2:=[FALSE,FALSE,"STN2",[[0,0,0],[1,0,0,0]],[[173.645,-174.205,220.132],[1,0,0,0]]];
The station userframe is taught when the robot was set up. The object frame is taught off the part you put in the positioner. The object frame is placed on the userframe and attached so the objectframe rotates as the positioner rotates. Make sure you copy the proper workobject for the part that your trying to move to a new positioner. All parts should have their own workobjects unless your using the same workobject for all the parts used on stn1. not a smart idea tbh
The workobject used in the program your moving is the one to copy.
If the mounting of the part varies from positioner to postioner then you may need to reteach the new workobject in the new positioner. you'll need to know where the 3 points were taken for the original workobject so you can reteach them for the new workobject but if the mounting of the part is the same then you may get away with just copying the original workobject to the new positioner. The more your mount is different the more your points will be off. Its probably a better idea to reteach the workobject for stn2 if you know where the original workobject was defined.. I would copy the original workoject for stn2 in the calibdata and then set the part up in stn2 and redefine that workobject.
Then copy your program and change all the work objects in the copy to your new workobject using find/replace
Next would be to edit the track position for each instruction in the copy....The problem here is all your points are declared and you cant use the same declarations for both programs because the track position needs edited for your copy.
This is where i would use the studio and convert all my points to inline points so we wouldn't need to use declarations. All the position data would end up on each line of code. Then you could go through your copied program and edit the track positions.
inline exampleMoveL [[-5.54,169.25,106.36],[0.228615,0.670302,-0.66034,0.249763],[-1,-1,1,0],[9E+09,-45,15.0002,9E+09,9E+09,9E+09]],v500,z10,tWeldGun\WObj:=wobj00757914_2;
The point names will be replaced with an astrick on the pendant.
I usually use inline points instead of named points just because of the ability to copy and edit the new point without affecting the orginal point. There are times where named points are necessary like if your trying to copy point data to a variable in program so you need to be aware if things like that are happening in your program. If that kind of thing is in your program then i would copy and rename the declaration and change the instruction to use the new name for that position. But if your whole program is movel,movej, arcstart, arcl and arcends then conversion to inline is the way to goBUT....since you dont use robotstudio.
work around without the studio...
You could copy and rename the declarations and edit the track positions and then edit the point names in the copied program to use the copied declaration.
or...
copy the declaration data for each point over top of the name of each point in your copy, essentially making them inline points and then editing the track position for each point. I would probably do this being its all copy and paste. If the robot sits in one spot along the track, you may get away with find/replace for the track data. You would only need to do this for the copy. you could keep the original program unchanged using the original point declarations.
copy this from declaration....[[-5.54,169.25,106.36],[0.228615,0.670302,-0.66034,0.249763],[-1,-1,1,0],[9E+09,-45,15.0002,9E+09,9E+09,9E+09]] overtop of point name to convert to inline
You could do all of that in a txt editor using a backup but this would be a very tedious job but very doable.
You would also need to calculate the offset you need to add to the track data for station 2.
Does the robot move on the track during program execution in stn1? Or does it just sit in one spot?
You could calculate the offset by looking at the stn positions in the baseframe and just add the difference to the track data, i imagine. If they use the same unit of measurement. If not you will need to figure out a conversion factor. This i dont know because of the lack of experience with tracks.
You might be able to get away with putting the robot into a postion where the migwire touches the faceplate on stn1 and then read the track position, then pull the arm out vertically move the robot down the track past the faceplate on stn2. then bring the arm back down and move the robot back along the track untill the wire touches the faceplate and read that track position, the difference is your offset to add to the track data.
i might add this will only work if the cell is as follows
===Robot====================
Stn1 Stn2
Head------Tail Head------Tail
Track : ===I hope my explaination has been clear. I've done this kind of shift of code from one workobj to another multiple times. never with a track but on a sky hook positioner where i have multiple weld stations on one plate. If the jig holds 2 parts, ill teach 2 workobjects (The 2nd wobj needs to be oriented the same as the first when i rotate the fixture 180), program the one part. copy the program and change the workobject in the copy. Then i'll add 180 degress to all my positioner data in the copy so the 2nd part has rotated into the same position as the first part. Same concept as what ive described above except all on the same positioner. The only difference is you'll only need to edit the workobject and the track data in your copy. Everything else remains the same besides a new routine name for your copy and the way you load it. You'll still need to walk through it and tweak the points afterwards but everything should be pretty close.
2573.47 is the position of the track and the 160.004 is the position of the station for that particular point. I took a point basically out of our 180 degree position routine.
You make really good knowledgeable insights. I did copy the program and edited in notepad to change the names of all the targets to be their "own" (STN2 tags instead of STN1 tags) so they didn't conflict with the ones from other program. I also changed what mech unit activates (STN2 instead of STN1) and the work object (STN1 work object to STN2 work object). But that's as far as I went. Program loaded in fine, and it would control the correct station, but some points when I stepped forward to them it would complain that the some positions were not reachable or it would still go to STN1, despite STN2 being turned in correct position and having the STN2 work object attached to the target line. So that's where I was getting hung up on there having to be some kind of conversion step to make these targets actually transfer, which I was told RobotStudio can take care of fairly easy. The robot does move up and down the track during this program I'm trying to convert.
I'm going to attach a picture that shows our cell layout. It's just a basic drawing I made real quick in Paint. But it will give an idea with what I work with. We have identical fixtures on both stations that never get changed. It has various attachments that are interchangeable for multiple parts. But the work object is taught exactly in the same orientation from STN1 and STN2.
https://imgur.com/gallery/cell-layout-0rGqAYl#7gppsJP
0 -
ok i gotcha...scratch everything i said. lol ya i would investigate using the mirror function...do some reading. its definatly opposite...seems like a fun project if you can get it working. not only is the robot reversed but also the part. if one of the headstocks was reversed, the robot would be approaching the part and positioner in the same orientation, lets say headstock to the right. but your setup reverses this.
One stn is headstock right and the other headstock left. You basically working from opposite sides of the parts. Interesting....have to take a minute and think about that one0
Categories
- All Categories
- 5.6K RobotStudio
- 401 UpFeed
- 21 Tutorials
- 15 RobotApps
- 306 PowerPacs
- 407 RobotStudio S4
- 1.8K Developer Tools
- 250 ScreenMaker
- 2.9K Robot Controller
- 365 IRC5
- 84 OmniCore
- 8 RCS (Realistic Controller Simulation)
- 854 RAPID Programming
- 37 AppStudio
- 4 RobotStudio AR Viewer
- 19 Wizard Easy Programming
- 111 Collaborative Robots
- 5 Job listings
