UnderAutomation
Any question?

[email protected]

Contact us
UnderAutomation
⌘Q
Fanuc SDK documentation
Motion commands
Documentation home

Frames, I/O & status

Manage user frames and tools, read/write I/O, read positions, set speed override, and get controller status via RMI.

RMI provides access to user frames, tools, digital I/O, position registers, and controller status.

Controller status

// Controller status
ControllerStatus status = robot.Rmi.GetStatus();
Console.WriteLine($"Servo ready: {status.ServoReady}");
Console.WriteLine($"TP mode: {status.TPMode}");
// Admin commands
robot.Rmi.SetOverride(50);
robot.Rmi.Pause();
robot.Rmi.Continue();
robot.Rmi.Reset();
robot.Rmi.Abort();
// Read last error
ControllerErrorText error = robot.Rmi.ReadError();

Admin commands

Position reading

// Current Cartesian position
var pos = robot.Rmi.ReadCartesianPosition();
Console.WriteLine($"X={pos.Position.X}, Y={pos.Position.Y}, Z={pos.Position.Z}");
// Current joint angles
JointAnglesSample joints = robot.Rmi.ReadJointAngles();
Console.WriteLine($"J1={joints.JointAngle.J1}, J2={joints.JointAngle.J2}");
// TCP speed
TcpSpeed speed = robot.Rmi.ReadTcpSpeed();
Console.WriteLine($"TCP speed: {speed.Speed} mm/s");

User frames and tools

// Read current frame/tool numbers
UFrameUToolNumbers current = robot.Rmi.GetUFrameUTool();
Console.WriteLine($"UFrame: {current.UFrameNumber}, UTool: {current.UToolNumber}");
// Set current frame/tool
robot.Rmi.SetUFrameUTool(uframe: 1, utool: 2);
// Read/write a user frame
IndexedFrame frame = robot.Rmi.ReadUFrame(1);
robot.Rmi.WriteUFrame(1, new Frame { X = 100, Y = 200, Z = 0 });
// Read/write user tool
IndexedFrame tool = robot.Rmi.ReadUTool(1);
robot.Rmi.WriteUTool(1, new Frame { X = 0, Y = 0, Z = 150 });

Digital I/O

// Read digital input
DigitalInputValue din = robot.Rmi.ReadDIN(5);
Console.WriteLine($"DI[5] = {din.PortValue}");
// Write digital output
robot.Rmi.WriteDOUT(1, OnOff.ON);
robot.Rmi.WriteDOUT(1, OnOff.OFF);
// Read a position register
PositionRegisterData pr = robot.Rmi.ReadPositionRegister(1);
Console.WriteLine($"PR[1]: X={pr.Position.X}");
// Write a position register
Frame newPos = new Frame { X = 500, Y = 200, Z = 300, W = 0, P = 90, R = 0 };
MotionConfiguration config = new MotionConfiguration { UToolNumber = 1, UFrameNumber = 0 };
robot.Rmi.WritePositionRegister(1, config, newPos);

Position registers

Complete example

using UnderAutomation.Fanuc;
using UnderAutomation.Fanuc.Rmi.Data;
public class RmiFramesIo
{
public static void Main()
{
FanucRobot robot = new FanucRobot();
ConnectionParameters parameters = new ConnectionParameters("192.168.0.1");
parameters.Rmi.Enable = true;
robot.Connect(parameters);
robot.Rmi.Initialize();
/**/
// --- Controller status ---
ControllerStatus status = robot.Rmi.GetStatus();
Console.WriteLine($"Servo ready: {status.ServoReady}");
Console.WriteLine($"TP mode: {status.TPMode}");
// --- Admin commands ---
robot.Rmi.SetOverride(50);
robot.Rmi.Pause();
robot.Rmi.Continue();
robot.Rmi.Reset();
// --- Position reading ---
var pos = robot.Rmi.ReadCartesianPosition();
JointAnglesSample joints = robot.Rmi.ReadJointAngles();
TcpSpeed speed = robot.Rmi.ReadTcpSpeed();
// --- User frames and tools ---
UFrameUToolNumbers current = robot.Rmi.GetUFrameUTool();
robot.Rmi.SetUFrameUTool(uframe: 1, utool: 2);
IndexedFrame frame = robot.Rmi.ReadUFrame(1);
robot.Rmi.WriteUFrame(1, new Frame { X = 100, Y = 200, Z = 0 });
IndexedFrame tool = robot.Rmi.ReadUTool(1);
robot.Rmi.WriteUTool(1, new Frame { X = 0, Y = 0, Z = 150 });
// --- Digital I/O ---
DigitalInputValue din = robot.Rmi.ReadDIN(5);
robot.Rmi.WriteDOUT(1, OnOff.ON);
// --- Position registers ---
PositionRegisterData pr = robot.Rmi.ReadPositionRegister(1);
Frame newPos = new Frame { X = 500, Y = 200, Z = 300 };
MotionConfiguration config = new MotionConfiguration { UToolNumber = 1, UFrameNumber = 0 };
robot.Rmi.WritePositionRegister(1, config, newPos);
/**/
}
}

