1. 在milo中,处理WORD等数据类型

例子如下:

VariableNode node = client.getAddressSpace().createVariableNode(
new NodeId(2, "ch1.d1.tag1")); Variant newVal = new Variant(Unsigned.ushort(111));
DataValue va = new DataValue(newVal, null, null);
StatusCode writeStatus = node.writeValue(va).get(); 也可以用UaOpcClient client.writeValue(
  new NodeId(2, "ch1.d1.tag1"),
  va
).get();

Variant 是milo中处理VARIANT变量的类,milo在Identifiers类中定义了各种类型的初始化如WORD LONG等,这里的Unsigned.ushort(111)就是将111初始化为WORD

2. 在utgard中,处理各种类型

(1)写入数据:

在utgard中采用jinterop中的JIVariant类型进行各种类型的处理,包括boolean, floate, double, short, int等,对boolean可处理如下:

Group group = server.addGroup();
Item item = group.addItem(mitem); final JIVariant value = new JIVariant(val);
item.write(value);

其中val是boolean型

(3)写入double和float数组数据:

 当写入double或float的数组数据时,因JIArray不支持基本类型数组,所以必须使用Double和Float对象进行处理,如下:

   server.connect();

    Group group = server.addGroup();
    Item item = group.addItem("Square Waves.Real4");     final Float[] Data = new Float[] { 1202f, 1203f, 1204f }; //这里没有使用float基本类型,使用了对象Float,如果是double,则需要使用Double类
    final JIArray array = new JIArray(Data, false);
    final JIVariant value = new JIVariant(array);     item.write(value);

(4)写入无符号数据:

java基本数据类型中没有无符号数据,所以需要使用JInterop中的无符号数类来生成JIUnsignedShort、JIUnsignedByte、JIUnsignedInt类型。

Group group = server.addGroup();
Item item = group.addItem(itemId);

JIUnsignedShort n5 = (JIUnsignedShort) JIUnsignedFactory.getUnsigned(5, JIFlags.FLAG_REPRESENTATION_UNSIGNED_SHORT);//JIUnsignedByte、JIUnsignedInt类型处理相同

final JIVariant value = new JIVariant(n5);

item.write(value);
Thread.sleep(2000);

(5) 写入无符号数组数据:

Group group = server.addGroup();
Item item = group.addItem(itemId);
// wait a little bit 有个10秒延时
JIUnsignedShort n1 = (JIUnsignedShort) JIUnsignedFactory.getUnsigned(5, JIFlags.FLAG_REPRESENTATION_UNSIGNED_SHORT);
JIUnsignedShort n2 = (JIUnsignedShort) JIUnsignedFactory.getUnsigned(5, JIFlags.FLAG_REPRESENTATION_UNSIGNED_SHORT);
JIUnsignedShort n3 = (JIUnsignedShort) JIUnsignedFactory.getUnsigned(5, JIFlags.FLAG_REPRESENTATION_UNSIGNED_SHORT);
JIUnsignedShort n4 = (JIUnsignedShort) JIUnsignedFactory.getUnsigned(5, JIFlags.FLAG_REPRESENTATION_UNSIGNED_SHORT);
JIUnsignedShort n5 = (JIUnsignedShort) JIUnsignedFactory.getUnsigned(5, JIFlags.FLAG_REPRESENTATION_UNSIGNED_SHORT);

final JIUnsignedShort[] dData = {n5, n4, n3, n2, n1 };
final JIArray array = new JIArray(dData, true);
final JIVariant value = new JIVariant(array);

item.write(value);
Thread.sleep(2000);

(6) 读出数据:

同样,读出的数据状态是ItemState, 它通过getValue得到一个JIVariant类型的值,这时需要进行分类处理:

