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

上传人:b****6 文档编号:5884525 上传时间:2023-01-01 格式:DOCX 页数:19 大小:71.25KB
下载 相关 举报
java读取PI数据库测点值.docx_第1页
第1页 / 共19页
java读取PI数据库测点值.docx_第2页
第2页 / 共19页
java读取PI数据库测点值.docx_第3页
第3页 / 共19页
java读取PI数据库测点值.docx_第4页
第4页 / 共19页
java读取PI数据库测点值.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

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

《java读取PI数据库测点值.docx》由会员分享,可在线阅读,更多相关《java读取PI数据库测点值.docx(19页珍藏版)》请在冰豆网上搜索。

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

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

Returns

None

Arguments

timedate(returned)

PItimestamp

timearray(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");//服务器ip

messageBox.invoke();

System.out.println("piut_setservernode:

"+messageBox.getRetValAsInt());

 

}catch(NativeExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}catch(IllegalAccessExceptione){

//TODOAuto-generatedcatchblock

e.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-generatedcatchblock

e.printStackTrace();

}catch(IllegalAccessExceptione){

//TODOAuto-generatedcatchblock

e.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(newHeapMemoryBlock(1024));

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值:

"+pp_status.getAsInt(0));

returnpp.getAsFloat(0);

}else{

System.out.println(tagName+"查询返回值:

"+messageBox.getRetValAsInt());

}

}else{

System.out.println("查询测点失败");

}

}catch(NativeExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}catch(IllegalAccessExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

return0F;

}

/**

*查询测点某时间段内最小值

*@paramtagName

*@paramtime1

*@paramtime2

*/

publicvoidgetTagMinValue(StringtagName,Stringtime1,Stringtime2){

intcode=1;

this.getTagValuesByTimeToTime(tagName,time1,time2,code);

}

/**

*查询测点某时间段内最大值

*@paramtagName

*@paramtime1

*@paramtime2

*/

publicvoidgetTagMaxValue(StringtagName,Stringtime1,Stringtime2){

intcode=2;

this.getTagValuesByTimeToTime(tagName,time1,time2,code);

}

/**

*查询测点某时间段内平均值

*@paramtagName

*@paramtime1

*@paramtime2

*/

publicvoidgetTagAvgValue(StringtagName,Stringtime1,Stringtime2){

intcode=5;

this.getTagValuesByTimeToTime(tagName,time1,time2,code);

}

 

/**

*

*@paramtagName

*@return

*/

publicvoidgetTagValuesByTimeToTime(StringtagName,Stringtime1,Stringtime2,intcode){

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","piar_summary");

messageBox.setRetVal(Type.INT);

//下面开始设置参数

messageBox.setParameter(0,Type.INT,""+ptId);

Pointerp_startTime=this.getTimeIntSec(time1);

Pointerp_endTime=this.getTimeIntSec(time2);

Pointerp_retVal=newPointer(newHeapMemoryBlock(8));

Pointerp_pctGood=newPointer(newHeapMemoryBlock(8));

messageBox.setParameter(1,p_startTime);

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(tagName+"查询状态值:

"+messageBox.getRetValAsInt());

}

}else{

System.out.println("查询测点失败");

}

}catch(NativeExceptione){

e.printStackTrace();

}catch(IllegalAccessExceptione){

e.printStackTrace();

}

}

/**

*将时间串转换为int

*格式:

11-Aug-1718:

00:

00

*@paramtime

*@return

*/

publicintgetPiTime(Stringtime){

//获取时间点

try{

Stringtt=time;

Pointerpointer=newPointer(MemoryBlockFactory.createMemoryBlock(8));

JNativemessageBox=newJNative("piapi32.dll","pitm_parsetime");

messageBox.setRetVal(Type.INT);

messageBox.setParameter(0,Type.STRING,tt);

messageBox.setParameter(1,Type.INT,"0");

messageBox.setParameter(2,pointer);

messageBox.invoke();

if(0==messageBox.getRetValAsInt()){

System.out.println("执行成功,getPiTime结果是:

"+pointer.getAsInt(0));

returnpointer.getAsInt(0);

}else{

System.out.println("执行失败");

return0;

}

}catch(NativeExceptione){

e.printStackTrace();

return0;

}catch(IllegalAccessExceptione){

e.printStackTrace();

return0;

}

}

/**

*将整数转换为时间,同上方法互逆

*@paramtime

*@return

*/

publicStringgetTimeFromInt(inttime){

try{

Pointerpointer=newPointer(MemoryBlockFactory.createMemoryBlock(8));

JNativemessageBox=newJNative("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());

returnpointer.getAsString();

}catch(NativeExceptione){

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

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

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