猿问

如何在 Eclipse Milo OpcUa 服务器上正确编写

我正在尝试在 Eclipse Milo OpcUa 服务器上编写一个 ExtensionObject 数组。我在 Java 8 和 Milo 0.2.3 上做所有这些。


我测试我写到我的服务器的方法是统一自动化 UaExpert 客户端和一个小的 Python 客户端。两者都显示相同的结果。


我有以下结构(我在这个场景中将它命名为 MyStructure)。它已经作为一个数组存在,我想将它写入相应的节点。


@Getter

@Setter

@AllArgsConstructor

public class MyStructure implements UaStructure {

    private String name;

    private Integer dataType;

    private String stringValue;

    private Integer intValue;

    private Float floatValue;


    public static final String Description = "MyStructure ";


    public static NodeId getNodeId() {

        return new NodeId(2, 3081);

    }


    @Override

    public NodeId getTypeId() {

        return getNodeId();

    }


    @Override

    public NodeId getBinaryEncodingId() {

        return getNodeId();

    }


    @Override

    public NodeId getXmlEncodingId() {

        return getNodeId();

    }


    public static class Codec extends GenericDataTypeCodec<MyStructure > {


        @Override

        public Class<MyStructure > getType() {

            return MyStructure .class;

        }


        @Override

        public MyStructure decode(SerializationContext context, UaDecoder reader) {

            return new MyStructure (

                reader.readString("Name"),

                reader.readInt32("DataType"),

                reader.readString("StringValue"),

                reader.readInt32("IntValue"),

                reader.readFloat("FloatValue")

            );

        }

每当我设置节点时,服务器都不会抱怨。它实际上设置了一些东西,准确地说它设置了 42 个扩展对象。在 UaExpert 中,我看到值(包括其时间戳)发生了变化,但我看不到实际值。该值只是 ExtensionObject 的 Array 类型,我无法读取任何嵌套值。但这是我在其他项目中看到的。它们具有自定义结构,并且嵌套字段在 UaExpert 中是人类可读的。


如果我在没有 Array 的情况下执行此操作并只编写一个 MyStructure,问题不会改变。


你有什么想法,我做错了什么或根本没有做什么?


森林海
浏览 394回答 1
1回答

拉莫斯之舞

现在 Milo 中的自定义结构只有在读取/写入它们的客户端事先知道结构时才有效。您所缺少的(并且尚未由 Milo 实现)是围绕创建 DataTypeDictionary、在地址空间中注册它以及通过 DataTypeEncoding 将您的编解码器链接到该字典中的条目的所有复杂性。如果您要使用 UaModeler 之类的工具并在其中创建自定义结构,然后查看生成的 XML,您会发现还有一大堆其他支持节点与之配套。当这些东西到位时,客户可以学习如何解码自定义结构,而无需事先了解它们。Milo 的客户端也包含此功能。另外,fwiw,您应该通过制作一个 来编码您的结构数组ExtensionObject[],每个都包含ExtensionObject一个标量结构值。
随时随地看视频慕课网APP

相关分类

Java
我要回答