CalcJoinT in RW 5.16 Error Handling when arm doesn't reach

Hi, I'm using an IR120 with an IRC5 controller which as far as I am aware only supports robotware upto version 5.16. 

My issue comes when using the function CalcJoinT on a position that is outside the robot's reach. I do not have the option to catch ERR_OUTSIDE_REACH as I think it was not implemented in this version.

I only have available ERR_ROBLIMIT which I am catching and allows the program to keep going. 

Is there a way around this in version 5.16?

BR. 

Rodrigo
Tagged:

Answers

  • Forge_Engineering
    Forge_Engineering Mackay, QLD, Australia
    HI RAH101, 

    I'm not sure about robotware versions on the IR120, but in regards to CalcJointT.
    Does it show up as an error when you calculate a position that is out of reach? Surely if the program stops it has an error you can see?

    If not I can suggest a workaround.

    Regards,

    Harry
  • RAH101
    RAH101 Madrid
    edited July 8

    HI RAH101, 

    I'm not sure about robotware versions on the IR120, but in regards to CalcJointT.
    Does it show up as an error when you calculate a position that is out of reach? Surely if the program stops it has an error you can see?

    If not I can suggest a workaround.

    Regards,

    Harry

    Hi Harry,

    First of all, thanks for your answer. 

    When asking for the arm to move to an unreachable position on the flexpendant I get:

    ----------------------------
    Event Message 40625
    Limit Error
    Description
    Task: R_ROB1
    Program reference path

    Probable causes
    ----------------------------

    The reason for the error is obvious, I just need to catch it so I can keep the program running
  • Forge_Engineering
    Forge_Engineering Mackay, QLD, Australia
    Hi RAH101, 

    Does the error show up when you execute CalcJointT? Or when you execute a MoveAbsJ?
    In any case you should be able to catch the error by extracting the errdomain and errorID with a TRAP routine that triggers on all errors, and then check the domain and ID in your error handler to catch when a limit error occurs:

    MODULE MainModule
    
    	VAR intnum err_interrupt;
    	VAR errdomain err_domain;
    	VAR num err_number;
    	VAR errtype err_type;
    	VAR trapdata err_data;
    
    	PROC Main()
    		
    		CONNECT err_interrupt WITH trap_err;
    		IError COMMON_ERR, TYPE_ERR, err_interrupt;
    
    		! do stuff
    		
    	ERROR
    		! Check the domain and error number
    		IF err_domain = 4 AND errno = 625 THEN
    			! Limit error recovery
    		ENDIF
    	ENDPROC
    	
    	! Trap routine to catch all errors and extract information
    	TRAP trap_err
    		GetTrapData err_data;
    		ReadErrData err_data, err_domain, err_number, err_type;
    	ENDTRAP
    	
    ENDMODULE

    Good Luck, 

    Harry

  • RAH101
    RAH101 Madrid
    Hi Harry,Thanks again for the answer, my error is in the instruction: joints_setpoint:=CalcJointT(Inverse_Setpoint,tool0\WObj:=wobj0\ErrorNumber:=myerrnum);

    I didn't manage to adapt your code to to my RAPID program. I solved it just by sending a UImsgBox in the error routine 

    I believe your code is missing the idelete before the connect aswell