OpcUaDataValue
OpcUaDataValue 包装一次 read 返回的全部信息: 值 + 状态 + 时间戳.
配套
- 内部值容器请看 OpcUaVariant.
- 标准节点常量请看 WellKnownNodes.
公共属性
| 类别 | 属性 | 类型 | 访问 | 说明 |
|---|---|---|---|---|
| 值 | value | Any | R | Pythonic 解码 (= variant.value, 按 DataType 自动) |
variant | OpcUaVariant | R | 原始 Variant (借用, 不需要 dispose) | |
status | StatusCode | R | 数据质量 Good / Bad* / Uncertain* | |
is_good | bool | R | (status == StatusCode.Good) | |
| 时间戳 (UTC) | source_timestamp | Optional[datetime] | R | 数据源打的时间戳 |
server_timestamp | Optional[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+ 次会涨内存).