update_history
往服务端 Historian 写入数据 (而不是当前 read / write 操作的"实时值"):
高敏感操作
HistoryUpdate 多数生产 Server 默认禁止, 需要管理员明确开启 + 合规审计. 详见服务端要求.
签名
def update_history(self,
node_id: str,
update_type: HistoryUpdateType,
values: List[OpcUaDataValue]) -> List[StatusCode]: ...
HistoryUpdateType
from darra_opcua import HistoryUpdateType
| 值 | 含义 |
|---|---|
HistoryUpdateType.INSERT | 仅当时间点不存在才插入 |
HistoryUpdateType.REPLACE | 仅当时间点存在才替换 |
HistoryUpdateType.UPDATE | Insert + Replace 任一适用 (推荐默认) |
HistoryUpdateType.REMOVE | 删除该时间点 (values 中只用 source_timestamp, value 字段忽略) |
用法
补录历史数据
构造 OpcUaDataValue 当前推荐通过先构造 OpcUaVariant 然后内部包装. 简化路径 (后续 SDK 提供高层 builder, 当前如下):
# 注: 当前 SDK 提供的 OpcUaDataValue 主要由 read 路径构造,
# update_history 输入的 OpcUaDataValue 通过底层 ctypes 构造接口或工厂方法获得.
# 后续版本将暴露 OpcUaDataValue.from_value(value=..., source_timestamp=...) 高层构造.
results = ua.update_history(
"ns=2;s=Temperature",
HistoryUpdateType.UPDATE,
values=dv_list)
for st in results:
print(st.name)
仅插入 (不覆盖已有)
ua.update_history("ns=2;s=Temperature", HistoryUpdateType.INSERT, dv_list)
删除特定时间点
# REMOVE 模式: values 中每个 DataValue 的 source_timestamp 决定删除目标
ua.update_history("ns=2;s=Temperature", HistoryUpdateType.REMOVE, dv_list)
权限要求
- 节点 AccessLevel bit 8 (HistoryWrite) 必须置位
- 用户必须有 HistoryUpdate 权限
- 大多数生产 Server 默认禁止, 需要管理员明确开启
错误码
| 错误码 | 含义 |
|---|---|
BadHistoryOperationInvalid | 该节点不支持 HistoryUpdate |
BadUserAccessDenied | 无权限 |
BadEntryExists | (INSERT 模式) 该时间点已存在 |
BadNoEntryExists | (REPLACE / REMOVE 模式) 该时间点不存在 |