Python OPC UA运行时动态访问Extension Object嵌套字段方法问询
动态访问OPC UA ExtensionObject嵌套字段的实现方法
核心思路
你拿到的Excel字段路径是.分隔的字符串(比如READ_PCM_PR_I9_INFO.physicalData.readingMBar),核心逻辑就是把这个字符串拆成单个字段名,从已经解析好的ExtensionObject实例开始,一层一层往下遍历访问对应字段。
代码实现
写一个通用工具函数,用Python的getattr()就能直接处理OPC UA解析后的类实例属性访问:
def get_nested_field(obj, field_path): # 把路径拆分为单个字段的列表 field_list = field_path.split('.') # 适配路径开头带根对象名的情况:如果传入的obj已经是根对象实例,跳过第一个字段名 if field_list[0] == obj.__class__.__name__: field_list = field_list[1:] current_obj = obj for field in field_list: try: # 逐层获取属性,OPC UA解析后的ExtensionObject支持直接属性访问 current_obj = getattr(current_obj, field) # 若返回的是Variant类型,需取.value拿到实际数值(根据你用的库版本调整) # current_obj = getattr(current_obj, field).value except AttributeError: raise ValueError(f"找不到字段: {field},当前对象结构不包含该字段") return current_obj
使用示例
结合你的业务场景,把读取PLC数据、获取字段值、范围比对的流程串起来:
# 假设已从PLC读取到READ_PCM_PR_I9_INFO(类型为sPressureSensorInfo) # 从Excel读取的目标字段路径 target_field_path = "READ_PCM_PR_I9_INFO.physicalData.readingMBar" # 从Excel读取的允许范围 min_range = 0 max_range = 25 try: # 获取实时读数 real_time_value = get_nested_field(READ_PCM_PR_I9_INFO, target_field_path) print(f"当前压力读数: {real_time_value} mBar") # 范围比对 if min_range <= real_time_value <= max_range: print("压力值在正常范围内") else: print(f"警告:压力值超出范围!当前值{real_time_value},允许范围{min_range}-{max_range}") except ValueError as e: print(f"获取字段失败: {e}")
关键注意点
- 路径适配:如果Excel里的路径是从嵌套字段开始(比如
physicalData.readingMBar),直接去掉根对象判断逻辑,用拆分后的列表遍历即可。 - Variant处理:部分OPC UA客户端库返回的字段值是Variant对象,需要加
.value获取实际数值,根据你使用的库调整。 - 异常防护:必须添加异常捕获,防止字段名写错、PLC结构变更导致程序崩溃。
内容的提问来源于stack exchange,提问作者Gaurav K
相关产品推荐
相关产品推荐

