Rockwell Micro850控制器通过EEIP.NET以太网通信时实例ID配置及通信报错问题
Rockwell Micro850控制器通过EEIP.NET以太网通信时实例ID配置及通信报错问题
首先,先明确你用的Class ID 0x04和Attribute ID 0x03是完全正确的——0x04是Allen Bradley的Assembly类(用来打包PLC标签的集合对象),0x03是这个类的Value属性(用来读写Assembly里的字节数据),这部分不用改。
你的核心问题是没在CCW里正确创建对应的Assembly实例,Micro850的Assembly(也就是你要找的Instance ID对应的对象)不会自动生成,必须手动配置,我给你一步步说怎么操作:
第一步:在CCW里配置Assembly实例ID(关键!)
打开你的Micro850项目,按以下步骤来:
- 在左侧项目树里找Assemblies节点,如果没看到,右键项目根节点 → Add → Assembly(有些版本的CCW会把Assemblies放在I/O Configuration下面)
- 右键Assemblies → New Assembly,弹出配置窗口:
- 给Assembly起个好记的名字(比如
PLC_To_PC_Input) - 选择Direction:
- 如果你要读PLC的数据(上位机获取PLC标签),选
Input(这个方向是相对于上位机来说的:PLC的输出是上位机的输入) - 如果你要写数据到PLC,选
Output
- 如果你要读PLC的数据(上位机获取PLC标签),选
- 重点!在Instance ID栏填写你要的数值(比如100,这个就是代码里要用到的
instanceID参数) - 点击Add Tags,把你要映射的PLC标签(比如布尔数组、整型变量)拖进来,调整顺序和长度,确保总字节数和你代码里处理的逻辑一致
- 给Assembly起个好记的名字(比如
- 保存配置,把项目下载到Micro850控制器,然后重启控制器(或者在CCW里点Apply Changes)
第二步:修正你的EEIP.NET代码错误
看了你贴的代码,有几个明显的问题导致你遍历1-150都报错:
- 你在循环里调用
GetAttributeSingle时硬编码了instanceID=100,但循环变量instanceID根本没用到 - 错误处理太粗糙,而且没有确保会话正确注销
- 你遍历所有可能的Instance ID效率极低,直接用你在CCW里配置好的ID就行
给你改好的代码示例,我标注了关键修改点:
public void Connect(string ip = "", ushort tcpPort = 44818) { // 这里要确保ModuleType选的是Micro850对应的枚举值,别选错成ControlLogix了 var myController = AllenBradleyUniversalModule.Create(ModuleType.Micro850); EEIPClient eeipClient = new EEIPClient { IPAddress = ip, TcpPort = tcpPort }; try { // 注册EIP会话 eeipClient.RegisterSession(); ushort classId = 0x04; // 正确,Assembly类ID ushort attributeId = 0x03; // 正确,Assembly的Value属性 ushort targetInstanceId = 100; // 这里填你在CCW里设置的Instance ID! try { // 调用读数据方法,传入正确的Instance ID var result = myController.ReadDataFromPlc(eeipClient, classId, targetInstanceId, attributeId); // 这里可以根据你映射的标签解析rawData,比如转成int、bool数组 Console.WriteLine($"成功读取数据,字节长度:{result.Length}"); } catch (Exception ex) { Console.WriteLine($"读取失败:{ex.Message}"); } } catch (Exception ex) { Console.WriteLine($"会话建立失败:{ex.Message}"); } finally { // 无论成功失败,都要注销会话,避免占资源 if (eeipClient.IsSessionRegistered) { eeipClient.UnRegisterSession(); } } } public byte[] ReadDataFromPlc(EEIPClient eeipClient, ushort classId, ushort instanceId, ushort attributeId) { // 这里用传入的instanceId,而不是硬编码的固定值! byte[] rawData = eeipClient.GetAttributeSingle(classId, instanceId, attributeId); this.Value = rawData; return rawData; }
为什么会报“Object does not exist”错误?
这个错误的原因很直接:
- 你遍历的1-150的Instance ID,在你的Micro850里根本不存在——因为你没在CCW里创建对应的Assembly对象
- Micro850和大型Logix控制器不一样,不会自动生成I/O Assembly的实例,所有Assembly必须手动创建并指定Instance ID
额外注意事项
- 确保上位机和Micro850在同一网段,防火墙没有屏蔽44818端口(EIP的默认TCP端口)
- 配置Assembly时,映射的标签总字节数要和你代码里的解析逻辑匹配(比如2个int变量就是8字节)
- 如果你要同时实现读和写,需要分别创建两个Assembly(一个Input方向,一个Output方向),Instance ID不能重复
- 建议用最新稳定版的EEIP.NET库,旧版本可能对Micro850的EIP协议支持有bug
内容来源于stack exchange




