跳到主要内容

OpcUaDataValue

OpcUaDataValue 包装一次 read 返回的全部信息: 值 + 状态 + 时间戳.

配套

公共属性

类别属性类型访问说明
valueAnyRPythonic 解码 (= variant.value, 按 DataType 自动)
variantOpcUaVariantR原始 Variant (借用, 不需要 dispose)
statusStatusCodeR数据质量 Good / Bad* / Uncertain*
is_goodboolR(status == StatusCode.Good)
时间戳 (UTC)source_timestampOptional[datetime]R数据源打的时间戳
server_timestampOptional[datetime]R服务端收到时打的时间戳

构造

通常由 SDK 内部构造 (从 read / read_history / read_many 返回). 用户也可以从 native handle wrap (高级用法, 一般不需要).

后续 SDK 版本将提供 OpcUaDataValue.from_value(value, source_timestamp=...) 高层 builder, 方便 update_history 写入.


用法

import datetime as dt

with ua.read("ns=2;s=Temperature") as dv:

# 检查质量
if not dv.is_good:
print(f"Bad value: {dv.status.name}")
return

# 检查 Null
if dv.variant.is_null:
print("Null value")
return

# 取值 (Pythonic)
temp: float = dv.value
t: dt.datetime = dv.source_timestamp or dt.datetime.now(dt.timezone.utc)
print(f"{t.isoformat()}: {temp} °C")

# 或强类型抽取
temp = dv.variant.as_double

StatusCode 重点值

含义
Good (0x00000000)一切正常
Uncertain* (0x40000000+)不确定但可用 (例如传感器超量程)
Bad* (0x80000000+)数据无效
BadCommunicationError通讯失败
BadNodeIdUnknown节点不存在
BadNotReadable该 Attribute 不可读

业务代码必须检查 status (或用 is_good), 不能假设 Good.


时间戳含义

  • source_timestamp数据真实产生时间 (传感器采样时刻 / 计算时刻). 历史 / 趋势 / 同步用这个.
  • server_timestamp服务端收到 / 处理时间. 用于诊断网络延迟. 一般不用于业务.

如果服务端没设 source_timestamp, 它就是 server_timestamp 的副本.

两个时间戳都是 Optional[datetime] (UTC). 用 .isoformat() 输出 ISO 8601 字符串.


内存所有权

OpcUaDataValue 持有 native handle. 从 ua.read / ua.read_history / ua.read_many 返回的都需要 dispose.

最佳实践:

# 单个: with
with ua.read("ns=2;s=T1") as dv:
print(dv.value)

# 批量: 每个都要 dispose
dvs = ua.read_many(nodes)
for dv in dvs:
if dv is None: continue
with dv:
print(dv.value)

# 或 try/finally
try:
for dv in dvs:
if dv: print(dv.value)
finally:
for dv in dvs:
if dv: dv.close()

漏 dispose 会泄漏 native 内存 (定时跑 100k+ 次会涨内存).

下一步