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 枚举
| 值 | 含义 |
|---|---|
| 1 | Insert (插入新值, 已存在则失败) |
| 2 | Replace (替换已存在的, 不存在则失败) |
| 3 | Update (Insert 或 Replace, 都行) |
| 4 | Remove (按时间删除, 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);
权限要求
- 节点
AccessLevelbit 8 (HistoryWrite) 必须置位 - 用户必须有 HistoryUpdate 权限
- 大多数生产 Server 默认禁止, 需要管理员明确开启
错误码
| 错误码 | 含义 |
|---|---|
BadHistoryOperationInvalid | 该节点不支持 HistoryUpdate |
BadUserAccessDenied | 无权限 |
BadEntryExists | (Insert 模式) 该时间点已存在 |
BadNoEntryExists | (Replace / Remove 模式) 该时间点不存在 |
InsertAnnotation (历史点加注释)
OPC UA 支持给历史点加注释, 当前 SDK 暂未在 C ABI 单独暴露; 通过 HistoryUpdateData + Annotation EncodingObject 也可实现, 后续版本提供专用 API.