跳到主要内容

HistoryUpdate (C)

往服务端 Historian 写入数据 (而不是当前 Read / Write 操作的"实时值"):

高敏感操作

HistoryUpdate 多数生产 Server 默认禁止, 需要管理员明确开启 + 合规审计.

API

DARRA_OPCUA_API DarraUa_Status DARRA_OPCUA_CALL DarraUa_Session_HistoryUpdateData(
DarraUa_SessionHandle h,
const char* node_id_str,
int32_t update_type,
const DarraUa_DataValue* const* values,
uint32_t count,
DarraUa_Status* out_results); /* 调用方分配 count 个 */

update_type 枚举

含义
1Insert (插入新值, 已存在则失败)
2Replace (替换已存在的, 不存在则失败)
3Update (Insert 或 Replace, 都行)
4Remove (按时间删除, values 数组只用 SourceTimestamp 字段, value 字段忽略)

out_results[i] 接收对应 DataValue 写入状态, 可为 NULL 忽略 (顶层返回值仍代表服务级状态).


用法

补录历史数据

#include <darra_opcua/darra_opcua_history.h>

/* 准备 3 个历史点 */
DarraUa_DataValue* dvs[3];
for (int i = 0; i < 3; ++i) {
dvs[i] = DarraUa_DataValue_New();
/* (注意: 当前 SDK 的 DataValue setter 可能在 darra_opcua_types.h 内部, 此处略;
实际工程中通过 Variant + 组装结构体填入) */
}

DarraUa_Status results[3] = { 0 };
DarraUa_Status st = DarraUa_Session_HistoryUpdateData(
h, "ns=2;s=Temperature",
/*update_type*/ 3 /* Update */,
(const DarraUa_DataValue* const*)dvs,
3,
results);

for (int i = 0; i < 3; ++i)
printf("point %d: %s\n", i, DarraUa_StatusName(results[i]));

for (int i = 0; i < 3; ++i)
DarraUa_DataValue_Delete(dvs[i]);

仅插入 (不覆盖已有)

DarraUa_Session_HistoryUpdateData(
h, "ns=2;s=Temperature",
/*update_type*/ 1 /* Insert */,
dvs, 3, NULL);

权限要求

  • 节点 AccessLevel bit 8 (HistoryWrite) 必须置位
  • 用户必须有 HistoryUpdate 权限
  • 大多数生产 Server 默认禁止, 需要管理员明确开启

错误码

错误码含义
BadHistoryOperationInvalid该节点不支持 HistoryUpdate
BadUserAccessDenied无权限
BadEntryExists(Insert 模式) 该时间点已存在
BadNoEntryExists(Replace / Remove 模式) 该时间点不存在

InsertAnnotation (历史点加注释)

OPC UA 支持给历史点加注释, 当前 SDK 暂未在 C ABI 单独暴露; 通过 HistoryUpdateData + Annotation EncodingObject 也可实现, 后续版本提供专用 API.

下一步