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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 07:26:14