我想问一下,当我试图从opc ua服务器读取一些对象时,我应该如何正确地使用struct。我仔细研究了这个例子,我能够读取数据。
但现在我不知道如何正确地阅读它们。假设我正在读取一些数据结构,其中包含x和y值的两个数组。我试着这样做:
Float[] x = (Float[])struct.getMember("x").getValue()
Float[] y = (Float[])struct.getMember("y").getValue()
但我收到异常“cannot cast'java.lang.object[]”to'java.lang.float[]”我可以这样做:
float[] x = new float[100];
int i = 0;
for(Object o: (Object[])struct.getMember("x").getValue()){
x[i] = (Float)o;
i++;
}
但我不认为这是对的。
无论如何,我想实现一些类似的东西,比如用jackson读取json文件。要使某个类具有相同的命名asi,请使用“成员”和合适的类型,并执行以下操作:
OpcuaReader reader = ...
MyClass myClass = reader.read(struct, MyClass.class)
我可能完全错了,有人能建议我怎么解决这个问题吗?
2条答案
按热度按时间r7s23pms1#
非常感谢istibekesi,我们设法让它工作。对于有同样问题的人,你需要做的是:
1) 查找类型id
您需要找到要通过opc ua(例如uaexpert)读取的结构(对象)的数据类型的名称空间索引和标识符
如果您不确定它是哪种数据类型,只需找到一些表示此结构的变量,当您单击它时,您将在屏幕右侧看到数据类型信息。
2) 查找二进制编码\u id
要找到这个,您需要使用uaexpert搜索数据类型本身,它将是一些在类型/数据类型下。。。
当你找到它时,点击查看更多信息
然后在屏幕的右下角会出现“hasencoding | default binary”,您可以双击它
这样,您将收到名称空间索引和二进制编码的标识符
3) 遵循这个例子
要拥有milo的所有部分,您需要在依赖项中包含sdk客户机、字典阅读器、bsd解析器
创建类似于以下内容的类:
在向客户机注册解码器时,如下所示:
zazmityj2#
首先,您不能像那样投射对象数组。相反,您可以使用流api来构造如下所示的浮点数:
关于milo客户机,有一个在readwritecustomdatatypenodeexample中读取自定义数据类型的好例子。
您可以创建自己的类型,类似于
CustomStructType
然后重写你自己的解码方法。解码器还有一个内置的readFloatArray
手头的方法: