为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

森林海 2021-10-13 16:31:27
我正在尝试在 Eclipse Milo OpcUa 服务器上编写一个 ExtensionObject 数组。我在 Java 8 和 Milo 0.2.3 上做所有这些。我测试我写到我的服务器的方法是统一自动化 UaExpert 客户端和一个小的 Python 客户端。两者都显示相同的结果。我有以下结构(我在这个场景中将它命名为 MyStructure)。它已经作为一个数组存在,我想将它写入相应的节点。@Getter@Setter@AllArgsConstructorpublic 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,问题不会改变。你有什么想法,我做错了什么或根本没有做什么?
查看完整描述

1 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

现在 Milo 中的自定义结构只有在读取/写入它们的客户端事先知道结构时才有效。

您所缺少的(并且尚未由 Milo 实现)是围绕创建 DataTypeDictionary、在地址空间中注册它以及通过 DataTypeEncoding 将您的编解码器链接到该字典中的条目的所有复杂性。

如果您要使用 UaModeler 之类的工具并在其中创建自定义结构,然后查看生成的 XML,您会发现还有一大堆其他支持节点与之配套。

当这些东西到位时,客户可以学习如何解码自定义结构,而无需事先了解它们。Milo 的客户端也包含此功能。

另外,fwiw,您应该通过制作一个 来编码您的结构数组ExtensionObject[],每个都包含ExtensionObject一个标量结构值。


查看完整回答
反对 回复 2021-10-13
  • 1 回答
  • 0 关注
  • 393 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信