EtherNet/IP(EIP)协议在 C# 上位机中的完整开发指南

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)

  1. 创建 EEIPClient 并注册 Session。
  2. 读写 Assembly Object 或使用通用 Get/Set Attribute。
  3. 完成后 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 + BackgroundWorkerTask,避免 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 或商业级封装,建议提供设备型号进一步细化。开发中遇到具体错误,附上异常信息和设备手册片段即可快速定位。祝开发顺利!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张工在路上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值