跳到主要内容

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.UPDATEInsert + 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 模式) 该时间点不存在

下一步