如何用Python OPC-UA客户端读取Float类型而非UINT16的数值
如何通过Python OPC-UA客户端获取Float类型数值?
我正在使用Python OPC-UA客户端从OPC UA服务器获取数值,需求是确保获取到的数值为Float类型。通过OPC Quick Client已确认服务器存储了包括Float在内的多种数据类型,说明可读取到Float类型的值。
但我无法通过Python OPC-UA库直接获取Float类型的值,尝试情况如下:
- 未指定数据类型调用
get_value(),无法保证获取到的是Float类型; - 尝试在
get_value()中指定数据类型(如get_value(datatype=ua.VariantType.Float)),但报错提示该方法不接受'datatype'参数。
代码片段如下:
from opcua import Client import logging from opcua import ua # Setup logging to debug level # logging.basicConfig(level=logging.DEBUG) url = "opc.tcp://xxx:1111" client = Client(url) try: client.connect() print("Client connected to:", url) node_id = "ns=2;s=xxx_lf_V.Rpc.30043" node = client.get_node(node_id) current_value = node.get_value() print("Current value from node:", current_value) except Exception as e: print(f"Error accessing node {node_id}: {str(e)}") finally: client.disconnect() print("Client disconnected")
已知服务器存储了Float类型的值,如何通过Python OPC-UA客户端正确获取Float类型的数值?且如何从OPC服务器获取与当前类型不同的数值?
解决方案
要强制读取指定类型(如Float)的值,需通过OPC UA的读取请求显式指定目标数据类型,get_value()方法不支持此参数,因此需使用底层读取接口:
方法1:服务器端转换(推荐)
让服务器直接将数值转换为目标Float类型后返回,可靠性更高,适用于服务器支持类型转换的场景:
from opcua import Client from opcua import ua url = "opc.tcp://xxx:1111" client = Client(url) try: client.connect() print("Client connected to:", url) # 解析节点ID node_id = ua.NodeId.from_string("ns=2;s=xxx_lf_V.Rpc.30043") # 构造读取请求对象,指定目标数据类型为Float read_req_item = ua.ReadValueId() read_req_item.NodeId = node_id read_req_item.AttributeId = ua.AttributeIds.Value # 指定读取值属性 read_req_item.DataType = ua.VariantType.Float # 设置要读取的目标类型 # 发送读取请求并获取结果 results = client.read_values([read_req_item]) if results: float_value = results[0].Value.Value print(f"Float类型值: {float_value},实际类型: {type(float_value)}") except Exception as e: print(f"访问节点出错: {str(e)}") finally: client.disconnect() print("Client disconnected")
方法2:客户端手动转换
如果服务器返回的原始值是可转换为Float的数值类型(如int、double),可在客户端手动转换:
# 在原有代码基础上修改获取值的部分 current_value = node.get_value() try: float_value = float(current_value) print(f"转换后的Float值: {float_value},类型: {type(float_value)}") except ValueError: print("无法将原始值转换为Float类型")
注意:此方法仅适用于原始值为数值类型的场景,若原始值为非数值类型(如字符串)会报错。
内容的提问来源于stack exchange,提问作者Mohammed Alaamri
相关产品推荐
相关产品推荐

