Configuration (NUT 001) in position register

  • Dear Sirs,

    On my J6 faceplate, the gripper is mounted in a way, that at “normal” position (normal is the position of the gripper, which the robot works 99% of the time), I have already 105 degrees.

    The robot palletizing boxes on pallet in to columns by 4 boxes. Something like this (O is a box):



    The boxes not in parenthesis, the configuration of the position register is NUT 000. The configuration of the last boxes, the ones in parenthesis is NUT 001.

    When I place all boxes, I rotate then at +179,9 degrees.

    The first six boxes, after the rotation, got configuration of NUT 000.

    The last two boxes, after the rotation, got configuration of NUT 001.

    Strangely, for me the robot did not complaining for last two boxes and palletizing them even without NUT 001.

    Unfortunately, when it cannot place the box properly (here I do not want to go into the detail, why this happening), it goes into SRVO-115 SERVO Limit error (G:%d^2, A:%s^7).

    The position where the robot must go is in position register.

    The remedy, I am thinking, is when I must palletizing the position in question (last two) to use configuration of NUT 001.

    I tried to add to the position register, another one, which got all x,y,z,w,p,r = 0 and configuration NUT 001.

    PR[81] = PR[81 - NUT 000] + PR[51 – the one with NUT 001]

    Unfortunately this did not work!

    I was advised to use joint coordinates, but at this stage of the project, I think it is not possible!

    Can I set NUT 001 in a position register?

    Thank you in advance! Any advices will be highly appreciated!

    Svetozar Yolov

  • Place your Ad here!
  • Keep using linear for the pick and place moves.

    What you need to add is a joint move at the beginning and end of your program(or this section of your program) to ensure the wrist returns to a neutral position (105 degrees in your case).

  • Hi Svetozar,

    Can I set NUT 001 in a position register?

    What you can do in TP is to prepare any empty PR to contain the configuration NUT001 and cartesian coordinates with all values to be zero, like:


    From here you copy the PR[64] to any other PR and just add the cartesian coordinates.

    PR[1] = PR[64]
    PR[1,1] = ...  ! set value for x
    PR[1,2] = ...  ! set value for y
    PR[1,6] = ...  ! set value for r

    Leaving the values for X,Y,...,R uninitialized (indicated by *****.***) prior to copy the PR will result in error INTP-311 (<prog>, <line>) Uninitialized data.

    If you'd like to alter the configuration of any given PR you'll need KAREL because in KAREL there are commands to perform this task. For details have a look to GET_POS_REG(), CONFIG data type and SET_POS_REG() in the B-83144EN-1/01 KAREL Operator's manual reference.

    Never EVER again fanuc!

    Edited 2 times, last by HalbesYoyo ().

  • The goal is to set a PRs configuration to NUT 001. Actually it's to change the configuration of a given PR from NUT 000 to NUT 001. Because using TP the configuration of a PR only cannot be altered you have to copy a whole PR already containing NUT 001 and overwrite the X,Y, ..., R with values from the given PR.

    It is inconvenient and rather unpleasant, but unfortunately this is often the case with FANUC. :frowning_face:

    Never EVER again fanuc!

  • Dear HawkME,

    Thank you for your comment. I quite value your post, because you help me in the past.

    The configuration of the point/position register really confuses me. I understand the meaning and the concept but some details, leave me confused.

    Can you explain your idea regarding the use of joint move?

    My program looks more or less as the following (all PR are in cartesian coordinates).

    281: !calc dest. final position ;

    // start point + offset in pallet

    282: PR[86:palGenPurpose2]=PR[21:47PalFullBgn]+PR[6:PalFullOffset] ;

    // start point + offset in pallet + gripper is 150 ABOVE the box

    283: PR[85:palGenPurpose1]=PR[86:palGenPurpose2]+PR[29:47ToolOffset] ;

    // approach to the place position with "not to hit something" code

    296: CALL ARC_KLT_ADAPTIVE_APRCH_FULL(PR[85:palGenPurpose1],PR[86:palGenPurpose2]) ;

    // some code

    309: !unlock the box;


    // evacuate from the box left

    314: !move over full KLT ;

    315:L PR[21:47PalFullBgn] 2000mm/sec CNT25 Offset,PR[6:PalFullOffset] Tool_Offset,PR[29:47ToolOffset] ;

    I cannot understand how to use joint coordinates.

    I check with the ROBOGUIDE, and I can change the PR coordinates only when it is included inti motion command. There in POSITION, with button REPRE, I can got to joint coordinates.

    I missing the link between cartesian coordinates which I calculate and the joint coordinates which you suggest to use. I hope, I make myself clear enough.



  • You don't need to use joint coordinates. Just use a joint movement.

    J P[x] ....

    If you put that at the beginning and end, then your robot will unwind the wrist to that exact orientation at the start and end of your program so you are always starting out in that more neutral position.

    Try it.

  • Many thanks for the explanations. I will try it.

    I will very grateful, if you explains me the following.

    I calculate a point in PR, where the robot must go - let say this is PR[80]. Configuration of PR[80] is NUT 000.

    In PR[80], there is rotation R = 179.9 degree.

    If there is NO rotation, the configuration is NUT 000.

    If there is rotation, the configuration (in my case ) becomes NUT 001.

    Strangely for me, EVEN THERE IS rotation, PR[80] with NUT 000 works, and the robot did not raise error and executes the move. Next the robot program continues further.

    If the movement is interrupted (I use skip function), the robot did not allow to execute movement to position of PR[80] with NUT 000 - I get SRVO-115 SERVO Limit error (G:1, A:6) error.

    As soon as I change configuration of PR[80] from the pendant to NUT 001, it starts working again.

    I hope that I make myself clear.

    What is this explanation for this behavior?

    Probably, the robot did not know what will be the configuration, and it is executing the move with NUT 000. Next, after the interruption, the configuration is already changed and the move is not more possible? Am I right?

    In this particular case, should I prepare PR[80] with NUT 001 before the movement?

    What do you think?

    Than you in advance!



  • Linear moves ignore the turn numbers (the 000 or 001) and the wrist will do what's needed to maintain it's orientation. This is good because it means your wrist won't unexpectedly flip on you when doing your pick/place moves.

    But if you never ever do a joint move you end up getting the wrist "wrapped up" and at some point you need to do a joint move to unwind it and bring it back to that starting turn number. If you let it get wrapped too far then you run into an axis limit.

    Here's an analogy: pretend you are watching an airplane fly by but you can only move your head, not your body. As the plane moves you keep turning your neck to watch it. Then if it flys around behind you and to your other side. To keep watching it you either need to spin your head behind you and break your neck or reverse direction and look the other way. Breaking your neck would be doing a linear move into an axis limit. Turning your head the other direction would be doing a joint move.

  • Many thanks for the explanations.

    To unwrap the wrist, I normally restore the R angle, close to zero. For example, if I need to turn +180 degrees, I use angle of +179.9 degrees, and then to unwind the wrist (the gripper), I set +0.5 degrees into R of the PR. With 90 degrees it is easy and more safer than +179.9 degrees.

    I almost do not use P[]. My program, becomes quite complicates and all points are based on PR[], and the points are calculated.

    From your explanations, it turns out that it is good idea, to have one or two points into the program, formatted in joints, in order to unwind the wrist of the robot.

    Thank you for sharing your experience with me.

    Good luck!

    Svetozar Yolov

  • From your explanations, it turns out that it is good idea, to have one or two points into the program, formatted in joints, in order to unwind the wrist of the robot.

    I think you are still confusing joint position representation and a joint move type.

    :J PR[1] 100% FINE;

    The above code is a JOINT MOVE to PR[1]. PR[1] could also be P[1], it doesn't matter.

    :L PR[1] 2000 mm/sec FINE;

    The above code is a LINEAR MOVE to PR[1]. Again, PR[1] could be P[1].

    Both of the above lines of code will move the robot to the same destination. However, the second line of code will move the robot's tool center point along a straight line from the starting position to the destination.

    While the robot's TCP may be in the same place at the end of either move instruction, the big difference is that a Joint move will take into account the turn numbers in the configuration, a linear move will ignore them.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account
Sign up for a new account in our community. It's easy!
Register a new account
Sign in
Already have an account? Sign in here.
Sign in Now

Advertising from our partners