<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[RoboDK Forum - RoboDK API]]></title>
		<link>https://robodk.com/forum/</link>
		<description><![CDATA[RoboDK Forum - https://robodk.com/forum]]></description>
		<pubDate>Tue, 21 Jul 2026 23:01:39 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[Guidance on PLC Integration and Robot Control in RoboDK]]></title>
			<link>https://robodk.com/forum/Thread-Guidance-on-PLC-Integration-and-Robot-Control-in-RoboDK</link>
			<pubDate>Mon, 20 Jul 2026 10:12:44 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://robodk.com/forum/member.php?action=profile&uid=10930">pritesh</a>]]></dc:creator>
			<guid isPermaLink="false">https://robodk.com/forum/Thread-Guidance-on-PLC-Integration-and-Robot-Control-in-RoboDK</guid>
			<description><![CDATA[I am currently working on an industrial automation project and would like to learn the complete process of integrating a PLC with RoboDK and controlling a robot using PLC logic.<br />
<br />
My objective is to build a complete simulation where the PLC communicates with RoboDK, exchanges input/output signals, and controls the robot's movements and program execution in real time.<br />
I would appreciate your guidance on the following:<ul class="mycode_list"><li>How to connect a PLC with RoboDK.<br />
</li>
<li>Supported communication protocols (such as EtherNet/IP, PROFINET, Modbus TCP, OPC UA, etc.).<br />
</li>
<li>How to configure communication between the PLC and RoboDK.<br />
</li>
<li>How to send and receive I/O signals.<br />
</li>
<li>How to control robot movements and execute robot programs using PLC logic.<br />
</li>
<li>Any documentation, tutorials, sample projects, or training resources that explain the complete workflow from start to finish.<br />
</li>
</ul>
I am eager to learn the entire setup and would greatly appreciate any recommendations or learning materials you can provide.]]></description>
			<content:encoded><![CDATA[I am currently working on an industrial automation project and would like to learn the complete process of integrating a PLC with RoboDK and controlling a robot using PLC logic.<br />
<br />
My objective is to build a complete simulation where the PLC communicates with RoboDK, exchanges input/output signals, and controls the robot's movements and program execution in real time.<br />
I would appreciate your guidance on the following:<ul class="mycode_list"><li>How to connect a PLC with RoboDK.<br />
</li>
<li>Supported communication protocols (such as EtherNet/IP, PROFINET, Modbus TCP, OPC UA, etc.).<br />
</li>
<li>How to configure communication between the PLC and RoboDK.<br />
</li>
<li>How to send and receive I/O signals.<br />
</li>
<li>How to control robot movements and execute robot programs using PLC logic.<br />
</li>
<li>Any documentation, tutorials, sample projects, or training resources that explain the complete workflow from start to finish.<br />
</li>
</ul>
I am eager to learn the entire setup and would greatly appreciate any recommendations or learning materials you can provide.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Controlling RG6 gripper using digital output command]]></title>
			<link>https://robodk.com/forum/Thread-Controlling-RG6-gripper-using-digital-output-command</link>
			<pubDate>Mon, 13 Jul 2026 22:19:56 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://robodk.com/forum/member.php?action=profile&uid=10107">Muhammad Faizan Ahmed</a>]]></dc:creator>
			<guid isPermaLink="false">https://robodk.com/forum/Thread-Controlling-RG6-gripper-using-digital-output-command</guid>
			<description><![CDATA[Hello everyone,<br />
<br />
I'm currently controlling Jaka Zu7 using Python script, running directly in RoboDK. Now, I want to control the OnRobot RG6 gripper which is attached to the robot. I tried to use the following command but it did not work.<br />
<br />
Command: robot.setDO(0,1) # first value represents the digital ouput while second shows the control value<br />
<br />
I also tried program.setDO(0,1) command and program = RDK.AddProgram(ProgramName) but it also did not work. Kindly guide me how can I control the gripper using python code. Looking forward to hearing from you all. Thank you]]></description>
			<content:encoded><![CDATA[Hello everyone,<br />
<br />
I'm currently controlling Jaka Zu7 using Python script, running directly in RoboDK. Now, I want to control the OnRobot RG6 gripper which is attached to the robot. I tried to use the following command but it did not work.<br />
<br />
Command: robot.setDO(0,1) # first value represents the digital ouput while second shows the control value<br />
<br />
I also tried program.setDO(0,1) command and program = RDK.AddProgram(ProgramName) but it also did not work. Kindly guide me how can I control the gripper using python code. Looking forward to hearing from you all. Thank you]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Creating a generic item and setting a custom icon in the tree]]></title>
			<link>https://robodk.com/forum/Thread-Creating-a-generic-item-and-setting-a-custom-icon-in-the-tree</link>
			<pubDate>Mon, 08 Jun 2026 22:46:46 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://robodk.com/forum/member.php?action=profile&uid=7192">HenryInUtah</a>]]></dc:creator>
			<guid isPermaLink="false">https://robodk.com/forum/Thread-Creating-a-generic-item-and-setting-a-custom-icon-in-the-tree</guid>
			<description><![CDATA[There is a good chance that I am misunderstanding what the "IconSet" command does.  I am hoping that it will change the icon next to the instruction in the station.  Like this...<br />

<br />
<img src="//cdn.robodk.com/forum/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
&nbsp;&nbsp;<a href="attachment.php?aid=7716" target="_blank" title="">2026-06-08 16 39 32.png</a> (Size: 7.11 KB / Downloads: 77)
<br />
<br />
I have tried this command:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>currentProg.Instruction(n).setParam('IconSet', "C:/images/LargeNext.png")</code></div></div><br />
<br />
Do I need to resize the icon?  I attached the file.  I was hoping that Qt would handle the scaling.<br />
<br />
Thanks for your help,<br />
Henry<br />
<br />
<img src="//cdn.robodk.com/forum/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
&nbsp;&nbsp;<a href="attachment.php?aid=7715" target="_blank" title="">LargeNext.png</a> (Size: 2.57 KB / Downloads: 82)
]]></description>
			<content:encoded><![CDATA[There is a good chance that I am misunderstanding what the "IconSet" command does.  I am hoping that it will change the icon next to the instruction in the station.  Like this...<br />

<br />
<img src="//cdn.robodk.com/forum/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
&nbsp;&nbsp;<a href="attachment.php?aid=7716" target="_blank" title="">2026-06-08 16 39 32.png</a> (Size: 7.11 KB / Downloads: 77)
<br />
<br />
I have tried this command:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>currentProg.Instruction(n).setParam('IconSet', "C:/images/LargeNext.png")</code></div></div><br />
<br />
Do I need to resize the icon?  I attached the file.  I was hoping that Qt would handle the scaling.<br />
<br />
Thanks for your help,<br />
Henry<br />
<br />
<img src="//cdn.robodk.com/forum/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
&nbsp;&nbsp;<a href="attachment.php?aid=7715" target="_blank" title="">LargeNext.png</a> (Size: 2.57 KB / Downloads: 82)
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Moving Two Robots Independently]]></title>
			<link>https://robodk.com/forum/Thread-Moving-Two-Robots-Independently</link>
			<pubDate>Tue, 05 May 2026 16:36:55 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://robodk.com/forum/member.php?action=profile&uid=7192">HenryInUtah</a>]]></dc:creator>
			<guid isPermaLink="false">https://robodk.com/forum/Thread-Moving-Two-Robots-Independently</guid>
			<description><![CDATA[Our PySide program will embed the RoboDK window so the user can visulize the robot movement.  This worked perfectly in the last project - which only used one robot.  The robot in the station was connected as normal and the simulated robot matched the real robot positions.  <br />
<br />
Skipping some steps... the <span style="font-family: Courier New;" class="mycode_font">self.RDK = robolink.Robolink(args=["-NEWINSTANCE", "-EXIT_LAST_COM", "-SKIPCOM_ALL"]) </span>command provided a RoboLink instance for our program.  That object could be used to move the robot or send a program to the controller.  No problems so far.<br />
<br />
The next project will use two robots - each with a seventh axis.  Each robot will have a separate ABB controller running the RoboDK driver.  I expect the RoboDK window to embed using the same steps as before.  Each robot in the station can connect and (hopefully) the simulation will echo what is happening in real life as the two robots move.  But here is where I get confused.<br />
<br />
Consider the example where each robot needs to calibrate an end effector.  Our program will move a robot to a position, signal the end effector to do something, then repeat for many positions.  This should happen for each robot at the same time - but the two robots are not "synchronized", they are running independently.  How do I do this?<br />
<br />
The first idea is to start two threads and pass the main RoboLink object to them. The "<span style="font-family: Courier New;" class="mycode_font">self.RDK</span>" object created above.  Thread "A" will make a reference to "Robot A" using something like <span style="font-family: Courier New;" class="mycode_font">self.Robot = self.RDK.Item('RobotA', 2)</span> and move it as needed.  Similarly, thread "B" will move RobotB.  In reality, they are both using methods in the same RoboLink object (I think).  What happens if both threads tell RoboLink to move different robots at the same?<br />
<br />
The "<a href="https://robodk.com/doc/en/PythonAPI/examples.html#synchronize-3-robots" target="_blank" rel="noopener" class="mycode_url">Synchronize 3 Robots</a>" example in the documentation also creates a thread for each robot, but the threads then create a new RoboLink instance.  How would this work if the RoboDK window (with the initial RoboLink) is embedded in our program?  That "embedded RoboLink" is also talking to the drivers to update the display, correct?<br />
<br />
I don't feel like I explained this very well - here is some pseudo-code that might help.<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>class ApplicationGUI(QtWidgets.QMainWindow):<br />
&nbsp;&nbsp;&nbsp;&nbsp;def embedRoboSK(self):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.RDK = robolink.Robolink(args=["-NEWINSTANCE", "-EXIT_LAST_COM", "-SKIPCOM_ALL"])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Stuff happens to embed the window and connect to the robots<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;def startTreads(self):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Each thread gets a reference to the main RoboLink object and a file of instructions<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.threadA = calibrationThreadA()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.threadA.rdk = self.RDK<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.threadA.instructions = pathToListOfPositionsA<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.threadA.start()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.threadB = calibrationThreadB(pathToListOfPositionsB)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.threadB.rdk = self.RDK<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.threadB.instructions = pathToListOfPositionsB<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.threadB.start()<br />
<br />
<br />
class calibrationThreadA(QThread):<br />
&nbsp;&nbsp;&nbsp;&nbsp;def __init__(self, parent=None):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QThread.__init__(self, parent)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;def run(self)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.robot = self.rdk.Item('RobotA', 2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Read the self.instructions file and move the robot when needed.<br />
<br />
<br />
class calibrationThreadB(QThread):<br />
&nbsp;&nbsp;&nbsp;&nbsp;def __init__(self, parent=None):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QThread.__init__(self, parent)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;def run(self):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.robot = self.rdk.Item('RobotB', 2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Read the self.instructions file and move the robot when needed.</code></div></div>]]></description>
			<content:encoded><![CDATA[Our PySide program will embed the RoboDK window so the user can visulize the robot movement.  This worked perfectly in the last project - which only used one robot.  The robot in the station was connected as normal and the simulated robot matched the real robot positions.  <br />
<br />
Skipping some steps... the <span style="font-family: Courier New;" class="mycode_font">self.RDK = robolink.Robolink(args=["-NEWINSTANCE", "-EXIT_LAST_COM", "-SKIPCOM_ALL"]) </span>command provided a RoboLink instance for our program.  That object could be used to move the robot or send a program to the controller.  No problems so far.<br />
<br />
The next project will use two robots - each with a seventh axis.  Each robot will have a separate ABB controller running the RoboDK driver.  I expect the RoboDK window to embed using the same steps as before.  Each robot in the station can connect and (hopefully) the simulation will echo what is happening in real life as the two robots move.  But here is where I get confused.<br />
<br />
Consider the example where each robot needs to calibrate an end effector.  Our program will move a robot to a position, signal the end effector to do something, then repeat for many positions.  This should happen for each robot at the same time - but the two robots are not "synchronized", they are running independently.  How do I do this?<br />
<br />
The first idea is to start two threads and pass the main RoboLink object to them. The "<span style="font-family: Courier New;" class="mycode_font">self.RDK</span>" object created above.  Thread "A" will make a reference to "Robot A" using something like <span style="font-family: Courier New;" class="mycode_font">self.Robot = self.RDK.Item('RobotA', 2)</span> and move it as needed.  Similarly, thread "B" will move RobotB.  In reality, they are both using methods in the same RoboLink object (I think).  What happens if both threads tell RoboLink to move different robots at the same?<br />
<br />
The "<a href="https://robodk.com/doc/en/PythonAPI/examples.html#synchronize-3-robots" target="_blank" rel="noopener" class="mycode_url">Synchronize 3 Robots</a>" example in the documentation also creates a thread for each robot, but the threads then create a new RoboLink instance.  How would this work if the RoboDK window (with the initial RoboLink) is embedded in our program?  That "embedded RoboLink" is also talking to the drivers to update the display, correct?<br />
<br />
I don't feel like I explained this very well - here is some pseudo-code that might help.<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>class ApplicationGUI(QtWidgets.QMainWindow):<br />
&nbsp;&nbsp;&nbsp;&nbsp;def embedRoboSK(self):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.RDK = robolink.Robolink(args=["-NEWINSTANCE", "-EXIT_LAST_COM", "-SKIPCOM_ALL"])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Stuff happens to embed the window and connect to the robots<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;def startTreads(self):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Each thread gets a reference to the main RoboLink object and a file of instructions<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.threadA = calibrationThreadA()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.threadA.rdk = self.RDK<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.threadA.instructions = pathToListOfPositionsA<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.threadA.start()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.threadB = calibrationThreadB(pathToListOfPositionsB)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.threadB.rdk = self.RDK<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.threadB.instructions = pathToListOfPositionsB<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.threadB.start()<br />
<br />
<br />
class calibrationThreadA(QThread):<br />
&nbsp;&nbsp;&nbsp;&nbsp;def __init__(self, parent=None):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QThread.__init__(self, parent)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;def run(self)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.robot = self.rdk.Item('RobotA', 2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Read the self.instructions file and move the robot when needed.<br />
<br />
<br />
class calibrationThreadB(QThread):<br />
&nbsp;&nbsp;&nbsp;&nbsp;def __init__(self, parent=None):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QThread.__init__(self, parent)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;def run(self):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.robot = self.rdk.Item('RobotB', 2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Read the self.instructions file and move the robot when needed.</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Robot is not moving]]></title>
			<link>https://robodk.com/forum/Thread-Robot-is-not-moving</link>
			<pubDate>Tue, 05 May 2026 15:56:23 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://robodk.com/forum/member.php?action=profile&uid=9104">weisseran</a>]]></dc:creator>
			<guid isPermaLink="false">https://robodk.com/forum/Thread-Robot-is-not-moving</guid>
			<description><![CDATA[I'm using Mecademic Meca500.<br />
When I rotate the dial to change the robot orientation, I can see the robot on my screen moving but the real robot is not moving unless I click Move Joint.<br />
It was moving before.<br />
What went wrong ?]]></description>
			<content:encoded><![CDATA[I'm using Mecademic Meca500.<br />
When I rotate the dial to change the robot orientation, I can see the robot on my screen moving but the real robot is not moving unless I click Move Joint.<br />
It was moving before.<br />
What went wrong ?]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Program instruction operations using the API]]></title>
			<link>https://robodk.com/forum/Thread-Program-instruction-operations-using-the-API</link>
			<pubDate>Mon, 27 Apr 2026 17:16:53 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://robodk.com/forum/member.php?action=profile&uid=7192">HenryInUtah</a>]]></dc:creator>
			<guid isPermaLink="false">https://robodk.com/forum/Thread-Program-instruction-operations-using-the-API</guid>
			<description><![CDATA[My goal is to have a script that will insert a command after the selected instruction in a program.  The snippet of code below finds the instruction that is selected/highlighted.  It is a robodk.robolink.Item object.  Next, the script looks at the parent of this (which should be an ITEM_TYPE_PROGRAM) and loops through the instructions looking for a match.<br />
<br />
However, using program.Instruction(n) returns a tuple.  So, I have a tuple and a  robodk.robolink.Item with no way to check if they are the same.  I cannot use the Item.Type() + Item.Name() because the names are not unique.<br />
<br />
I hope that I explained that so it made sense...<br />
<br />
This code is part of a PySide app - sorry if it looks a little different.<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&nbsp;&nbsp;&nbsp;&nbsp;def btnSelectedItem_Clicked(self):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'''Show information about the selected item in the tree'''<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ui.textInfo.clear()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentSelection = self.rdk.Selection()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if len(currentSelection) == 0:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ui.textInfo.append('No items selected')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item = currentSelection[0]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;itemType = item.Type()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;itemName = item.Name()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;itemParent = item.Parent()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;itemVisible = item.Visible()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ui.textInfo.append(f'{itemName=}')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ui.textInfo.append(f'{itemType=}')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ui.textInfo.append(f'{itemParent=}')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ui.textInfo.append(f'{itemVisible=}')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ui.textInfo.append(f'type={type(item)}')<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# The parent is a program, so it must be an instruction<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if itemParent.Type() == 8:<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;instructionCount = itemParent.InstructionCount()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ui.textInfo.append(f'Looping through {instructionCount} instructions...')<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for n in range(instructionCount):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ui.textInfo.append(f'Instruction {n}')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current = itemParent.Instruction(n)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# How to compare if item == current?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# current is a tuple and item is an robodk.robolink.Item</code></div></div>]]></description>
			<content:encoded><![CDATA[My goal is to have a script that will insert a command after the selected instruction in a program.  The snippet of code below finds the instruction that is selected/highlighted.  It is a robodk.robolink.Item object.  Next, the script looks at the parent of this (which should be an ITEM_TYPE_PROGRAM) and loops through the instructions looking for a match.<br />
<br />
However, using program.Instruction(n) returns a tuple.  So, I have a tuple and a  robodk.robolink.Item with no way to check if they are the same.  I cannot use the Item.Type() + Item.Name() because the names are not unique.<br />
<br />
I hope that I explained that so it made sense...<br />
<br />
This code is part of a PySide app - sorry if it looks a little different.<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&nbsp;&nbsp;&nbsp;&nbsp;def btnSelectedItem_Clicked(self):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'''Show information about the selected item in the tree'''<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ui.textInfo.clear()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentSelection = self.rdk.Selection()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if len(currentSelection) == 0:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ui.textInfo.append('No items selected')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item = currentSelection[0]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;itemType = item.Type()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;itemName = item.Name()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;itemParent = item.Parent()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;itemVisible = item.Visible()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ui.textInfo.append(f'{itemName=}')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ui.textInfo.append(f'{itemType=}')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ui.textInfo.append(f'{itemParent=}')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ui.textInfo.append(f'{itemVisible=}')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ui.textInfo.append(f'type={type(item)}')<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# The parent is a program, so it must be an instruction<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if itemParent.Type() == 8:<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;instructionCount = itemParent.InstructionCount()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ui.textInfo.append(f'Looping through {instructionCount} instructions...')<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for n in range(instructionCount):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ui.textInfo.append(f'Instruction {n}')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current = itemParent.Instruction(n)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# How to compare if item == current?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# current is a tuple and item is an robodk.robolink.Item</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Display mensage on screen based on the running program]]></title>
			<link>https://robodk.com/forum/Thread-Display-mensage-on-screen-based-on-the-running-program</link>
			<pubDate>Sat, 28 Mar 2026 13:06:26 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://robodk.com/forum/member.php?action=profile&uid=10213">Danilo assumpção</a>]]></dc:creator>
			<guid isPermaLink="false">https://robodk.com/forum/Thread-Display-mensage-on-screen-based-on-the-running-program</guid>
			<description><![CDATA[Dear All,<br />
I made a simulation with 7 robots, step by step.<br />
<br />
I would like to display a message on the screen according to the program being executed.<br />
<br />
Example:<br />
When program RB01 is running - "Robot 1 picking up part"<br />
When program RB02 is running - "Welding part"<br />
<br />
Is there any API or Python script to do this?]]></description>
			<content:encoded><![CDATA[Dear All,<br />
I made a simulation with 7 robots, step by step.<br />
<br />
I would like to display a message on the screen according to the program being executed.<br />
<br />
Example:<br />
When program RB01 is running - "Robot 1 picking up part"<br />
When program RB02 is running - "Welding part"<br />
<br />
Is there any API or Python script to do this?]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Use API to link multiple program]]></title>
			<link>https://robodk.com/forum/Thread-Use-API-to-link-multiple-program</link>
			<pubDate>Fri, 20 Mar 2026 13:59:07 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://robodk.com/forum/member.php?action=profile&uid=8408">b05611018</a>]]></dc:creator>
			<guid isPermaLink="false">https://robodk.com/forum/Thread-Use-API-to-link-multiple-program</guid>
			<description><![CDATA[I’m currently trying to replicate the <span style="font-weight: bold;" class="mycode_b">“Link selected programs”</span> functionality using the RoboDK API.<br />
From my understanding, I can already achieve a similar result by creating a main program and using <br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>RunInstruction(..., INSTRUCTION_CALL_PROGRAM)</code></div></div> to call multiple sub-programs. However, I noticed that your built-in <span style="font-weight: bold;" class="mycode_b">Link selected programs</span> feature seems to do more than just calling programs sequentially.<br />
In particular, it appears to automatically generate <span style="font-weight: bold;" class="mycode_b">safe transition motions (e.g., collision-free or obstacle-avoiding paths)</span> between programs. This is extremely useful for ensuring safe execution, especially in machining workflows.<br />
I would like to ask:<br />
<ol type="1" class="mycode_list"><li>Is there any API that directly replicates the full behavior of <span style="font-weight: bold;" class="mycode_b">“Link selected programs”</span>, including the automatic generation of safe transition paths?<br />
</li>
<li>If not, is there a recommended way to programmatically generate these <span style="font-weight: bold;" class="mycode_b">safe linking motions</span> between programs (e.g., via motion planning, collision checking, or predefined safe targets)?<br />
</li>
</ol>
My goal is to fully automate the generation of a main program that not only links sub-programs, but also ensures <span style="font-weight: bold;" class="mycode_b">safe transitions between them</span>, similar to what the GUI provides.<br />
Thank you for your help!<br />
<br />
<img src="//cdn.robodk.com/forum/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
&nbsp;&nbsp;<a href="attachment.php?aid=7619" target="_blank" title="">螢幕擷取畫面 2026-03-20 181548.png</a> (Size: 29.52 KB / Downloads: 91)
]]></description>
			<content:encoded><![CDATA[I’m currently trying to replicate the <span style="font-weight: bold;" class="mycode_b">“Link selected programs”</span> functionality using the RoboDK API.<br />
From my understanding, I can already achieve a similar result by creating a main program and using <br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>RunInstruction(..., INSTRUCTION_CALL_PROGRAM)</code></div></div> to call multiple sub-programs. However, I noticed that your built-in <span style="font-weight: bold;" class="mycode_b">Link selected programs</span> feature seems to do more than just calling programs sequentially.<br />
In particular, it appears to automatically generate <span style="font-weight: bold;" class="mycode_b">safe transition motions (e.g., collision-free or obstacle-avoiding paths)</span> between programs. This is extremely useful for ensuring safe execution, especially in machining workflows.<br />
I would like to ask:<br />
<ol type="1" class="mycode_list"><li>Is there any API that directly replicates the full behavior of <span style="font-weight: bold;" class="mycode_b">“Link selected programs”</span>, including the automatic generation of safe transition paths?<br />
</li>
<li>If not, is there a recommended way to programmatically generate these <span style="font-weight: bold;" class="mycode_b">safe linking motions</span> between programs (e.g., via motion planning, collision checking, or predefined safe targets)?<br />
</li>
</ol>
My goal is to fully automate the generation of a main program that not only links sub-programs, but also ensures <span style="font-weight: bold;" class="mycode_b">safe transitions between them</span>, similar to what the GUI provides.<br />
Thank you for your help!<br />
<br />
<img src="//cdn.robodk.com/forum/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
&nbsp;&nbsp;<a href="attachment.php?aid=7619" target="_blank" title="">螢幕擷取畫面 2026-03-20 181548.png</a> (Size: 29.52 KB / Downloads: 91)
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Control 3 Positioners as A7, A8, A9]]></title>
			<link>https://robodk.com/forum/Thread-Control-3-Positioners-as-A7-A8-A9</link>
			<pubDate>Wed, 11 Mar 2026 23:03:43 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://robodk.com/forum/member.php?action=profile&uid=10125">wreid</a>]]></dc:creator>
			<guid isPermaLink="false">https://robodk.com/forum/Thread-Control-3-Positioners-as-A7-A8-A9</guid>
			<description><![CDATA[Hey team!<br />
<br />
I need some help setting up 3 positioners to be controlled from my Comau robot A7, A8, A9.<br />
<br />
I've been playing around with the configuration and reading other forum posts (like <a href="https://robodk.com/forum/Thread-Synchronizing-external-axes-using-the-API" target="_blank" rel="noopener" class="mycode_url">this one</a>) to set up the mechanisms but have had little success. The only way I can define all 3 positioners is with one of the positioners linked to A7, and the other two as standalone positioners (essentially an A1 each). <br />
<br />
This works fine inside the RoboDK simulation, and I have created python scripts to manipulate the positioners as expected. However, the problem is when I generate the robot program.<br />
<br />
Any control command (move just robot, move robot &amp; positioners, move just positioners) is generated as a move robot command with 7 axes. <br />
E.g.   MOVE TO {A1, A2, A3, A4, A5, A6, E1} <br />
<br />
This means that trying to move just the robot will also move the positioner in E1. <br />
E.g. my MoveRobotHome.py is exported with the following move command.<br />
      MOVE TO {0.00000,-60.00000,-110.00000,0.00000,90.00000,0.00000,90.00000} <br />
      robot is moved to home AND positioner 1 is moved to 90 deg<br />
<br />
Similarly, when I try to move just positioner A8 or A9 it will generate it as essentially just an A1 move<br />
E.g. MovePositioner2(90) is exported with the following move command.<br />
      MOVE TO {90.00000,0.00000,0.00000,0.00000,0.00000,0.00000,0.00000}<br />
      This moves A1 to 90 and all other joints (including positioner 1 in A7) to 0, instead of just positioner 2 to 90 deg.<br />
<br />
I need to be able to export my move commands with all axes by defining the positioners as A7, A8 and A9 inside RoboDK so the exported move commands are:<br />
   MOVE TO {A1, A2, A3, A4, A5, A6, E1, E2, E3}  <br />
<br />
Any ideas?<br />
<br />
I am using RoboDK v5.7.4<br />
Robot: Comau S-13<br />
Post Processor: Comau C5G<br />
<br />
See below raw script dump. This script should move robot to home, then positioners 2 and 3 to home, then positioner 1.<br />
MoveToStation1.py<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code># You can also use the new version of the API:<br />
from robodk import robolink    # RoboDK API<br />
from robodk import robomath    # Robot toolbox<br />
RDK = robolink.Robolink()<br />
<br />
<br />
<br />
# ----------------- move robot to home -----------------<br />
<br />
# get comau robodk<br />
comau = RDK.Item('Comau S-13', robolink.ITEM_TYPE_ROBOT)<br />
<br />
# check comau is valid<br />
if not comau.Valid():<br />
    raise Exception("Could not find JIG 1")<br />
<br />
# set speed<br />
comau.setSpeed(-1, 30, -1, -1)  # 30 deg/s joint speed<br />
<br />
# initialise joints<br />
joints_comau = comau.Joints()<br />
<br />
# update joints to home position<br />
joints_comau[0] = 0<br />
joints_comau[1] = -60<br />
joints_comau[2] = -110<br />
joints_comau[3] = 0<br />
joints_comau[4] = 90<br />
joints_comau[5] = 0<br />
<br />
# move to joints<br />
comau.MoveJ(joints_comau)<br />
<br />
# ------------------------------------------------------<br />
<br />
<br />
<br />
# --------------------- move JIG 1 ---------------------<br />
<br />
# get jig1 robodk<br />
jig_1 = RDK.Item('JIG1', robolink.ITEM_TYPE_ROBOT)<br />
<br />
# check jig1 is valid<br />
if not jig_1.Valid():<br />
    raise Exception("Could not find JIG 1")<br />
<br />
# set speed<br />
jig_1.setSpeed(-1, 10, -1, -1)  # 20 deg/s rotation speed<br />
<br />
# initialise joints<br />
joints_jig1 = jig_1.Joints()<br />
<br />
# update jig1 target angle<br />
joints_jig1[0] = 90<br />
<br />
# move to target angle<br />
jig_1.MoveJ(joints_jig1)<br />
<br />
# ------------------------------------------------------<br />
<br />
<br />
<br />
# --------------------- move JIG 2 ---------------------<br />
<br />
# get jig2 robodk<br />
jig_2 = RDK.Item('JIG2', robolink.ITEM_TYPE_ROBOT) <br />
<br />
# check jig2 is valid<br />
if not jig_2.Valid():<br />
    raise Exception("Could not find JIG 2")<br />
<br />
# set speed<br />
jig_2.setSpeed(-1, 10, -1, -1)  # 20 deg/s rotation speed<br />
<br />
# initialise joints<br />
joints_jig2 = jig_2.Joints()<br />
<br />
# update jig2 target angle<br />
joints_jig2[0] = 90<br />
<br />
# move to target angle<br />
jig_2.MoveJ(joints_jig2)<br />
<br />
# ------------------------------------------------------<br />
<br />
<br />
<br />
# -------------------- move JIG MAIN -------------------<br />
<br />
# get main jig robodk<br />
jig_main = RDK.Item('MAIN JIG', robolink.ITEM_TYPE_ROBOT)<br />
<br />
# check main jig is valid<br />
if not jig_main.Valid():<br />
    raise Exception("Could not find MAIN JIG")<br />
<br />
# set speed<br />
jig_main.setSpeed(-1, 10, -1, -1)  # 20 deg/s rotation speed<br />
<br />
# initialise joints<br />
joints_jigmain = jig_main.Joints()<br />
<br />
# update jig main target angle<br />
joints_jigmain[0] = 0<br />
<br />
# move to target angle<br />
jig_main.MoveJ(joints_jigmain)<br />
<br />
# ------------------------------------------------------</code></div></div><br />
Comau output<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>PROGRAM MoveToStation1<br />
VAR<br />
ROUTINE R_MoveToStation1 EXPORTED FROM MoveToStation1 GLOBAL<br />
<br />
ROUTINE R_MoveToStation1<br />
VAR<br />
BEGIN<br />
  &#36;ORNT_TYPE := RS_WORLD<br />
  &#36;MOVE_TYPE := JOINT<br />
  &#36;JNT_MTURN := TRUE<br />
  &#36;CNFG_CARE := TRUE<br />
  &#36;TURN_CARE := TRUE<br />
  &#36;SING_CARE := FALSE<br />
  &#36;TERM_TYPE := NOSETTLE<br />
  &#36;FLY_TYPE := FLY_CART<br />
  &#36;FLY_TRAJ := FLY_PASS<br />
  &#36;FLY_DIST := -1.000<br />
  &#36;STRESS_PER:= 65<br />
  -- Program generated by RoboDK v5.7.4 for Comau S-13 on 11/03/2026 12:35:30<br />
  &#36;ROT_SPD := 0.524<br />
  &#36;UFRAME := POS(-62.0000, -140.0000, -2000.0000, -90.0000, 90.0000, 0.0000, '') <br />
  &#36;TOOL := POS(0.0000, 0.0000, 510.0000, -104.9996, 120.0002, 150.0002, '')<br />
  MOVE TO {0.00000,-60.00000,-110.00000,0.00000,90.00000,0.00000,90.00000} -- move COMAU only<br />
  &#36;ROT_SPD := 0.175<br />
  &#36;UFRAME := POS(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, '')<br />
  &#36;TOOL := POS(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, '')<br />
  MOVE TO {90.00000,0.00000,0.00000,0.00000,0.00000,0.00000,0.00000} -- move JIG1 only<br />
  &#36;ROT_SPD := 0.175<br />
  MOVE TO {90.00000,0.00000,0.00000,0.00000,0.00000,0.00000,0.00000} -- move JIG2 only<br />
  &#36;ROT_SPD := 0.175<br />
  MOVE TO {0.00000,0.00000,0.00000,0.00000,0.00000,0.00000,0.00000} -- move MAIN JIG only<br />
END R_MoveToStation1<br />
<br />
BEGIN<br />
  R_MoveToStation1<br />
END MoveToStation1</code></div></div><br />
<br />
<img src="//cdn.robodk.com/forum/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
&nbsp;&nbsp;<a href="attachment.php?aid=7608" target="_blank" title="">Screenshot 2026-03-12 085123.png</a> (Size: 332.11 KB / Downloads: 103)
]]></description>
			<content:encoded><![CDATA[Hey team!<br />
<br />
I need some help setting up 3 positioners to be controlled from my Comau robot A7, A8, A9.<br />
<br />
I've been playing around with the configuration and reading other forum posts (like <a href="https://robodk.com/forum/Thread-Synchronizing-external-axes-using-the-API" target="_blank" rel="noopener" class="mycode_url">this one</a>) to set up the mechanisms but have had little success. The only way I can define all 3 positioners is with one of the positioners linked to A7, and the other two as standalone positioners (essentially an A1 each). <br />
<br />
This works fine inside the RoboDK simulation, and I have created python scripts to manipulate the positioners as expected. However, the problem is when I generate the robot program.<br />
<br />
Any control command (move just robot, move robot &amp; positioners, move just positioners) is generated as a move robot command with 7 axes. <br />
E.g.   MOVE TO {A1, A2, A3, A4, A5, A6, E1} <br />
<br />
This means that trying to move just the robot will also move the positioner in E1. <br />
E.g. my MoveRobotHome.py is exported with the following move command.<br />
      MOVE TO {0.00000,-60.00000,-110.00000,0.00000,90.00000,0.00000,90.00000} <br />
      robot is moved to home AND positioner 1 is moved to 90 deg<br />
<br />
Similarly, when I try to move just positioner A8 or A9 it will generate it as essentially just an A1 move<br />
E.g. MovePositioner2(90) is exported with the following move command.<br />
      MOVE TO {90.00000,0.00000,0.00000,0.00000,0.00000,0.00000,0.00000}<br />
      This moves A1 to 90 and all other joints (including positioner 1 in A7) to 0, instead of just positioner 2 to 90 deg.<br />
<br />
I need to be able to export my move commands with all axes by defining the positioners as A7, A8 and A9 inside RoboDK so the exported move commands are:<br />
   MOVE TO {A1, A2, A3, A4, A5, A6, E1, E2, E3}  <br />
<br />
Any ideas?<br />
<br />
I am using RoboDK v5.7.4<br />
Robot: Comau S-13<br />
Post Processor: Comau C5G<br />
<br />
See below raw script dump. This script should move robot to home, then positioners 2 and 3 to home, then positioner 1.<br />
MoveToStation1.py<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code># You can also use the new version of the API:<br />
from robodk import robolink    # RoboDK API<br />
from robodk import robomath    # Robot toolbox<br />
RDK = robolink.Robolink()<br />
<br />
<br />
<br />
# ----------------- move robot to home -----------------<br />
<br />
# get comau robodk<br />
comau = RDK.Item('Comau S-13', robolink.ITEM_TYPE_ROBOT)<br />
<br />
# check comau is valid<br />
if not comau.Valid():<br />
    raise Exception("Could not find JIG 1")<br />
<br />
# set speed<br />
comau.setSpeed(-1, 30, -1, -1)  # 30 deg/s joint speed<br />
<br />
# initialise joints<br />
joints_comau = comau.Joints()<br />
<br />
# update joints to home position<br />
joints_comau[0] = 0<br />
joints_comau[1] = -60<br />
joints_comau[2] = -110<br />
joints_comau[3] = 0<br />
joints_comau[4] = 90<br />
joints_comau[5] = 0<br />
<br />
# move to joints<br />
comau.MoveJ(joints_comau)<br />
<br />
# ------------------------------------------------------<br />
<br />
<br />
<br />
# --------------------- move JIG 1 ---------------------<br />
<br />
# get jig1 robodk<br />
jig_1 = RDK.Item('JIG1', robolink.ITEM_TYPE_ROBOT)<br />
<br />
# check jig1 is valid<br />
if not jig_1.Valid():<br />
    raise Exception("Could not find JIG 1")<br />
<br />
# set speed<br />
jig_1.setSpeed(-1, 10, -1, -1)  # 20 deg/s rotation speed<br />
<br />
# initialise joints<br />
joints_jig1 = jig_1.Joints()<br />
<br />
# update jig1 target angle<br />
joints_jig1[0] = 90<br />
<br />
# move to target angle<br />
jig_1.MoveJ(joints_jig1)<br />
<br />
# ------------------------------------------------------<br />
<br />
<br />
<br />
# --------------------- move JIG 2 ---------------------<br />
<br />
# get jig2 robodk<br />
jig_2 = RDK.Item('JIG2', robolink.ITEM_TYPE_ROBOT) <br />
<br />
# check jig2 is valid<br />
if not jig_2.Valid():<br />
    raise Exception("Could not find JIG 2")<br />
<br />
# set speed<br />
jig_2.setSpeed(-1, 10, -1, -1)  # 20 deg/s rotation speed<br />
<br />
# initialise joints<br />
joints_jig2 = jig_2.Joints()<br />
<br />
# update jig2 target angle<br />
joints_jig2[0] = 90<br />
<br />
# move to target angle<br />
jig_2.MoveJ(joints_jig2)<br />
<br />
# ------------------------------------------------------<br />
<br />
<br />
<br />
# -------------------- move JIG MAIN -------------------<br />
<br />
# get main jig robodk<br />
jig_main = RDK.Item('MAIN JIG', robolink.ITEM_TYPE_ROBOT)<br />
<br />
# check main jig is valid<br />
if not jig_main.Valid():<br />
    raise Exception("Could not find MAIN JIG")<br />
<br />
# set speed<br />
jig_main.setSpeed(-1, 10, -1, -1)  # 20 deg/s rotation speed<br />
<br />
# initialise joints<br />
joints_jigmain = jig_main.Joints()<br />
<br />
# update jig main target angle<br />
joints_jigmain[0] = 0<br />
<br />
# move to target angle<br />
jig_main.MoveJ(joints_jigmain)<br />
<br />
# ------------------------------------------------------</code></div></div><br />
Comau output<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>PROGRAM MoveToStation1<br />
VAR<br />
ROUTINE R_MoveToStation1 EXPORTED FROM MoveToStation1 GLOBAL<br />
<br />
ROUTINE R_MoveToStation1<br />
VAR<br />
BEGIN<br />
  &#36;ORNT_TYPE := RS_WORLD<br />
  &#36;MOVE_TYPE := JOINT<br />
  &#36;JNT_MTURN := TRUE<br />
  &#36;CNFG_CARE := TRUE<br />
  &#36;TURN_CARE := TRUE<br />
  &#36;SING_CARE := FALSE<br />
  &#36;TERM_TYPE := NOSETTLE<br />
  &#36;FLY_TYPE := FLY_CART<br />
  &#36;FLY_TRAJ := FLY_PASS<br />
  &#36;FLY_DIST := -1.000<br />
  &#36;STRESS_PER:= 65<br />
  -- Program generated by RoboDK v5.7.4 for Comau S-13 on 11/03/2026 12:35:30<br />
  &#36;ROT_SPD := 0.524<br />
  &#36;UFRAME := POS(-62.0000, -140.0000, -2000.0000, -90.0000, 90.0000, 0.0000, '') <br />
  &#36;TOOL := POS(0.0000, 0.0000, 510.0000, -104.9996, 120.0002, 150.0002, '')<br />
  MOVE TO {0.00000,-60.00000,-110.00000,0.00000,90.00000,0.00000,90.00000} -- move COMAU only<br />
  &#36;ROT_SPD := 0.175<br />
  &#36;UFRAME := POS(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, '')<br />
  &#36;TOOL := POS(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, '')<br />
  MOVE TO {90.00000,0.00000,0.00000,0.00000,0.00000,0.00000,0.00000} -- move JIG1 only<br />
  &#36;ROT_SPD := 0.175<br />
  MOVE TO {90.00000,0.00000,0.00000,0.00000,0.00000,0.00000,0.00000} -- move JIG2 only<br />
  &#36;ROT_SPD := 0.175<br />
  MOVE TO {0.00000,0.00000,0.00000,0.00000,0.00000,0.00000,0.00000} -- move MAIN JIG only<br />
END R_MoveToStation1<br />
<br />
BEGIN<br />
  R_MoveToStation1<br />
END MoveToStation1</code></div></div><br />
<br />
<img src="//cdn.robodk.com/forum/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
&nbsp;&nbsp;<a href="attachment.php?aid=7608" target="_blank" title="">Screenshot 2026-03-12 085123.png</a> (Size: 332.11 KB / Downloads: 103)
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA["Python Path Not Found" Error when trying to save program]]></title>
			<link>https://robodk.com/forum/Thread-Python-Path-Not-Found-Error-when-trying-to-save-program</link>
			<pubDate>Wed, 11 Mar 2026 12:37:08 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://robodk.com/forum/member.php?action=profile&uid=10123">Georgia van der linden</a>]]></dc:creator>
			<guid isPermaLink="false">https://robodk.com/forum/Thread-Python-Path-Not-Found-Error-when-trying-to-save-program</guid>
			<description><![CDATA[Hi! I'm trying to export a tool path for my meca500 robot, but for some reason I can't configure python correctly. When I go to tools-&gt;options-&gt;other and try to load the path to where python is, it still says "path not found" and I have no python tab to insert a path into the "python interpreter". I've tried restarting robodk, but it still doesn't auto-include python. What am I doing wrong? I just want to export my tool path as a python script so I can send it to the post-processor and robot. <br />
Thanks!]]></description>
			<content:encoded><![CDATA[Hi! I'm trying to export a tool path for my meca500 robot, but for some reason I can't configure python correctly. When I go to tools-&gt;options-&gt;other and try to load the path to where python is, it still says "path not found" and I have no python tab to insert a path into the "python interpreter". I've tried restarting robodk, but it still doesn't auto-include python. What am I doing wrong? I just want to export my tool path as a python script so I can send it to the post-processor and robot. <br />
Thanks!]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[How to get the curve object generated by RoboDK CAM Machining Project]]></title>
			<link>https://robodk.com/forum/Thread-How-to-get-the-curve-object-generated-by-RoboDK-CAM-Machining-Project</link>
			<pubDate>Wed, 11 Mar 2026 11:18:50 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://robodk.com/forum/member.php?action=profile&uid=8408">b05611018</a>]]></dc:creator>
			<guid isPermaLink="false">https://robodk.com/forum/Thread-How-to-get-the-curve-object-generated-by-RoboDK-CAM-Machining-Project</guid>
			<description><![CDATA[Hello,<br />
I am currently exploring RoboDK's CAM / Machining Project workflow.<br />
I would like to ask whether it is possible to access the <span style="font-weight: bold;" class="mycode_b">curve object</span> that is internally generated from the machining settings.<br />
From what I observed, the Machining Project seems to compute the number of points along the toolpath / curve, so I assume there is some internal curve or point sequence being created.<br />
My question is:<ul class="mycode_list"><li>Is there any API method to retrieve that generated <span style="font-weight: bold;" class="mycode_b">curve object</span> directly?<br />
</li>
<li>If not, is there any way to access the corresponding <span style="font-weight: bold;" class="mycode_b">points / path data</span> that the machining settings produced?<br />
</li>
</ul>
Thank you!]]></description>
			<content:encoded><![CDATA[Hello,<br />
I am currently exploring RoboDK's CAM / Machining Project workflow.<br />
I would like to ask whether it is possible to access the <span style="font-weight: bold;" class="mycode_b">curve object</span> that is internally generated from the machining settings.<br />
From what I observed, the Machining Project seems to compute the number of points along the toolpath / curve, so I assume there is some internal curve or point sequence being created.<br />
My question is:<ul class="mycode_list"><li>Is there any API method to retrieve that generated <span style="font-weight: bold;" class="mycode_b">curve object</span> directly?<br />
</li>
<li>If not, is there any way to access the corresponding <span style="font-weight: bold;" class="mycode_b">points / path data</span> that the machining settings produced?<br />
</li>
</ul>
Thank you!]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Program unable to generate depending on creation order]]></title>
			<link>https://robodk.com/forum/Thread-Program-unable-to-generate-depending-on-creation-order</link>
			<pubDate>Thu, 26 Feb 2026 15:59:59 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://robodk.com/forum/member.php?action=profile&uid=9032">Elie_Roy</a>]]></dc:creator>
			<guid isPermaLink="false">https://robodk.com/forum/Thread-Program-unable-to-generate-depending-on-creation-order</guid>
			<description><![CDATA[Hi,<br />
<br />
I’m creating a bunch of programs, but I can only generate them if the tools are processed in a specific order.<br />
<br />
If I generate a program using a mill and then generate a saw program, the mill program won’t generate correctly and I get an error message. However, if I generate the saw program first and then the mill program, everything works fine.<br />
<br />
<br />
I can generate multiple mill programs back-to-back without any issues, but as soon as I switch from mill to saw, everything breaks. At that point, I would need to manually update each mill program, which I can’t do because they would lose their I/O calls and my speed-call modifications.<br />
<br />
All of these programs are then called from a main program.<br />
<br />
In my programs the set tool and set frame is called before any type of moves.<br />
<br />
Any suggestions ?<br />
<br />
Both Mill and Saw programs are built about the same way.<br />
<br />
Cheers<br />
<br />
<img src="//cdn.robodk.com/forum/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
&nbsp;&nbsp;<a href="attachment.php?aid=7584" target="_blank" title="">Screenshot 2026-02-26 104741.png</a> (Size: 58.23 KB / Downloads: 114)
<br />
<br />
<img src="//cdn.robodk.com/forum/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
&nbsp;&nbsp;<a href="attachment.php?aid=7585" target="_blank" title="">Screenshot 2026-02-26 102930.png</a> (Size: 31.7 KB / Downloads: 127)
<br />
<br />
<img src="//cdn.robodk.com/forum/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
&nbsp;&nbsp;<a href="attachment.php?aid=7586" target="_blank" title="">Screenshot 2026-02-26 095335.png</a> (Size: 52.01 KB / Downloads: 150)
<br />
<br />
<img src="//cdn.robodk.com/forum/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
&nbsp;&nbsp;<a href="attachment.php?aid=7587" target="_blank" title="">Screenshot 2026-02-26 095322.png</a> (Size: 51.54 KB / Downloads: 143)
]]></description>
			<content:encoded><![CDATA[Hi,<br />
<br />
I’m creating a bunch of programs, but I can only generate them if the tools are processed in a specific order.<br />
<br />
If I generate a program using a mill and then generate a saw program, the mill program won’t generate correctly and I get an error message. However, if I generate the saw program first and then the mill program, everything works fine.<br />
<br />
<br />
I can generate multiple mill programs back-to-back without any issues, but as soon as I switch from mill to saw, everything breaks. At that point, I would need to manually update each mill program, which I can’t do because they would lose their I/O calls and my speed-call modifications.<br />
<br />
All of these programs are then called from a main program.<br />
<br />
In my programs the set tool and set frame is called before any type of moves.<br />
<br />
Any suggestions ?<br />
<br />
Both Mill and Saw programs are built about the same way.<br />
<br />
Cheers<br />
<br />
<img src="//cdn.robodk.com/forum/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
&nbsp;&nbsp;<a href="attachment.php?aid=7584" target="_blank" title="">Screenshot 2026-02-26 104741.png</a> (Size: 58.23 KB / Downloads: 114)
<br />
<br />
<img src="//cdn.robodk.com/forum/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
&nbsp;&nbsp;<a href="attachment.php?aid=7585" target="_blank" title="">Screenshot 2026-02-26 102930.png</a> (Size: 31.7 KB / Downloads: 127)
<br />
<br />
<img src="//cdn.robodk.com/forum/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
&nbsp;&nbsp;<a href="attachment.php?aid=7586" target="_blank" title="">Screenshot 2026-02-26 095335.png</a> (Size: 52.01 KB / Downloads: 150)
<br />
<br />
<img src="//cdn.robodk.com/forum/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
&nbsp;&nbsp;<a href="attachment.php?aid=7587" target="_blank" title="">Screenshot 2026-02-26 095322.png</a> (Size: 51.54 KB / Downloads: 143)
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Is there an API to fully automate the new RoboDK CAM workflow?]]></title>
			<link>https://robodk.com/forum/Thread-Is-there-an-API-to-fully-automate-the-new-RoboDK-CAM-workflow</link>
			<pubDate>Sat, 21 Feb 2026 09:43:42 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://robodk.com/forum/member.php?action=profile&uid=8408">b05611018</a>]]></dc:creator>
			<guid isPermaLink="false">https://robodk.com/forum/Thread-Is-there-an-API-to-fully-automate-the-new-RoboDK-CAM-workflow</guid>
			<description><![CDATA[Hello RoboDK team and community,<br />
     I am currently exploring the new CAM features recently introduced in RoboDK, and they look very promising for advanced robot machining and toolpath workflows.<br />
I would like to know whether these new CAM-related functionalities (such as creating and configuring Machining Projects, loading NC/G-code toolpaths, and setting strategies/parameters) are fully accessible through the RoboDK API for automation purposes.<br />
My goal is to build a fully automated pipeline where:<ul class="mycode_list"><li>CAM toolpaths are generated externally<br />
</li>
<li>RoboDK automatically creates a Machining Project<br />
</li>
<li>All machining parameters (tool, frame, offsets, approach/retract strategies, etc.) are configured programmatically<br />
</li>
<li>The robot program is then generated and post-processed without manual GUI interaction<br />
</li>
</ul>
From the documentation and examples, I understand that it is possible to create machining projects using functions like "AddMachiningProject"and to load NC files via the API, and also to modify parameters such as tool or frame offsets programmatically.<br />
However, I am not sure if the <span style="font-style: italic;" class="mycode_i">entire</span> workflow exposed in the new CAM GUI (including all advanced machining settings and strategies) is fully controllable via the API, or if some parts are still GUI-only.<br />
So my questions are:<br />
<ol type="1" class="mycode_list"><li>Is there a complete API coverage for the new CAM features?<br />
</li>
<li>Are there recommended best practices to fully automate the CAM → RoboDK → Robot program pipeline?<br />
</li>
<li>If some parameters are not yet available via the API, is there a roadmap to expose them in future releases?<br />
</li>
</ol>
Any guidance, examples, or best practices would be greatly appreciated.<br />
Thank you for your continuous development of RoboDK — it is an incredibly powerful platform for automated robotic machining workflows.<br />
<br />
Best regards,<br />
<br />
YEN-SHUO]]></description>
			<content:encoded><![CDATA[Hello RoboDK team and community,<br />
     I am currently exploring the new CAM features recently introduced in RoboDK, and they look very promising for advanced robot machining and toolpath workflows.<br />
I would like to know whether these new CAM-related functionalities (such as creating and configuring Machining Projects, loading NC/G-code toolpaths, and setting strategies/parameters) are fully accessible through the RoboDK API for automation purposes.<br />
My goal is to build a fully automated pipeline where:<ul class="mycode_list"><li>CAM toolpaths are generated externally<br />
</li>
<li>RoboDK automatically creates a Machining Project<br />
</li>
<li>All machining parameters (tool, frame, offsets, approach/retract strategies, etc.) are configured programmatically<br />
</li>
<li>The robot program is then generated and post-processed without manual GUI interaction<br />
</li>
</ul>
From the documentation and examples, I understand that it is possible to create machining projects using functions like "AddMachiningProject"and to load NC files via the API, and also to modify parameters such as tool or frame offsets programmatically.<br />
However, I am not sure if the <span style="font-style: italic;" class="mycode_i">entire</span> workflow exposed in the new CAM GUI (including all advanced machining settings and strategies) is fully controllable via the API, or if some parts are still GUI-only.<br />
So my questions are:<br />
<ol type="1" class="mycode_list"><li>Is there a complete API coverage for the new CAM features?<br />
</li>
<li>Are there recommended best practices to fully automate the CAM → RoboDK → Robot program pipeline?<br />
</li>
<li>If some parameters are not yet available via the API, is there a roadmap to expose them in future releases?<br />
</li>
</ol>
Any guidance, examples, or best practices would be greatly appreciated.<br />
Thank you for your continuous development of RoboDK — it is an incredibly powerful platform for automated robotic machining workflows.<br />
<br />
Best regards,<br />
<br />
YEN-SHUO]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Do point objects have to be imported at the global level?]]></title>
			<link>https://robodk.com/forum/Thread-Do-point-objects-have-to-be-imported-at-the-global-level</link>
			<pubDate>Wed, 18 Feb 2026 17:36:46 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://robodk.com/forum/member.php?action=profile&uid=8757">PhzyksDoesRobots</a>]]></dc:creator>
			<guid isPermaLink="false">https://robodk.com/forum/Thread-Do-point-objects-have-to-be-imported-at-the-global-level</guid>
			<description><![CDATA[I have no issue importing multiple embedded user frames and targets and importing them exactly where I want in my RoboDK tree utilizing scripts. However, any 'physical' point objects seem to always go to the global level? Forces me to manually place points which can be time consuming for lots of points.]]></description>
			<content:encoded><![CDATA[I have no issue importing multiple embedded user frames and targets and importing them exactly where I want in my RoboDK tree utilizing scripts. However, any 'physical' point objects seem to always go to the global level? Forces me to manually place points which can be time consuming for lots of points.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Incorrect Destination Joints for Linear Move]]></title>
			<link>https://robodk.com/forum/Thread-Incorrect-Destination-Joints-for-Linear-Move</link>
			<pubDate>Wed, 04 Feb 2026 22:48:59 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://robodk.com/forum/member.php?action=profile&uid=4812">SamuelEStreamline</a>]]></dc:creator>
			<guid isPermaLink="false">https://robodk.com/forum/Thread-Incorrect-Destination-Joints-for-Linear-Move</guid>
			<description><![CDATA[Hello,<br />
<br />
I'm getting an issue where a linear move to a joint target does not move the robot to the correct joint target and also does not flag a reach error.<br />
<br />
I've attached an example simulation file.<br />
<br />
If you run the TRIM_WIRE_C2_1 program, the last instruction tells the robot to move linearly to target WR_C2_1.<br />
<br />
Target WR_C2_1 is a joint target with the following joint values:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>106.300000, -10.800000, -56.000000, -180.000000, 34.200000, 163.700000</code></div></div><br />
<br />
However, when the TRIM_WIRE_C2_1 program is executed, the final robot joints are:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>106.300000, -10.800000, -56.000000, 0.000000, -34.200000, -16.300000</code></div></div><br />
Can you explain why the robot is not moving to the correct joints?<br />
<br />
<img src="//cdn.robodk.com/forum/images/attachtypes/robodk.png" title="RoboDK station" border="0" alt=".rdk" />
&nbsp;&nbsp;<a href="attachment.php?aid=7563" target="_blank" title="">Config_Issue.rdk</a> (Size: 4.24 MB / Downloads: 194)
]]></description>
			<content:encoded><![CDATA[Hello,<br />
<br />
I'm getting an issue where a linear move to a joint target does not move the robot to the correct joint target and also does not flag a reach error.<br />
<br />
I've attached an example simulation file.<br />
<br />
If you run the TRIM_WIRE_C2_1 program, the last instruction tells the robot to move linearly to target WR_C2_1.<br />
<br />
Target WR_C2_1 is a joint target with the following joint values:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>106.300000, -10.800000, -56.000000, -180.000000, 34.200000, 163.700000</code></div></div><br />
<br />
However, when the TRIM_WIRE_C2_1 program is executed, the final robot joints are:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>106.300000, -10.800000, -56.000000, 0.000000, -34.200000, -16.300000</code></div></div><br />
Can you explain why the robot is not moving to the correct joints?<br />
<br />
<img src="//cdn.robodk.com/forum/images/attachtypes/robodk.png" title="RoboDK station" border="0" alt=".rdk" />
&nbsp;&nbsp;<a href="attachment.php?aid=7563" target="_blank" title="">Config_Issue.rdk</a> (Size: 4.24 MB / Downloads: 194)
]]></content:encoded>
		</item>
	</channel>
</rss>