I am using our UR10e with a distance sensor. The idea is to move the robot at constant speed until a “True” signal is received from the sensor (in this case DO9).
From what I have gathered I can move the robot at a constant speed using speedl-command until the movement is interrupted. Since the sensor signal changes from “False” to “True” at a specific height, I need to constantly check the IO-value while the robot moves. As I understood this can be done using a program that runs parallel to the main script, a thread.
What I cannot figure out is how to let the main script know when the thread has detected the signal change to “True”. It seems like I cannot use a return statement either since the manual states “although a return statement is allowed in the thread, the value returned is discarded, and cannot be accessed from outside the thread.”
You could have the movement inside the thread while the main script is checking for the input. That way you can kill the thread once it goes “True” and stop the movement.
Thanks, but would this be any different than running the movement in the main script? I assume the thread works linearly by running line after line,. and having a move here would not allow me to continuously check the signal while moving.
Yeah, this is similar to what I found on Google and it seems to work. The thing is that I would like to do this on URScript side so that I can use the same file in several places. By DO9 I mean Digital Out 9.
But you have to use a digital input if you want to get a signal from a sensor into the robot? I’m confused.
Anywho. You can load programs as subprograms and load them between programs with the SubProg command.
Alternatively, you can also make a “normal” .urp UR program, save it and run it. Then the controller will save the program as a script file. You can take a look at it to get an idea of how to write it in script yourself, if you need to afterall.
Thank you, it seems like I am getting there! I noticed that you have the movel command in two places: both inside the thread and the main script - is there a specific reason to do this twice?
Also, you are checking the signal condition inside a “while thread running-loop”; does this mean the script checks the signal level every processing cycle ?
The first movel in the main script is the starting position, inside the async thread you find the final target position.
The while async_running loop is there to continuously check the signal condition.
The while True loop is there only to repeat the task for testing purpose.
(I have used digital_out because it is easier to test it directly using polyscope IO status window)