The Yaskawa SDK enables seamless integration with Yaskawa robots for automation, data exchange, and remote control. Ideal for industrial automation, research, and advanced robotics applications.
π More Information: https://underautomation.com/yaskawa
π Also available for π¨ LabVIEW & π Python
ποΈ Watch to be notified of latest updates !
A powerful and efficient .NET library for communicating with Yaskawa Motoman industrial robots using the High-Speed Ethernet Server (HSES) protocol. Enables seamless connectivity, motion control, and data acquisition.
β No additional installations or Yaskawa options are required to use this SDK.
Key Benefits:
- π‘ Fast & Reliable: Leverage high-speed UDP communication for real-time control.
- π οΈ Easy Integration: Works with .NET projects, compatible with VB.NET and C#.
- π€ Advanced Features: Supports status monitoring, alarm handling, job selection, and more.
- π Cross-Platform: Works with Windows/Linux using .NET Core.
Explore the Yaskawa SDK with fully functional example applications and precompiled binaries for various platforms. See Github releases
A Windows Forms application demonstrating all the features of the library.
π Download: π₯ UnderAutomation.Yaskawa.Showcase.Forms.exe
// Connect to the robot
var robot = new YaskawaRobot();
robot.Connect("192.168.0.1");
// Ensure robot is connected
bool isConnected = robot.HighSpeedEServer.Connected;
To move the robot, your robot must be correctly configured, see the section below.
robot.HighSpeedEServer.MoveCartesian(
x: 1000,
y: 10,
z: 0,
rx: 0,
ry: 0,
rz: 0,
PositionCommandClassification.Cartesian_MM_S,
speed:10,
PositionCommandOperationCoordinate.Robot
);
Argument name | Argument type | Optional | Description |
---|---|---|---|
x | Double | X coordinate in millimeter | |
y | Double | Y coordinate in millimeter | |
z | Double | Z coordinate in millimeter | |
rx | Double | Rx coordinate in degrees | |
ry | Double | Ry coordinate in degrees | |
rz | Double | Rz coordinate in degrees | |
classification | PositionCommandClassification | Unit for speed (LinkPercent , Cartesian_MM_S , Cartesian_DEG_S ) |
|
speed | Double | Move speed | |
coordinate | PositionCommandOperationCoordinate | Frame coordinate (Base , Robot , User , Tool ) |
|
posture | RobotPosture | β | Robot target posture (RCONF) |
commandtype | PositionCommandType | β | Command type (LinkAbsolute , StraightAbsolute , StraightIncrement ) |
RobotControlGroup | Integer | β | Control group (default: 1 ) |
StationControlGroup | Integer | β | Station control group (default: 0 ) |
tool | Integer | β | Selected TCP (default: 0 ) |
userCoordinate | Integer | β | User coordinate for User coordinate (default: 0 ) |
robot.HighSpeedEServer.MoveJoints(new int[] { 1000, 0, 0, 0, 0, 0 }, PositionCommandClassification.LinkPercent, 10);
Argument name | Argument type | Optional | Description |
---|---|---|---|
axesPulse | Integer[] | Axes position in degrees | |
classification | PositionCommandClassification | Classification (LinkPercent , Cartesian_MM_S , Cartesian_DEG_S ) |
|
speed | Double | Movement speed in degrees/s | |
commandtype | PositionCommandType | β | Command type (LinkAbsolute , StraightAbsolute , StraightIncrement ) (default: StraightIncrement ) |
RobotControlGroup | Integer | β | Robot control group (default: 1 ) |
StationControlGroup | Integer | β | Station control group (default: 1 ) |
tool | Integer | β | Selected TCP (default: 0 ) |
RobotPositionCartesianData position = robot.HighSpeedEServer.GetRobotCartesianPosition();
Properties of class RobotPositionCartesianData
:
Property | Type |
---|---|
Form | RobotPosture |
DataType | RobotPositionDataType |
ToolNumber | Integer |
UserCoordinateNumber | Integer |
X | Double |
Y | Double |
Z | Double |
Rx | Double |
Ry | Double |
Rz | Double |
// Get position pulses of each axes
RobotPositionData(Of Integer) position = robot.HighSpeedEServer.GetRobotJointPosition();
// Get position error of each axes in pulses
RobotPositionData(Of Integer) error = robot.HighSpeedEServer.GetPositionError();
// Get torque in mNm of each axes
RobotPositionData(Of Integer) torque = robot.HighSpeedEServer.GetTorque();
Properties of class RobotPositionData(Of Integer)
:
Property | Type |
---|---|
Form | RobotPosture |
DataType | RobotPositionDataType |
ToolNumber | Integer |
UserCoordinateNumber | Integer |
Axes | Integer[] |
robot.HighSpeedEServer.AlarmReset(AlarmResetType.Reset);
RobotAlarmData alarm = robot.HighSpeedEServer.GetAlarm(RobotRecentAlarm.Latest);
Members of enum RobotRecentAlarm
:
RobotRecentAlarm | Value |
---|---|
Latest | 1 |
SecondLatest | 2 |
ThirdLatest | 3 |
FourthLatest | 4 |
Properties of class RobotAlarmData
:
Property | Type |
---|---|
Code | Integer |
Data | Integer |
Type | Integer |
OccurringTime | String |
Text | String |
RobotStatusData statusData = robot.HighSpeedEServer.GetStatusInformation();
Properties of class RobotStatusData
:
Property | Type |
---|---|
Step | Boolean |
Cycle | Boolean |
Automatic | Boolean |
Running | Boolean |
InGuardSafeOperation | Boolean |
Teach | Boolean |
Play | Boolean |
CommandRemote | Boolean |
InHoldStatusPendant | Boolean |
InHoldStatusExternally | Boolean |
InHoldStatusByCommand | Boolean |
Alarming | Boolean |
ErrorOccurring | Boolean |
ServoOn | Boolean |
To send servo commands, your robot must be correctly configured, see the section below.
/// Servo on
robot.HighSpeedEServer.ServoCommand(OnOffCommandType.Servo, true);
/// Servo off
robot.HighSpeedEServer.ServoCommand(OnOffCommandType.Servo, false);
Members of enum OnOffCommandType
:
Name | Value |
---|---|
Hold | 1 |
Servo | 2 |
HLock | 3 |
robot.HighSpeedEServer.SwitchingCommand(SwitchingCommands.Cycle);
Members of enum SwitchingCommands
:
Name | Value |
---|---|
Cycle | 1 |
Step | 2 |
Continue | 3 |
robot.HighSpeedEServer.Display("Hello !");
To select and start a job, your robot must be correctly configured, see the section below.
robot.HighSpeedEServer.SelectJob("PROGRAM", line:0);
robot.HighSpeedEServer.StartJob();
```
#### Get executing job information
```csharp
RobotJobData jobInformation = robot.HighSpeedEServer.GetExecutingJobInformation();
Properties of class RobotJobData
:
Property | Type |
---|---|
Name | String |
Line | Integer |
Step | Integer |
SpeedOverride | Integer |
The ReadIO
and WriteIO
functions allow reading and writing robot I/O signals. These include user input signals, user output signals, external signals, network signals, and system control signals.
First index :
- 1 to 512 : Robot user input signal
- 1001 to 1512: Robot user output signal
- 2001 to 2512: External input signal
- 2701 to 2956: Network input signal
- 3001 to 3512: External output signal
- 3701 to 3956: Network output signal
- 4001 to 4160: Robot system input signal
- 5001 to 5300: Robot system output signal
- 6001 to 6064: Interface panel input signal
- 7001 to 7999: Auxiliary relay signal
- 8001 to 8128: Robot control status signal
int firstIndex = 1001; // Robot user output signal
int count = 4; // Number of bytes to read
var ioData = robot.HighSpeedEServer.ReadIO(firstIndex, count);
Console.WriteLine("IO Data: " + BitConverter.ToString(ioData.Values));
int firstIndex = 1001; // Robot user output signal
byte[] dataToWrite = new byte[] { 0x01, 0x00, 0xFF, 0x00 };
robot.HighSpeedEServer.WriteIO(firstIndex, dataToWrite);
Console.WriteLine("IO Data written successfully.");
Registers store numerical data. The ReadRegister
and WriteRegister
methods allow interaction with these values.
int firstIndex = 10; // Starting register index
int count = 2; // Number of registers to read
var registerData = robot.HighSpeedEServer.ReadRegister(firstIndex, count);
Console.WriteLine("Register Data: " + string.Join(", ", registerData.Values));
int firstIndex = 10; // Starting register index
ushort[] dataToWrite = new ushort[] { 1234, 5678 };
robot.HighSpeedEServer.WriteRegister(firstIndex, dataToWrite);
Console.WriteLine("Register Data written successfully.");
Reads and writes byte-type variables from the robot system.
int firstIndex = 2001; // External input signal
int count = 6; // Number of bytes to read
var byteData = robot.HighSpeedEServer.ReadByte(firstIndex, count);
Console.WriteLine("Byte Data: " + BitConverter.ToString(byteData.Values));
int firstIndex = 2001; // External input signal
byte[] dataToWrite = new byte[] { 0xAA, 0xBB, 0xCC, 0xDD };
robot.HighSpeedEServer.WriteByte(firstIndex, dataToWrite);
Console.WriteLine("Byte Data written successfully.");
Reads and writes integer-type variables from the robot system.
int firstIndex = 5001; // Robot system output signal
int count = 4; // Number of integers to read
var intData = robot.HighSpeedEServer.ReadInteger(firstIndex, count);
Console.WriteLine("Integer Data: " + string.Join(", ", intData.Values));
int firstIndex = 5001; // Robot system output signal
short[] dataToWrite = new short[] { 100, -50, 200, -100 };
robot.HighSpeedEServer.WriteInteger(firstIndex, dataToWrite);
Console.WriteLine("Integer Data written successfully.");
Reads and writes 64-bit floating-point values.
int firstIndex = 6001; // Interface panel input signal
int count = 2; // Number of doubles to read
var doubleData = robot.HighSpeedEServer.ReadDouble(firstIndex, count);
Console.WriteLine("Double Data: " + string.Join(", ", doubleData.Values));
int firstIndex = 6001; // Interface panel input signal
double[] dataToWrite = new double[] { 123.456, -78.90 };
robot.HighSpeedEServer.WriteDouble(firstIndex, dataToWrite);
Console.WriteLine("Double Data written successfully.");
Reads and writes 32-bit floating-point values.
int firstIndex = 7001; // Auxiliary relay signal
int count = 3; // Number of floats to read
var floatData = robot.HighSpeedEServer.ReadSingle(firstIndex, count);
Console.WriteLine("Float Data: " + string.Join(", ", floatData.Values));
int firstIndex = 7001; // Auxiliary relay signal
float[] dataToWrite = new float[] { 1.23f, -4.56f, 7.89f };
robot.HighSpeedEServer.WriteSingle(firstIndex, dataToWrite);
Console.WriteLine("Float Data written successfully.");
Reads and writes string data, where each entry consists of 16 bytes.
int firstIndex = 8001; // Robot control status signal
int count = 2; // Number of strings to read
var charData = robot.HighSpeedEServer.Read16BytesChar(firstIndex, count);
Console.WriteLine("Character Data: " + string.Join(", ", charData.Values));
int firstIndex = 8001; // Robot control status signal
string[] dataToWrite = new string[] { "HelloRobot", "MoveFaster" };
robot.HighSpeedEServer.Write16BytesChar(firstIndex, dataToWrite);
Console.WriteLine("Character Data written successfully.");
Reads and writes robot position data.
int firstIndex = 9001; // Robot position variable index
int count = 1; // Number of position variables to read
var positionData = robot.HighSpeedEServer.ReadPositionVariable(firstIndex, count);
Console.WriteLine("Position Data: " + positionData);
int firstIndex = 9001; // Robot position variable index
var position = new RobotPositionData<int> { DataType = 1, Axes = new int[] { 10, 20, 30, 40, 50, 60, 70, 80 } };
robot.HighSpeedEServer.WritePositionVariable(firstIndex, new[] { position });
Console.WriteLine("Position Data written successfully.");
Reads and writes base position data for robot movement.
int firstIndex = 9101; // Base position index
int count = 1; // Number of base positions to read
var basePositionData = robot.HighSpeedEServer.ReadBasePosition(firstIndex, count);
Console.WriteLine("Base Position Data: " + basePositionData);
int firstIndex = 9101; // Base position index
var basePosition = new RobotBasePositionData { DataType = RobotBasePositionType.Absolute, Axes = new int[] { 5, 10, 15, 20, 25, 30, 35, 40 } };
robot.HighSpeedEServer.WriteBasePosition(firstIndex, new[] { basePosition });
Console.WriteLine("Base Position Data written successfully.");
Here is the updated markdown document including the Read32BytesChar
and Write32BytesChar
functions.
The Read32BytesChar
and Write32BytesChar
functions allow reading and writing string data with a fixed size of 32 bytes per entry. Any characters beyond this limit are truncated, and shorter strings are padded with null (0x00
) bytes.
int firstIndex = 8501; // Example index for reading 32-byte character data
int count = 2; // Number of string entries to read
var charData = robot.HighSpeedEServer.Read32BytesChar(firstIndex, count);
Console.WriteLine("Character Data: " + string.Join(", ", charData.Values));
int firstIndex = 8501; // Example index for writing 32-byte character data
string[] dataToWrite = new string[] { "HelloRobot32Bytes", "MoveWithPrecision" };
robot.HighSpeedEServer.Write32BytesChar(firstIndex, dataToWrite);
Console.WriteLine("32-Byte Character Data written successfully.");
string[] files = robot.HighSpeedEServer.GetFileList("*.JBI").Files;
robot.HighSpeedEServer.LoadFile("PROGRAM.JBI", fileContent, onLoadFileProgress);
private void onLoadFileProgress(LoadFileProgress progress)
{
// Called during file loading
}
Properties of class LoadFileProgress
:
Property | Type |
---|---|
Completed | Boolean |
FileName | String |
TotalBytes | Integer |
LoadedBytes | Integer |
robot.HighSpeedEServer.GetFile("PROGRAM.JBI", onGetFileProgress);
private void onGetFileProgress(GetFileProgress progress)
{
// Called during file loading
}
Properties of class GetFileProgress
:
Property | Type |
---|---|
Completed | Boolean |
FileName | String |
DownloadedBytes | Integer |
robot.HighSpeedEServer.DeleteFile("PROGRAM.JBI");
- Set Management mode as Security mode
- Select
IN/OUT
/PSEUDO INPUT SIGNAL
- Move the cursor to the #82015
CMD REMOTE SEL
, and pressINTER LOCK
+SELECT
to select
The read commands work regardless of the position of the physical key. However, if you want to send commands (Run job, Go to position, etc.), you need to put the key in the left position on Remote Control.
To enable this, we need to copy register #80011
(Key on Remote Position) to #40042
(Enable Remote Control) :
- Set Management mode as Security mode
- Select
IN/OUT
/LADDER EDITOR
- Ensure
#40042
is not already written by a relay and add the following Rung :
To be able to authorise job select from the SDK, you need to set the permission :
- Set Management mode as Security mode
- Select
SETUP
/FUNCTION ENABLE
- Set
JOB SELECT WHEN REMOTE AND PLAY
toPERMIT
. For advanced users or on the Smart Pendant, setSC2 224
to0
.
To enable the SDK to send files that already exist on the controller and overwrite them:
- Set Management mode as Security mode
- Select
PARAMETER
/RS
- Set
RS029
to1
- Set
RS214
to1
Choose the installation method that works best for you:
Method | NuGet (Recommended) | Direct Download |
---|---|---|
How to Install | Install via NuGet. See on Nuget | Download and reference the DLL manually |
dotnet add package UnderAutomation.Yaskawa |
π₯ Download ZIP |
using UnderAutomation.Yaskawa;
var robot = new YaskawaRobot();
robot.Connect("192.168.0.1");
β
Supported Robots: DX200, YRC1000, YRC1000 Micro
β
Operating Systems: Windows, Linux, macOS
β
.NET Versions: .NET Framework (β₯3.5), .NET Standard, .NET Core, .NET 5/6/8/9
We welcome contributions! Feel free to:
- Report issues via GitHub Issues
- Submit pull requests with improvements
- Share feedback & feature requests
π Learn more: UnderAutomation Licensing
If you have any questions or need support:
- π Check the Docs: Documentation
- π© Contact Us: Support