EtherNet/IP(EIP)协议在 C# 上位机中的完整开发指南(基于 .NET 8 / .NET Framework)。
EtherNet/IP 是基于 CIP(Common Industrial Protocol)的工业以太网协议,常用于与 Rockwell(AB)、Omron、西门子、WAGO、Keyence、Allen-Bradley Point I/O 等设备通信。上位机(PC/工控机)通常作为 Scanner(Originator/Client) 角色,与设备(Adapter)进行 Explicit Messaging(显式报文,用于参数读写)和 Implicit Messaging(隐式报文,周期性 I/O 数据交换)。
1. 协议基础概念
- CIP 对象模型:设备由多个对象组成(如 Identity Object、Assembly Object、Connection Manager 等)。
- 显式报文(Explicit):基于 TCP(端口 0xAF12),用于配置、读写属性(GetAttributeSingle/SetAttributeSingle 等),非实时。
- 隐式报文(Implicit):基于 UDP,周期性 I/O 数据交换(RPI:Requested Packet Interval),实时性高。
- Scanner vs Adapter:上位机一般做 Scanner,发起连接;设备做 Adapter。
- 关键参数:IP 地址、Instance ID(Assembly)、RPI、Connection Type、RealTime Format 等(需参考设备手册或 EDS 文件)。
推荐参考资料:
- ODVA EtherNet/IP 规范(需会员或购买)。
- 设备手册(Assembly Instance、数据映射)。
2. 推荐库:EEIP.NET(开源免费)
GitHub:https://github.com/rossmann-engineering/EEIP.NET
支持 Explicit + Implicit Messaging,CIP 对象库,适合大多数工业场景。NuGet 包也有可用版本。
其他选项:
- libplctag.NET(适合 Rockwell/AB PLC Tag 读写)。
- 商业栈(如 Pyramid Solutions)。
- 老项目:SourceForge Ethernet/IP Explorer & C# Stack。
安装(推荐通过 GitHub 下载源码或 NuGet):
# NuGet(如果可用)
Install-Package EEIP
或直接引用项目中的 Sres.Net.EEIP。
3. 基础开发步骤(Explicit Messaging)
- 创建 EEIPClient 并注册 Session。
- 读写 Assembly Object 或使用通用 Get/Set Attribute。
- 完成后 UnRegisterSession。
示例代码(读写数字量,WAGO 等设备):
using System;
using Sres.Net.EEIP;
class Program
{
static void Main()
{
EEIPClient client = new EEIPClient();
try
{
// 注册 Session(TCP 端口 44818 = 0xAF12)
client.RegisterSession("192.168.1.100"); // 设备 IP
// 写输出(Assembly Instance 根据设备手册)
client.AssemblyObject.setInstance(0x66, new byte[] { 0x01 }); // 输出高
// 读输入
byte[] inputs = client.AssemblyObject.getInstance(0x6C);
Console.WriteLine($"Input 0: {EEIPClient.ToBool(inputs[0], 0)}");
// 通用属性读写(Keyence 等)
byte[] value = client.GetAttributeSingle(classID: 0x66, instanceID: 1, attributeID: 0x325);
client.SetAttributeSingle(0x66, 1, 0x389, new byte[] { 50, 0 }); // 设置参数
}
finally
{
client.UnRegisterSession();
}
}
}
发现网络设备:
var client = new EEIPClient();
var devices = client.ListIdentity();
foreach (var dev in devices)
{
Console.WriteLine($"Device: {dev.ProductName1}, IP: {CIPIdentityItem.getIPAddress(dev.SocketAddress.SIN_Address)}");
}
4. 隐式 Messaging(I/O 周期通信)示例
适用于高频数据交换(如 Point I/O)。
EEIPClient client = new EEIPClient();
client.IPAddress = "192.168.1.100";
client.RegisterSession();
// O->T (Originator to Target,输出)
client.O_T_InstanceID = 0x64; // 输出 Assembly Instance
client.O_T_Length = 4; // 数据长度(字节)
client.O_T_RealTimeFormat = RealTimeFormat.Header32Bit;
client.O_T_ConnectionType = ConnectionType.Point_to_Point;
client.RequestedPacketRate_O_T = 100000; // 100ms
// T->O (Target to Originator,输入)
client.T_O_InstanceID = 0x65;
client.T_O_Length = 16;
client.T_O_RealTimeFormat = RealTimeFormat.Modeless;
client.T_O_ConnectionType = ConnectionType.Multicast;
client.RequestedPacketRate_T_O = 100000;
// 发起连接
client.ForwardOpen();
// 订阅数据变化事件
client.T_O_DataReceived += (sender, args) =>
{
byte[] data = args.ReceivedData;
// 处理输入数据
Console.WriteLine($"Input data: {BitConverter.ToString(data)}");
};
// 写输出数据
client.O_T_Data = new byte[] { 0x01, 0x00, 0x00, 0x00 }; // 周期发送
Console.ReadKey();
client.ForwardClose();
client.UnRegisterSession();
注意:
O_T_Length/T_O_Length必须精确匹配设备手册,否则 ForwardOpen 失败。- 部分设备需设置 Configuration Assembly Instance。
- 使用 Wireshark(过滤
enip)抓包调试。
5. 生产级实现建议
- 异步与事件驱动:使用
async/await+BackgroundWorker或Task,避免 UI 阻塞。 - 重连机制:捕获异常,定时尝试 RegisterSession + ForwardOpen。
- 配置管理:从 EDS 文件或 JSON 加载 Instance ID、RPI 等参数。
- 多设备支持:为每个设备维护一个 EEIPClient 实例。
- 数据解析:实现强类型 Wrapper(bool、ushort、float、string 等),使用
BitConverter和自定义扩展。 - 性能优化:
- Implicit 使用 UDP 多播/点对点。
- 调整 RPI(最小建议 4-10ms,根据设备)。
- 线程安全队列处理接收数据。
- 错误处理:处理 CIP 通用状态码(0x01 Success, 0x05 Path Destination Unknown 等)。
- 安全性:工业网络建议隔离,考虑 CIP Security(较新设备)。
示例项目结构:
EIPHost/
├── Core/ // EEIPClient 封装类
├── Models/ // DeviceConfig, Tag 定义
├── Services/ // ScannerService, DataProcessor
├── UI/ // WinForms/WPF/HMI
└── Examples/ // 不同设备示例
6. 常见问题与避坑
- ForwardOpen 失败:检查 Instance ID、Length、RPI、RealTime Format。参考设备 EDS 或手册。
- 数据偏移:注意 Run/Idle Header(有时额外 4 字节)。
- 大端/小端:CIP 多为 Little-Endian,确认设备规范。
- 超时:设置合理的 Timeout。
- 防火墙:开放 TCP 44818 和 UDP 端口。
- AB PLC:推荐 libplctag.NET 直接读写 Tag,更简单。
- 中文资源:CSDN 有较多实战文章,可搜索 “EtherNet/IP C#” 查看具体设备案例。
7. 进阶与测试
- 使用 Ethernet/IP Explorer(SourceForge)扫描测试设备。
- Wireshark + CIP 解码器抓包分析。
- 实现 EDS 文件解析器(可选)。
- 压力测试:长时间高频通信,监控 CPU/网络占用。
完整示例项目:直接 Clone EEIP.NET GitHub,里面有多个设备(如 Allen-Bradley Point I/O、Fanuc、Keyence、Turck)的完整示例,直接运行调试。
通过 EEIP.NET,多数场景几十行代码即可完成通信。如果需要特定设备(如 Omron NX、AB CompactLogix)完整 Demo 或商业级封装,建议提供设备型号进一步细化。开发中遇到具体错误,附上异常信息和设备手册片段即可快速定位。祝开发顺利!
1729

被折叠的 条评论
为什么被折叠?



