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]); }