Reltool

I am working on a ABB robot IRB2400 using IRC5 controller . The robot is used to cut keypad slots for ATM machines. Iam using Reltool command , as it becomes lot easier to define one point and use reltool and offset the robot in relation to my master point.

I have to cut keypad slots which are rectangular in shape and I have found that even if you give proper xyz (dimensions). The robot shows signs of overshooting at the four corners of the robot. I have posted pictures to give a better understanding of what Iam tryin to say. I have checked the aligned of the tool and everthing is fine. But i cannot get rid of this overshooting. Looking at the last picture you can see the left hand botton corner has a curve like feature, which is the most annoying bit here. I cannot figure out why it takes extra material from the corner and then follows the straght line. I will attach a part of the code here so that everyone gets an understanding of what I have done. I have numbered the whole sequence. The corners are 1-2-3-4 in clockwise direction. But I am machining the hole in a sequence, which is 1-4-3-2 and then it does the final bit at the top that is 2-1.
IT WOULD BE REALLY GREAT IF FORUM USERS COULD GIVE ME SOME SUGGESTION ON HOW TO SOLVE THIS PROBLEM.
PROC VW3_KEYBOARD()
VAR num rx := 13;
VAR num ry := 45;
VAR num rz := 3;
VAR num y := 6;
SetGO tmp2, 6000;
!

