Implements communication with Fanuc industrial robots - Fully-managed .NET commercial DLL without dependencies
$ dotnet add package UnderAutomation.FanucThe Fanuc SDK enables seamless integration with Fanuc robots for automation, data exchange, and remote control. Ideal for industrial automation, research, and advanced robotics applications.
It allows you to connect to a real robot, but also to ROBOGUIDE.
🔗 More Information: https://underautomation.com/fanuc
🔗 Also available for 🟨 LabVIEW & 🐍 Python
👁️ Watch to be notified of latest updates !
No additional installations or Fanuc options are required to use this SDK.
Explore the Fanuc SDK with fully functional example applications and precompiled binaries for various platforms. See Github releases
A Windows Forms application demonstrating all the features of the library.
📌 Download: 📥 UnderAutomation.Fanuc.Showcase.Forms.exe
Read variables :

Move the robot :

High speed Read & Write registers :

Live remote control with Jostick or 3D Mouse:

TP Editor with breakpoints:

Forward and Inverse Kinematics:

Telnet KCL (Keyboard Command Line) allows sending commands to control the robot remotely—no additional options needed on the controller.
robot.Telnet.Reset();
robot.Telnet.Run("MyProgram");
robot.Telnet.Pause("MyProgram");
robot.Telnet.Hold("MyProgram");
robot.Telnet.Continue("MyProgram");
robot.Telnet.Abort("MyProgram", force: true);
robot.Telnet.SetVariable("my_variable", 42);
robot.Telnet.SetVariable("$RMT_MASTER", 1);
// Set an output port (example: DOUT port 2 = 0)
robot.Telnet.SetPort(KCLPorts.DOUT, 2, 0);
// Simulate an input port (example: DIN port 3 = 1)
robot.Telnet.Simulate(KCLPorts.DIN, 3, 1);
robot.Telnet.Unsimulate(KCLPorts.DIN, 3);
SNPX (also known as SRTP/RobotIF) enables fast, structured data communication with the robot.
It is used to read/write registers, monitor alarms, and check robot status.
// Read position register 1
Position register1 = robot.Snpx.PositionRegisters.Read(1);
// Set a new value for register 2
robot.Snpx.PositionRegisters.Write(2, new Position { X = 100, Y = 50, Z = 25 });
// Read register R[1]
double value = robot.Snpx.Registers.Read(1);
// Write a value to R[2]
robot.Snpx.Registers.Write(2, 123.45);
// Read a User Input (UI) state
bool UI1 = robot.Snpx.UI.Read(1);
// Set a User Output (UO) signal
robot.Snpx.UO.Write(3, true);
// Write a system variable
robot.Snpx.IntegerSystemVariables.Write("$RMT_MASTER", 1);
robot.Snpx.StringSystemVariables.Write("$ALM_IF.$LAST_ALM", "No alarms");
robot.Snpx.PositionSystemVariables.Write("$CELL_FLOOR", cellFloor);
// Write a Karel program variable
robot.Snpx.IntegerSystemVariables.Write("$[KarelProgram]KarelVariable", 1);
// Clear alarms
robot.Snpx.ClearAlarms();
// Read current joint and cartesian position
Position position = robot.Snpx.CurrentPosition.ReadWorldPosition();
// Read User frame cartesian position
robot.Snpx.CurrentPosition.ReadUserFramePosition(1);
The SDK provides direct FTP access to the robot's memory for file transfer, variable reading, and configuration management.
// Upload a TP program to the controller
robot.Ftp.DirectFileHandling.UploadFileToController(@"C:\Programs\MyPrg.tp", "md:/MyPrg.tp");
// Download a file from the robot
robot.Ftp.DirectFileHandling.DownloadFileFromController("md:/Backup.va", @"C:\Backup\Backup.va");
// Delete a file on the robot
robot.Ftp.DirectFileHandling.DeleteFile("md:/OldProgram.tp");
var allVariables = robot.Ftp.GetAllVariables();
foreach (var variable in allVariables)
{
Console.WriteLine($"{variable.Name} = {variable.Value}");
}
// Read system variable $RMT_MASTER
int remoteMode = robot.Ftp.KnownVariableFiles.GetSystemFile().RmtMaster;
SafetyStatus safetyStatus = robot.Ftp.GetSafetyStatus();
Console.WriteLine($"Emergency Stop: {safetyStatus.ExternalEStop}");
Console.WriteLine($"Teach Pendant Enabled: {safetyStatus.TPEnable}");
CurrentPosition currentPosition = robot.Ftp.GetCurrentPosition();
Console.WriteLine($"Cartesian Position: X={currentPosition.Cartesian.X}, Y={currentPosition.Cartesian.Y}, Z={currentPosition.Cartesian.Z}");
SETUP > Host CommTELNET and press [DETAIL]SETUP > Host Comm > FTPIf Your Robot Uses "FANUC America Corp." Parameters (R650 FRA): You need to enable option R553 ("HMI Device SNPX") in the robot's software configuration.
If Your Robot Uses "FANUC Ltd." Parameters (R651 FRL): No additional option is required—SNPX is included by default.
The SDK includes tools for performing forward and inverse kinematics calculations offline, allowing you to compute the robot's end-effector position based on joint angles and vice versa, from DH parameters.
using UnderAutomation.Fanuc.Kinematics;
JointsPosition position = new JointsPosition(10, 20, 120, 0, 0, 25);
// ---- Get DH parameters ----
// Example: CRX-10iA/L
DhParameters dh = new DhParameters(-540, 150, -160, 0, 710, 0);
// From a known arm model
dh = DhParameters.FromArmKinematicModel(ArmKinematicModels.CRX10iA);
// From OPW parameters: M10iA/7L
dh = DhParameters.FromOpwParameters(0.15, -0.20, 0.60, 0.86, 0.10);
// From an online robot (SYSMOTN file)
dh = DhParameters.FromSymotnFile(_robot.Ftp.KnownVariableFiles.GetSymotnFile())[0];
// ---- Forward kinematics ----
CartesianPosition pose = KinematicsUtils.ForwardKinematics(position, dh);
// ---- Inverse kinematics with multiple solutions ----
JointsPosition[] positions = KinematicsUtils.InverseKinematics(pose, dh);
Choose the installation method that works best for you:
| Method | NuGet (Recommended) | Direct Download |
|---|---|---|
| How to Install | Install via NuGet. See on Nuget | Download and reference the DLL manually |
dotnet add package UnderAutomation.Fanuc | 📥 Download ZIP |
using UnderAutomation.Fanuc;
var robot = new FanucRobot();
var parameters = new ConnectParameters("192.168.0.1");
parameters.Language = Languages.English; // Japanese and Chinese controllers are also supported
parameters.Telnet.Enable = true;
parameters.Telnet.TelnetKclPassword = "your_telnet_password";
parameters.Ftp.Enable = true;
parameters.Ftp.FtpUser = "";
parameters.Ftp.FtpPassword = "";
parameters.Snpx.Enable = true;
parameters.Rmi.Enable = true;
robot.Connect(parameters);
✅ Supported Robots: R-J3iB, R-30iA, R-30iB
✅ Operating Systems: Windows, Linux, macOS
✅ .NET Versions: .NET Framework (≥3.5), .NET Standard, .NET Core, .NET 5/6/8/9
We welcome contributions! Feel free to:
⚠️ This SDK requires a commercial license.
🔗 Learn more: UnderAutomation Licensing
If you have any questions or need support: