RobotStudio event

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)

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?

  • You could also look into the path recorder.
    Lee Justice
  • 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?

    What would that code look like? In the recovery I can advance 10mm yes. but how do I get it to command the weld to start again then also command it to travel back 10mm (to the original start point) and then head to the second point?

  • So you are not talking about the arc weld recovery?
  • 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)
  • 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.
  • I do have this but sometimes it still does not arc and needs to advance the 10mm. 
  • @Maxim Riabichev is there an arc welding expert that could help here?
  • @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 Riabichev
    PC Software Support Engineer
  • 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

  • BwillieS
    BwillieS
    edited February 2023
    @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?
  • 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.

  • 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.

    Hello Matti,

    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.
  • 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.

  • 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.

    We also utilize this. again it helps reduce but not eliminate. the advance 10mm function works all the time but as mentioned produces the gap defect.
  • 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 .
  • 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.

    Can you send me what your scrape parameters are?