Java读取PI数据库测点值-程序员宅基地

技术标签: Database  实时数据库 java PI  

最近公司组织培训PI数据库,在听课之余试验了一下java直接读取PI数据库。

       安装数据库

安装osi ,启动PIPerfMon_Basic.bat,使用process book 绘制一个趋势图,加入几个例子测点,如“CDT158”,如图:

图片

 

 

 

       Piapi简介

利用PIAPI直接操作PI,安装PI数据库后会有一个piapi32.dll,提供了.net读取的接口。

       Jnative简介

JNative是一种能够使Java语言使调用DLL的一种技术,对JNI进行了封装。我们将下载的jnative.jar解压后,有一个jNativeCpp.dll,将其拷入C:\windows\system32下,并将jnative.jar加载到我们项目中来。准备工作就绪。

       程序读取。

要点记录:

       阅读API。打开PI System->about PI SDK->View Help,即可看到api文档。

PI数据库的数据分别存储在Snapshot或者Archive,一个是快照一个是档案文件,这样做是为了方便PI数据库对数据进行压缩.那么自然对数据库的读取也分为对SnapshotArchive读取.snapshotarchive的值都是用PIValue的形式表示的, PIValue对象包括了数值和时间。

其中Piapi中,用到最多的函数组是time functionsarchive functionssnapshot functionstime functions包含很多对时间处理的函数; archive functions包含了对档案文件的读写的函数;snapshot functions包含了对快照的读取函数。

       时间处理。

.net调用piapi传入时间类型时,是将.netDate类型转为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时,传入和读取数组时需要注意的事项。

       Java与。Net类型匹配。

Api里的除字符串外的指针类型,对应jnativepointer

Api里的intfloat等基本类型和String类型,在java中必须指定类型(Type.INT

Api里的date,是用int[]表示的,详见上条。

       传值与返回值。

Jnative对象调用invoke后会有返回,对照api,一般返回值是调用状态。如果要查询一个测点值,返回值是通过传入的pointer对象读取出来的。

 

源代码如下:

 

import java.text.ParseException;

import java.text.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.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 PIClientUtil();

 

    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().getTagValuesByTimeToTime("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-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")

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xuranpaoche/article/details/84220322

智能推荐

[vue-router] Duplicate named routes definition: { name: “Home“, path: “/home“ } warn @ vue-router._duplicate named routes definition: { name: "home",-程序员宅基地

文章浏览阅读2.6k次。报错[vue-router] Duplicate named routes definition: { name: “Home”, path: “/home” }warn @ vue-router.esm.js?8c4f:16如何解决?报错原因: { path: '/', name: 'Home', component: Home }, { path: '/login', name: 'Login', component: Login },_duplicate named routes definition: { name: "home", path: "/home" }

ext4magic恢复误删的目录文件测试(ext3/4)-程序员宅基地

文章浏览阅读860次。ext4magic /dev/datavg/datalv -m -a $(date -d "-1 day" +%s) -b $(date -d "-0 day" +%s)[root@oem ~]# cd /app/apach-YDZH/[root@oem apach-YDZH]# lltotal 12-rw-r--r-- 1 root root 4 Jun 17 15:14 1.txtdrwxr-xr-x 2 root root 4096 Jun 17 15:15 zhihuidrwxr.._ext4magic

java 生成 excel文件_导出execel jav-程序员宅基地

文章浏览阅读820次。java 生成 excel文件1.easyexcelhttps://www.yuque.com/easyexcel/doc/easyexcel2.hutoolhttps://hutool.cn/docs/#/poi/%E6%A6%82%E8%BF%B0_导出execel jav

微信企业号获取openId_企业微信获取openid-程序员宅基地

文章浏览阅读6.1k次,点赞2次,收藏3次。根据文档开发,怎么死的都不知道;这就是对微信的评价……1、微信获取openid两种方式企业获取code、根据code获取成员信息、非企业成员可以直接获取到openId,这里不做过多描述;企业成员取到的只有userId(如文档描述)微信企业开发者文档如下:https://qydev.weixin.qq.com/wiki/index.php?title=OAuth%E..._企业微信获取openid

使用Python Django开发web应用14 静态文件_在django项目开发中,不能像正常web开发一样通过 'imgs/bg.jpg' 访问本地静态文件-程序员宅基地

文章浏览阅读1.1k次。版本声明:转载请注明出处。未经允许,禁止商业用途。14 使用Python Django开发web应用 静态文件 讲师:刘一凡第一步:准备静态文件,制作图片OurBlog第二步:缺省配置下。静态文件放置在应用blog的static文件夹下。第三步:settings.py中修改为STATIC_URL = '/blog/static/'第四步:在template中引用图片..._在django项目开发中,不能像正常web开发一样通过 'imgs/bg.jpg' 访问本地静态文件

git 用命令下载代码到本地_命令行下载git-程序员宅基地

文章浏览阅读6.7w次,点赞11次,收藏56次。有的代码编辑工具里没有导入功能,可以用git命令导入第一步:创建一个本地的版本库(即新建一个文件夹)第二步:选中文件夹右键--Git bash here--进入控制面板,输入命令git init 初始化化文件夹,把这个文件夹变成Git可管理的仓库第三步:把gitee(码云)上的项目地址复过来,git clone "你的仓库地址",点击回车,如下图好了,到本地文件夹中就可以看到这..._命令行下载git

随便推点

HTML转义字符大全_%9转义-程序员宅基地

文章浏览阅读1.9k次。spring boot thymeleaf模板需要使用ISO Latin-1字符集: 	 — 制表符Horizontal tab 
 — 换行Line feed 
 — 回车Carriage Return   — Space ! ! — 惊叹号Exclamation mark ” " &..._%9转义

PHP面向对象 知识点总结_php面向对象知识点-程序员宅基地

文章浏览阅读617次。原文地址 - PHP面向对象 知识点总结1 面向对象思想的核心概念1.0 面向对象的核心思想对象、封装、可重用性和可扩展性1.1 面向对象的“形”与“本”类是对象的抽象组织,对象是类的具体存在对象和类的概念以及二者之间的关系 类是定义一系列属性和操作的模板,而对象则把属性进行具体化,然后交给类处理。对象就是数据,对象本身不包含方法。但是对象有一个“指针”指向一个类,这个类里可以有方法。_php面向对象知识点

一. Scala安装与环境配置-程序员宅基地

文章浏览阅读1w次。CenOS7安装Scala2.12Mac OS X 安装Scala2.12Windows安装Scala2.12Scala2.12安装与配置_scala

第六章第三十七题(格式化整数)(Format an integer)_编写一个格式化整型数的函数,参数是待格式化的整数 number 和指定的宽度 width,函-程序员宅基地

文章浏览阅读464次。第六章第三十七题(格式化整数)(Format an integer)6.37(格式化整数)使用下面的方法头编写一个方法,用于将整数格式化为指定宽度:public static String format(int number, int width)方法为数字number返回一个带有一个或多个以0作为前缀的字符串。字符串的位数就是宽度。比如,format(34,4)返回0034,format(34,5)返回00034。如果数字宽于指定宽度,方法返回该数字的字符串表示。比如,format(34,1)返回_编写一个格式化整型数的函数,参数是待格式化的整数 number 和指定的宽度 width,函

linux下,Android apk 反编译方法总结_apk转deb原理-程序员宅基地

文章浏览阅读3.5k次。总结网上分散的反编译方法,归类并亲测有效,其完整步骤如下:一、资源反编译(推荐工具apktool) 1. 下载apktool.jar以及相关文件: http://code.google.com/p/android-apktool/downloads/list 下载apktool1.4.3.bz2 和apktool-install-linux-r04-brut1.zip。_apk转deb原理

计算机要逻辑思维,学计算机专业需要逻辑思维强-程序员宅基地

文章浏览阅读229次。清华大学计算机科学与技术系在全国享有盛誉,本科只设计算机科学与技术专业,在人才培养过程中强调科学理论与实际应用的相互结合,培养适应研究、设计和应用开发的“复合型”人才。北航计算机科学与技术专业的定位是培养计算机领域的科学研究和工程技术性人才。该专业按一级学科招生和宽口径培养,二年级之后学生可以选择学科方向:计算机软件与理论、计算机系统结构、计算机应用和软件工程。三年级90%以上的学生可进入重点实验..._计算机强逻辑

推荐文章

热门文章

相关标签