跳到主要内容

从 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:

dotnet new console -n MyEtherCATApp
cd MyEtherCATApp
dotnet add package DarraEtherCAT

或在 Visual Studio 的 NuGet 包管理器 中搜索 DarraEtherCAT

然后将导出的 Program.csconfig.deni 复制到项目目录中即可。


最简代码

以下是让从站进入 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 结构体。

规则

  1. 必须添加 [StructLayout(LayoutKind.Sequential, Pack = 1)]
  2. 字段顺序 必须 与从站 PDO 映射顺序一致
  3. 字段类型必须与 PDO 数据类型匹配

类型对照表

PDO 位长有符号无符号
1 bitboolbool
8 bitsbytebyte
16 bitshortushort
32 bitint / floatuint
64 bitlong / doubleulong

验证结构体大小

int inputSize = Marshal.SizeOf<Slave1_Input>();
if (inputSize != slave.Ibytes)
Console.WriteLine($"输入结构体大小 ({inputSize}) 与从站 ({slave.Ibytes}) 不匹配!");

关闭资源

master.Close();    // 停止线程、切换到 PreOp、释放资源
master.Dispose(); // 释放非托管资源

下一步

协议用途文档
FSoE功能安全通信FSoE 用法
CoECANopen over EtherCAT,SDO 读写对象字典CoE 用法
FoE文件传输(固件升级)FoE 用法
EoE以太网透传EoE 用法
SoE伺服参数访问SoE 用法
AoEADS over EtherCATAoE 用法
DC分布式时钟同步DC 用法