Monitor running tasks, program names, line numbers, and execution state on your Fanuc robot.

## SNPX

SNPX provides direct task monitoring with program name, line number, state, and caller:

**C# : MonitorTaskExecutionSnpx**
```csharp
using System;
using UnderAutomation.Fanuc;
using UnderAutomation.Fanuc.Snpx.Internal;
using UnderAutomation.Fanuc.Common;

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

        /**/
        // Read task 1 status
        RobotTaskStatus task = robot.Snpx.CurrentTaskStatus.Read(1);
        Console.WriteLine($"Program: {task.ProgramName}");
        Console.WriteLine($"Line: {task.LineNumber}");
        Console.WriteLine($"State: {task.State}");       // Running, Paused, Stopped
        Console.WriteLine($"Caller: {task.Caller}");
        /**/
    }
}
```

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

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

##
# Read task 1 status
task = robot.snpx.current_task_status.read(1)
print(f"Program: {task.program_name}")
print(f"Line: {task.line_number}")
print(f"State: {task.state}")       # Running, Paused, Stopped
print(f"Caller: {task.caller}")
##
```

See also: [SNPX Alarms & task status](/fanuc/documentation/snpx-alarms-tasks)

## FTP (offline parsing)

Download and parse the task information file:

**C# : MonitorTaskExecutionFtp**
```csharp
using System;
using UnderAutomation.Fanuc;
using UnderAutomation.Fanuc.Common;
using UnderAutomation.Fanuc.Common.Files.Diagnosis;

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

        /**/
        ProgramStates programStates = robot.Ftp.GetProgramStates();
        /**/
    }
}
```

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

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

##
tasks = robot.ftp.get_summary_diagnostic().task_status
for task in tasks:
    print(f"{task.program_name} - Line {task.line_number} - {task.status}")
##
```

See also: [FTP Diagnostics & variables](/fanuc/documentation/ftp-diagnostics)

## Telnet KCL

Query task information using KCL commands:

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

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

        /**/
        // Get task information for a program like line number, state, and more
        TaskInformationResult result = robot.Telnet.GetTaskInformation("MY_PROGRAM");
        /**/
    }
}
```

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

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

##
# Get task information for a program like line number, state, and more
result = robot.telnet.get_task_information("MY_PROGRAM")
##
```

See also: [Telnet Debugging & breakpoints](/fanuc/documentation/telnet-debugging)

## Protocol comparison

| Feature | SNPX | FTP | Telnet |
|---------|------|-----|--------|
| **Speed** | ~2 ms | ~100 ms | ~30 ms |
| **Program name** | Yes | Yes | Yes |
| **Line number** | Yes | Yes | Yes |
| **Task state** | Yes | Yes | Yes |
| **Caller info** | Yes | No | No |
| **Multiple tasks** | Yes (by index) | Yes (all) | Yes (all) |