Run, pause, hold, continue, and abort TP and Karel programs remotely using Telnet KCL commands.

## Run, pause, hold, continue

**C# : TelnetProgramControlRun**
```csharp
using UnderAutomation.Fanuc;

public class TelnetProgramControlRun
{
    static void Main()
    {
        FanucRobot robot = new FanucRobot();
        var parameters = new ConnectionParameters("192.168.0.1");
        parameters.Telnet.Enable = true;
        parameters.Telnet.TelnetKclPassword = "TELNET_PASS";
        robot.Connect(parameters);

        /**/
        // Run the default program
        robot.Telnet.Run();

        // Run a specific program
        robot.Telnet.Run("MyProgram");

        // Pause a running program (stops at the next fine point)
        robot.Telnet.Pause("MyProgram");

        // Force pause immediately
        robot.Telnet.Pause("MyProgram", force: true);

        // Hold a program (stops at the current position)
        robot.Telnet.Hold("MyProgram");

        // Resume a paused or held program
        robot.Telnet.Continue("MyProgram");
        /**/
    }
}
```

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

robot = FanucRobot()
parameters = ConnectionParameters("192.168.0.1")
parameters.telnet.enable = True
parameters.telnet.telnet_kcl_password = "TELNET_PASS"
robot.connect(parameters)

##
# Run the default program
robot.telnet.run()

# Run a specific program
robot.telnet.run("MyProgram")

# Pause a running program (stops at the next fine point)
robot.telnet.pause("MyProgram")

# Force pause immediately
robot.telnet.pause("MyProgram", force=True)

# Hold a program (stops at the current position)
robot.telnet.hold("MyProgram")

# Resume a paused or held program
robot.telnet.continue_program("MyProgram")
##
```

**Pause** stops at the next motion fine point. **Hold** decelerates the robot to stop at the current position.

## Abort, clear, and reset

**C# : TelnetProgramControlAbort**
```csharp
using UnderAutomation.Fanuc;

public class TelnetProgramControlAbort
{
    static void Main()
    {
        FanucRobot robot = new FanucRobot();
        var parameters = new ConnectionParameters("192.168.0.1");
        parameters.Telnet.Enable = true;
        parameters.Telnet.TelnetKclPassword = "TELNET_PASS";
        robot.Connect(parameters);

        /**/
        // Abort a specific program
        robot.Telnet.Abort("MyProgram", force: true);

        // Abort all running programs
        robot.Telnet.AbortAll(force: true);

        // Clear all programs from memory
        robot.Telnet.ClearAll();

        // Clear a specific program
        robot.Telnet.ClearProgram("MyProgram");

        // Clear variables of a specific program
        robot.Telnet.ClearVars("MyProgram");

        // Reset alarms and re-enable servo power
        robot.Telnet.Reset();
        /**/
    }
}
```

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

robot = FanucRobot()
parameters = ConnectionParameters("192.168.0.1")
parameters.telnet.enable = True
parameters.telnet.telnet_kcl_password = "TELNET_PASS"
robot.connect(parameters)

##
# Abort a specific program
robot.telnet.abort("MyProgram", force=True)

# Abort all running programs
robot.telnet.abort_all(force=True)

# Clear all programs from memory
robot.telnet.clear_all()

# Clear a specific program
robot.telnet.clear_program("MyProgram")

# Clear variables of a specific program
robot.telnet.clear_vars("MyProgram")

# Reset alarms and re-enable servo power
robot.telnet.reset()
##
```

The `Reset()` command has the same effect as the FAULT RESET button on the operator panel. The error message remains displayed if the error condition still exists.

## Complete example

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

public class TelnetProgramControl
{
  static void Main()
  {
    FanucRobot robot = new FanucRobot();
    ConnectionParameters parameters = new ConnectionParameters("192.168.0.1");
    parameters.Telnet.Enable = true;
    parameters.Telnet.TelnetKclPassword = "TELNET_PASS";
    robot.Connect(parameters);

    /**/
    // Run a program
    robot.Telnet.Run("MyProgram");

    // Pause (stops at next fine point)
    robot.Telnet.Pause("MyProgram");

    // Hold (decelerates and stops at current position)
    robot.Telnet.Hold("MyProgram");

    // Resume a paused or held program
    robot.Telnet.Continue("MyProgram");

    // Abort a program
    robot.Telnet.Abort("MyProgram", force: true);

    // Abort all running programs
    robot.Telnet.AbortAll(force: true);

    // Reset alarms (same as FAULT RESET button)
    robot.Telnet.Reset();

    // Clear program variables
    robot.Telnet.ClearVars("MyProgram");
    /**/
  }
}
```

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

robot = FanucRobot()
parameters = ConnectionParameters("192.168.0.1")
parameters.telnet.enable = True
parameters.telnet.telnet_kcl_password = "TELNET_PASS"
robot.connect(parameters)

##
# Run a program
robot.telnet.run("MyProgram")

# Pause (stops at next fine point)
robot.telnet.pause("MyProgram")

# Hold (decelerates and stops at current position)
robot.telnet.hold("MyProgram")

# Resume a paused or held program
robot.telnet.continue_("MyProgram")

# Abort a program
robot.telnet.abort("MyProgram", force=True)

# Abort all running programs
robot.telnet.abort_all(force=True)

# Reset alarms (same as FAULT RESET button)
robot.telnet.reset()

# Clear program variables
robot.telnet.clear_vars("MyProgram")
##
```

## API reference

**Members of Common.Kcl.RunResult**
```csharp
public class RunResult : ProgramCommandResult {
    public RunResult()

    // During implementation, return true if it is assumed that the frame has finished being received.
    protected override bool FromResult(string data)
}
```

**Members of Common.Kcl.ProgramCommandResult**
```csharp
public class ProgramCommandResult : Result {
    public ProgramCommandResult()

    // Indicates that responses have been completed and received
    protected override void EndReceive()

    // During implementation, return true if it is assumed that the frame has finished being received.
    protected override bool FromResult(string data)
}
```