Read/write general purpose registers via real-time interface

Hi there, is it possible to read/write general purpose registers through TCP/IP communication not using RTDE? I need to write and read data from registers, and I can’t find the way to do that using the Real-time interface through port 30003. Also, I am having many difficulties to do that via RTDE because I am not using Python or C++, I am using C# instead and it is a bit complicated to make it work.

Please I would highly appreciate any hint or help you can provide. Thank you!

If you’ve got budget for extra libraries, UnderAutomation has a C# library for communicating with UR bots, including RTDE. It has a free trial option, so you can test it out to see if it serves your needs.

Yes, you can take a look at the UnderAutomatrion library. It provides a complete implementation of RTDE in C#:

https://underautomation.com/universal-robots/documentation/rtde

using UnderAutomation.UniversalRobots;
using UnderAutomation.UniversalRobots.Common;
using UnderAutomation.UniversalRobots.Rtde;
using UnderAutomation.UniversalRobots.Rtde.Internal;

class Rtde
{
    static void Main(string[] args)
    {
        var robot = new UR();

        var param = new ConnectParameters("192.168.0.1");

        // Enable RTDE
        param.Rtde.Enable = true;

        // Exchange data at 500Hz
        param.Rtde.Frequency = 500;

        // Select data you want to write in robot controller
        param.Rtde.InputSetup.Add(RtdeInputData.StandardAnalogOutput0);
        param.Rtde.InputSetup.Add(RtdeInputData.InputIntRegisters, 0);

        // Select data you want the robot to send
        param.Rtde.OutputSetup.Add(RtdeOutputData.ActualTcpPose);
        param.Rtde.OutputSetup.Add(RtdeOutputData.ToolOutputVoltage);
        param.Rtde.OutputSetup.Add(RtdeOutputData.OutputDoubleRegisters, 10);

        // Connect to robot
        robot.Connect(param);

        // Be notified at 500Hz when data is received
        robot.Rtde.OutputDataReceived += Rtde_OutputDataReceived;

        // Get last received data in cache
        Pose actualTcpPose = robot.Rtde.OutputDataValues.ActualTcpPose;
        int toolOutputVoltage = robot.Rtde.OutputDataValues.ToolOutputVoltage;
        double outputDoubleRegisters10 = robot.Rtde.OutputDataValues.OutputDoubleRegisters.X10;

        // Write input values in robot
        var inputValues = new RtdeInputValues();
        inputValues.StandardAnalogOutput0 = 0.2;
        inputValues.InputIntRegisters.X0 = 12;
        robot.Rtde.WriteInputs(inputValues);

        // Disconnect every interfaces (Primary Interface, Dashboard, RTDE, ...)
        robot.Disconnect();
    }

    private static void Rtde_OutputDataReceived(object sender, RtdeDataPackageEventArgs e)
    {
        // Get frequency of received message (OutputSetup contains Timestamp by default)
        var realMessageFrequency = e.MeasuredFrequency;

        // Get the value of the data you have selected in the setup 
        Pose actualTcpPose = e.OutputDataValues.ActualTcpPose;
        int toolOutputVoltage = e.OutputDataValues.ToolOutputVoltage;
        double outputDoubleRegisters10 = e.OutputDataValues.OutputDoubleRegisters.X10;

        // Write inputs at 500Hz
        var inputValues = new RtdeInputValues();
        inputValues.StandardAnalogOutput0 = 0.5;
        inputValues.InputIntRegisters.X0 = -10;
        (sender as RtdeClientBase)?.WriteInputs(inputValues);
    }
}