API reference

Members of Rmi.Data.ControllerStatus :
public class ControllerStatus : RmiResponseBase {
public ControllerStatus()
public override bool Equals(object obj)
public override int GetHashCode()
// Next valid SequenceID when sequence checking is enabled.
public int NextSequenceId { get; set; }
// Number of UFRAMEs configured.
public byte NumberUFrame { get; set; }
// Number of UTOOLs configured.
public byte NumberUTool { get; set; }
// RMI_MOVE program status (1 = aborted).
public byte ProgramStatus { get; set; }
// RMI motion runtime state (1 = running).
public byte RMIMotionStatus { get; set; }
// Servo ready state (1 = ready).
public byte ServoReady { get; set; }
// Single step mode flag (1 = on).
public byte SingleStepMode { get; set; }
// Teach pendant mode (0 = disabled/AUTO, 1 = enabled/TEACH).
public byte TPMode { get; set; }
public override string ToString()
}
Members of Rmi.Data.ControllerErrorText :
public class ControllerErrorText : RmiResponseBase {
public ControllerErrorText()
public override bool Equals(object obj)
// Controller error text in the form XXXX-NNN.
public string ErrorData { get; set; }
public override int GetHashCode()
public override string ToString()
}
Members of Rmi.Data.UFrameUToolNumbers :
public class UFrameUToolNumbers : RmiResponseBase {
public UFrameUToolNumbers()
public override bool Equals(object obj)
public override int GetHashCode()
public override string ToString()
// Current user frame number.
public byte UFrameNumber { get; set; }
// Current user tool number.
public byte UToolNumber { get; set; }
}
Members of Rmi.Data.DigitalInputValue :
public class DigitalInputValue : RmiResponseBase {
public DigitalInputValue()
public override bool Equals(object obj)
public override int GetHashCode()
// Port number.
public short PortNumber { get; set; }
// Port value (0 = OFF, 1 = ON).
public byte PortValue { get; set; }
public override string ToString()
}
Members of Rmi.Data.PositionRegisterData :
public class PositionRegisterData : RmiResponseBase {
public PositionRegisterData()
// Configuration saved in the position register.
public MotionConfiguration Configuration { get; set; }
public override bool Equals(object obj)
public override int GetHashCode()
// Position saved in the position register.
public Frame Position { get; set; }
// Register number.
public short RegisterNumber { get; set; }
public override string ToString()
}
Members of Rmi.Data.CartesianPosition :
public class CartesianPosition : RmiTimedResponse {
public CartesianPosition()
// Active configuration at sampling time.
public MotionConfiguration Configuration { get; set; }
public override bool Equals(object obj)
public override int GetHashCode()
// Cartesian TCP position.
public Frame Position { get; set; }
public override string ToString()
}
Members of Rmi.Data.TcpSpeed :
public class TcpSpeed : RmiTimedResponse {
public TcpSpeed()
public override bool Equals(object obj)
public override int GetHashCode()
// Current tool center point speed.
public double Speed { get; set; }
public override string ToString()
}

Easily integrate Universal Robots, Fanuc, Yaskawa, ABB or Staubli robots into your .NET, Python, LabVIEW or Matlab applications

UnderAutomation
Contact usLegal

© All rights reserved.