Read and write variables inside Karel programs running on your Fanuc robot.

## SNPX

SNPX accesses Karel variables using the `$[ProgramName]VariableName` naming convention:

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

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

        /**/
        // Read a Karel integer variable
        int myVar = robot.Snpx.IntegerSystemVariables.Read("$[MyKarelProg]my_variable");

        // Write a Karel integer variable
        robot.Snpx.IntegerSystemVariables.Write("$[MyKarelProg]my_variable", 42);

        // Read a Karel real variable
        float realVar = robot.Snpx.RealSystemVariables.Read("$[MyKarelProg]speed_ratio");

        // Read a Karel position variable
        Position posVar = robot.Snpx.PositionSystemVariables.Read("$[MyKarelProg]target_pos");

        // Read a Karel string variable
        string strVar = robot.Snpx.StringSystemVariables.Read("$[MyKarelProg]status_msg");
        /**/
    }
}
```

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

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

##
# Read a Karel integer variable
my_var = robot.snpx.integer_system_variables.read("$[MyKarelProg]my_variable")

# Write a Karel integer variable
robot.snpx.integer_system_variables.write("$[MyKarelProg]my_variable", 42)

# Read a Karel real variable
real_var = robot.snpx.real_system_variables.read("$[MyKarelProg]speed_ratio")

# Read a Karel position variable
pos_var = robot.snpx.position_system_variables.read("$[MyKarelProg]target_pos")

# Read a Karel string variable
str_var = robot.snpx.string_system_variables.read("$[MyKarelProg]status_msg")
##
```

See also: [SNPX System variables](/fanuc/documentation/snpx-variables)

## CGTP Web Server

CGTP reads and writes Karel program variables using the `progName` parameter:

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

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

        /**/
        // Read a Karel variable
        CgtpVariableValue var = robot.Cgtp.ReadVariable("my_variable", progName: "MyKarelProg");
        int intVal = var.IntegerValue;

        // Write a Karel variable
        robot.Cgtp.WriteVariable("my_variable", 42, progName: "MyKarelProg");

        // Read as string
        string raw = robot.Cgtp.ReadVariableAsString("speed_ratio", progName: "MyKarelProg");
        /**/
    }
}
```

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

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

##
# Read a Karel variable
var = robot.cgtp.read_variable("my_variable", prog_name="MyKarelProg")
int_val = var.integer_value

# Write a Karel variable
robot.cgtp.write_variable("my_variable", 42, prog_name="MyKarelProg")

# Read as string
raw = robot.cgtp.read_variable_as_string("speed_ratio", prog_name="MyKarelProg")
##
```

See also: [CGTP Registers & variables](/fanuc/documentation/cgtp-registers-variables)

## Telnet

Telnet allows you to read and write a karel program variable 

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

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

        /**/
        GetVariableResult result = robot.Telnet.GetVariable("VAR_NAME", "KarelProgramName");
        /**/
    }
}
```

**Python : AccessKarelProgramVariablesTelnet**
```python
from underautomation.fanuc.fanuc_robot import FanucRobot
from underautomation.fanuc.common import FanucFileReaders

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

##
result = robot.telnet.get_variable("VAR_NAME", "KarelProgramName")
##
```


## Protocol comparison

| Feature | SNPX | CGTP | Telnet |
|---------|------|------|-----|
| **Speed** | ~2 ms | ~50 ms | ~100 ms |
| **Typed read** | Yes (4 types) | Yes (auto-detect) | Yes (file parse) |
| **Write** | Yes | Yes | No |
| **Batch read** | Yes | Yes | Yes (all at once) |
| **All variable types** | Integer, Real, Position, String | All | All |