!MoveL Test_largekey, v50, z50, Machine_ToolWObj:=wobj_V1;
!MoveL RelTool( Test_largekey,0.5,0,0.5Rx:=0Ry:=0.0Rz:=-0.0), v40, fine, Machine_ToolWObj:=wobj_V1;
!MoveL RelTool( Test_largekey,0,0,-80Rx:=0Ry:=0Rz:=-0.0), v40, fine, Machine_ToolWObj:=wobj_V1;
!
!!!
!!!Large Key board First cut(smaller hole 0.5x0.5mm inward.
!!!
!

!start from some random point and then move to first
MoveJ common, v400, z30, Machine_ToolWObj:=wobj_V1;
MoveJ common10, v400, z30, Machine_ToolWObj:=wobj_V1;
MoveJ common80, v400, z30, Machine_ToolWObj:=wobj_V1;
MoveL RelTool( vw3_key,0.3,-10,44.75Rx:=0Ry:=0Rz:=0), v200, fine, Machine_ToolWObj:=wobj_V1;
!
!Drill the first hole
MoveL RelTool( vw3_key,1,y,44.75Rx:=0Ry:=0Rz:=0), v40, z1, Machine_ToolWObj:=wobj_V1;
!1

MoveL RelTool( vw3_key,0,y,89.5Rx:=rxRy:=ryRz:=rz), v40, z0, Machine_ToolWObj:=wobj_V1;
!4
MoveL RelTool( vw3_key,0,y,20Rx:=rxRy:=ryRz:=rz), v40, z0, Machine_ToolWObj:=wobj_V1;
MoveL RelTool( vw3_key,1,y,20Rx:=0Ry:=0Rz:=0), v10, z0, Machine_ToolWObj:=wobj_V1;
MoveL RelTool( vw3_key,0,y,20Rx:=0Ry:=0Rz:=0), v10, z1, Machine_ToolWObj:=wobj_V1;
MoveL RelTool( vw3_key,0,y,0Rx:=0Ry:=0Rz:=-0.0), v20, z0, Machine_ToolWObj:=wobj_V1;
!3
MoveL RelTool( vw3_key,186.91,y,0Rx:=0Ry:=0Rz:=-0.0), v40, z0, Machine_ToolWObj:=wobj_V1;
!2
MoveL RelTool( vw3_key,186.91,y,50.00Rx:=0Ry:=0Rz:=0), v40, z0, Machine_ToolWObj:=wobj_V1;
MoveL RelTool( vw3_key,186.00,y,50.00Rx:=rxRy:=ryRz:=rz), v10, z0, Machine_ToolWObj:=wobj_V1;
MoveL RelTool( vw3_key,186.91,y,50.00Rx:=rxRy:=ryRz:=rz), v10, z1, Machine_ToolWObj:=wobj_V1;
MoveL RelTool( vw3_key,186.91,y,89.5Rx:=rxRy:=ryRz:=rz), v10, z0, Machine_ToolWObj:=wobj_V1;
!
!!!
!MOVE TO FINISHING POINT FROM !2 TO !1 BY MOVE IN SOMEHWRE IN THE MIDDLE.
!!!
MoveL RelTool( vw3_key,186.00,y,88.5Rx:=rxRy:=ryRz:=rz), v10, z20, Machine_ToolWObj:=wobj_V1;
MoveL RelTool( vw3_key,186.00,-20,49.5Rx:=rxRy:=ryRz:=rz), v80, z20, Machine_ToolWObj:=wobj_V1;
MoveL RelTool( vw3_key,0.3,-20,44.75Rx:=0Ry:=0Rz:=0), v80, z20, Machine_ToolWObj:=wobj_V1;
MoveL RelTool( vw3_key,0.3,y,85.9Rx:=rxRy:=ryRz:=rz), v40, z0, Machine_ToolWObj:=wobj_V1;
!
!!!
!!!Large Key Board Finishing!!
!!!
!1
MoveL RelTool( vw3_key,-0.1,y,90.8Rx:=rxRy:=ryRz:=rz), v20, z0, Machine_ToolWObj:=wobj_V1;
!4
MoveL RelTool( vw3_key,-0.5,y,3Rx:=rxRy:=ryRz:=rz), v40, z1, Machine_ToolWObj:=wobj_V1;
MoveL RelTool( vw3_key,-0,y,3Rx:=0Ry:=0Rz:=0), v10, z1, Machine_ToolWObj:=wobj_V1;
MoveL RelTool( vw3_key,-0.5,y,-0.5Rx:=0Ry:=0Rz:=-0.0), v10, z1, Machine_ToolWObj:=wobj_V1;
!
!3
MoveL RelTool( vw3_key,186.41,y,-0.5Rx:=0Ry:=0Rz:=-0.0), v40, z1, Machine_ToolWObj:=wobj_V1;
MoveL RelTool( vw3_key,187.41,y,-0.5Rx:=0Ry:=0Rz:=-0.0), v10, z1, Machine_ToolWObj:=wobj_V1;
!2
MoveL RelTool( vw3_key,187.41,y,89.8Rx:=rxRy:=ryRz:=rz), v40, z1, Machine_ToolWObj:=wobj_V1;
MoveL RelTool( vw3_key,187.41,y,90.8Rx:=rxRy:=ryRz:=rz), v10, z1, Machine_ToolWObj:=wobj_V1;
!

!!!
!NOW MOVE TO LARGE KEYBOARD FIRSTCUT FROM 2-1
!!!
!2
MoveL RelTool( vw3_key,185.91,2,89.0Rx:=rxRy:=ryRz:=rz), v40, z0, Machine_ToolWObj:=wobj_V1;
MoveL RelTool( vw3_key,186.91,2,89.5Rx:=rxRy:=ryRz:=rz), v10, z0, Machine_ToolWObj:=wobj_V1;
!1
MoveL RelTool( vw3_key,0,2,89.5Rx:=rxRy:=ryRz:=rz), v40, z0, Machine_ToolWObj:=wobj_V1;
! !
!!!
!MOVE TO 2 AND DO THE FINAL FINISHING CUT
!!!
!
!*******************
!MOVING FROM POINT 1
MoveL RelTool( vw3_key,0.3,y,89.0Rx:=rxRy:=ryRz:=rz), v10, z1, Machine_ToolWObj:=wobj_V1;
MoveL RelTool( vw3_key,0.3,-20,49.5Rx:=rxRy:=ryRz:=rz), v80, z1, Machine_ToolWObj:=wobj_V1;
!********************
!MOVING IN AT POINT 2
MoveL RelTool( vw3_key,186.91,-20,49.5Rx:=rxRy:=ryRz:=rz), v80, z20, Machine_ToolWObj:=wobj_V1;
!
!!!
!FINISHING CUT FROM 2 TO 1
!!!
!
!2
MoveL RelTool( vw3_key,186.41,y,89Rx:=rxRy:=ryRz:=rz), v20, fine, Machine_ToolWObj:=wobj_V1;
MoveL RelTool( vw3_key,186.91,y,89.5Rx:=rxRy:=ryRz:=rz), v10, fine, Machine_ToolWObj:=wobj_V1;
!1
MoveL RelTool( vw3_key,-0,y,89.5Rx:=rxRy:=ryRz:=rz), v10, fine, Machine_ToolWObj:=wobj_V1;
!
!****************** 2ND FINISHING CUT***********************
!
!MOVE TO 2 AND DO THE FINAL FINISHING CUT
!!!
!
!*******************
!MOVING FROM POINT 1
MoveL RelTool( vw3_key,0.3,y,89Rx:=rxRy:=ryRz:=rz), v10, z20, Machine_ToolWObj:=wobj_V1;
MoveL RelTool( vw3_key,-0,-20,49.5Rx:=rxRy:=ryRz:=rz), v80, z20, Machine_ToolWObj:=wobj_V1;
!********************
!MOVING IN AT POINT 2
MoveL RelTool( vw3_key,186.91,-20,49.5Rx:=rxRy:=ryRz:=rz), v80, z20, Machine_ToolWObj:=wobj_V1;
!
!
!!!
!FINISHING CUT FROM 2 TO 1
!!!
!
!2
MoveL RelTool( vw3_key,187,y,90.4Rx:=rxRy:=ryRz:=rz), v40, z0, Machine_ToolWObj:=wobj_V1;
MoveL RelTool( vw3_key,187.41,y,90.9Rx:=rxRy:=ryRz:=rz), v10, z0, Machine_ToolWObj:=wobj_V1;
!1
MoveL RelTool( vw3_key,-0.1,y,90.9Rx:=rxRy:=ryRz:=rz), v40, z0, Machine_ToolWObj:=wobj_V1;
MoveL RelTool( vw3_key,-0.5,y,90.9Rx:=rxRy:=ryRz:=rz), v10, z0, Machine_ToolWObj:=wobj_V1;

Have you looked into Advanced Shape Tuning and axis Friction Tuning?

Have you tried to decrease your accelerations in the cutting path when going arond a corner?

Resequence your cutting path for straight lines only, ending in the corners - decreasing your speeed as you approach the corner, do not turn and cut - too many axis have to change speed /direction suddenly -

HI Thomas,
I haven’t tried Advanced shape tuning and axis friction tuning. I will have a lot for it in the documentation Cd and find out more about it. In the mean time if you have any info on them please do let me know.

I have tried decreasing the acceleration at the corners and that didnt seem to make a difference. I had to add angles as the robot cannot reach the top bit of the square without the angle and there used to be a joint collision fault coming up wthout angles being added. I tried cutting in clockwise and anticlose wise directions but that didnt seem to help either.
Thanks for your help.
Cheers,
Bharat

Hi

I have noted this behaviour on other 2400 robots.. only when cornering.

Is it possible to add a wait time at the corner… I appreciate this will slow down your cycle time.

Hi Sturner,
I will try that. Let me see if that makes a difference.

Thanks

I have tried the waittime to produce a delay at the corners but didnt help.
The problem seems to occur as soon as the robot runs a instruction even if its feed rate is small say v15. Its like the robot is jerking at the start of a instruction and then continues to jog in a straight line. It is seen in automatic mode as well. I spoke to ABB about it and they are confused as well.

How well defined and accurate is the tool load in your TCP decleration?

Are you near or over capacity? - Overshoot is normally caused by poor dynamics for load def. -

Run LoadID more than once - observe the results - if they float alot you either have a load that is over capacity - or you have some other influences (such as cabling) causing unwanted dynamics - if it is possible to run Load ID withiout cables insltalled, do that as well and compare to LoadID results with cabling -

Do you have proper upper arm loads defined to account for cabling? - can the cables be controlled by a tool balancer or removed from robot arm and routed above in any way -

The shorter the cables the better - provide sufficent support for them so they do not influence your process

Post your RTAPID decleration for the TCP Machine_Tool

I have run LoadID twice and come up with a tool load of 6.6kg , and 98% accuracy. The cables are sufficient for the job and they cant be made smaller than this.
Here is the Information about the tool, hope this is will be helpful.
TASK PERS tooldata Machine_Tool:=[TRUE,[[-1.73141,181.756,99.75],[1,0,0,0]],[6.6,[7.8,0,101.5],[1,0,0,0],0,0,0.123]];

Look at Cable routing - not cable size - for possible influences.
Have you taken the complete EOAT off the robot and weigh it? - use that weight as input to Load ID.

Hard to beleive the COG and Inertia set in the tool load. Was that what LoadID Set when it updated the TCP.load values?

Never seen it set any COG or Inertias to zero…

I had called the service routine, Loadidentify and this is wat it had set the tool data after running it. Once the process completed, I saved the values using the pendent. The weight found by the robot is right, the weight value replicates the drill motor and the any fixtures attached at the end of the robot.The cables from the tool are routed in the same way as the robot cables are routed. Thus Iam sure it is caused by the cabling.

I have run the Load identify routine 2 more times and found that the mass remains the same but the COG values vary slightly fro first run it was

  1. COG x= 9.2, y= 0 and z=105 accuracy 99%
  2. COG x= 6.2, y=0 and z= 101.5 accuracy 98%

Look into Advanced Shape Tuning and Friction Tuning then if you are comfortable with the load def in the TCP -

At the moment the Friction compensation under motion settings are not active. The friction FFW on is set as NO for all 6 axis. Just incase I want to revert back to the default values Can I do that or the values lost as soon as change them?

Hi,

Have you tried fine points instead of Z0?

Regards
Graeme

Yes I have tried fine and it doesnt make any difference.

Hi

If you can use a small tool with moveC

I HAV ESCALATED THE ISSUE TO ABB UK. THEY HAVE FORWARDED IT TO SWEDEN. HOPEFULLY A SOLUTION SHOULD BE OUT SOON.
IN THE MEAN TIME THERE IS THIS ISSUE THAT IS BOTHERING ME. IT IS TO DO WIT THE MENU TASK I HAVE CREATED. COULD SOME ON EGIVE ME A SOULTION FOR THIS. MY MAIN TASK DISPLAYS A MESSAGE VIA TPWRITE ON THE TASK SCREEN. BUT THE MENU TASK WHICH IS SEMISTATIC AND THUS THE MENU SCREEN POPS UP ALL THE TIME NOT ALLOWING THE TPWRITE MESSAGES TO BE SHOWN ON THE SCREEN.
PLEASE LET ME KNOW IF THERE IS A WAY AROUND IT.

THIS IS THE MENU TASK

MODULE MainModule
TASK PERS tooldata DRILL_BIT:=[TRUE,[[-1.5959,180.821,99.539],[0.70668,-0.70486,-0.0435024,0.0433906]],[5,[0,0,90],[1,0,0,0],0,0,0]];
CONST robtarget common:=[[808.00,56.04,952.70],[0.0819994,-0.702442,0.702437,0.0801998],[0,0,-2,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
CONST robtarget common10:=[[397.61,-60.64,1188.30],[0.0876785,-0.0675001,0.00262596,-0.993856],[0,0,-3,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
CONST robtarget PARK_POINT:=[[374.53,-32.49,1231.91],[0.130241,-0.15111,0.688131,-0.697623],[0,-1,-3,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
CONST robtarget PARK_POINT10:=[[298.21,-220.72,844.62],[0.09782,-0.0573678,-0.711884,0.693081],[-1,1,-2,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
CONST robtarget PARK_POINT20:=[[298.21,-220.72,844.62],[0.0978206,-0.0573632,-0.711884,0.693081],[-1,1,-2,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
CONST robtarget CHANGE_DRILl:=[[335.48,-219.34,811.16],[0.0212412,-0.0842365,0.995021,0.0488424],[-1,1,-2,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];

!*********************************************************************
VAR btnres btnresMainMenu:=0;
VAR btnres btnresProductSelect:=0;
!*********************************************************************
PERS errnum errnoDibreak:=0;
!*********************************************************************
PERS string stCurrProduct:=“VW1P_BARCODE_2ND_DIP”;
PERS string stCurrModel:=“VW1P”;
!*********************************************************************
CONST string MyButtonsMain{2}:=[“Press to continue”," "];
!CONST string MyButtonsMain1{2}:=[“A”,“B”];
CONST string MyButtonsProdSel1{4}:=[“A”,“B”,“C”,“D”];
CONST string MyButtonsProdSel2{4}:=[“A”,“B”,“C”,“Main Menu”];
CONST string MyButtonsProdSel3{3}:=[“A”,“B”,“Main Menu”];
CONST string MyButtonsProdSel4{4}:=[“A”,“B”,“Main Menu”, “Test_routine”];
!*********************************************************************
!CONST string MyMessageMain {2}:=[“A = Park Robot”,“B = Change Drill Bit”];
CONST string MyMessageProdSel1{4}:=[“A = MODEL VW3”,“B = MODEL VX4”,“C = MODEL VW1P”,“D = Service”];
CONST string MyMessageProdSel2{4}:=[“A = MACHINE THE BARCODE SLOT”,“B = MACHINE THE KEYBOARD SLOT”,“C = MACHINE THE BARCODE & KEYBOARD SLOT”,“MAIN MENU = RETURN TO MAIN MENU”];
CONST string MyMessageProdSel3{3}:=[“A = MACHINE THE BARCODE SLOT”,“B = MACHINE THE BARCODE 2ND DIP SLOT”,“MAIN MENU = RETURN TO MAIN MENU”];
!added
CONST string MyMessageProdSel4{4}:=[“A = Park Robot”,“B = CHANGE TOOL”,“MAIN MENU = RETURN TO MAIN MENU”,“Test_routine”];
!*********************************************************************
PERS bool bProdSelect:=TRUE;

PROC main()
TPErase;
!WaitUntil ICH01 = 1
WaitTime 2;
!WHILE TRUE DO
IF UIClientExist() THEN
btnresMainMenu := UIMessageBox(Header:=“Waiting For Operator Ready"Message:=“Current Product: " + stCurrProductBtnArray:=MyButtonsMainIcon:=iconInfoDIBreak:=ICH01BreakFlag:=errnoDibreak);
ENDIF
IF btnresMainMenu = 1 THEN
Product_Select;
!
ELSEIF errnoDibreak = ERR_TP_NO_CLIENT THEN
WaitTime 3;
RETURN;
!
ELSEIF errnoDibreak = ERR_TP_DIBREAK AND stCurrModel = “PARK” THEN
!TPWRITE"MOVING ROBOT TO PARK POSITION”;
!ADDED
RETURN;
ELSEIF errnoDibreak = ERR_TP_DIBREAK THEN
!****THE MOTION TASK WILL START IN T_ROB1/MAINMODULE
RETURN;
ENDIF
!!!CHECK TO SEE IF A PRODUCT HAS BEEN SELECTED
!!
!!!Check for the correct fixture ICH04,ICH05,ICH06!!!
!!!
!!!Here I have grouped inputs ICH04(fixture check senser for VW3), ICH05(fixture check senser for VW1P), ICH06(fixture check ssenser for VX4)
!!!
!!!ICH07(PART CLAMPED SENSOR), ICH08(PART CLAMPED SENSOR)
!!!
!!!IAM NAMING THE GROUP AS SENSOR_GROUP
!!!USING A TEST STATEMENT TO CHECK THE VALUES OF THE SENSOR AND GIVING THE OUTPUT
!!!UNIT MAPPING 7-3
!!!AT A TIME ONE OF THE SENSORS FOR FIXTURES ICH04,ICHO5,ICH06 SHOULD BE HIGH AND BOTH ICH09 AND ICH10 SHOULD BE HIGH
!!!THE THREE BINARY INPUT POSSIBILITIES ARE 10011 = 19 ,01011 = 11 ,00111 = 7
!!!
!!TEST SENSORGROUP
!!CASE 19:
!!IF stCurrModel = “VW3” THEN
!!TPWRITE"THE “+stCurrProduct+” WILL BE MACHINED”;
!!ELSE
!!TPWRITE “THE FIXTURE DOES NOT MATCH THE MODEL SELECTED BY THE OPERATOR”;
!!TPWRITE" “;
!!TPWRITE “PRESS THE RESET BUTTON TO RETURN TO MAIN MENU”;
!!!
!!WaitUntil ICH03 = 1;
!!EXITCYCLE;
!!ENDIF
!!CASE 11:
!!IF stCurrModel = “VW1P” THEN
!!TPWRITE"THE “+stCurrProduct+” WILL BE MACHINED”;
!!ELSE
!!TPWRITE “The Program selected and model placed in the machine doesnt match”;
!!TPWRITE" “;
!!TPWRITE “PRESS THE RESET BUTTON TO RETURN TO MAIN MENU”;
!!!
!!WaitUntil ICH03 = 1;
!!EXITCYCLE;
!!ENDIF
!!CASE 7:
!!IF stCurrModel = “VX4” THEN
!!TPWRITE"THE “+stCurrProduct+” WILL BE MACHINED”;
!!ELSE
!!TPWrite “The Program selected and model placed in the machine doesnt match”;
!!TPWRITE" “;
!!TPWRITE “PRESS THE RESET BUTTON TO RETURN TO MAIN MENU”;
!!!
!!WaitUntil ICH03 = 1;
!!EXITCYCLE;
!!ENDIF
!!DEFAULT:
!!TPWRITE “Please check the fixture and whether the model is clamped properly”;
!!TPWRITE” “;
!!TPWRITE “PRESS THE RESET BUTTON TO RETURN TO MAIN MENU”;
!WaitUntil ICH03 = 1;
!EXITCYCLE;
!!!
!ENDTEST
!!!
!!!*******THE MAIN TASK (T_ROB1)WILL HANDLE THE REST
!!!*****THE MAIN TASK WILL START THE ROUTINE;
!!!*STRCURRPRODUCT IS BEING USED AS A PERS VARIABLE TO CARRY INFOR TO MAIN MENU
!ENDWHILE
ENDPROC
!
!
PROC Product_Select()
bProdSelect := FALSE;
WHILE bProdSelect = FALSE DO
btnresProductSelect := UIMessageBox(Header:=“Current Product: " + stCurrProductMsgArray:=MyMessageProdSel1BtnArray:=MyButtonsProdSel1Icon:=iconInfo);
TEST btnresProductSelect
CASE 1:
stCurrModel:= “VW3”;
CASE 2:
stCurrModel:= “VX4”;
CASE 3:
stCurrModel:= “VW1P”;
CASE 4:
stCurrModel:= “Service”;
ENDTEST
IF stCurrModel = “VW3” OR stCurrModel = “VX4” THEN
btnresProductSelect := UIMessageBox(Header:=“Current Model: " + stCurrModelMsgArray:=MyMessageProdSel2BtnArray:=MyButtonsProdSel2Icon:=iconInfo);
TEST btnresProductSelect
CASE 1:
stCurrProduct:= stCurrModel+”_BARCODE”;
bProdSelect := TRUE;
CASE 2:
stCurrProduct:= stCurrModel+”_KEYBOARD";
bProdSelect := TRUE;
CASE 3:
stCurrProduct:= stCurrModel+“_BARCODEANDKEYBOARD”;
bProdSelect := TRUE;
ENDTEST
ELSEIF stCurrModel = “VW1P” THEN
btnresProductSelect := UIMessageBox(Header:=“Current Model: " + stCurrModelMsgArray:=MyMessageProdSel3BtnArray:=MyButtonsProdSel3Icon:=iconInfo);
TEST btnresProductSelect
CASE 1:
stCurrProduct:= stCurrModel+”_BARCODE";
bProdSelect := TRUE;
CASE 2:
stCurrProduct:= stCurrModel+“_BARCODE_2ND_DIP”;
bProdSelect := TRUE;
ENDTEST
!ADDED
ELSEIF stCurrModel = “Service” THEN
btnresProductSelect := UIMessageBox(Header:="Current Model: " + stCurrModelMsgArray:=MyMessageProdSel4BtnArray:=MyButtonsProdSel4Icon:=iconInfo);
TEST btnresProductSelect
CASE 1:
stCurrProduct:= “PARK”;
bProdSelect := TRUE;
CASE 2:
stCurrProduct:= “CHANGE_TOOL”;
bProdSelect := TRUE;
CASE 4:
stCurrProduct:= “Test_routine”;
bProdSelect := TRUE;
ENDTEST
ENDIF
ENDWHILE
ENDPROC
ENDMODULE

THIS IS MY MAIN TASK(TASK WITH ROBOT MOTION PROGRAMMED)
PROC main()
TPERASE;
!TPShow TP_LATEST;
waituntil ICH01=1;
!!!
!RESET BEACON ALARM
Reset OCH01;
!!!
!RESET RED BEACON
Reset OCH02;
!!!
!SET GREEN BEACON
Set OCH03;
!!!
!
IF stCurrProduct = “PARK” then
%stCurrProduct%;
ELSEIF
stCurrProduct = “CHANGE_TOOL” then
%stCurrProduct%;
ELSEIF
stCurrProduct = “Test_routine” then
%stCurrProduct%;
!!!Check for the correct fixture ICH04,ICH05,ICH06!!!
!
!Here I have grouped inputs ICH04(fixture check senser for VW3), ICH05(fixture check senser for VW1P), ICH06(fixture check ssenser for VX4)
!
!ICH07(PART CLAMPED SENSOR), ICH08(PART CLAMPED SENSOR)
!
!IAM NAMING THE GROUP AS SENSOR_GROUP
!USING A TEST STATEMENT TO CHECK THE VALUES OF THE SENSOR AND GIVING THE OUTPUT
!UNIT MAPPING 7-3
!AT A TIME ONE OF THE SENSORS FOR FIXTURES ICH04,ICHO5,ICH06 SHOULD BE HIGH AND BOTH ICH09 AND ICH10 SHOULD BE HIGH
!THE THREE BINARY INPUT POSSIBILITIES ARE 10011 = 19 ,01011 = 11 ,00111 = 7
!

Else
SetGO tmp2, 3000;
SetGO tmp1, 97;
!
TEST SENSORGROUP
CASE 19:
IF stCurrModel = “VW3” THEN
TPWRITE"THE “+stCurrProduct+” WILL BE MACHINED";
%stCurrProduct%;
ELSE
!SET BEACON ALARM
Set OCH01;
WaitTime 1;
!!!
!RESET BEACON ALARM
Reset OCH01;
!SET RED BEACON
Set OCH02;
!!!
!RESET GREEN BEACON
Reset OCH03;
!
TPWRITE “The Program selected and model placed in the machine doesnt match”;
TPWRITE “PRESS THE RESET BUTTON TO RETURN TO MAIN”;
!
WaitUntil ICH03 = 1;
EXITCYCLE;
ENDIF

CASE 11:
IF stCurrModel = “VW1P” THEN
TPWRITE"THE “+stCurrProduct+” WILL BE MACHINED";
%stCurrProduct%;
ELSE
!SET BEACON ALARM
Set OCH01;
WaitTime 1;
!!!
!RESET BEACON ALARM
Reset OCH01;
!SET RED BEACON
Set OCH02;
!!!
!RESET GREEN BEACON
Reset OCH03;
!
TPWRITE “The Program selected and model placed in the machine doesnt match”;
TPWRITE “PRESS THE RESET BUTTON TO RETURN TO MAIN”;
!
WaitUntil ICH03 = 1;
EXITCYCLE;
ENDIF

CASE 7:
IF stCurrModel = “VX4” THEN
TPWRITE"THE “+stCurrProduct+” WILL BE MACHINED";
%stCurrProduct%;
ELSE
!SET BEACON ALARM
Set OCH01;
WaitTime 1;
!!!
!RESET BEACON ALARM
Reset OCH01;
!SET RED BEACON
Set OCH02;
!!!
!RESET GREEN BEACON
Reset OCH03;
!
TPWrite “The Program selected and model placed in the machine doesnt match”;
TPWRITE “PRESS THE RESET BUTTON TO RETURN TO MAIN”;
!
WaitUntil ICH03 = 1;
EXITCYCLE;
ENDIF

DEFAULT:
!SET BEACON ALARM
Set OCH01;
WaitTime 1;
!!!
!RESET BEACON ALARM
Reset OCH01;
!SET RED BEACON
Set OCH02;
!!!
!RESET GREEN BEACON
Reset OCH03;
!
TPWRITE “Please check the fixture and whether the model is clamped properly”;
TPWRITE “PRESS THE RESET BUTTON TO RETURN TO MAIN”;
WaitUntil ICH03 = 1;
EXITCYCLE;
!
ENDTEST
ENDIF
!!!
!!%Procedure call% it calls the procedures local to the task

!!!
!SET RED BEACON
Set OCH02;
!!!
!RESET GREEN BEACON
Reset OCH03;
WaitTime 0.1;
!!!
!stop the Drill
SetGO tmp1, 32;
!!!Notify the operator of the end of cycle!!!
!SET BEACON ALARM
Set OCH01;
WaitTime 1;
!!!
!RESET BEACON ALARM
Reset OCH01;
TPERASE;
TPWRITE"THE OPERATION HAS BEEN COMPLETED";
WaitTime 1;
TPERASE;
TPShow TP_LATEST;
!!END OF THE MACHINING TASK
!
ENDPROC
!!!PARK ROBOT ROUTINE!!!
PROC PARK()
TPWRITE"MOVING ROBOT TO PARK POSITION";
MoveJ common, v400, z30, Machine_ToolWObj:=wobj_V1;
MoveJ Parkrobot, v400, z30, Machine_ToolWObj:=wobj_V1;

ENDPROC
PROC CHANGE_TOOL()
TPWRITE"MOVING ROBOT TO PARK POSITION";
MoveJ common, v400, z30, Machine_ToolWObj:=wobj_V1;
MoveJ CHANGE_DRILl, v400, z30, Machine_ToolWObj:=wobj_V1;

ENDPROC

Hi

I dot not know but check for raisetouser command