ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:71.25KB ,
资源ID:5884525      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5884525.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(java读取PI数据库测点值.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

java读取PI数据库测点值.docx

1、java读取PI数据库测点值Java读取PI数据库测点值最近公司组织培训PI数据库,在听课之余试验了一下java直接读取PI数据库。1. 安装数据库。安装osi,启动PIPerfMon_Basic.bat,使用process book 绘制一个趋势图,加入几个例子测点,如“CDT158”,如图:2. Piapi简介利用PIAPI直接操作PI,安装PI数据库后会有一个piapi32.dll,提供了.net读取的接口。3. Jnative简介JNative是一种能够使Java语言使调用DLL的一种技术,对JNI进行了封装。我们将下载的jnative.jar解压后,有一个jNativeCpp.dll

2、,将其拷入C:windowssystem32下,并将jnative.jar加载到我们项目中来。准备工作就绪。4. 程序读取。要点记录:1. 阅读API。打开PI System-about PI SDK-View Help,即可看到api文档。PI数据库的数据分别存储在Snapshot或者Archive中,一个是快照一个是档案文件,这样做是为了方便PI数据库对数据进行压缩.那么自然对数据库的读取也分为对Snapshot和Archive读取.snapshot和archive的值都是用PIValue的形式表示的, PIValue对象包括了数值和时间。其中Pi的api中,用到最多的函数组是time f

3、unctions、archive functions、snapshot functions。time functions包含很多对时间处理的函数; archive functions包含了对档案文件的读写的函数;snapshot functions包含了对快照的读取函数。2. 时间处理。.net调用piapi传入时间类型时,是将.net的Date类型转为int数组,并可以直接将int数组传入方法。Java使用时间类型稍微复杂一些,需要调用pitm_intsec方法,该方法帮助如下:PIVOID pitm_intsec(int32 PIPTR * timedate,int32 timearray

4、6 );ReturnsNoneArgumentstimedate (returned)PI time stamptimearray (passed)表示该方法2个参数,第一个是一个int型数组(指针),第二个参数是一个int型数组。第一个参数是返回参数,第二个参数是传入参数。注意,传入int32 timearray6参数时,必须使用Pointer模拟指针,并且,循环设置数组元素时,注意pointer.setIntAt(intoffset, intvalue),offset的下标,比如第一个元素是0,第二个元素不是1,要看int占几个字节,int在。Net中占4个字节,所以第二个元素是4,第三个

5、元素是8。这是java调用.net时,传入和读取数组时需要注意的事项。3. Java与。Net类型匹配。Api里的除字符串外的指针类型,对应jnative的pointer。Api里的int、float等基本类型和String类型,在java中必须指定类型(Type.INT)Api里的date,是用int表示的,详见上条。4. 传值与返回值。Jnative对象调用invoke后会有返回,对照api,一般返回值是调用状态。如果要查询一个测点值,返回值是通过传入的pointer对象读取出来的。源代码如下:import java.text.ParseException;import java.text

6、.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.util.regex.Matcher;import java.util.regex.Pattern;import org.xvolks.jnative.JNative;import org.xvolks.jnative.Type;import org.xvolks.jnative.exceptions.NativeException;import org.xvolks.jnative.pointers.Pointer;import org.

7、xvolks.jnative.pointers.memory.HeapMemoryBlock;import org.xvolks.jnative.pointers.memory.MemoryBlock;import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;/* * Java通过jnative调用pi实时数据库dll类库piapi32.dll获取tag标签数据 * */public class PIClientUtil private static PIClientUtil piClientUtil=new PIClientUt

8、il(); public static void main(String args) /PIClientUtil.getPIClientUtil().getTimeFromInt(); /PIClientUtil.getPIClientUtil().getTagValue(picompress_Compression Ratio_CALC); /PIClientUtil.getPIClientUtil().getTagValueByTime(CDT158,2012-05-17 11:11:11); /PIClientUtil.getPIClientUtil().getTagValuesByTi

9、meToTime(CDT158,2012-05-17 11:11:11,2012-05-17 18:00:00,2); PIClientUtil.getPIClientUtil().getTagMaxValue(CDT158,2012-05-17 11:11:11,2012-05-17 18:00:00); /PIClientUtil.getPIClientUtil().getTimeSecint(1); /PIClientUtil.getPIClientUtil().getPiTime(); /PIClientUtil.getPIClientUtil().getTimeIntSec(2012

10、-03-03 12:00:00); public static PIClientUtil getPIClientUtil() return piClientUtil; private PIClientUtil() try / *连接PI数据库*/ / */ JNative messageBox = new JNative(piapi32.dll, piut_setservernode); messageBox.setRetVal(Type.INT); messageBox.setParameter(0, Type.STRING, 127.0.0.1);/服务器ip messageBox.inv

11、oke();System.out.println(piut_setservernode:+messageBox.getRetValAsInt(); catch (NativeException e) / TODO Auto-generated catch block e.printStackTrace(); catch (IllegalAccessException e) / TODO Auto-generated catch block e.printStackTrace(); /* * 获取tag最新值 * param tagName * return */ public float ge

12、tTagValue(String tagName) try JNative messageBox = new JNative(piapi32.dll, pipt_findpoint); messageBox.setRetVal(Type.INT); messageBox.setParameter(0, Type.STRING, tagName); Pointer p=new Pointer(new HeapMemoryBlock(1024); messageBox.setParameter(1, p); messageBox.invoke(); int ptId=p.getAsInt(0);

13、if(0=messageBox.getRetValAsInt() System.out.println(测点id:+ptId); messageBox = new JNative(piapi32.dll, pisn_getsnapshot); messageBox.setRetVal(Type.INT); messageBox.setParameter(0, Type.INT, + ptId); Pointer pp=new Pointer(new HeapMemoryBlock(1024); messageBox.setParameter(1, pp); messageBox.setPara

14、meter(2, new Pointer(new HeapMemoryBlock(1024); /messageBox.setParameter(3, new Pointer(new HeapMemoryBlock(1024); /messageBox.setParameter(4, new Pointer(new HeapMemoryBlock(1024); messageBox.invoke(); if(0=messageBox.getRetValAsInt() System.out.println(tagName+测点值:+pp.getAsFloat(0); return pp.getA

15、sFloat(0); else System.out.println(查询测点失败); catch (NativeException e) / TODO Auto-generated catch block e.printStackTrace(); catch (IllegalAccessException e) / TODO Auto-generated catch block e.printStackTrace(); return 0F; /* * 获取测点制定时间点的值 * param tagName * return */ public float getTagValueByTime(

16、String tagName,String time) try JNative messageBox = new JNative(piapi32.dll, pipt_findpoint); messageBox.setRetVal(Type.INT); messageBox.setParameter(0, Type.STRING, tagName); Pointer p=new Pointer(new HeapMemoryBlock(8); messageBox.setParameter(1, p); messageBox.invoke(); int ptId=p.getAsInt(0); i

17、f(0=messageBox.getRetValAsInt() System.out.println(测点id:+ptId); messageBox = new JNative(piapi32.dll, piar_value); messageBox.setRetVal(Type.INT); messageBox.setParameter(0, Type.INT, + ptId); Pointer pp=new Pointer(new HeapMemoryBlock(1024); Pointer pp_status = new Pointer(new HeapMemoryBlock(1024)

18、; messageBox.setParameter(1,getTimeIntSec(time); messageBox.setParameter(2, Type.INT,3+); messageBox.setParameter(3, pp); messageBox.setParameter(4, pp_status); messageBox.invoke(); if(0=messageBox.getRetValAsInt() System.out.println(tagName+测点值:+pp.getAsFloat(0); System.out.println(tagName+status值:

19、+pp_status.getAsInt(0); return pp.getAsFloat(0); else System.out.println(tagName+查询返回值:+messageBox.getRetValAsInt(); else System.out.println(查询测点失败); catch (NativeException e) / TODO Auto-generated catch block e.printStackTrace(); catch (IllegalAccessException e) / TODO Auto-generated catch block e.

20、printStackTrace(); return 0F; /* * 查询测点某时间段内最小值 * param tagName * param time1 * param time2 */ public void getTagMinValue(String tagName,String time1,String time2) int code = 1; this.getTagValuesByTimeToTime(tagName, time1, time2, code); /* * 查询测点某时间段内最大值 * param tagName * param time1 * param time2

21、*/ public void getTagMaxValue(String tagName,String time1,String time2) int code = 2; this.getTagValuesByTimeToTime(tagName, time1, time2, code); /* * 查询测点某时间段内平均值 * param tagName * param time1 * param time2 */ public void getTagAvgValue(String tagName,String time1,String time2) int code = 5; this.g

22、etTagValuesByTimeToTime(tagName, time1, time2, code); /* * * param tagName * return */ public void getTagValuesByTimeToTime(String tagName,String time1,String time2, int code) try JNative messageBox = new JNative(piapi32.dll, pipt_findpoint); messageBox.setRetVal(Type.INT); messageBox.setParameter(0

23、, Type.STRING, tagName); Pointer p=new Pointer(new HeapMemoryBlock(1024); messageBox.setParameter(1, p); messageBox.invoke(); int ptId=p.getAsInt(0); if(0=messageBox.getRetValAsInt() System.out.println(测点id:+ptId); messageBox = new JNative(piapi32.dll, piar_summary); messageBox.setRetVal(Type.INT);

24、/下面开始设置参数 messageBox.setParameter(0, Type.INT, + ptId); Pointer p_startTime = this.getTimeIntSec(time1); Pointer p_endTime = this.getTimeIntSec(time2); Pointer p_retVal = new Pointer(new HeapMemoryBlock(8); Pointer p_pctGood = new Pointer(new HeapMemoryBlock(8); messageBox.setParameter(1, p_startTim

25、e); messageBox.setParameter(2, p_endTime); messageBox.setParameter(3, p_retVal); messageBox.setParameter(4, p_pctGood); messageBox.setParameter(5, Type.INT,code+); messageBox.invoke(); if(0=messageBox.getRetValAsInt() System.out.println(tagName+测点返回值:+p_retVal.getAsFloat(0); else System.out.println(

26、tagName+查询状态值:+messageBox.getRetValAsInt(); else System.out.println(查询测点失败); catch (NativeException e) e.printStackTrace(); catch (IllegalAccessException e) e.printStackTrace(); /* * 将时间串转换为int * 格式:11-Aug-17 18:00:00 * param time * return */ public int getPiTime(String time) / 获取时间点 try String tt =

27、 time; Pointer pointer = new Pointer(MemoryBlockFactory.createMemoryBlock(8); JNative messageBox = new JNative(piapi32.dll, pitm_parsetime); messageBox.setRetVal(Type.INT); messageBox.setParameter(0, Type.STRING, tt); messageBox.setParameter(1, Type.INT, 0); messageBox.setParameter(2, pointer); mess

28、ageBox.invoke(); if(0 = messageBox.getRetValAsInt() System.out.println(执行成功,getPiTime结果是:+ pointer.getAsInt(0); return pointer.getAsInt(0); else System.out.println(执行失败); return 0; catch (NativeException e) e.printStackTrace(); return 0; catch (IllegalAccessException e) e.printStackTrace(); return 0

29、; /* * 将整数转换为时间,同上方法互逆 * param time * return */ public String getTimeFromInt(int time) try Pointer pointer = new Pointer(MemoryBlockFactory.createMemoryBlock(8); JNative messageBox = new JNative(piapi32.dll, pitm_formtime); messageBox.setRetVal(Type.INT); messageBox.setParameter(0, Type.INT,this.getPiTime()+); messageBox.setParameter(1, pointer); messageBox.setParameter(2,19); messageBox.invoke(); System.out.println(结果是:+ pointer.getAsString(); return pointer.getAsString(); catch (NativeException e)

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1