解码二进制ExtensionObject

时间:2017-11-16 14:34:18

标签: java decode opc-ua milo

我正在测试Eclipse Milo(版本0.1.5),以便作为客户端与TwinCAT PLC的OPC UA服务器进行通信。我的java程序充当一种中间件。它从TwinCAT OPC UA服务器读取结构,将其值放入JSON并将其发送到其他服务器。

为了测试,我在PLC中创建了一个带有两个变量的示例结构:
stSimpleStruct(PLC中的结构定义)
- bVar1(布尔)
- fVar2(浮动)
Picture of Struct in TwinCAT

如果我读取节点,则该值是一个编码为ByteString的ExtensionObject。应读取结构变量(bVar1和fVar2)的值并将其放入JSON对象中。所以结果是这样的:

{
    “bVar1” : false,
    “fVar2” : 0
}

上面的结构只是一个例子。要读取的结构仅在运行时已知。如何解码二进制ExtensionObject以访问结构变量的值?

这是我的代码:

 // Get endpoints
 String endpointURL = "opc.tcp://172.20.1.1:4840";
 EndpointDescription[] endpoints = UaTcpStackClient.getEndpoints(endpointURL).get();
 logger.info("Available endpoint:");
 for (EndpointDescription endpoint : endpoints)
 {
     logger.info("{} Security: {}", endpoint.getEndpointUrl(), endpoint.getSecurityPolicyUri());
 }
 // Chose endpoint
 SecurityPolicy securityPolicy = SecurityPolicy.None;
 EndpointDescription endpoint = Arrays.stream(endpoints)
     .filter(e -> e.getSecurityPolicyUri().equals(securityPolicy.getSecurityPolicyUri()))
     .findFirst()
     .orElseThrow(() -> new Exception("No desired endpoints returned"));
 logger.info("Using endpoint: {} [{}]", endpoint.getEndpointUrl(), SecurityPolicy.None);
 // Create client config
 OpcUaClientConfig config = OpcUaClientConfig.builder()
     .setApplicationName(LocalizedText.english("TestApplication"))
     .setEndpoint(endpoint)
     .setRequestTimeout(uint(5000))
     .build();
 OpcUaClient client = new OpcUaClient(config);
 // Synchronous connect
 client.connect().get();
 // Read struct
 NodeId nodeId = new NodeId(4, "MAIN.stSimpleStruct");
 VariableNode node = client.getAddressSpace().createVariableNode(nodeId);
 DataValue value = node.readValue().get();
 ExtensionObject extensionObject = (ExtensionObject) value.getValue().getValue();

1 个答案:

答案 0 :(得分:0)

Milo目前不支持自定义数据类型。

我有工作代码,可以读取服务器中的DataTypeDictionary节点,并在运行时构建自定义编解码器,这些编解码器已经注册了DataTypeManager,但是这个代码的发布时间,时间和方式仍未确定。在任何情况下,它都是针对Milo的开发0.2.0分支编写的,它已经进行了更改以适应自定义数据类型,所以它至少要到那时才可用。

如果您想进一步讨论,可以给我发电子邮件,列表或通过gitter.im频道停止。