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

  • graemepaulin
    graemepaulin New Zealand ✭✭✭
    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?

  • lemster68
    lemster68 United States ✭✭✭
    You could also look into the path recorder.
    Lee Justice
  • BwillieS
    BwillieS Canada
    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?

  • graemepaulin
    graemepaulin New Zealand ✭✭✭
    So you are not talking about the arc weld recovery?
  • BwillieS
    BwillieS Canada
    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)
  • graemepaulin
    graemepaulin New Zealand ✭✭✭
    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.
  • BwillieS
    BwillieS Canada
    I do have this but sometimes it still does not arc and needs to advance the 10mm. 
  • graemepaulin
    graemepaulin New Zealand ✭✭✭
    @Maxim Riabichev is there an arc welding expert that could help here?
  • Maxim Riabichev
    Maxim Riabichev Sweden admin
    @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
  • jmf
    jmf South Africa
    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