java读取PI数据库测点值
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
17 11:11:11");
//PIClientUtil.getPIClientUtil().getTagValuesByTimeTo 05-17 11:11:11","2012-05-17 18:00:00",2); PIClientUtil.getPIClientUtil().getTagMaxValue("CDT 11:11:11","2012-05-17 18:00:00"); //PIClientUtil.getPIClientUtil().getTimeSecint(1); //PIClientUtil.getPIClientUtil().getPiTime(""); //PIClientUtil.getPIClientUtil().getTimeIntSec("20 12:00:00"); } public static PIClientUtil getPIClientUtil(){ return piClientUtil; }
System.out.println("piut_setservernode:"+messageBox.getRe
} catch (NativeException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); }
的, PIValue对象包括了数值和时间。 其中Pi的api中,用到最多的函数组是time functions、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[6] ); Returns None Arguments timedate (returned) PI time stamp timearray (passed) 表示该方法2个参数,第一个是一个int型数组(指针),第二 个参数是一个int型数组。第一个参数是返回参数,第二个参数是 传入参数。 注意,传入int32 timearray[6]参数时,必须使用Pointer模拟指 针,并且,循环设置数组元素时,注意pointer.setIntAt(int offset, int value),offset的下标,比如第一个元素是0,第二个元素不是 1,要看int占几个字节,int在。Net中占4个字节,所以第二个元 素是4,第三个元素是8。这是java调用.net时,传入和读取数组时 需要注意的事项。 3. Java与。Net类型匹配。 Api里的除字符串外的指针类型,对应jnative的pointer。 Api里的int、float等基本类型和String类型,在java中必须指定
Java读Hale Waihona Puke BaiduPI数据库测点值
最近公司组织培训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,将其拷入 C:\windows\system32下,并将jnative.jar加载到我们项目中来。准备 工作就绪。 4. 程序读取。 要点记录: 1. 阅读API。打开PI System->about PI SDK->View Help,即可看 到api文档。 PI数据库的数据分别存储在Snapshot或者Archive中,一个是 快照一个是档案文件,这样做是为了方便PI数据库对数据进行 压缩.那么自然对数据库的读取也分为对Snapshot和Archive 读取.snapshot和archive的值都是用PIValue的形式表示
/** * Java通过jnative调用pi实时数据库dll类库piapi32.dll获取tag标签数 * */ public class PIClientUtil { private static PIClientUtil piClientUtil=new PIClientU
public static void main(String[] args) { //PIClientUtil.getPIClientUtil().getTimeFromInt("" //PIClientUtil.getPIClientUtil().getTagValue("pico Ratio_CALC"); //PIClientUtil.getPIClientUtil().getTagValueByTime
org.xvolks.jnative.JNative; org.xvolks.jnative.Type; org.xvolks.jnative.exceptions.NativeException; org.xvolks.jnative.pointers.Pointer; org.xvolks.jnative.pointers.memory.HeapMemoryBlock; org.xvolks.jnative.pointers.memory.MemoryBlock; org.xvolks.jnative.pointers.memory.MemoryBlockFacto
类型(Type.INT) Api里的date,是用int[]表示的,详见上条。 4. 传值与返回值。 Jnative对象调用invoke后会有返回,对照api,一般返回值是调用 状态。如果要查询一个测点值,返回值是通过传入的pointer对象 读取出来的。 源代码如下: import import import import import import import import import import import import import java.text.ParseException; java.text.SimpleDateFormat; java.util.Calendar; java.util.Date; java.util.regex.Matcher; java.util.regex.Pattern;
private PIClientUtil() { try { // *********************连接PI数据库************ // ******************************************* JNative messageBox = new JNative("piapi32.dll" "piut_setservernode"); messageBox.setRetVal(Type.INT); messageBox.setParameter(0, Type.STRING, "127.0 messageBox.invoke();
} /** * 获取tag最新值 * @param tagName * @return */ public float getTagValue(String tagName){ try {
JNative messageBox = new JNative("piapi32.dll" "pipt_findpoint"); messageBox.setRetVal(Type.INT); messageBox.setParameter(0, Type.STRING, tagNam 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", "p messageBox.setRetVal(Type.INT); messageBox.setParameter(0, Type.INT, "" + Pointer pp=new Pointer(new HeapMemoryBlock messageBox.setParameter(1, pp); messageBox.setParameter(2, new Pointer(new HeapMemoryBlock(1024))); //messageBox.setParameter(3, new Pointer(n HeapMemoryBlock(1024))); //messageBox.setParameter(4, new Pointer(n HeapMemoryBlock(1024))); messageBox.invoke(); if(0==messageBox.getRetValAsInt()){ System.out.println(tagName+"测点值 return pp.getAsFloat(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(String tagName,String try {
JNative messageBox = new JNative("piapi32.dll" "pipt_findpoint"); messageBox.setRetVal(Type.INT); messageBox.setParameter(0, Type.STRING, tagNam Pointer p=new Pointer(new HeapMemoryBlock(8)); 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", "p messageBox.setRetVal(Type.INT); messageBox.setParameter(0, Type.INT, "" + Pointer pp=new Pointer(new HeapMemoryBlock