OPC HDA批量读取历史数据时continuationPoint为空问题求助
解决OPC Milo Java SDK批量读取历史数据时continuationPoint为空的问题
先排查基础原因
首先确认目标节点在dateStart到dateEnd时间范围内的历史数据总量是否超过15条。如果数据总数≤15,continuationPoint为空是正常现象——没有剩余数据需要续读。
代码逻辑修正(实现循环续读)
如果数据量确实超过15条,问题出在你没有正确复用continuationPoint进行循环读取。以下是修正后的代码逻辑:
// 初始化续读点为null ByteString continuationPoint = ByteString.NULL_VALUE; // 时间范围和读取参数保持不变 HistoryReadDetails historyDetails = new ReadRawModifiedDetails( false, dateStart, dateEnd, UInteger.valueOf(15), true ); do { // 每次循环创建带续读点的HistoryReadValueId HistoryReadValueId nodeId = new HistoryReadValueId( new NodeId(1, 22), null, QualifiedName.NULL_VALUE, continuationPoint ); List<HistoryReadValueId> nodesToRead = new ArrayList<>(); nodesToRead.add(nodeId); // 调用historyRead,注意releaseContinuationPoints参数:有续读点时设为false,避免提前释放 boolean releaseContinuationPoints = continuationPoint == ByteString.NULL_VALUE; HistoryReadResponse historyReadResponse = client.historyRead( historyDetails, TimestampsToReturn.Both, releaseContinuationPoints, nodesToRead ).get(); HistoryReadResult[] historyReadResults = historyReadResponse.getResults(); if (historyReadResults.length > 0) { HistoryReadResult result = historyReadResults[0]; // 处理当前批次的历史数据 if (result.getHistoryData() != null) { List<DataValue> dataValues = result.getHistoryData().getDataValues(); // 这里添加你的数据处理逻辑 } // 更新续读点,用于下一次循环 continuationPoint = result.getContinuationPoint(); } else { // 无结果,终止循环 break; } } while (continuationPoint != null && !continuationPoint.isNullOrEmpty());
关键注意点
- 续读点的传递:每次循环必须将上一次返回的
continuationPoint设置到HistoryReadValueId中,服务器才会返回下一批数据。 - releaseContinuationPoints参数:当还有续读点时(即还需要继续读取),该参数要设为
false,防止服务器提前释放续读点资源;当最后一次读取(续读点为空)时,设为true释放资源。 - 服务器兼容性:部分OPC HDA服务器可能不支持续读功能,你可以通过读取服务器的
ServerCapabilities节点下的HistoryReadCapability属性,确认服务器是否支持带续读点的历史数据读取。
内容的提问来源于stack exchange,提问作者Jayashree Madanala
相关产品推荐
相关产品推荐

