Control digital and analog I/O signals on your Fanuc robot: read values, write outputs, simulate inputs, and manage I/O descriptions.

## SNPX (fastest : ~2 ms)

SNPX supports 13 digital and 5 numeric I/O types with single and range operations.

**C# : SnpxIo**
```csharp
using UnderAutomation.Fanuc;
using UnderAutomation.Fanuc.Common;

public class SnpxIo
{
  public static void Main()
  {
    FanucRobot robot = new FanucRobot();

    ConnectionParameters parameters = new ConnectionParameters("192.168.0.1");
    parameters.Snpx.Enable = true;

    robot.Connect(parameters);

    /**/
    // --- Digital signals (boolean) ---

    // Read a single digital input
    bool sdi10 = robot.Snpx.SDI.Read(10);

    // Write a single digital output
    robot.Snpx.RDO.Write(1, true);

    // Read a range of digital inputs (100 signals starting at index 1)
    bool[] sdiRange = robot.Snpx.SDI.Read(1, 100);

    // Write a range of digital outputs
    robot.Snpx.SDO.Write(1, new[] { true, false, true });

    // Other digital signal types: UI, UO, SI, SO, WI, WO, WSI, PMC_K, PMC_R
    bool ui5 = robot.Snpx.UI.Read(5);
    robot.Snpx.SO.Write(3, false);


    // --- Numeric I/O (ushort) ---

    // Read Group Input
    ushort gi1 = robot.Snpx.GI.Read(1);

    // Write Group Output
    robot.Snpx.GO.Write(1, 500);

    // Read Analog Input
    ushort ai1 = robot.Snpx.AI.Read(1);

    // Write Analog Output
    robot.Snpx.AO.Write(2, 32767);

    // Read a range of numeric I/O
    ushort[] giRange = robot.Snpx.GI.Read(1, 100);

    // Other numeric I/O types: PMC_D
    ushort pmcD = robot.Snpx.PMC_D.Read(1);
    /**/
  }
}
```

**Python : SnpxIo**
```python
from underautomation.fanuc.fanuc_robot import FanucRobot
from underautomation.fanuc.connection_parameters import ConnectionParameters

# Create a robot instance
robot = FanucRobot()

# Configure connection parameters
parameters = ConnectionParameters("192.168.0.1")
parameters.snpx.enable = True

# Connect to the robot
robot.connect(parameters)

##
# --- Digital signals (boolean) ---

# Read a single digital input
sdi10 = robot.snpx.sdi.read(10)

# Write a single digital output
robot.snpx.rdo.write(1, True)

# Read a range of digital inputs (100 signals starting at index 1)
sdi_range = robot.snpx.sdi.read(1, 100)

# Write a range of digital outputs
robot.snpx.sdo.write(1, [True, False, True])

# Other digital signal types: UI, UO, SI, SO, WI, WO, WSI, PMC_K, PMC_R
ui5 = robot.snpx.ui.read(5)
robot.snpx.so.write(3, False)


# --- Numeric I/O (ushort) ---

# Read Group Input
gi1 = robot.snpx.gi.read(1)

# Write Group Output
robot.snpx.go.write(1, 500)

# Read Analog Input
ai1 = robot.snpx.ai.read(1)

# Write Analog Output
robot.snpx.ao.write(2, 32767)

# Read a range of numeric I/O
gi_range = robot.snpx.gi.read(1, 100)

# Other numeric I/O types: PMC_D
pmc_d = robot.snpx.pmc_d.read(1)
##
```

See also: [SNPX Inputs & Outputs](/fanuc/documentation/snpx-io)

## CGTP Web Server

CGTP provides read/write/simulate for all standard I/O types:

**C# : CgtpIo**
```csharp
using UnderAutomation.Fanuc;
using UnderAutomation.Fanuc.Cgtp;

public class CgtpIo
{
  public static void Main()
  {
    FanucRobot robot = new FanucRobot();

    ConnectionParameters parameters = new ConnectionParameters("192.168.0.1");
    parameters.Cgtp.Enable = true;

    robot.Connect(parameters);

    /**/
    // Read digital input
    int di1 = robot.Cgtp.ReadIo(CgtpIoPortType.DI, 1);

    // Write digital output
    robot.Cgtp.WriteIo(CgtpIoPortType.DO, 1, 1);

    // Read analog input
    int ai1 = robot.Cgtp.ReadIo(CgtpIoPortType.AI, 1);

    // Write analog output
    robot.Cgtp.WriteIo(CgtpIoPortType.AO, 1, 500);

    // Read group input
    int gi1 = robot.Cgtp.ReadIo(CgtpIoPortType.GI, 1);

    // Write group output
    robot.Cgtp.WriteIo(CgtpIoPortType.GO, 1, 255);

    // Read/write robot I/O
    int ri1 = robot.Cgtp.ReadIo(CgtpIoPortType.RI, 1);
    robot.Cgtp.WriteIo(CgtpIoPortType.RO, 1, 1);

    // Read/write flag
    int flag = robot.Cgtp.ReadIo(CgtpIoPortType.Flag, 10);
    robot.Cgtp.WriteIo(CgtpIoPortType.Flag, 10, 1);

    // Simulate an I/O
    robot.Cgtp.SimulateIo(CgtpIoPortType.DI, 5);

    // Check simulation status
    bool isSimulated = robot.Cgtp.GetIoSimulationStatus(CgtpIoPortType.DI, 5);

    // Unsimulate
    robot.Cgtp.UnsimulateIo(CgtpIoPortType.DI, 5);
    /**/
  }
}
```

