ReadProcessed (聚合)
最强大的 HistoryRead 模式, 配合标准聚合函数. 给区间 + 聚合函数 + 子区间宽度, 服务端返回每个子区间的聚合结果.
前置 / 配套
- 拉所有原始点请用 ReadRaw.
- 指定时间点的内插值请用 ReadAtTime.
签名
public IReadOnlyList<DataValue> History.ReadProcessed(
string nodeId,
DateTime startTime,
DateTime endTime,
string aggregateNodeId,
double processingIntervalMs);
标准聚合函数 NodeId (ns=0)
| NodeId | 名称 | 含义 |
|---|---|---|
i=2342 | Average | 算术平均 |
i=2343 | TimeAverage | 时间加权平均 |
i=2344 | Total | 累计总和 |
i=2346 | Minimum | 最小值 |
i=2347 | Maximum | 最大值 |
i=2348 | MinimumActualTime | 最小值出现时间 |
i=2349 | MaximumActualTime | 最大值出现时间 |
i=2350 | Range | Max − Min |
i=2352 | Count | 点数 |
i=2355 | NumberOfTransitions | 状态变化次数 |
i=2341 | Interpolative | 插值 |
完整列表见 OPC UA 聚合函数标准.
用法
24 小时温度的每小时平均
var values = ua.History.ReadProcessed(
nodeId: "ns=2;s=Temperature",
startTime: DateTime.UtcNow.Date.AddDays(-1),
endTime: DateTime.UtcNow.Date,
aggregateNodeId: "i=2342" /* Average */,
processingIntervalMs: 3_600_000 /* 1 hour */);
// 返回 24 个 DataValue, 每个是该小时的平均值
一周每天的最大温度
var maxes = ua.History.ReadProcessed("ns=2;s=Temperature",
startTime: today.AddDays(-7), endTime: today,
aggregateNodeId: "i=2347" /* Maximum */,
processingIntervalMs: 86_400_000 /* 1 day */);
一小时累计流量
var totals = ua.History.ReadProcessed("ns=2;s=FlowRate",
startTime: now.AddHours(-1), endTime: now,
aggregateNodeId: "i=2344" /* Total */,
processingIntervalMs: 3_600_000);
性能优势
- 避免拉百万点原始数据再客户端算
- 服务端常对历史数据建索引, 聚合极快
- 跨日 / 跨周报表的标准方案
服务端要求
- Historian 必须实现该聚合函数 (服务端 ServerCapabilities/AggregateFunctions 列出支持的)
- 不支持的聚合返回
BadAggregateNotSupported