Store weld / seam data when going into error recovery.
I want to advance 10mm in my arc error recovery routine and try and arc again but I need to use the same weld / seam data that was tried in the rapid code. I know ABB has a built in routine that does this but I want to travel back to start point to fill in the gap (which ABBs arc error handler does not do)
1
Comments
-
If you store the point at which you have the arc error (eg p1 := CRobT();) then you can go back and weld from this point for 10 mm?
0 -
You could also look into the path recorder.Lee Justice0
-
graemepaulin said:If you store the point at which you have the arc error (eg p1 := CRobT();) then you can go back and weld from this point for 10 mm?
0 -
So you are not talking about the arc weld recovery?0
-
Yes I am. In ABB standard arc recovery it will advance 10mm and try and arc again. If it does arc it will carry on to point 2 but will leave a 10mm gap where it advanced to try and arc again. Im looking to some how fill this gap in (by traveling back to point 1 then continue to point 2)0
-
You can setup the recovery so that it retries from where it is (ie does not advance 10mm), as well as the number of automatic retries before it gives you an error.0
-
I do have this but sometimes it still does not arc and needs to advance the 10mm.0
-
@Maxim Riabichev is there an arc welding expert that could help here?0
-
@graemepaulin most certainly. But I'm not sure if they roam these forums
I'd recommend contacting local ABB if no one can provide support via this route.
—Maxim RiabichevPC Software Support Engineer0 -
What is the error that is occurring to cause the error on the weld area?
Reason for asking is if you can isolate that cause you can find a suitable solution for it.
For instance. I weld heavy duty materials and most of the times I am required to do multipasses and I found that due to the welding prep, welding wire and parent material, cause slag on the start of the next weld. What I have done is create this code and it will scrape on the specific area for a prescribed amount of times until it can restart the arc. All is happening and no operator input is required at least until it reaches the prescribed amount of times.
To note you have to set your Process Configuration to accommodate this code so that it will run.%%% VERSION:1 LANGUAGE:ENGLISH %%% MODULE Sys_Errors(SYSMODULE,NOVIEW) !******************************************************* !Module Name: - Sys_Errors !Description: - Sys_Errors Module for Robot System !******************************************************* PERS num nErrCount; PERS num nErrReport:=0; VAR num ncErrorClk; PERS num nScrape:=4; VAR num nScrapeX:=0.25; VAR num nScrapeY:=0.25; VAR num nScrapeZ:=0.25; VAR num nListErrorIndex; VAR robtarget pCurrent; VAR string sArcIgnErrs; CONST string sArcIgniErrDir:="ARC IGNITION LOG"; PERS string sErrFeedBackText:=""; CONST string sErrInformation{7}:=["TIME SPENT IN LAST ERROR : ","NO OF ERRORS OCCURED IN PART : ","LAST ERROR THAT OCCURED : ","ACTION USED TO FIX LAST ERROR : ", "TIME LAST ERROR OCCURED : ","TIME LAST ERROR WAS FIXED : ","DATE LAST ERROR OCCURED : "]; PERS string sErrClk:=""; PERS string sErrRepNo:=""; PERS string sErrStartTime:=""; PERS string sErrStopTime:=""; CONST string sArcIgnErr:="ARC IGNITION ERROR"; PERS string sLastErr:=""; PERS string sLastErrLogTime:="17:51:19"; PERS string sLastErrLogDate:=""; PERS string sLastErrRecov_Opt{5}:=["OPTION 1 - MOVE TO CUTTER","OPTION 2 - MOVE TO REAMER","OPTION 3 - MOVE TO SPRAY","OPTION 4 - MOVE TO SAFE POS",""]; CONST string sDirErrMain:="Home:/Report Information/Error Logs"; CONST string sRepArcErr{3}:=["TIME:","OPERATOR ON DUTY:","DATE:"]; VAR clock cErrorClk; VAR bool bHardFacing_Active:=FALSE; PROC ReportArcIgniErr() ErrWrite\W,"ARC IGNITION ERROR. ","CHECK WELDING EQUIPMENT."\RL2:=" "\RL3:="CORRECT PROBLEM AND"\RL4:="PRESS EXECUTE BUTTON WHEN READY."; sLastErr:=sArcIgnErr; sLastErrLogTime:=CTime(); sLastErrLogDate:=CDate(); OpenDir directory,sDirErrMain; Open sDirErrMain\File:=sArcIgnErr+sGap+CDate()+FileExtension(\CsvExt),infile\Read; sErrFeedBackText:=ReadStr(infile\DiscardHeaders); Close infile; IF sErrFeedBackText=sArcIgnErr+sGap+CDate() THEN Open sDirErrMain\File:=sArcIgnErr+sGap+CDate()+FileExtension(\CsvExt),infile\Append; ELSE sErrFeedBackText:=sClear; Open sDirErrMain\File:=sArcIgnErr+sGap+CDate()+FileExtension(\CsvExt),infile\Write; ENDIF sArcIgnErrs:=ArcIgnErr(); ERROR IF ERRNO=ERR_FILEOPEN OR ERRNO=ERR_FILNOTFND OR ERRNO=ERR_FILEACC THEN SkipWarn; MakeDir sDirErrMain; OpenDir directory,sDirErrMain; Open sDirErrMain\File:=sArcIgnErr+sGap+CDate()+FileExtension(\CsvExt),infile\Write; Write infile,sArcIgnErr+sGap+CDate(); Write infile,"-----------------------------"; Write infile,""; Close infile; SkipWarn; CloseDir directory; Close infile; ResetRetryCount; RETRY; ENDIF ENDPROC FUNC string ArcIgnErr() VAR string sArcIgnErr; CONST string sRepArcErrIgniDescr{7}:=["ROBOT FAILED TO ARC IN:","CORRECT PROBLEM BY: "," - DESCALING WELDING AREA OR"," - POLISH/GRIND WELDING AREA OR"," - TRIM WIRE OR", " - CHECK CONTACT TIP FOR WIRE STICK OR"," - CHECK WELDING WIRE LEVEL."]; sErrFeedBackText:=sClear; Write infile,sRepArcErr{1}+sGap+CTime()+sGap+sRepArcErr{3}+sGap+CDate(); Write infile,""; Write infile,sArcIgnErr; Write infile,""; Write infile,sRepArcErrIgniDescr{1}+sGap+sRep_PartDes{2}; Write infile,sRepArcErrIgniDescr{2}; Write infile,sRepArcErrIgniDescr{3}; Write infile,sRepArcErrIgniDescr{4}; Write infile,sRepArcErrIgniDescr{5}; Write infile,sRepArcErrIgniDescr{6}; Write infile,sRepArcErrIgniDescr{7}; Write infile,""; Write infile,sRepArcErr{2}+sGap+sRep_OperOnDuty{2}; Write infile,"---------------------------------------------------"; Close infile; CloseDir directory; SkipWarn; ErrWrite\I,"ERROR REPORT GENERATED UNDER :",StrMap(sDirErrMain,STR_LOWER,STR_UPPER)+"/"+CDate(); RETURN sArcIgnErr; ENDFUNC PROC PreErr() VAR num nScrapeStart:=1; VAR num nScrapeEnd:=5; VAR robtarget pScrape; VAR num nService; ! rt99 = Error Location VAR robtarget rt99:=[[2006.72,1357.7,-433.462],[0.0148458,0.00984716,-0.999816,-0.00710797],[1,-1,1,0],[1765.14,9E+09,9E+09,9E+09,9E+09,9E+09]]; ! rt99_1 = Move Out with RelTool from Error Location VAR robtarget rt99_1:=[[2006.72,1357.7,-433.462],[0.0148458,0.00984716,-0.999816,-0.00710797],[1,-1,1,0],[1765.14,9E+09,9E+09,9E+09,9E+09,9E+09]]; ! rt99_2 = Move Out with Offs from rt99_1 VAR robtarget rt99_2:=[[2006.72,1357.7,-433.462],[0.0148458,0.00984716,-0.999816,-0.00710797],[1,-1,1,0],[1765.14,9E+09,9E+09,9E+09,9E+09,9E+09]]; VAR listitem liMyErrItems{4}:=[["","OPTION 1 - MOVE TO CUTTER"],["","OPTION 2 - MOVE TO REAMER"],["","OPTION 3 - MOVE TO SPRAY"],["","OPTION 4 - MOVE TO SAFE POS"]]; ClkStart cErrorClk; sErrStartTime:=CTime(); IF bHardFacing_Active=TRUE OR nErrCount<>0 OR nErrCount=0 THEN IF bHardFacing_Active=TRUE THEN pCurrent:=CRobT(\Tool:=tWG_Straight,\WObj:=wobj0); rt99:=pCurrent; MoveL rt99,v1000,fine,tWG_Straight; rt99_1:=RelTool(rt99,0,0,-100); MoveL rt99_1,v1000,fine,tWG_Straight; pCurrent:=Offs(rt99_1,-400,0,0); rt99_2:=pCurrent; MoveL rt99_2,v1000,fine,tWG_Straight; SetDoSignals doBeaconA_Red,1,doBeaconB_Red,1; TPReadFK nService,"CORRECT FAULT AND PRESS OKAY.","","","OKAY","",""; IF nService=3 THEN MV_99_2_99_1_99 rt99_2,rt99_1,rt99,v1000,fine,tWG_Straight; StartMove; SetDoSignals doBeaconA_Red,0,doBeaconB_Red,0; ENDIF ENDIF IF nErrCount>=0 AND nErrCount<5 THEN ! Change the value of nErrCount to whatever value you want the Robot to continue tdDummy:=CTool(); pScrape:=CRobT(\Tool:=tdDummy\WObj:=wobj0); nScrape:=0; FOR i FROM (nScrapeStart) TO (nScrapeEnd) DO CornerPathWarning FALSE; MoveL Offs(pScrape,0,0,-(nScrapeZ)),v100,z1,tdDummy\WObj:=wobj0; MoveL Offs(pScrape,nScrapeX,0,0),v100,z1,tdDummy\WObj:=wobj0; MoveL Offs(pScrape,-nScrapeX,0,0),v100,z1,tdDummy\WObj:=wobj0; MoveL Offs(pScrape,0,0,-(nScrapeZ)),v100,z1,tdDummy\WObj:=wobj0; MoveL Offs(pScrape,0,nScrapeY,0),v100,z1,tdDummy\WObj:=wobj0; MoveL Offs(pScrape,0,-nScrapeY,0),v100,z1,tdDummy\WObj:=wobj0; MoveL Offs(pScrape,0,0,-(nScrapeZ)),v100,z1,tdDummy\WObj:=wobj0; WaitTime 0.2; nScrapeX:=nScrapeX+0.02; nScrapeY:=nScrapeY+0.02; nScrapeZ:=nScrapeZ+0.02; PulseDO\PLength:=0.2,doFeed_1; nScrape:=nScrape+1; WaitTime 0.5; CornerPathWarning TRUE; ENDFOR Decr nERRCount; ENDIF IF nERRCount=5 OR nErrCount>5 THEN tdDummy:=CTool(); ReportArcIgniErr; nListErrorIndex:=UIListView(\Result:=button_answer,\Header:="ERROR OCCURED",liMyErrItems\Icon:=iconInfo\MaxTime:=nMaxtime\BreakFlag:=Err_Var); pCurrent:=CRobT(\Tool:=tdDummy,\WObj:=wobj0); rt99:=pCurrent; MoveL rt99,v1000,fine,tdDummy; TEST nListErrorIndex CASE 1: sLastErrRecov_Opt{5}:=sLastErrRecov_Opt{1}; rt99_1:=RelTool(rt99,0,0,-50); MoveL rt99_1,v1000,fine,tdDummy; pCurrent:=Offs(rt99_1,0,0,400); rt99_2:=pCurrent; MoveL rt99_2,v1000,fine,tdDummy; TSC_Cut; MV_99_2_99_1_99 rt99_2,rt99_1,rt99,v1000,fine,tdDummy; CASE 2: sLastErrRecov_Opt{5}:=sLastErrRecov_Opt{2}; rt99_1:=RelTool(rt99,0,0,-50); MoveL rt99_1,v1000,fine,tdDummy; pCurrent:=Offs(rt99_1,0,0,400); rt99_2:=pCurrent; MoveL rt99_2,v1000,fine,tdDummy; TSC_Ream; MV_99_2_99_1_99 rt99_2,rt99_1,rt99,v1000,fine,tdDummy; CASE 3: sLastErrRecov_Opt{5}:=sLastErrRecov_Opt{3}; rt99_1:=RelTool(rt99,0,0,-50); MoveL rt99_1,v1000,fine,tdDummy; pCurrent:=Offs(rt99_1,0,0,400); rt99_2:=pCurrent; MoveL rt99_2,v1000,fine,tdDummy; TSC_Spray; MV_99_2_99_1_99 rt99_2,rt99_1,rt99,v1000,fine,tdDummy; CASE 4: sLastErrRecov_Opt{5}:=sLastErrRecov_Opt{4}; rt99_1:=RelTool(rt99,0,0,-50); MoveL rt99_1,v1000,fine,tdDummy; pCurrent:=Offs(rt99_1,0,0,400); rt99_2:=pCurrent; MoveL rt99_2,v1000,fine,tdDummy; TPReadFK nService,"CORRECT FAULT AND PRESS OKAY.","","","OKAY","",""; SetDoSignals doBeaconA_Red,1,doBeaconB_Red,1; IF nService=3 THEN MV_99_2_99_1_99 rt99_2,rt99_1,rt99,v1000,fine,tdDummy; StartMove; SetDoSignals doBeaconA_Red,0,doBeaconB_Red,0; ENDIF ENDTEST nERRCount:=0; Incr nErrReport; RETURN; ENDIF ENDIF ENDPROC PROC PostErr() RecoveryMenuWR; ClkStop cErrorClk; sErrStopTime:=CTime(); ncErrorClk:=ClkRead(cErrorClk); sErrClk:=ValToStr(ncErrorClk/60); ENDPROC ENDMODULE
2 -
@jmf
How does it strike the arc again? I assume after
" CornerPathWarning FALSE;MoveL Offs(pScrape,0,0,-(nScrapeZ)),v100,z1,tdDummy\WObj:=wobj0;MoveL Offs(pScrape,nScrapeX,0,0),v100,z1,tdDummy\WObj:=wobj0;MoveL Offs(pScrape,-nScrapeX,0,0),v100,z1,tdDummy\WObj:=wobj0;MoveL Offs(pScrape,0,0,-(nScrapeZ)),v100,z1,tdDummy\WObj:=wobj0;MoveL Offs(pScrape,0,nScrapeY,0),v100,z1,tdDummy\WObj:=wobj0;MoveL Offs(pScrape,0,-nScrapeY,0),v100,z1,tdDummy\WObj:=wobj0;MoveL Offs(pScrape,0,0,-(nScrapeZ)),v100,z1,tdDummy\WObj:=wobj0;WaitTime 0.2;nScrapeX:=nScrapeX+0.02;nScrapeY:=nScrapeY+0.02;nScrapeZ:=nScrapeZ+0.02;PulseDO\PLength:=0.2,doFeed_1;nScrape:=nScrape+1;WaitTime 0.5;CornerPathWarning TRUE;"
It will exit the recovery and try and strike the arc again?0 -
Hallo,I think the best way would be to find the reason for the welding error, if it is unexpected arc off or ignition error on an end of an seam, rather than find a repair method for that error.When you have to start on an end of a seam for instance regularly, you might use heat-functionlity, where you start inside your new seam, weld backward to the existing one with some parameters and then go ahead with the normal parameters.0
-
matti said:Hallo,I think the best way would be to find the reason for the welding error, if it is unexpected arc off or ignition error on an end of an seam, rather than find a repair method for that error.When you have to start on an end of a seam for instance regularly, you might use heat-functionlity, where you start inside your new seam, weld backward to the existing one with some parameters and then go ahead with the normal parameters.
We've tried several things to mitigate this issue but as you mentioned our issue is starting on an arc end. The silica puddle moves around on the arc end and some times we strike the arc without issue but other times we strike right on the silica and no weld parameter can help with that. It's non conductive material and acts as a barrier. We use the ER70-6 weld wire as we need the silica properties to weld on our 'dirty' steal so the negative result of this is the silica puddles in the weld. ABB has a standard recovery of moving the robot 10mm forward to strike the arc again (which works) but it doesn't travel back to the arc start robtarget leaving a 10mm gap.0 -
Hallo,we use ScrapeOn=TRUE in ArcSystemProperties(Konfiguration Process) to handle this.The robot will then oscillate around the welding start point. With ScrapeWidth and ScrapeDirection you can define how this movement is like, weaving cross or along the seam or something in between.ScrapeCycleTime defines the frequency.The wire will either remove the silica or have ignition aside.0
-
matti said:Hallo,we use ScrapeOn=TRUE in ArcSystemProperties(Konfiguration Process) to handle this.The robot will then oscillate around the welding start point. With ScrapeWidth and ScrapeDirection you can define how this movement is like, weaving cross or along the seam or something in between.ScrapeCycleTime defines the frequency.The wire will either remove the silica or have ignition aside.0
-
Hallo,again another attempt. Weld to your designated end but do not stop arc but weld backwards into the seam 10-15 mm. Stop welding there. Seam will look nice but end-crater/silica spot is inside .0
-
matti said:Hallo,we use ScrapeOn=TRUE in ArcSystemProperties(Konfiguration Process) to handle this.The robot will then oscillate around the welding start point. With ScrapeWidth and ScrapeDirection you can define how this movement is like, weaving cross or along the seam or something in between.ScrapeCycleTime defines the frequency.The wire will either remove the silica or have ignition aside.0
Categories
- All Categories
- 5.5K RobotStudio
- 396 UpFeed
- 18 Tutorials
- 13 RobotApps
- 297 PowerPacs
- 405 RobotStudio S4
- 1.8K Developer Tools
- 250 ScreenMaker
- 2.8K Robot Controller
- 316 IRC5
- 61 OmniCore
- 7 RCS (Realistic Controller Simulation)
- 798 RAPID Programming
- AppStudio
- 3 RobotStudio AR Viewer
- 18 Wizard Easy Programming
- 105 Collaborative Robots
- 5 Job listings