read_history (Raw)
def read_history(self,
node_id: str,
start_utc: datetime,
end_utc: datetime,
max_values: int = 0) -> List[OpcUaDataValue]: ...
最常用的历史读, 返回 [start_utc, end_utc] 区间内全部原始数据点.
前置 / 配套
- 高频数据点过多时改用 read_history_processed 聚合.
- 想要含修改记录请用 read_history_modified.
参数
| 参数 | 默认 | 说明 |
|---|---|---|
node_id | — | 目标 NodeId |
start_utc | — | 区间起 (UTC datetime) |
end_utc | — | 区间止 (UTC datetime) |
max_values | 0 (不限) | 单次返回上限 |
用法
import datetime as dt
dvs = ua.read_history(
"ns=2;s=Temperature",
start_utc=dt.datetime.now(dt.timezone.utc) - dt.timedelta(hours=1),
end_utc=dt.datetime.now(dt.timezone.utc),
max_values=1000)
for dv in dvs:
with dv:
print(f"{dv.source_timestamp.isoformat()}: {dv.value} ({dv.status.name})")
异常
| 异常 | 含义 |
|---|---|
OpcUaException(BadHistoryOperationUnsupported) | 服务端无 Historian |
OpcUaException(BadNotReadable) | 节点无 HistoryRead 权限 |
OpcUaException(BadCommunicationError) | 网络故障 |
ContinuationPoint 处理 (内部)
如果数据量大, 服务端可能分多次返回 (ContinuationPoint). SDK 内部已自动循环 HistoryReadNext, 客户端拿到的是合并后的完整列表.
性能与最佳实践
-
高频数据 (1000 Hz+) 拉一天 = 86 M+ 点 → 必须用
max_values限制或改用 read_history_processed 聚合 -
OpcUaDataValue列表里每个元素都持有 native 内存, 必须 dispose. 推荐:for dv in dvs:
with dv:
# 用完即释放
... -
时间戳一律 UTC, 不要传本地时间