java读取PI数据库测点值

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Java读取PI数据库测点值最近公司组织培训PI数据库,在听课之余试验了一下java直接读取PI数据库。1.安装数据库。安装osi,启动PIPerfMon_Basic.bat,使用processbook绘制一个趋势图,加入几个例子测点,如“CDT158”,如图:2.Piapi简介利用PIAPI直接操作PI,安装PI数据库后会有一个piapi32.dll,提供了.net读取的接口。3.Jnative简介JNative是一种能够使Java语言使调用DLL的一种技术,对JNI进行了封装。我们将下载的jnative.jar解压后,有一个jNativeCpp.dll,将其拷入C:\windows\system32下,并将jnative.jar加载到我们项目中来。准备工作就绪。4.程序读取。要点记录:1.阅读API。打开PISystem-aboutPISDK-ViewHelp,即可看到api文档。PI数据库的数据分别存储在Snapshot或者Archive中,一个是快照一个是档案文件,这样做是为了方便PI数据库对数据进行压缩.那么自然对数据库的读取也分为对Snapshot和Archive读取.snapshot和archive的值都是用PIValue的形式表示的,PIValue对象包括了数值和时间。其中Pi的api中,用到最多的函数组是timefunctions、archivefunctions、snapshotfunctions。timefunctions包含很多对时间处理的函数;archivefunctions包含了对档案文件的读写的函数;snapshotfunctions包含了对快照的读取函数。2.时间处理。.net调用piapi传入时间类型时,是将.net的Date类型转为int数组,并可以直接将int数组传入方法。Java使用时间类型稍微复杂一些,需要调用pitm_intsec方法,该方法帮助如下:PIVOIDpitm_intsec(int32PIPTR*timedate,int32timearray[6]);ReturnsNoneArgumentstimedate(returned)PItimestamptimearray(passed)表示该方法2个参数,第一个是一个int型数组(指针),第二个参数是一个int型数组。第一个参数是返回参数,第二个参数是传入参数。注意,传入int32timearray[6]参数时,必须使用Pointer模拟指针,并且,循环设置数组元素时,注意pointer.setIntAt(intoffset,intvalue),offset的下标,比如第一个元素是0,第二个元素不是1,要看int占几个字节,int在。Net中占4个字节,所以第二个元素是4,第三个元素是8。这是java调用.net时,传入和读取数组时需要注意的事项。3.Java与。Net类型匹配。Api里的除字符串外的指针类型,对应jnative的pointer。Api里的int、float等基本类型和String类型,在java中必须指定类型(Type.INT)Api里的date,是用int[]表示的,详见上条。4.传值与返回值。Jnative对象调用invoke后会有返回,对照api,一般返回值是调用状态。如果要查询一个测点值,返回值是通过传入的pointer对象读取出来的。源代码如下:importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.Calendar;importjava.util.Date;importjava.util.regex.Matcher;importjava.util.regex.Pattern;importorg.xvolks.jnative.JNative;importorg.xvolks.jnative.Type;importorg.xvolks.jnative.exceptions.NativeException;importorg.xvolks.jnative.pointers.Pointer;importorg.xvolks.jnative.pointers.memory.HeapMemoryBlock;importorg.xvolks.jnative.pointers.memory.MemoryBlock;importorg.xvolks.jnative.pointers.memory.MemoryBlockFactory;/***Java通过jnative调用pi实时数据库dll类库piapi32.dll获取tag标签数据**/publicclassPIClientUtil{privatestaticPIClientUtilpiClientUtil=newPIClientUtil();publicstaticvoidmain(String[]args){//PIClientUtil.getPIClientUtil().getTimeFromInt();//PIClientUtil.getPIClientUtil().getTagValue(picompress_CompressionRatio_CALC);//PIClientUtil.getPIClientUtil().getTagValueByTime(CDT158,2012-05-1711:11:11);//PIClientUtil.getPIClientUtil().getTagValuesByTimeToTime(CDT158,2012-05-1711:11:11,2012-05-1718:00:00,2);PIClientUtil.getPIClientUtil().getTagMaxValue(CDT158,2012-05-1711:11:11,2012-05-1718:00:00);//PIClientUtil.getPIClientUtil().getTimeSecint(1);//PIClientUtil.getPIClientUtil().getPiTime();//PIClientUtil.getPIClientUtil().getTimeIntSec(2012-03-0312:00:00);}publicstaticPIClientUtilgetPIClientUtil(){returnpiClientUtil;}privatePIClientUtil(){try{//*********************连接PI数据库**************************////**********************************************************//JNativemessageBox=newJNative(piapi32.dll,piut_setservernode);messageBox.setRetVal(Type.INT);messageBox.setParameter(0,Type.STRING,127.0.0.1);//服务器ipmessageBox.invoke();System.out.println(piut_setservernode:+messageBox.getRetValAsInt());}catch(NativeExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(IllegalAccessExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}/***获取tag最新值*@paramtagName*@return*/publicfloatgetTagValue(StringtagName){try{JNativemessageBox=newJNative(piapi32.dll,pipt_findpoint);messageBox.setRetVal(Type.INT);messageBox.setParameter(0,Type.STRING,tagName);Pointerp=newPointer(newHeapMemoryBlock(1024));messageBox.setParameter(1,p);messageBox.invoke();intptId=p.getAsInt(0);if(0==messageBox.getRetValAsInt()){System.out.println(测点id:+ptId);messageBox=newJNative(piapi32.dll,pisn_getsnapshot);messageBox.setRetVal(Type.INT);messageBox.setParameter(0,Type.INT,+ptId);Pointerpp=newPointer(newHeapMemoryBlock(1024));messageBox.setParameter(1,pp);messageBox.setParameter(2,newPointer(newHeapMemoryBlock(1024)));//messageBox.setParameter(3,newPointer(newHeapMemoryBlock(1024)));//messageBox.setParameter(4,newPointer(newHeapMemoryBlock(1024)));messageBox.invoke();if(0==messageBox.getRetValAsInt()){System.out.println(tagName+测点值:+pp.getAsFloat(0));returnpp.getAsFloat(0);}}else{System.out.println(查询测点失败);}}catch(NativeExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(IllegalAccessExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}return0F;}/***获取测点制定时间点的值*@paramtagName*@return*/publicfloatgetTagValueByTime(StringtagName,Stringtime){try{JNativemessageBox=newJNative(piapi32.dll,pipt_findpoint);messageBox.setRetVal(Type.INT);messageBox.setParameter(0,Type.STRING,tagName);Pointerp=newPointer(newHeapMemoryBlock(8));messageBox.setParameter(1,p);messageBox.invoke();intptId=p.getAsInt(0);if(0==messageBox.getRetValAsInt()){System.out.println(测点id:+ptId);messageBox=newJNative(piapi32.dll,piar_value);messageBox.setRetVal(Type.INT);messageBox.setParameter(0,Type.INT,+ptId);Pointerpp=newPointer(newHeapMemoryBlock(1024));Pointerpp_status=newPointer(newHeapMemoryBloc

1 / 14
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功