Hi everyone,
New on Fanuc robots and not yet an everyday user,
I am reaching to you to have your retex regarding the best strategies to bring back the robot to home from any position if the robot is unintentionally stopped
Thank you very much
Hi everyone,
New on Fanuc robots and not yet an everyday user,
I am reaching to you to have your retex regarding the best strategies to bring back the robot to home from any position if the robot is unintentionally stopped
Thank you very much
I use return to home, so I always write down the current positions in the PR, then check them through the conditions, where I then jump to various help points from where the robot can get to the home position.
It's not the easiest to write down, but it works.
code example:
22: LBL[1] ;
23: !position control ;
24: IF DO[2:Ref. Servis]=ON,JMP LBL[1100] ;
25: IF DO[1:Ref. Home]=ON,JMP LBL[1200] ;
26: ;
27: LBL[900] ;
28: !Write akt.pos. registers ;
29: PR[95:Akt.pos.JPOS]=JPOS ;
30: PR[96:Akt.pos.LPOS]=LPOS ;
31: ;
32: !write J1,J2,J3,J4,J5,J6 ;
33: R[150:Pos. J1]=PR[95,1:Akt.pos.JPOS] ;
34: R[151:Pos. J2]=PR[95,2:Akt.pos.JPOS] ;
35: R[152:Pos. J3]=PR[95,3:Akt.pos.JPOS] ;
36: R[153:Pos. J4]=PR[95,4:Akt.pos.JPOS] ;
37: R[154:Pos. J5]=PR[95,5:Akt.pos.JPOS] ;
38: R[155:Pos. J6]=PR[95,6:Akt.pos.JPOS] ;
39: ;
40: !write X,Y,Z,W,P,R ;
41: R[156:Pos. X]=PR[96,1:Akt.pos.LPOS] ;
42: R[157:Pos. Y]=PR[96,2:Akt.pos.LPOS] ;
43: R[158:Pos. Z]=PR[96,3:Akt.pos.LPOS] ;
44: R[159:Pos. W]=PR[96,4:Akt.pos.LPOS] ;
45: R[160:Pos. P]=PR[96,5:Akt.pos.LPOS] ;
46: R[161:Pos. R]=PR[96,6:Akt.pos.LPOS] ;
47: ;
48: IF R[150:Pos. J1]>=115,JMP LBL[400] ;
49: IF R[150:Pos. J1]<55 AND R[150:Pos. J1]>(-10),JMP LBL[100] ;
50: IF R[150:Pos. J1]<=(-10),JMP LBL[200] ;
51: IF R[150:Pos. J1]>=55,JMP LBL[300] ;
52: ;
53: ;
54: LBL[100] ;
55: !Control pos. NOK table ;
56: IF R[150:Pos. J1]>=(-10) AND R[150:Pos. J1]<=55 AND R[156:Pos. X]>=780,JMP LBL[1000] ;
57: IF R[150:Pos. J1]>=(-10) AND R[150:Pos. J1]<=55 AND R[158:Pos. Z]<=(-100),JMP LBL[1010] ;
58: IF R[150:Pos. J1]>=(-10) AND R[150:Pos. J1]<=55 AND R[156:Pos. X]<=780 AND R[158:Pos. Z]>=(-100),JMP LBL[1050] ;
59: ;
60: DO[10:Fault Home]=PULSE,0.5sec ;
61: END ;
62: ;
63: ;
64: LBL[200] ;
65: !Control pos. ST210 ;
66: IF R[150:Pos. J1]<=(-10) AND R[150:Pos. J1]>=(-96) AND R[157:Pos. Y]<=(-800) AND R[158:Pos. Z]<=142,JMP LBL[1000] ;
67: IF R[150:Pos. J1]<=(-10) AND R[150:Pos. J1]>=(-96) AND R[157:Pos. Y]<=(-800) AND R[158:Pos. Z]>=142,JMP LBL[1070] ;
68: IF R[150:Pos. J1]<=(-10) AND R[150:Pos. J1]>=(-96) AND R[156:Pos. X]<=700 AND R[158:Pos. Z]>=140,JMP LBL[1070] ;
69: ;
70: DO[10:Fault Home]=PULSE,0.5sec ;
71: END ;
72: ;
73: LBL[300] ;
74: !Control pos. ST305 ;
75: IF R[150:Pos. J1]>=50 AND R[150:Pos. J1]<=110 AND R[157:Pos. Y]>=936,JMP LBL[1000] ;
76: IF R[150:Pos. J1]>=50 AND R[150:Pos. J1]<=110 AND R[158:Pos. Z]<=150,JMP LBL[1010] ;
77: IF R[150:Pos. J1]>=50 AND R[150:Pos. J1]<=110 AND R[157:Pos. Y]<=936 AND R[158:Pos. Z]>=R[150:Pos. J1],JMP LBL[1060] ;
78: DO[10:Fault Home]=PULSE,0.5sec ;
79: END ;
80: ;
81: LBL[400] ;
82: !Control pos. ST295 ;
83: IF (PR[96,1:Akt.pos.LPOS]>(-950) AND PR[96,1:Akt.pos.LPOS]<(-550) AND PR[96,3:Akt.pos.LPOS]<=(-390)),JMP LBL[410] ;
84: IF (PR[96,1:Akt.pos.LPOS]>(-950) AND PR[96,1:Akt.pos.LPOS]<(-550) AND PR[96,3:Akt.pos.LPOS]<=330 AND PR[96,3:Akt.pos.LPOS]>(-390)),JMP LBL[420] ;
85: IF (PR[96,1:Akt.pos.LPOS]>(-950) AND PR[96,1:Akt.pos.LPOS]<(-550) AND PR[96,3:Akt.pos.LPOS]<=1070 AND PR[96,3:Akt.pos.LPOS]>330),JMP LBL[430] ;
86: MESSAGE[moving the robot manually] ;
87: END ;
88: ;
89: LBL[410:auxiliary from below] ;
90:J P[6] 10% CNT20 ;
91:J P[7] 15% CNT20 ;
92: JMP LBL[1100] ;
93: ;
94: LBL[420:pomocna stred] ;
95:J P[9] 10% CNT20 ;
96:J P[7] 15% CNT20 ;
97: JMP LBL[1100] ;
98: ;
99: LBL[430:auxiliary center] ;
100:J P[10] 10% CNT20 ;
101:J P[7] 15% CNT20 ;
102: JMP LBL[1100] ;
103: ;
104: LBL[1000] ;
105: PR[96:Akt.pos.LPOS]=LPOS ;
106: ;
107: PR[97,1:Offset home use]=(-30) ;
108: PR[97,2:Offset home use]=0 ;
109: PR[97,3:Offset home use]=0 ;
110: PR[97,4:Offset home use]=0 ;
111: PR[97,5:Offset home use]=0 ;
112: PR[97,6:Offset home use]=0 ;
113: ;
114:L PR[96:Akt.pos.LPOS] 100mm/sec FINE Tool_Offset,PR[97:Offset home us] ;
115: JMP LBL[900] ;
116: ;
117: LBL[1010] ;
118: PR[96:Akt.pos.LPOS]=LPOS ;
119: ;
120: PR[97,1:Offset home use]=0 ;
121: PR[97,2:Offset home use]=0 ;
122: PR[97,3:Offset home use]=30 ;
123: PR[97,4:Offset home use]=0 ;
124: PR[97,5:Offset home use]=0 ;
125: PR[97,6:Offset home use]=0 ;
126: ;
127:L PR[96:Akt.pos.LPOS] 100mm/sec FINE Offset,PR[97:Offset home use] ;
128: JMP LBL[900] ;
129: ;
130: LBL[1050] ;
131:J P[1] 20% FINE ;
132: JMP LBL[1100] ;
133: ;
134: LBL[1060] ;
135:J P[2] 20% FINE ;
136: JMP LBL[1100] ;
137: ;
138: LBL[1070] ;
139:J P[3] 20% FINE ;
140:J P[4] 20% FINE ;
141:J P[5] 20% FINE ;
142: JMP LBL[1100] ;
143: ;
144: LBL[1100] ;
145:J PR[100:Home position] 10% FINE ;
146: LBL[1200] ;
Display More
If there are multiple stations and machines in the workplace, the HOME program can have more than 500 lines.
I have also seen a similar principle, but using the SPACE function.
Alternatively, in the main program you marked a FLAG for each position and in the Home program then "back", the entire program back from the given FLAG.
Verys thanks for your feedback and contribution.
I hope others will share their methods and strategies.
Hi,
You can set up a macro program with your home position, then select the SU button.
This method isn't automatic, you need to switch to manual mode (T1 or T2)
if you haven't done it before check the link below :
We use a recovery sub program. We write the position to a position register and then use IF statements to determine if the robot is in a location it can be recovered as well as recoverin it. If the robot is not in an area and pose that has a recovery procedure it throws a user alarm and must have a technicain recover. An example of a non recoverable area would be shared spaces or in machines.
We use ref positions and space checks to find where the robot is in the cell.
Based on the above information, we write if statements to home the robot safely.
If the robot enters a complicated space where recovery is not easy, we use registers, increment the register value, and backstep based on the register value. This is a more complicated way of getting the robot out.
You can also use DCS "not stop" zones to determine current location similar to the posts above that are using space check, ref pos, or LPOS.
I prefer to use some kind of current location or zone first then rely on registers and breadcrumbs only if needed for the application.
I'm currently finishing a cell that has a ton of interference with paths that snake between equipment below and overhead. Difficult to maneuver even with a teach pendant moving manually. So I created a move stack that the normal routine "pushes" the moves and then a recovery routine can "pulls" moves to reverse the motions until the robot gets to a pounce position. Time invested was worth it because I have a bunch more cells that are going to have the same problem; robot is big because of the payload but space to move is cramped.
I know Fanuc as an option that claims to be able to do the same thing but I couldn't get it to work well because it wants to "rewind" with linear moves (not joint) and if there is a lot of wrist action, the robot throws up configuration faults. So I home brewed my own. Basically breadcrumbs as HawkME mentioned.
One of the other options using R[a] register and record a number after each critical move in each program. Let's say you have five programs, program one R[a] range would be 0 to 1000, program 2 1001 to 2000, program 3 2001 to 3000 and so on.
Whenever you need to home, call home program set another R[b] register to 1 to indicate homing request issued and check the value of R register If 0<R<1000 call program 1, 1001<R<2000 call program , 2001<R<3000 program 2 and so on.
In you program 1,2,3... check IF R[b]=1 jump to the homing label placed after the end of normal cycle of this program and depends of the value of R[a] you can program a backward exit from your R[a] position. than reset R[a] and R[b]. starting comparing R[a] to highest enter motion to built exit if robot stopped entering the cell and to the lowest exit motion number to finish the exit. If that make sense.
Also CRX robots have built in backward exit program when you can record up to 6000mm of motion and execute a backward exit. But from my experience if robot moves fast the recording is not accurate, so I used this method even with CRXs instead of built in option...