从 SDK 继续
上一步你已经在配置工具中完成了测试,并导出了代码。现在,将导出的代码集成到你自己的项目中。
导出的项目结构
选择 C# 导出后,工具会生成一个完整的可编译项目:
EtherCATRestore/
├── EtherCATRestore.csproj # 项目文件(已配置本地 DLL 引用)
├── Program.cs # C# 调用示例(含初始化、PDO 循环、选配的协议代码)
├── config.deni # 主站配置文件
├── run.bat # 一键编译运行脚本
└── lib/
├── DarraEtherCAT.dll # C# 类库
├── DarraEtherCAT.xml # IntelliSense 文档
└── Darra.Core.dll # 核心驱动 DLL
导出即可运行
导出的项目已包含 .csproj 和本地 DLL 引用,无需安装 NuGet 包。双击 run.bat 或用 dotnet run 即可编译运行。
SDK 文件夹
配置工具启动后会在 exe 目录下自动创建 SDK/ 文件夹,你也可以直接从这里获取最新的 DLL:
Darra_EtherCAT_Master.exe
SDK/
├── CSharp/
│ ├── DarraEtherCAT.dll # C# 类库
│ ├── DarraEtherCAT.xml # IntelliSense 文档
│ ├── Darra.Core.dll # 核心驱动
│ └── README.txt # 使用说明
├── Python/ # 即将发布
├── Java/ # 即将发布
└── C/ # 即将发布
其他语言
| 语言 | 导出内容 | 调用方式 |
|---|---|---|
| Python | 单个 .py 文件 | 通过 pythonnet / ctypes 调用 DLL |
| Java | 单个 .java 文件 | 通过 JNA 调用 DLL |
| C | 单个 .c 文件 | 通过 LoadLibrary 调用 DLL |
C# 是首选
C# SDK 功能最完整,所有协议(CoE/FoE/FSoE/EoE/SoE/AoE/VoE/MDP)均可直接调用。其他语言通过 DLL 调用,可用功能相对有限。本文以 C# 为例。
创建项目
新建 .NET 项目后,选择以下任意方式引入 SDK:
- NuGet 包(推荐)
- 直接引用 DLL
dotnet new console -n MyEtherCATApp
cd MyEtherCATApp
dotnet add package DarraEtherCAT
或在 Visual Studio 的 NuGet 包管理器 中搜索 DarraEtherCAT。
然后将导出的 Program.cs 和 config.deni 复制到项目目录中即可。
推荐直接使用导出的项目(已包含 .csproj 和 DLL 引用),无需手动配置。
如需手动引用,从导出的 lib/ 目录或配置工具的 SDK/CSharp/ 目录复制文件:
- 将
DarraEtherCAT.dll、DarraEtherCAT.xml、Darra.Core.dll复制到项目的lib/目录 - 在
.csproj中添加引用:
<Reference Include="DarraEtherCAT">
<HintPath>lib\DarraEtherCAT.dll</HintPath>
</Reference>
- 确保
Darra.Core.dll在运行目录中 - 将导出的
Program.cs和config.deni复制到项目目录
IntelliSense 方法提示
DarraEtherCAT.xml 与 DLL 放在同一目录,即可获得完整的方法名、参数和注释提示,体验与 NuGet 包一致。
最简代码
以下是让从站进入 OP 并读写 PDO 的最少代码:
using System;
using System.Threading;
using System.Runtime.InteropServices;
using DarraEtherCAT_Master;
class Program
{
// PDO 结构体(由工具根据从站配置自动生成)
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct Slave1_Input
{
public ushort StatusWord; // 0x6041
public int ActualPosition; // 0x6064
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct Slave1_Output
{
public ushort ControlWord; // 0x6040
public int TargetPosition; // 0x607A
}
static void Main()
{
// 1. 初始化主站(加载导出的配置文件)
var result = new DarraEtherCAT()
.SetENI(@"config.deni")
.EnableAutoStartup()
.Build();
if (!result.Success)
{
Console.WriteLine($"初始化失败: {result.Message}");
return;
}
DarraEtherCAT master = result;
Console.WriteLine($"发现 {master.SlaveCount} 个从站");
// 2. 进入 OP 状态
var (ok, msg) = master.SetState(EcState.OP);
if (!ok)
{
Console.WriteLine($"进入 OP 失败: {msg}");
master.Dispose();
return;
}
// 3. 获取 PDO 映射(零拷贝引用)
ref var input = ref master.Slaves[0].PDO.InputsMapping<Slave1_Input>();
ref var output = ref master.Slaves[0].PDO.OutputsMapping<Slave1_Output>();
// 4. 实时读写
while (true)
{
Console.WriteLine($"状态: 0x{input.StatusWord:X4} 位置: {input.ActualPosition}");
output.TargetPosition = 10000;
Thread.Sleep(1);
}
}
}
无配置文件时
如果没有导出配置文件,可以直接指定网卡:
// 通过网卡名称
var master = new DarraEtherCAT()
.SetNetwork("以太网 2")
.EnableAutoStartup()
.Build();
// 或自动选择有从站的网卡
var networkInfo = DarraEtherCAT.GetNetworkInfo(NeedSlavesNum: true)
.FirstOrDefault(n => n.SlaveNum > 0);
var master = new DarraEtherCAT()
.SetNetwork(networkInfo)
.EnableAutoStartup()
.Build();
定义 PDO 结构体
如果你没有使用工具导出的代码,需要手动定义 PDO 结构体。
规则
- 必须添加
[StructLayout(LayoutKind.Sequential, Pack = 1)] - 字段顺序 必须 与从站 PDO 映射顺序一致
- 字段类型必须与 PDO 数据类型匹配
类型对照表
| PDO 位长 | 有符号 | 无符号 |
|---|---|---|
| 1 bit | bool | bool |
| 8 bit | sbyte | byte |
| 16 bit | short | ushort |
| 32 bit | int / float | uint |
| 64 bit | long / double | ulong |
验证结构体大小
int inputSize = Marshal.SizeOf<Slave1_Input>();
if (inputSize != slave.Ibytes)
Console.WriteLine($"输入结构体大小 ({inputSize}) 与从站 ({slave.Ibytes}) 不匹配!");
关闭资源
master.Close(); // 停止线程、切换到 PreOp、释放资源
master.Dispose(); // 释放非托管资源