UnderAutomation
Any question?

[email protected]

Contact us
UnderAutomation
⌘Q
Fanuc SDK documentation
File management
Documentation home

Diagnostics & variables

Read safety status, current position, I/O state, installed features, error history, registers, and system variables via FTP.

Read safety status, current position, I/O state, error history, installed features, registers, and system variables from the Fanuc controller via FTP.

Safety, position, I/O, and errors

// Safety status
SafetyStatus safetyStatus = robot.Ftp.GetSafetyStatus();
Console.WriteLine($"Emergency Stop: {safetyStatus.ExternalEStop}");
Console.WriteLine($"Teach Pendant Enabled: {safetyStatus.TPEnable}");
// Current position
CurrentPosition currentPosition = robot.Ftp.GetCurrentPosition();
// I/O state
IOState ioState = robot.Ftp.GetIOState();
// Error history
var errors = robot.Ftp.GetAllErrorsList();
Members of Common.Files.Diagnosis.SafetyStatus :
public class SafetyStatus : IFanucContent {
public SafetyStatus()
// Belt broken signal is active
public bool BeltBroken { get; }
public override bool Equals(object obj)
// External emergency stop active
public bool ExternalEStop { get; }
// Safety fence is open
public bool FenceOpen { get; }
public override int GetHashCode()
// Hand broken signal is active
public bool HandBroken { get; }
// Low air pressure alarm is active
public bool LowAirAlarm { get; }
// File name : sftysig.dg
public string Name { get; }
// Non-teacher enable signal is active
public bool NonTeacherEnb { get; }
// Over travel limit is active
public bool OverTravel { get; }
// Emergency stop active by SOP signal
public bool SOPEStop { get; }
// Servo off detection is active
public bool SVOFFDetect { get; }
// The deadman switch of the teach pendant is active
public bool TPDeadman { get; }
// Emergency stop active on teach peandant
public bool TPEStop { get; }
// Teach pendant is enabled
public bool TPEnable { get; }
public override string ToString()
}
Members of Common.Files.Diagnosis.CurrentPosition :
public class CurrentPosition : IFanucContent {
public CurrentPosition()
// Position of each robots handled by this controller
public GroupPosition[] GroupsPosition { get; }
// File name : curpos.dg
public string Name { get; }
public override string ToString()
}
Members of Common.Files.Diagnosis.GroupPosition :
public class GroupPosition {
public GroupPosition()
public override bool Equals(object obj)
public override int GetHashCode()
// Group ID
public int Id { get; }
// Joint positions : the position of each robot angles
public JointsPosition JointsPosition { get; }
public override string ToString()
// Position of each tools in each user frames
public CartesianPositionWithUserFrame[] UserFramePositions { get; }
// Position of each tools in world coordinates
public CartesianPositionWithTool[] WorldPositions { get; }
}
Members of Common.Files.Diagnosis.IOState :
public class IOState : IFanucContent {
public IOState()
// File name : iostate.dg
public string Name { get; }
// Status of all controller inputs and outputs
public IOStatus[] States { get; }
public override string ToString()
}
Members of Common.IOStatus :
public class IOStatus {
public IOStatus()
public override bool Equals(object obj)
public override int GetHashCode()
// Digital port ID
public int Id { get; }
// IO Name
public string Name { get; }
// Digital port type
public DigitalPorts Port { get; }
// String representation like : DIN[1]=True
public override string ToString()
// Digital port value
public bool Value { get; }
}
Members of Common.DigitalPorts :
public enum DigitalPorts {
// Digital input
DIN = 0
// Digital outputs
DOUT = 1
// Flags
FLG = 8
// Robot inputs
RI = 6
// Robot outputs
RO = 7
// SI
SI = 4
// SO
SO = 5
// User inputs
UI = 2
// User outputs
UO = 3
}

Read variables

Variables are read in bulk from .va files stored on the controller.

// Get all variables from all files
var allVariables = robot.Ftp.GetAllVariables();
foreach (var file in allVariables)
foreach (var variable in file.Variables)
Console.WriteLine($"{variable.Name} = {variable.Value}");
// Get variables from a specific file
var variables = robot.Ftp.GetVariablesFromFile("SYSVARS.va");
// Access commonly used system variables directly
int rmtMaster = robot.Ftp.KnownVariableFiles.GetSystemFile().RmtMaster;

Read registers

Registers are read in bulk via FTP variable files.