int type = 0;
try {
type = itemState.getValue().getType();
} catch (JIException e) {
e.printStackTrace();
} // 如果读到是short类型的值ֵ
if (type == JIVariant.VT_I2) {
short n = 0;
try {
n = itemState.getValue().getObjectAsShort();
} catch (JIException e) {
e.printStackTrace();
}
System.out.println("-----short类型 " + n);
} //如果读到是字符串类型的值ֵ
if(type == JIVariant.VT_BSTR) {
JIString value = null;
try {
value = itemState.getValue().getObjectAsString();
} catch (JIException e) {
e.printStackTrace();
} //
String str = value.getString();
System.out.println("-----String类型 " + str);
}
}
//如果是无符号整数(WORD,DWORD)这里WORD对对应JIVariant.VT_UI2, DWORD对应JIVariant.VT_UI4 if(type == JIVariant.VT_UI2) {
Number value = 0;
try {
value =itemState.getValue().getObjectAsUnsigned().getValue();//这里生成一个Number类型的数
} catch (JIException e) {
e.printStackTrace();
} // System.out.println("-----无符号类型 " + value );
}
}

这里WORD对对应JIVariant.VT_UI2, DWORD对应JIVariant.VT_UI4,BYTE对应JIVariant.VT_UI1,都可以用Number类取出

但是在取QWORD(四字节)时出错,这个问题还没有办法解决。

(4) 读出数组数据

