Posts by RoboticsMan

    No, unfortunately there was no backup. In the end I was able to write all of the code again in about 3 days. It sucks to have to do that, but at least it was not close to a deadline.

    One of my colleagues accidentally did an I-Start on a robot running on a production line at a car factory. Fortunately they were able to get it back up and running with a backup, but it is really horrible user interface design, that there isn't more of a warning when doing I-Start. I think I will contact ABB and ask them to improve this.


    Ok, I know this is a long shot. I have been working on a robot program in RobotStudio for a while now. So far everything has been done in the virtual environment. Today I wanted to do a warm-start, but must have mis-clicked and performed an I-start. When the virtual robot controller booted up again, all the files were lost. Is there any way to recover them, or do I have to start over? (that's my guess).

    Im trying Windows File recovery, but I have not found anything so far.

    Thanks in advance!



    I am trying to make an analytical inverse kinematics solver for the Fanuc CRX-10iA robot. I already made such a solver for "normal" 6-axis robots with spherical wrists (spherical = axis 4-5-6 intersect in the same point), and for UR-style robots.

    For robots with spherical wrist, I use the flange->wrist offset to determine the location of the center of the wrist. The A1, A2, and A3 angles can then be found using a little geometry. A4, A5 and A6 angles are found using ZYZ Euler angles.

    The UR robot does not have a spherical wrist, but I know that A4 is parallel with A2 and that both A4 and A6 are perpendicular to A5. So I can find the A5-A6 intersection, calculate an initial angle to that one (first guess for A1), compensate for the A4 offset to get the correct A1 angle, then subtract the A4 offset to find the intersection between A4-A5. This point is then used for the formulas to derive the A1-A3 angles, and the A4-A5-A6 angles are derived using ZYZ Euler angles like I did for the robots with spherical wrists.

    But now I want to make an analytical solver for the Fanuc CRX-10iA robot. It is in many ways like a robot with a spherical wrist, only the wrist axes do not all intersect in the same point. See attached picture. Do any of you have a good idea for how to solve this using geometry? I know that I can find a solution using the jacobian method, but I want to use the analytical solver to find a good starting guess for the jacobian solver.

    Thanks in advance!


    I am trying to make a program that can read the names of the available inputs and outputs on the robot, using the "ReadCfgData" command. The names are then displayed in a list, so that the user can choose which inputs/outputs to use for what, when the robot program is set up.

    This works fine when it is simulated in RobotStudio, but on some real robots it doesn't work. We recently had a case where it gave us the following error message:


    40747: Access Error


    Task T_ROB1

    Cannot read or write to the system parameter Attribute. The parameter is internal and protected from reading and writing.

    Program ref: /SBase/GetExistingIONames/ReadCFGData/4747


    Recovery: ERR_CFG_INTERNAL


    The code for reading the signal names looks like this:

    sSignalTypeString will have one of the values "DI", "DO", "GI", "GO", "AI", "AO". In this particular case (where it failed), the value was "DO".

    We have not been able to figure out what the problem is, and how to solve it. Is it a system setting that we need to change?

    Any help would be greatly appreciated. Thanks in advance!


    EDIT: Added information: It fails on the first call to ReadCfgData

    I found the solution. RoboDK was apparently running on the wrong graphics card. I had the same problem in another program, but there I actually got a warning saying that the headset had to be running on the same graphicscard as the main monitor. In Windows it is possible to specify on an app-per-app basis what graphicscard it should be running on. Once I did that for RoboDK, it worked fine.



    I am experimenting with Virtual Reality, I would like to be able to see our cell layouts that we made in RoboDK in my Oculus Quest 2 headset. The headset is connected to the PC via Virtual Desktop. Steam VR is running on the PC, it is working fine. I start RoboDK and tell it to connect to the headset. A window pops up on the PC, showing the view of the headset, and I can see it tracks the movements correctly. But within the headset itself, in SteamVR, it just stays at "Next: RoboDK", and I never get to see the virtual view. It doesnt matter how long I wait. Any clues what could be going on here? I have not tried Oculus Link, since that does not work with my computer for some reason. But Virtual Desktop seems to be working fine for other applications, so I assumed it would be here, too.

    Thanks for any suggestions in advance!


    just FYI, i am using EKI right now and it is working without issue for quite some time on a headless unit (no smartPad connected). and i chose to make it auto reconnect etc. no matter what. you can unplug cable, reboot robot or restart external application or reboot PC on which it runs, it does not matter.... this thing reconnects automatically user intervention as soon as "stars align" (both nodes are booted and network connection is present).

    but that's me...

    Well that is nice.

    But anyways: The message from EKI_CLOSE() is not suppressed, even though I use

    <MESSAGES Logging="enabled" Display="disabled"/> .

    The user will still have to acknowledge it. So is it by design only some messages that are disabled, or is it a bug?


    Yes, I know that I don't evaluate the result, but that is irrelevant for this example, since the error message that I could not suppress is shown from within EKI_CLOSE().

    As I wrote earlier: "The problem is that I get the error message when I call the commands, so I never get to evaluate the return value. "

    I could evaluate the result all I want, but that doesn't change that the user would still have to acknowledge the message on the KCP first, and that is what I wanted to avoid :)

    I think it would be a natural assumption that the manual for EKI2.2 would be valid for EKI2.2, and the manual for EKI3.0 would be valid for EKI3.0 and that the 3.0 manual might even be misleading for EKI2.2 . But alright, I learned something new today then. I will keep it in mind.


    The "Alive" flag that Panic refers to is part of your EKI channel XML file -- you can assign an $OUT or $FLAG to reflect that status of the channel. This is in the EKI manuals.

    Yes, I also considered that, but in the end I decided for another solution. But now that we talk about it: Is the alive flag always up to date, even before a connection is established in first case?


    why i recommend reading pinned topic READ FIRST and posting some details. such as how to reproduce problem.

    "we get an error..." is not specific...

    i would say post your code sample, configuration, state exactly what the message as is etc.

    Yes, you are right. There was not enough info. Even though I already found a workaround for the problem, I made some code to reproduce the problem, so that I could get the exact error message.

    Test case 1: Messages are not suppressed. I try to open a connection twice


    Then I will get the error "EKI00023: Initialization already performed"

    Test case 2: Messages are not suppressed. I try to close a connection without opening it first.


    This results in error "EKI00009: Connection not available"

    Test case 3: Messages are suppressed with <MESSAGES Logging="enabled" Display="disabled"/>. I try to open a connection twice, same code as in case 1. This time there is no error message.

    Test case 4: Messages are suppressed with <MESSAGES Logging="enabled" Display="disabled"/>. I try to close a connection, even though it wasn't opened first. Same code as in case 2. Same error message as in case 2.

    So suppressing the error message only seems to work when opening a channel, not when closing it.

    KSS version is 8.3.27, EthernetKRL version is 2.2.7

    I am no longer looking for a solution, but maybe this info can be useful to someone else.


    are you evaluating EKI_STATUS and ALIVE flag?

    To evaluate the EKI_STATUS value, I guess that I would have to call a command that returns the value? The problem is that I get the error message when I call the commands, so I never get to evaluate the return value. I thought these messages could be suppressed via the setting in the XML file, but this does not seem to work.

    I also thought about using the ALIVE flag, since it turns out we have used it before. In the end I ended up monitoring the $PRO_STATE1 variable in the SPS instead, to see if the program has been reset since the last time a connection was established. In that way I only try to open a connection if there was a program reset since the last connection. The good thing about that solution is that it works just as fine on KRC2. But thanks for the reply anyways!



    I have the following problem:

    I am using a robot with KRC4 and KUKA.EthernetKRL 2.2.

    We have made an API on the robot for our vision system. The first time our Init() command is called, we establish a command to the PC that runs the vision software. However, the Init() command may have to be called again, with different parameters. If we try to establish a connection, and one has already been established, then we get an error. I don't want that. If we try to close the connection before opening a new one, then we also get an error, if no connection has been established yet (i.e. first time the command is called). I also don't want that.

    This problem could be avoided if there was some way to ask the KUKA software whether a connection has already been established. This does not seem to be the case. Or am I missing something?

    We are also using our software with KRC2 robots. In the older versions of KUKA.EthernetKRL it is possible to call the command for closing a connection, and it gives no error message even if no connection is open. This is the behavior I want!

    I know I could just restructure our API and add a specific command for opening a connection once in the beginning, but I would rather not do that.

    So: Is it in some way possible to ask the KUKA.EthernetKRL software whether a connection is already open? If so, then can just skip opening it again.

    I have tried to suppress the error messages from the EthernetKRL software by adding this to the xml file that configures the communication:


    <Messages Display="disabled" Logging="error"/>


    But this does not seem to work.

    Thanks in advance for any tips!


    There is not really a "variable". Just the configuration files, as Saaboholic mentioned the robot type is one such instance. I also suggest that you could read the robot serial number upper part which would indicate the robot type. I might be wrong, but I think that the general rule is that the parallel arm robots are named X400, like 2400, 4400 and so on. Their non-parallel are X600, like 2600, 4600, and so on. Older robotware used only two digits for the upper part, 24, 44 and so on. Newer ones were lengthened to 4 digits to indicate the variants like 6620, 6650 and many more.

    Thank you, that is very useful information!

    Why, do you have to change the program every time you have one of these robots? You have to have two different programs, one for the linked and one for the others.

    What about an own variable/constant, that you can set during setup of the robot, in case that you don't find a system variable.

    Yes, maybe I made it sound worse than it actually is :) I have encountered the "special" robots a couple of times, but it is so far between that I usually have a problem finding the program I made the last time I had that issue... So this time I am going to make the solution so that it can be reused and is always part of the program. A constant in my own program would definitely be an option, but it would be nicer if the person setting it up would not have to worry about this.


    We have made a pretty big program in Rapid that we use on many different robots. The program is responsible for robot control in a vision application. Once in a while we encounter a robot with parallel linkage, i.e. the axis 3 servo is next to the axis 2 servo, and the servo pulls a bar that goes up to joint 3, like this:

    Every time we encounter one of these robots I have to change the program, because of how the kinematics works on these robots (joint angle of axis 3 is dependent on joint angle of axis 2).

    So I was wondering : Is there a way to ask the robot software whether axis 2 and 3 are linked like that? Is there a system variable that has this information? In that case the program could have different cases depending on whether the type of the robot, and I could solve the problem once and for all.

    Thanks in advance!



    I also figured it out just before I saw your answer. I had 191 subroutines and 67 functions in the file, so I guessed that the limit had to be around 255 (I knew that I was very close to the limit).


    Hi all

    Today I wanted to test a program on a KRC4 robot, but I got the message "KSS02710 {Object name} too many local subprograms". I have to admit that the program is relatively big, but now I wonder: How many subprograms are you allowed to have in one file? Is there a hard limit? And if so, why doesn't the message tell me what the limit is?

    But at least the KRC4 handles it better than the KRC2 I tested it on. On KRC2 the controller software had an internal error when it tried to compile the file, and the robot had to be rebooted (after the file in question had been deleted via windows)