using UnderAutomation.Fanuc;
using UnderAutomation.Fanuc.Common.Files.Variables;
public class FtpDiagnosticsRegisters
{
public static void Main()
{
// Create a FanucRobot instance
FanucRobot robot = new FanucRobot();
// Set connection parameters (example values)
ConnectionParameters parameters = new ConnectionParameters("192.168.0.1");
parameters.Ftp.Enable = true;
parameters.Ftp.FtpUser = "user";
parameters.Ftp.FtpPassword = "ftp password";
// Connect to the robot with FTP enabled
robot.Connect(parameters);
// 1) Reading Numeric Registers
ReadNumericRegisters(robot);
// 2) Reading Position Registers
ReadPositionRegisters(robot);
// 3) Reading String Registers
ReadStringRegisters(robot);
}
private static void ReadNumericRegisters(FanucRobot robot)
{
NumregFile numregFile = robot.Ftp.KnownVariableFiles.GetNumregFile();
for (int i = 0; i < numregFile.Numreg.Length; i++)
{
double value = numregFile.Numreg[i];
Console.WriteLine($"📊 Numeric R[{i}] = {value}");
}
}
private static void ReadPositionRegisters(FanucRobot robot)
{
PosregFile posregFile = robot.Ftp.KnownVariableFiles.GetPosregFile();
// posregFile.Posreg is a 3D array: dimension [1] = group, [2] = register index
for (int group = 0; group < posregFile.Posreg.GetLength(1); group++)
{
Console.WriteLine($"\n🤖 Reading position registers for Group {group}:");
for (int i = 0; i < posregFile.Posreg.GetLength(2); i++)
{
PositionRegister value = posregFile.Posreg[group, i];
Console.WriteLine($" - PR[{i}] :");
Console.WriteLine($" X = {value.CartesianPosition.X}");
Console.WriteLine($" Y = {value.CartesianPosition.Y}");
Console.WriteLine($" Z = {value.CartesianPosition.Z}");
Console.WriteLine($" W = {value.CartesianPosition.W}");
Console.WriteLine($" P = {value.CartesianPosition.P}");
Console.WriteLine($" R = {value.CartesianPosition.R}");
Console.WriteLine(" Configuration :");
Console.WriteLine($" ArmFrontBack = {value.CartesianPosition.Configuration.ArmFrontBack}");
Console.WriteLine($" ArmLeftRight = {value.CartesianPosition.Configuration.ArmLeftRight}");
Console.WriteLine($" ArmUpDown = {value.CartesianPosition.Configuration.ArmUpDown}");
Console.WriteLine($" WristFlip = {value.CartesianPosition.Configuration.WristFlip}");
}
}
}
private static void ReadStringRegisters(FanucRobot robot)
{
StrregFile strregFile = robot.Ftp.KnownVariableFiles.GetStrregFile();
for (int i = 0; i < strregFile.Strreg.Length; i++)
{
string value = strregFile.Strreg[i];
Console.WriteLine($"💬 String SR[{i}] = '{value}'");
}
}
}

Installed features (options)

Detect available options on the controller to check protocol availability.

Features features = robot.Ftp.GetSummaryDiagnostic().Features;
// Check specific capabilities
bool hasSnpx = features.HasSnpx;
bool hasTelnet = features.HasTelnet;
// List all installed features
foreach (var feature in features.FeaturesList)
Console.WriteLine($"{feature.Name} ({feature.OrderNo})");

Complete example

using UnderAutomation.Fanuc;
using UnderAutomation.Fanuc.Common.Files.Diagnosis;
public class FtpDiagnostics
{
static void Main()
{
FanucRobot robot = new FanucRobot();
ConnectionParameters parameters = new ConnectionParameters("192.168.0.1");
parameters.Ftp.Enable = true;
robot.Connect(parameters);
/**/
// Read safety status
SafetyStatus safetyStatus = robot.Ftp.GetSafetyStatus();
Console.WriteLine($"Emergency Stop: {safetyStatus.ExternalEStop}");
Console.WriteLine($"Teach Pendant Enabled: {safetyStatus.TPEnable}");
// Read current position (joints, world, user frames)
CurrentPosition currentPosition = robot.Ftp.GetCurrentPosition();
// Read I/O state
IOState ioState = robot.Ftp.GetIOState();
// Read all errors
var errors = robot.Ftp.GetAllErrorsList();
// Read all variables from all files
var allVariables = robot.Ftp.GetAllVariables();
foreach (var file in allVariables)
foreach (var variable in file.Variables)
Console.WriteLine($"{variable.Name} = {variable.Value}");
// Access well-known system variables
int rmtMaster = robot.Ftp.KnownVariableFiles.GetSystemFile().RmtMaster;
// Get installed features
Features features = robot.Ftp.GetSummaryDiagnostic().Features;
bool hasSnpx = features.HasSnpx;
/**/
}
}

API reference

Members of Common.Files.Diagnosis.SummaryDiagnosis :
public class SummaryDiagnosis : IFanucContent {
public SummaryDiagnosis()
// Current position of each robots and groups handled by this controller
public CurrentPosition CurrentPosition { get; }
// Controller features status
public Features Features { get; }
// Controller IO status
public IOState IOs { get; }
// File name : summary.dg
public string Name { get; }
// Controller program states
public ProgramStates ProgramStates { get; }
// Controller safety information
public SafetyStatus Safety { get; }
public override string ToString()
}
Members of Common.Files.Diagnosis.Features :
public class Features {
public Features()
public override bool Equals(object obj)
// List of features
public Feature[] FeaturesList { get; }
public override int GetHashCode()
// Indicates if the robot has the ASCII upload feature enabled : R507 ("ASCII Upload" on older controllers) or R796 ("ASCII Program Loader" on most recent controllers).
public bool HasAsciiUpload { get; }
// Indicates if the robot has the SNPX feature enabled (R553 or R651).
public bool HasSnpx { get; }
// Indicates if the robot has the TELNET feature enabled (TELN).
public bool HasTelnet { get; }
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.