Fanuc SDK documentation
Members of Common.Files.Diagnosis.SafetyStatus :
Members of Common.Files.Diagnosis.CurrentPosition :
Members of Common.Files.Diagnosis.GroupPosition :
Members of Common.Files.Diagnosis.IOState :
Members of Common.IOStatus :
Members of Common.DigitalPorts :
Members of Common.Files.Diagnosis.Features :
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 statusSafetyStatus safetyStatus = robot.Ftp.GetSafetyStatus();Console.WriteLine($"Emergency Stop: {safetyStatus.ExternalEStop}");Console.WriteLine($"Teach Pendant Enabled: {safetyStatus.TPEnable}");// Current positionCurrentPosition currentPosition = robot.Ftp.GetCurrentPosition();// I/O stateIOState ioState = robot.Ftp.GetIOState();// Error historyvar errors = robot.Ftp.GetAllErrorsList();
public class SafetyStatus : IFanucContent {public SafetyStatus()// Belt broken signal is activepublic bool BeltBroken { get; }public override bool Equals(object obj)// External emergency stop activepublic bool ExternalEStop { get; }// Safety fence is openpublic bool FenceOpen { get; }public override int GetHashCode()// Hand broken signal is activepublic bool HandBroken { get; }// Low air pressure alarm is activepublic bool LowAirAlarm { get; }// File name : sftysig.dgpublic string Name { get; }// Non-teacher enable signal is activepublic bool NonTeacherEnb { get; }// Over travel limit is activepublic bool OverTravel { get; }// Emergency stop active by SOP signalpublic bool SOPEStop { get; }// Servo off detection is activepublic bool SVOFFDetect { get; }// The deadman switch of the teach pendant is activepublic bool TPDeadman { get; }// Emergency stop active on teach peandantpublic bool TPEStop { get; }// Teach pendant is enabledpublic bool TPEnable { get; }public override string ToString()}
public class CurrentPosition : IFanucContent {public CurrentPosition()// Position of each robots handled by this controllerpublic GroupPosition[] GroupsPosition { get; }// File name : curpos.dgpublic string Name { get; }public override string ToString()}
public class GroupPosition {public GroupPosition()public override bool Equals(object obj)public override int GetHashCode()// Group IDpublic int Id { get; }// Joint positions : the position of each robot anglespublic JointsPosition JointsPosition { get; }public override string ToString()// Position of each tools in each user framespublic CartesianPositionWithUserFrame[] UserFramePositions { get; }// Position of each tools in world coordinatespublic CartesianPositionWithTool[] WorldPositions { get; }}
public class IOState : IFanucContent {public IOState()// File name : iostate.dgpublic string Name { get; }// Status of all controller inputs and outputspublic IOStatus[] States { get; }public override string ToString()}
public class IOStatus {public IOStatus()public override bool Equals(object obj)public override int GetHashCode()// Digital port IDpublic int Id { get; }// IO Namepublic string Name { get; }// Digital port typepublic DigitalPorts Port { get; }// String representation like : DIN[1]=Truepublic override string ToString()// Digital port valuepublic bool Value { get; }}
public enum DigitalPorts {// Digital inputDIN = 0// Digital outputsDOUT = 1// FlagsFLG = 8// Robot inputsRI = 6// Robot outputsRO = 7// SISI = 4// SOSO = 5// User inputsUI = 2// User outputsUO = 3}
Read variables
Variables are read in bulk from .va files stored on the controller.
// Get all variables from all filesvar 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 filevar variables = robot.Ftp.GetVariablesFromFile("SYSVARS.va");// Access commonly used system variables directlyint 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 instanceFanucRobot 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 enabledrobot.Connect(parameters);// 1) Reading Numeric RegistersReadNumericRegisters(robot);// 2) Reading Position RegistersReadPositionRegisters(robot);// 3) Reading String RegistersReadStringRegisters(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 indexfor (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 capabilitiesbool hasSnpx = features.HasSnpx;bool hasTelnet = features.HasTelnet;// List all installed featuresforeach (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 statusSafetyStatus 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 stateIOState ioState = robot.Ftp.GetIOState();// Read all errorsvar errors = robot.Ftp.GetAllErrorsList();// Read all variables from all filesvar 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 variablesint rmtMaster = robot.Ftp.KnownVariableFiles.GetSystemFile().RmtMaster;// Get installed featuresFeatures 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 controllerpublic CurrentPosition CurrentPosition { get; }// Controller features statuspublic Features Features { get; }// Controller IO statuspublic IOState IOs { get; }// File name : summary.dgpublic string Name { get; }// Controller program statespublic ProgramStates ProgramStates { get; }// Controller safety informationpublic SafetyStatus Safety { get; }public override string ToString()}
public class Features {public Features()public override bool Equals(object obj)// List of featurespublic 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()}