具有历史数据访问功能的Milo OPC UA服务器

时间:2017-10-18 13:25:43

标签: java opc-ua milo

HY,

我是milo(和OPC-UA)的新手,并尝试使用历史数据访问实现OPC-UA服务器。我重用了当前的milo服务器示例并创建了一个历史节点。在这个节点上,我可以查询(使用Prosys OPC UA Client)空的历史记录。我知道我必须自己实现历史节点的持久性。 到目前为止一直很好 - 但我找不到任何有关处理历史读取请求以及如何返回响应的信息。更准确地说,如何将HistoryData添加到HistoryReadResult

@Override
public void historyRead(HistoryReadContext context, HistoryReadDetails readDetails, TimestampsToReturn timestamps,
        List<HistoryReadValueId> readValueIds)
{
     List<HistoryReadResult> results = Lists.newArrayListWithCapacity(readValueIds.size());
     for (HistoryReadValueId readValueId : readValueIds){
         //return 3 historical entries
         DataValue v1 = new DataValue(new Variant(new Double(1)), StatusCode.GOOD, new DateTime(Date.from(Instant.now().minus(1, ChronoUnit.MINUTES))));
         DataValue v2 = new DataValue(new Variant(new Double(2)), StatusCode.GOOD, new DateTime(Date.from(Instant.now().minus(2, ChronoUnit.MINUTES))));
         DataValue v3 = new DataValue(new Variant(new Double(3)), StatusCode.GOOD,  new DateTime(Date.from(Instant.now().minus(3, ChronoUnit.MINUTES))));
         HistoryData data = new HistoryData(new DataValue[] {v1,v2,v3});
         //???
         HistoryReadResult result = new HistoryReadResult(StatusCode.GOOD, ByteString.NULL_VALUE, ??? );
         results.add(result);
     }
     context.complete(results);
}

2 个答案:

答案 0 :(得分:1)

您需要访问规范才能成功实施历史访问服务。第4部分和第11部分。

HistoryReadResult构造函数中的最后一个参数应该是HistoryData结构。 ExtensionObject基本上是编码和传输结构的容器。

要创建ExtensionObject,您首先需要创建HistoryData(或HistoryModifiedData,取决于...请参阅规范),然后执行类似ExtensionObject.encode(historyData)的操作以获取您需要完成构建HistoryReadResult

的对象

答案 1 :(得分:1)

覆盖historyRead是正确的方法。

increase(card: any, index: any) {

    shoppingCart[index].quantity += 1;
    shoppingCart[index].subtotal = card.subtotal * card.quantity 

  }

但是,在使用特定的AccessLevel和Historizing模式定义我的variableNode之前,通用客户端(例如UA-Expert)未调用该方法:

HistoryReadResult result = new HistoryReadResult(StatusCode.GOOD, ByteString.NULL_VALUE,ExtensionObject.encode(data) );