**Python : CgtpIo**
```python
from underautomation.fanuc.fanuc_robot import FanucRobot
from underautomation.fanuc.connection_parameters import ConnectionParameters
from underautomation.fanuc.cgtp.cgtp_io_port_type import CgtpIoPortType

# Create a robot instance
robot = FanucRobot()

# Configure connection parameters
parameters = ConnectionParameters("192.168.0.1")
parameters.cgtp.enable = True

# Connect to the robot
robot.connect(parameters)

##
# Read digital input
di1 = robot.cgtp.read_io(CgtpIoPortType.DI, 1)

# Write digital output
robot.cgtp.write_io(CgtpIoPortType.DO, 1, 1)

# Read analog input
ai1 = robot.cgtp.read_io(CgtpIoPortType.AI, 1)

# Write analog output
robot.cgtp.write_io(CgtpIoPortType.AO, 1, 500)

# Read group input
gi1 = robot.cgtp.read_io(CgtpIoPortType.GI, 1)

# Write group output
robot.cgtp.write_io(CgtpIoPortType.GO, 1, 255)

# Read/write robot I/O
ri1 = robot.cgtp.read_io(CgtpIoPortType.RI, 1)
robot.cgtp.write_io(CgtpIoPortType.RO, 1, 1)

# Read/write flag
flag = robot.cgtp.read_io(CgtpIoPortType.FLAG, 10)
robot.cgtp.write_io(CgtpIoPortType.FLAG, 10, 1)

# Simulate an I/O
robot.cgtp.simulate_io(CgtpIoPortType.DI, 5)

# Check simulation status
is_simulated = robot.cgtp.get_io_simulation_status(CgtpIoPortType.DI, 5)

# Unsimulate
robot.cgtp.unsimulate_io(CgtpIoPortType.DI, 5)
##
```

See also: [CGTP Inputs & Outputs](/fanuc/documentation/cgtp-io)

## Telnet KCL

Telnet can set, simulate, and unsimulate I/O ports:

**C# : SetAndSimulateInputsOutputsTelnet**
```csharp
using UnderAutomation.Fanuc;
using UnderAutomation.Fanuc.Telnet;

public class SetAndSimulateInputsOutputsTelnet
{
    static void Main()
    {
        FanucRobot robot = new FanucRobot();
        robot.Connect("192.168.0.1");

        /**/
        // Set a port value
        robot.Telnet.SetPort(KCLPorts.DOUT, 1, 1);

        // Simulate a port
        robot.Telnet.Simulate(KCLPorts.DIN, 5, 1);

        // Unsimulate a port
        robot.Telnet.Unsimulate(KCLPorts.DIN, 5);
        /**/
    }
}
```

**Python : SetAndSimulateInputsOutputsTelnet**
```python
from underautomation.fanuc.fanuc_robot import FanucRobot

robot = FanucRobot()
robot.connect("192.168.0.1")

##
# Set a port value
robot.telnet.set_port("DO", 1, True)

# Simulate a port
robot.telnet.simulate("DI", 5, True)

# Unsimulate a port
robot.telnet.unsimulate("DI", 5)
##
```

See also: [Telnet Variables & I/O](/fanuc/documentation/telnet-variables-io)

## Protocol comparison

| Feature | SNPX | CGTP | Telnet |
|---------|------|------|--------|
| **Speed** | ~2 ms | ~50 ms | ~30 ms |
| **Digital I/O types** | 13 types | 5 types + Flag | SDI/SDO/RDI/RDO/UI/UO/SI/SO/WI/WO |
| **Numeric I/O types** | 5 types | AI/AO/GI/GO | GI/GO/AI/AO |
| **Range read/write** | Yes | No | No |
| **Simulate/Unsimulate** | No | Yes | Yes |
| **Batch read** | Yes | No | No |