You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C#的OPC Foundation库获取PLC节点的全部属性

解决OPC Foundation获取PLC节点自定义属性的问题

核心逻辑

OPC UA里的自定义属性本质是目标节点的扩展属性节点,无法通过读取预定义标准属性ID的方式获取,必须先通过浏览节点引用发现所有属性(含自定义),再批量读取这些属性的值。

实现步骤

  • 遍历属性节点:通过Browse方法筛选目标节点的HasProperty类型引用,得到所有属性节点的ID和名称。
  • 批量读取属性值:将筛选出的属性节点整理为ReadValueId列表,调用Session.Read批量获取所有属性数据。

示例代码

// 假设已获取目标PLC节点的NodeId:targetNodeId
var browseRequest = new BrowseRequest
{
    NodeId = targetNodeId,
    BrowseDirection = BrowseDirection.Forward,
    ReferenceTypeId = ReferenceTypeIds.HasProperty,
    IncludeSubtypes = true,
    NodeClassMask = NodeClass.Property,
    ResultMask = BrowseResultMask.NodeId | BrowseResultMask.DisplayName
};

var browseResult = session.Browse(null, browseRequest);
List<ReadValueId> propertyReadIds = new List<ReadValueId>();

// 整理所有属性的读取请求
foreach (var reference in browseResult.References)
{
    propertyReadIds.Add(new ReadValueId
    {
        NodeId = reference.NodeId,
        AttributeId = Attributes.Value
    });
}

// 批量读取所有属性值
session.Read(
    null,
    0,
    TimestampsToReturn.Neither,
    propertyReadIds.ToArray(),
    out var readResults,
    out var diagnosticInfos);

// 输出结果(可根据需求调整处理逻辑)
for (int i = 0; i < propertyReadIds.Count; i++)
{
    var propertyName = browseResult.References[i].DisplayName.Text;
    var propertyValue = readResults[i].Value;
    Console.WriteLine($"{propertyName}: {propertyValue}");
}

关键说明

  • 自定义属性在OPC UA服务器中是独立的Property节点,和Value、DataType等标准属性属于同一层级,必须通过节点引用发现。
  • 避免依赖Attributes类的预定义ID,自定义属性没有对应的固定ID,只能通过浏览方式动态获取。
  • 批量读取相比逐个读取性能更优,适合获取节点全部属性的场景。

内容的提问来源于stack exchange,提问作者Giovanni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 15:25:44