OPC UA节点数据读取报错:'str'对象无'time_low'属性求助
OPC UA读取节点时AttributeError: 'str'对象没有'time_low'属性的解决方法
问题描述
尝试通过OPC UA读取节点数据,已确认命名空间(ns)和ID正确,但调用get_data_value()方法时触发错误:在将Python UUID 6字段格式转换为OPC UA 4字段格式过程中,出现AttributeError: 'str' object has no attribute 'time_low'。该节点为变量且包含两个子节点,相关代码及报错堆栈如下:
相关代码
from opcua import Client ... client.connect() forceAS = client.get_node("ns=3;g=V:0.3.0.0.1") meaForceAS = forceAS.get_data_value() # 此处报错
报错堆栈
C:\ProgramData\Anaconda3\lib\site-packages\opcua\ua\ua_binary.py in nodeid_to_binary(nodeid) 315 elif nodeid.NodeIdType == ua.NodeIdType.Guid: 316 data = struct.pack("<BH", nodeid.NodeIdType.value, nodeid.NamespaceIndex) + \ --> 317 Primitives.Guid.pack(nodeid.Identifier) 318 else: 319 raise UaError("Unknown NodeIdType: {} for NodeId: {}".format(nodeid.NodeIdType, nodeid)) C:\ProgramData\Anaconda3\lib\site-packages\opcua\ua\ua_binary.py in pack(guid) 100 def pack(guid): 101 # convert python UUID 6 field format to OPC UA 4 field format --> 102 f1 = Primitives.UInt32.pack(guid.time_low) 103 f2 = Primitives.UInt16.pack(guid.time_mid) 104 f3 = Primitives.UInt16.pack(guid.time_hi_version) AttributeError: 'str' object has no attribute 'time_low'
解决方案
这个错误的核心原因是:你使用的节点ID格式ns=3;g=V:0.3.0.0.1被库解析为Guid类型的NodeId,但你的标识符是普通字符串而非标准UUID格式,导致库尝试调用字符串对象的UUID专属属性(如time_low)时失败。
方法1:明确指定NodeId类型为字符串
将节点ID中的g=(Guid类型前缀)替换为s=(字符串类型前缀),让库正确识别标识符类型:
forceAS = client.get_node("ns=3;s=V:0.3.0.0.1")
方法2:手动构造NodeId对象
如果需要保留原标识符格式,可以手动创建NodeId实例,直接指定类型为字符串:
from opcua import ua # 创建字符串类型的NodeId,参数为标识符和命名空间索引 node_id = ua.NodeId("V:0.3.0.0.1", 3) forceAS = client.get_node(node_id)
额外验证建议
可以通过OPC UA客户端工具(如UaExpert)查看目标节点的实际NodeId类型:
- 如果节点ID类型为字符串,必须使用
s=前缀或手动指定字符串类型NodeId - 如果节点ID类型为Guid,需传入标准UUID格式的字符串(如
ns=3;g=550e8400-e29b-41d4-a716-446655440000),此时库会自动将其转换为UUID对象处理
内容的提问来源于stack exchange,提问作者chris_2091
相关产品推荐
相关产品推荐

