Java中处理OPC寄存器数据类型
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寄存器数据类型的更多相关文章
- Java中字符串string的数据类型
Java中字符串string的数据类型 时间:2017-07-03 08:01:47 YuanMxy 原文:https://blog.csdn.net/YuanMxy/article/details/ ...
- 二、 java中的变量与数据类型及类型转换
标识符:凡是可以自己命名的地方都叫标识符,如:类名.方法名.接口名... 1.标识符命名的规则: 由26个英文字母大小写,0-9,_或$组成,不遵守会报错. 不可以用数字开头. 不能使用关键字和保留字 ...
- Java中几种常用数据类型之间转换的方法
Java中几种常用的数据类型之间转换方法: 1. short-->int 转换 exp: short shortvar=0; int intvar=0; shortvar= (short) in ...
- java中的变量和数据类型
变量和javascript的变量含义一样 在Java中,变量分为两种:基本类型的变量和引用类型的变量.(javascript中同样是这样的) 基本数据类型 基本数据类型是CPU可以直接进行运算的类型. ...
- Java中的变量、数据类型和运算符
1. java语言是一种强类型的语言,对各种数据类型都有明确的区分,而计算机使用内存来记忆大量运算时需要使用的数据,而当声明一个变量时,即在内存中划分一块空间存储数据,而变量类型决定划分内存空间的大小 ...
- Java中的变量,数据类型和运算符
变量,数据类型和运算符 1.变量是一个数据存储空间的表示,它是储存数据的基本单元. 如何理解这句话,下面用一个表格可以形象的表达: 变量与房间之间的对应关系 房间名称 变量名 房间类型 变量类型 入住 ...
- Java中的八大基本数据类型
Java中的基本类型主要包括整数.浮点数.字符和布尔类型. 整数: 整数类型主要包括byte.short.int.long四种类型,所占大小分别为1byte.2byte.4byte和8byte: 浮点 ...
- java中八种基本数据类型以及它们的封装类,String类型的一些理解
在我们面试或者考试过程中经常会考到八种基本数据类型以及它们的封装类,那么有哪八种基本数据类型呢?它们的封装类又是什么呢? 首先,八种基本数据类型分别是:int.short.float.double.l ...
- (转载)JAVA中八种基本数据类型的默认值
原文链接: http://simon-c.iteye.com/blog/1016031 引用 For type byte, the default value is zero, that is, th ...
随机推荐
- 「Django」Xadmin应用
第一:命令安装xadmin2 pip install xadmin2 第二:setting.py中设置 INSTALLED_APPS INSTALLED_APPS = ( ... 'xadmin', ...
- Python和Shell交互工具 ShellPy
ShellPy 是一款Python和Shell的交互工具.一般来说,我们会通过Subprocess.Popen或者Command模块执行一条Shell命令或脚本,然后通过返回的标准输出和错误输出来得到 ...
- 使用jdk自带的线程池。加载10个线程。
在开发中使用线程,经常不经意间就new Thread()一个出来,然后发现,这样做不是很好,特别是很多线程同时处理的时候,会出现CPU被用光导致机器假死,线程运行完成自动销毁后,又复活的情况. 所以在 ...
- scrapy3 中间件的使用
前情提要: 补充知识点: ua请求头库的使用 安装: pip install fake-useragent 使用: from fake_useragent import UserAgent ua = ...
- MySQL Index 索引提示:force or use
一.使用索引提示(Index Hint)的条件 1.Mysql优化器错误的选择了某个索引.这种情况很少发生,需要做数据库的表.索引的统计分析. 2.某个SQL语句可选择的索引非常多,这个时候优化器执行 ...
- Bzoj 2134: [国家集训队2011]单选错位(期望)
2134: 单选错位 Time Limit: 10 Sec Memory Limit: 259 MB Description Input n很大,为了避免读入耗时太多,输入文件只有5个整数参数n, A ...
- Mybatis——更新DB表的字段时,应该注意的点
1.记录下哪些表发生了字段更新. 2.利用Navicat将最新的数据库(schema)转储SQL文件到项目的sql目录下,作为备份 3.依次更新 被记录表所对应的Po类,确保类的域和表的字段一一对应, ...
- 7.26T3小游戏
小游戏 题目描述 有一个简单的小游戏.游戏的主人公是一个勇士,他要穿过一片黑森林,去 解救公主.黑森林的地图可以用一张 V 个点.E 条边的无向图来描述,起点是 1 号点,终点是 V 号点.勇士从起点 ...
- c语言 数组类型
数组类型重命名数组类型由元素类型和数组大小共同决定数组指针是一个指针,只想对应类型的数组指针数组是一个数组,其中每个元素都是指针数组指针遵循指针运算法则指针数组拥有c语言数组的各种特性 c通过type ...
- white-space 标签 使用
white-space MSD定义为: 是用来设置如何处理元素中的空白 其使用场景有很多,比如:横向滑动,超出显示省略号,输出空格显示空格等 1.横向滑动 在写手机页面的过程中,我想大部分人都遇到横向 ...