如何用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
相关产品推荐
相关产品推荐

