Fanuc SDK documentation
Members of Snpx.Internal.PositionRegisters :
Members of Common.Position :
Members of Common.JointsPosition :
Members of Common.ExtendedCartesianPosition :
Members of Common.CartesianPosition :
Registers
Read and write numeric registers (R[]), position registers (PR[]), string registers (SR[]), and flags (F[]) via SNPX.
SNPX provides fast read and write access to all register types: numeric (R[]), position (PR[]), string (SR[]), and flags (F[]).
Numeric registers (R[])
Numeric registers store floating-point, 32-bit integer, or 16-bit integer values.
// Read R[1] as float (default)float value = robot.Snpx.NumericRegisters.Read(1);// Write R[1]robot.Snpx.NumericRegisters.Write(1, 123.45f);// Read as 32-bit integerint intValue = robot.Snpx.NumericRegistersInt32.Read(1);robot.Snpx.NumericRegistersInt32.Write(1, 999);// Read as 16-bit integershort shortValue = robot.Snpx.NumericRegistersInt16.Read(1);
Position registers (PR[])
Position registers store joint or Cartesian positions with tool and frame info.
// Read PR[1]Position posReg = robot.Snpx.PositionRegisters.Read(1);// Access Cartesian valuesdouble x = posReg.CartesianPosition.X;short userFrame = posReg.UserFrame;short userTool = posReg.UserTool;// Access joint valuesdouble j1 = posReg.JointsPosition.J1;// Write Cartesian position to PR[1]robot.Snpx.PositionRegisters.Write(1, new CartesianPosition(100, 200, 300, 0, 90, 0));// Write joint position to PR[1]robot.Snpx.PositionRegisters.Write(1, new JointsPosition { J1 = 0, J2 = 0, J3 = 0, J4 = 0, J5 = 0, J6 = 45 });
String registers (SR[]) and flags (F[])
The default string length is 80 characters. You can change it with StringRegisters.StringLength (must be even, >= 2).
// Read SR[1]string text = robot.Snpx.StringRegisters.Read(1);// Write SR[1]robot.Snpx.StringRegisters.Write(1, "Hello, Robot!");// Read F[1]bool flag = robot.Snpx.Flags.Read(1);// Write F[1]robot.Snpx.Flags.Write(1, true);
Complete example
using UnderAutomation.Fanuc;using UnderAutomation.Fanuc.Common;public class SnpxRegisters{public static void Main(){// Create a FanucRobot instanceFanucRobot robot = new FanucRobot();// Set SNPX connection parameters (example values)ConnectionParameters parameters = new ConnectionParameters("192.168.0.1");parameters.Snpx.Enable = true;// Connect with SNPX enabledrobot.Connect(parameters);/**/// 1) Numeric Registers: Read & WriteReadWriteNumericRegisters(robot);// 2) Position Registers: Read & WriteReadWritePositionRegisters(robot);// 3) String Registers: Read & WriteReadWriteStringRegisters(robot);/**/}private static void ReadWriteNumericRegisters(FanucRobot robot){// Read numeric register R[1]float numReg1 = robot.Snpx.NumericRegisters.Read(1);Console.WriteLine($"📊 R[1] = {numReg1}");// Write numeric register R[1]robot.Snpx.NumericRegisters.Write(1, 123.45f);Console.WriteLine("✅ Wrote 123.45 to R[1]");}private static void ReadWritePositionRegisters(FanucRobot robot){// Read position register PR[1]Position posReg1 = robot.Snpx.PositionRegisters.Read(1);Console.WriteLine("\n🤖 Current PR[1]:");Console.WriteLine($" UserFrame = {posReg1.UserFrame}");Console.WriteLine($" UserTool = {posReg1.UserTool}");// If the register is Cartesianif (posReg1.CartesianPosition != null){Console.WriteLine(" CartesianPosition:");Console.WriteLine($" X = {posReg1.CartesianPosition.X}");Console.WriteLine($" Y = {posReg1.CartesianPosition.Y}");Console.WriteLine($" Z = {posReg1.CartesianPosition.Z}");Console.WriteLine($" W = {posReg1.CartesianPosition.W}");Console.WriteLine($" P = {posReg1.CartesianPosition.P}");Console.WriteLine($" R = {posReg1.CartesianPosition.R}");Console.WriteLine(" Configuration :");Console.WriteLine($" ArmFrontBack = {posReg1.CartesianPosition.Configuration.ArmFrontBack}");Console.WriteLine($" ArmLeftRight = {posReg1.CartesianPosition.Configuration.ArmLeftRight}");Console.WriteLine($" ArmUpDown = {posReg1.CartesianPosition.Configuration.ArmUpDown}");Console.WriteLine($" WristFlip = {posReg1.CartesianPosition.Configuration.WristFlip}");}// If the register is Joint-basedif (posReg1.JointsPosition != null){Console.WriteLine(" JointsPosition:");Console.WriteLine($" J1 = {posReg1.JointsPosition.J1}");Console.WriteLine($" J2 = {posReg1.JointsPosition.J2}");Console.WriteLine($" J3 = {posReg1.JointsPosition.J3}");Console.WriteLine($" J4 = {posReg1.JointsPosition.J4}");Console.WriteLine($" J5 = {posReg1.JointsPosition.J5}");Console.WriteLine($" J6 = {posReg1.JointsPosition.J6}");}// Write a Cartesian position to PR[1]Console.WriteLine("\n✅ Writing Cartesian position to PR[1]...");robot.Snpx.PositionRegisters.Write(1, new CartesianPosition(x: 0.1f, y: 0.2f, z: 0.3f, w: 0.4f, p: 0.5f, r: 0.6f));// Write a Joint position to PR[1]Console.WriteLine("✅ Writing Joint position to PR[1]...");robot.Snpx.PositionRegisters.Write(1, new JointsPosition { J1 = 0, J2 = 0, J3 = 0, J4 = 0, J5 = 0, J6 = 45 });}private static void ReadWriteStringRegisters(FanucRobot robot){// Read string register SR[1]string strReg1 = robot.Snpx.StringRegisters.Read(1);Console.WriteLine($"\n💬 SR[1] = '{strReg1}'");// Write string register SR[1]robot.Snpx.StringRegisters.Write(1, "Hello, Robot!");Console.WriteLine("✅ Wrote 'Hello, Robot!' to SR[1]");}}
API reference
Members of Snpx.Internal.NumericRegisters :public class NumericRegisters : NumericRegistersBase<float, NumericRegistersBatchAssignment> {// Creates a batch assignment for reading multiple numeric registers.public NumericRegistersBatchAssignment CreateBatchAssignment(int startIndex, int count)// Reads a value from the client at the specified memory offset.protected override float ReadFromClient(int offset, int index)// Writes a value to the robot at the specified offset.protected override void WriteInClient(int offset, int index, float value)}
public class PositionRegisters : SnpxWritableAssignableIndexableElements<Position, PositionRegistersBatchAssignment> {// Creates a batch assignment for reading multiple position registers.public PositionRegistersBatchAssignment CreateBatchAssignment(int startIndex, int count)protected override string GetAssignmentName(int index)protected override int GetAssignmentSize(int index)protected override string GetAssignmentTarget(int index)// Reads the position at the specified register index.public Position Read(int index)// Reads a value from the client at the specified memory offset.protected override Position ReadFromClient(int offset, int index)// Writes a Cartesian position to the specified position register.public void Write(int index, CartesianPosition cartesianPosition)// Writes an extended Cartesian position to the specified position register.public void Write(int index, ExtendedCartesianPosition extendedCartesianPosition)// Writes a joints position to the specified position register.public void Write(int index, JointsPosition jointsPosition)// Writes a value to the robot at the specified offset.protected override void WriteInClient(int offset, int index, Position value)}
public class Position {// Default constructorpublic Position()// Constructor with user frame, tool, joints and cartesian positionpublic Position(short userFrame, short userTool, JointsPosition jointsPosition, ExtendedCartesianPosition cartesianPosition)// Cartesian position with extended axespublic ExtendedCartesianPosition CartesianPosition { get; set; }public override bool Equals(object obj)public override int GetHashCode()// Joint values in degreespublic JointsPosition JointsPosition { get; set; }public override string ToString()// User frame indexpublic short UserFrame { get; set; }// User tool indexpublic short UserTool { get; set; }}
public class JointsPosition {// Default constructorpublic JointsPosition()// Constructor with 6 joint values in degreespublic JointsPosition(double j1Deg, double j2Deg, double j3Deg, double j4Deg, double j5Deg, double j6Deg)// Constructor with 9 joint values in degreespublic JointsPosition(double j1Deg, double j2Deg, double j3Deg, double j4Deg, double j5Deg, double j6Deg, double j7Deg, double j8Deg, double j9Deg)// Constructor from an array of joint values in degreespublic JointsPosition(double[] values)public override bool Equals(object obj)public override int GetHashCode()// Check if joints position is near to expected joints position with a tolerance valuepublic static bool IsNear(JointsPosition j1, JointsPosition j2, double degreesTolerance)// Gets or sets the joint value at the specified indexpublic double this[int i] { get; set; }// Joint 1 in degreespublic double J1 { get; set; }// Joint 2 in degreespublic double J2 { get; set; }// Joint 3 in degreespublic double J3 { get; set; }// Joint 4 in degreespublic double J4 { get; set; }// Joint 5 in degreespublic double J5 { get; set; }// Joint 6 in degreespublic double J6 { get; set; }// Joint 7 in degreespublic double J7 { get; set; }// Joint 8 in degreespublic double J8 { get; set; }// Joint 9 in degreespublic double J9 { get; set; }public override string ToString()// Numeric values for each jointspublic double[] Values { get; }}
public class ExtendedCartesianPosition : CartesianPosition {// Default constructorpublic ExtendedCartesianPosition()// Constructor with position, rotations, and extended axespublic ExtendedCartesianPosition(double x, double y, double z, double w, double p, double r, double e1, double e2, double e3)// Extended axis 1 valuepublic double E1 { get; set; }// Extended axis 2 valuepublic double E2 { get; set; }// Extended axis 3 valuepublic double E3 { get; set; }public override bool Equals(object obj)public override int GetHashCode()public override string ToString()}
public class CartesianPosition : XYZPosition {// Default constructorpublic CartesianPosition()// Constructor with position and rotationspublic CartesianPosition(double x, double y, double z, double w, double p, double r)// Constructor with position, rotations and configurationpublic CartesianPosition(double x, double y, double z, double w, double p, double r, Configuration configuration)// Copy constructorpublic CartesianPosition(CartesianPosition position)// Constructor from an XYZ position with rotationspublic CartesianPosition(XYZPosition position, double w, double p, double r)// Position configurationpublic Configuration Configuration { get; }public override bool Equals(object obj)// Create a CartesianPosition with unknow configuration from a homogeneous rotation and translation 4x4 matrixpublic static CartesianPosition FromHomogeneousMatrix(double[,] R)public override int GetHashCode()// Check if two Cartesian positions are near each other within specified tolerancespublic static bool IsNear(CartesianPosition a, CartesianPosition b, double mmTolerance, double degreesTolerance)// Normalize an angle to the range ]-180, 180]public static double NormalizeAngle(double angle)// Normalize the W, P, R angles to the range ]-180, 180]public static void NormalizeAngles(CartesianPosition pose)// P rotation in degrees (Ry)public double P { get; set; }// R rotation in degrees (Rz)public double R { get; set; }// Convert position to a homogeneous rotation and translation 4x4 matrixpublic double[,] ToHomogeneousMatrix()public override string ToString()// W rotation in degrees (Rx)public double W { get; set; }}