Group group = server.addGroup("group");
//Item item = group.addItem(itemId);
Map<String, Item> item_map = group.addItems( "ch1.d1.tag8"); //这是一个双字数组WORD ARRAY
Set<String> keySet = item_map.keySet();
//遍历存放所有key的Set集合
for(int i=0; i<6; i++) {
Iterator<String> it = keySet.iterator();
while(it.hasNext())
{
  String key = it.next();
  Item item = item_map.get(key);
  ItemState itemState = item.read(true);
  int type = itemState.getValue().getType();   if(type > 0x2000 && type < 0x3000)
  {
    int etype = type - 0x2000;
    JIVariant val = itemState.getValue();
    JIArray array = val.getObjectAsArray();
    int d = array.getDimensions();
    int upbounds[] = array.getUpperBounds();     if(etype == JIVariant.VT_UI2) {//如果是字节则用VT_UI1,双字用VT_UI4, 可以用switch case       @SuppressWarnings("rawtypes")
      Class clazz = array.getArrayClass();
      Object ob = array.getArrayInstance();       JIUnsignedShort[] num = (JIUnsignedShort[])ob; //将Object强制转换为JIUnsignedShort数组,如果是字节则用JIUnsignedByte,双字用JIUnsignedInteger   System.out.println("first element is :" + num[0].getValue()); //这里getValue返回一个Number类型,可以调用Number的成员函数将数据转换成其他类型
  }
} else if(etype == JIVariant.VT_R4) { //JIVariant.VT_R4对应float,JIVariant.VT_R8对应double,两种处理方法一致           @SuppressWarnings("rawtypes")
          Class clazz = array.getArrayClass();
          Object ob = array.getArrayInstance();           Number[] num = (Number[])ob; //将Object强制转换为Number数组,
          System.out.println("first element is :" + num[3]); }

Java中处理OPC寄存器数据类型的更多相关文章

  1. Java中字符串string的数据类型

    Java中字符串string的数据类型 时间:2017-07-03 08:01:47 YuanMxy 原文:https://blog.csdn.net/YuanMxy/article/details/ ...

  2. 二、 java中的变量与数据类型及类型转换

    标识符:凡是可以自己命名的地方都叫标识符,如:类名.方法名.接口名... 1.标识符命名的规则: 由26个英文字母大小写,0-9,_或$组成,不遵守会报错. 不可以用数字开头. 不能使用关键字和保留字 ...

  3. Java中几种常用数据类型之间转换的方法

    Java中几种常用的数据类型之间转换方法: 1. short-->int 转换 exp: short shortvar=0; int intvar=0; shortvar= (short) in ...

  4. java中的变量和数据类型

    变量和javascript的变量含义一样 在Java中,变量分为两种:基本类型的变量和引用类型的变量.(javascript中同样是这样的) 基本数据类型 基本数据类型是CPU可以直接进行运算的类型. ...

  5. Java中的变量、数据类型和运算符

    1. java语言是一种强类型的语言,对各种数据类型都有明确的区分,而计算机使用内存来记忆大量运算时需要使用的数据,而当声明一个变量时,即在内存中划分一块空间存储数据,而变量类型决定划分内存空间的大小 ...

  6. Java中的变量,数据类型和运算符

    变量,数据类型和运算符 1.变量是一个数据存储空间的表示,它是储存数据的基本单元. 如何理解这句话,下面用一个表格可以形象的表达: 变量与房间之间的对应关系 房间名称 变量名 房间类型 变量类型 入住 ...

  7. Java中的八大基本数据类型

    Java中的基本类型主要包括整数.浮点数.字符和布尔类型. 整数: 整数类型主要包括byte.short.int.long四种类型,所占大小分别为1byte.2byte.4byte和8byte: 浮点 ...

  8. java中八种基本数据类型以及它们的封装类,String类型的一些理解

    在我们面试或者考试过程中经常会考到八种基本数据类型以及它们的封装类,那么有哪八种基本数据类型呢?它们的封装类又是什么呢? 首先,八种基本数据类型分别是:int.short.float.double.l ...

  9. (转载)JAVA中八种基本数据类型的默认值

    原文链接: http://simon-c.iteye.com/blog/1016031 引用 For type byte, the default value is zero, that is, th ...

随机推荐

  1. Django内置email发送邮件

    ###Django内置email发送邮件 ####1.首先在settings.py文件设置相关参数 ```python STATIC_URL = '/static/' # 设置邮件域名 EMAIL_H ...

  2. python 获取运行脚本和模块的绝对路径

    方法一:sys.args[0] 在python的运行时,sys.argv[0],存了当前脚本的运行路径包括文件名 python test.py 则:sys.argv[0] =>test.py p ...

  3. C# Contract诊断

    命名空间 : using System.Diagnostics.Contracts; 属性标记 : [ContractOption(category: "runtime", set ...

  4. java内存溢出定位

    一.内存溢出问题分类 瞬时流量过大造成的创建大量对象 内存泄漏导致的内存溢出,一般就是程序编码的BUG引起的 二.内存泄漏问题分析 step1: 收集内存泄漏的堆内存异常日志 > 添加HeapD ...

  5. Educational Codeforces Round 37 (Rated for Div. 2) 920E E. Connected Components?

    题 OvO http://codeforces.com/contest/920/problem/E 解 模拟一遍…… 1.首先把所有数放到一个集合 s 中,并创建一个队列 que 2.然后每次随便取一 ...

  6. SIGAI深度学习第七集 卷积神经网络1

    讲授卷积神经网络核心思想.卷积层.池化层.全连接层.网络的训练.反向传播算法.随机梯度下降法.AdaGrad算法.RMSProp算法.AdaDelta算法.Adam算法.迁移学习和fine tune等 ...

  7. 安裝開源BBS軟件YAF時碰到的問題

    1.下載 http://yetanotherforum.net/download.aspx 安裝說明 http://www.drreddys.com/quest/readme.htm 其實只要打開根目 ...

  8. 参数类型 (@Test层)常用参数

    long lNum = 1234L; float fNum = 1.23f; double dNum = 1.23d;

  9. vue中使用ckeditor,支持wps,word,网页粘贴

    由于工作需要必须将word文档内容粘贴到编辑器中使用 但发现word中的图片粘贴后变成了file:///xxxx.jpg这种内容,如果上传到服务器后其他人也访问不了,网上找了很多编辑器发现没有一个能直 ...

  10. ueditor+粘贴word

    Chrome+IE默认支持粘贴剪切板中的图片,但是我要发布的文章存在word里面,图片多达数十张,我总不能一张一张复制吧?Chrome高版本提供了可以将单张图片转换在BASE64字符串的功能.但是无法 ...