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