我正在嘗試在 Eclipse Milo OpcUa 服務器上編寫一個 ExtensionObject 數(shù)組。我在 Java 8 和 Milo 0.2.3 上做所有這些。我測試我寫到我的服務器的方法是統(tǒng)一自動化 UaExpert 客戶端和一個小的 Python 客戶端。兩者都顯示相同的結(jié)果。我有以下結(jié)構(gòu)(我在這個場景中將它命名為 MyStructure)。它已經(jīng)作為一個數(shù)組存在,我想將它寫入相應的節(jié)點。@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") ); }每當我設置節(jié)點時,服務器都不會抱怨。它實際上設置了一些東西,準確地說它設置了 42 個擴展對象。在 UaExpert 中,我看到值(包括其時間戳)發(fā)生了變化,但我看不到實際值。該值只是 ExtensionObject 的 Array 類型,我無法讀取任何嵌套值。但這是我在其他項目中看到的。它們具有自定義結(jié)構(gòu),并且嵌套字段在 UaExpert 中是人類可讀的。如果我在沒有 Array 的情況下執(zhí)行此操作并只編寫一個 MyStructure,問題不會改變。你有什么想法,我做錯了什么或根本沒有做什么?
1 回答

拉莫斯之舞
TA貢獻1820條經(jīng)驗 獲得超10個贊
現(xiàn)在 Milo 中的自定義結(jié)構(gòu)只有在讀取/寫入它們的客戶端事先知道結(jié)構(gòu)時才有效。
您所缺少的(并且尚未由 Milo 實現(xiàn))是圍繞創(chuàng)建 DataTypeDictionary、在地址空間中注冊它以及通過 DataTypeEncoding 將您的編解碼器鏈接到該字典中的條目的所有復雜性。
如果您要使用 UaModeler 之類的工具并在其中創(chuàng)建自定義結(jié)構(gòu),然后查看生成的 XML,您會發(fā)現(xiàn)還有一大堆其他支持節(jié)點與之配套。
當這些東西到位時,客戶可以學習如何解碼自定義結(jié)構(gòu),而無需事先了解它們。Milo 的客戶端也包含此功能。
另外,fwiw,您應該通過制作一個 來編碼您的結(jié)構(gòu)數(shù)組ExtensionObject[]
,每個都包含ExtensionObject
一個標量結(jié)構(gòu)值。
添加回答
舉報
0/150
提交
取消