You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Rockwell Micro850控制器通过EEIP.NET以太网通信时实例ID配置及通信报错问题

Rockwell Micro850控制器通过EEIP.NET以太网通信时实例ID配置及通信报错问题

首先,先明确你用的Class ID 0x04Attribute ID 0x03是完全正确的——0x04是Allen Bradley的Assembly类(用来打包PLC标签的集合对象),0x03是这个类的Value属性(用来读写Assembly里的字节数据),这部分不用改。

你的核心问题是没在CCW里正确创建对应的Assembly实例,Micro850的Assembly(也就是你要找的Instance ID对应的对象)不会自动生成,必须手动配置,我给你一步步说怎么操作:


第一步:在CCW里配置Assembly实例ID(关键!)

打开你的Micro850项目,按以下步骤来:

  1. 在左侧项目树里找Assemblies节点,如果没看到,右键项目根节点 → AddAssembly(有些版本的CCW会把Assemblies放在I/O Configuration下面)
  2. 右键AssembliesNew Assembly,弹出配置窗口:
    • 给Assembly起个好记的名字(比如PLC_To_PC_Input
    • 选择Direction
      • 如果你要读PLC的数据(上位机获取PLC标签),选Input(这个方向是相对于上位机来说的:PLC的输出是上位机的输入)
      • 如果你要写数据到PLC,选Output
    • 重点!在Instance ID栏填写你要的数值(比如100,这个就是代码里要用到的instanceID参数)
    • 点击Add Tags,把你要映射的PLC标签(比如布尔数组、整型变量)拖进来,调整顺序和长度,确保总字节数和你代码里处理的逻辑一致
  3. 保存配置,把项目下载到Micro850控制器,然后重启控制器(或者在CCW里点Apply Changes

第二步:修正你的EEIP.NET代码错误

看了你贴的代码,有几个明显的问题导致你遍历1-150都报错:

  1. 你在循环里调用GetAttributeSingle时硬编码了instanceID=100,但循环变量instanceID根本没用到
  2. 错误处理太粗糙,而且没有确保会话正确注销
  3. 你遍历所有可能的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. 你遍历的1-150的Instance ID,在你的Micro850里根本不存在——因为你没在CCW里创建对应的Assembly对象
  2. 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

火山引擎 最新活动