1
关注中国自动化产业发展的先行者!
2024
2024中国自动化产业年会
2023年工业安全大会
OICT公益讲堂
当前位置:首页 >> 案例 >> 案例首页

案例频道

PI实时数据库简单开发的探索
  • 企业:    
  • 点击数:1371     发布时间:2023-08-30 13:04:16
  • 分享到:
本文简单介绍了PI实时数据库的相关信息,然后利用PI-SDK、PIAPI技术对PI实时数据库进行读写的一些方法,从而实现在PI实时数据库的基础上进行简单的二次开发的初步探索。

文献标识码:B文章编号:1003-0492(2023)08-066-04中图分类号:TP392

★朱国海(浙江巨化热电有限公司,浙江衢州324000)

关键词:PI;PI-SDK;PI-API;接口

1 引言

随着计算机信息技术的飞速发展,电厂都已经实现了底层生产用DCS系统、上层管理用MIS系统。为了实现上层MIS系统和底层DCS系统的沟通,SIS系统(Supervisory Information System in Plant Level)应运而生。随着SIS系统的产生和发展,逐渐为多数业内人士所接受,电厂信息化已经走向SIS+MIS时代。SIS系统和MIS系统是电厂实现电力生产过程自动化和管理现代化的两种不可缺少的工具,它们是相辅相成的。

2 SIS系统和PI实时数据库

实时数据库是SIS系统最基础、最重要的核心组成部分。说到实时数据库系统,目前的产品有很多,PI(Plant Information System)是由美国OSI Software公司开发的一套商品化软件应用平台,由于采用基于“螺旋门”的专利压缩技术而使得存储效率非常高。PI可在线存贮每个工艺过程点的多年数据。它提供了清晰、精确的操作情况画面,用户既可浏览工厂当前的生产情况,也可回顾过去的生产情况,所以PI在国内拥有很大的市场占有率,特别是在电力系统得到广泛的运用。

电厂建设SIS系统是为了可以开发各种应用,从而使信息系统发挥出更大的作用。PI系统本身客户端的应用程序可使用户很容易对工厂实施管理,诸如改进工艺,TQC,故障预防维护等。通过PI可集成产品计划、维护管理、专家系统、LIMS和优化/建模等应用程序,PI在业务管理和实时生产之间起到桥梁作用。同时PI数据库也有完善的二次开发手段,包括应用开发接口和数据库访问手段等。PI提供了对OPC、ODBC以及OLEDB等的支持。另外,它还有C/C++、VB环境下的SDK开发工具包和PI-API接口函数库,利用PI-API和PISDK,用户可以比较方便地进行二次开发。

3 PI-SDK和PI-API

某热电厂虽然已经建立了全厂的网络和PI实时数据库,但上层的应用大多处于起步阶段,还没有多少成熟的应用,本文打算初步探索下PI-SDK和PI-API技术,为今后二次开发做准备。

PI-API(PI Application Programming Interface)即PI应用程序接口,包含很多函数可以用来读写数据库。利用这些函数,用VB、C++或C#、甚至连PI-PROCESSBOOK中内嵌的VBA都可以对PI数据库进行数据读写。

PI-SDK(PI Software Development Kit)即基于面向对象的访问PI数据库的软件开发工具包。作者个人感觉PI-SDK是把PI-API封装了一下,让开发人员更容易连接数据库进行读写。两种方式本文都尝试了一下,后面会分别探讨。

4 PI-API的基本应用

在开始编程之前,首先需要安装OSI提供的PI-API,安装后会在系统的SYSTEM32目录中生成PIAPI32.DLL和PILOG32.DLL,在PI系统目录下的INCLUDE目录中生成PIAPI32.BAS。

下面以VB为例说明PI-API的大致用法。首先在VB程序中引用上面提到的PIAPI32.BAS,将它作为一个公用模块,然后就可以按照以下步骤连接数据库了。首先是连接数据库、其次是获取测点的内部标识号、然后通过内部标识号访问数据、最后断开数据库的连接,调用相关API函数,完成对PI数据库的读写操作。下面是几个主要函数:

pilg_registerapp,piut_setservernode,piut_login,pipt_findpoint,pisn_getsnapshot,pisn_putsnapshot,piut_disconnect()。

作者编写了一个读写PI数据库的小程序,作者对每个函数后面都做了说明,这样看起来更加直观。程序界面如图1所示,通过输入点名可以读取快照值,也可以写入快照值。

image.png 

图1 程序界面

Private Sub commandread_Click()

Dim pv '读取到的值

Dim pd As Long 'pointid

Dim TagName As String ’PI数据库点名

pilg_registerapp "piapi32.dll" {这是注册PI的动态连接库}

piut_setservernode "piserver" {设置要登录的PI服务器}

piut_login "piuser", "password", 0 {根据用户名和密码登录到上面设置的PI服务器,第一个参数是用户名,第二个参数是密码。}

TagName = Text1.Text {在文本框中输入PI数据库点名}

pipt_findpoint TagName,pd{根据输入的PI数据库点名获取对应的pointid,函数中的pd就是获得的pointid。用户平时应用的时候一般习惯都是用TAGNAME,也就是PI数据库点名,但是PI-API函数是用POINTID来存取的,所以要先根据TAGNAME来获得POINTID号。}

pisn_getsnapshotpd,pv,0,0{获取对应点的快照值,第一个函数是POINTID,PV就是获取到的值,第三和第四个参数值本文设的0,就是获取当前值}

Text2.Text=pv

pilg_disconnect{断开与PI服务器的连接}

End Sub

以上就是获取快照值的全部过程,写入值和获取值的过程差不多,就是最后用写入函数。

Private Sub commandwrite_Click()

Dim pv '写入的值

Dim pd As Long 'pointid

Dim TagName As String ’PI数据库点名

pilg_registerapp "piapi32.dll"

piut_setservernode "piserver"

piut_login "piuser", "password", 0

TagName = Text1.Text

pipt_findpoint TagName, pd

pv= Text2.Text

pisn_putsnapshot pd,pv,0,0{写入对应点的快照值,第一个函数是POINTID,PV就是要写入的值,第三和第四个参数值本文设的0。}

pilg_disconnect{断开与PI服务器的连接}

EndSub

以上就是最基础的利用PI-API读取和写入PI数据库的操作,按照以上步骤用户就能顺利地把数据写入到PI实时数据库的快照中。除了能对快照进行读写操作,PI-API还提供了能对已经存档的数据进行读写的函数,比如piar_value,可以获取特定时间的存档值,piar_putvalue可以把数据写入数据存档文件。

初步掌握PI-API数据库读写操作后,本文进行了简单的开发尝试。某热电厂的蒸汽用户比较分散,用户的用汽量数据是利用无线数据通讯方式传回来的,并没有写入到PI数据库,造成全厂实时数据的不完整,所以作者打算把这部分用户用汽数据写入PI数据库中。要对PI数据库进行写的操作,感觉用PI-API更容易操作,所以本文用的是PI的API函数开发了数据采集程序,程序界面如图2所示。

image.png 

图2 程序界面

部分代码截图如图3所示,代码中用户名和密码隐去。该段代码是程序接收第三方系统发送过来的数据,经过处理后用PI-API函数写入PI数据库的代码。

image.png 

图3  部分代码截图

5 PI-SDK的简单应用

PI-SDK是面向对象的软件开发工具包,在开始编程之前,首先需要安装OSI提供的PI-SDK,安装后会在PI的目录中生成PISDK目录,里面是PI的类库文件,PISDK.dll为核心类,大部分主要功能都在该类中,PISDKCommon.dll是通用类,PITimeServer.dll是PI自定义的时间类,我们利用上述三个类库就能够完成访问PI服务的主要功能。PISDK顶级类,下面是SERVERS类,在SERVERS类下面最重要的是SERVER类,SERVER类下面有很多类,其中我们要用到的最重要的是PIPOINTS类,其他类都有各自的功能,本文暂时用不到或者很少用到。

下面仍然以VB为例说明PI-SDK的大致用法。首先在VB程序中引用上面提到的PISDK.dll、PISDKCommon.dll、PITimeServer.dll三个类,然后就可以连接数据库进行读写操作了。本文同样编写了一个读写PI数据库的小程序,本文同样在后面都做了说明,这样看起来更加直观。程序界面如图4所示,通过输入点名可以读取快照值,也可以读取指定时间的值。

image.png 

图4 程序界面

Private Sub Command1_Click() {读取快照值}

Dim srv As server

Dim pn As PIPoint

Dim dt As PITimeFormat

Dim pv As PIValue

Dim t1 As String

Set srv = Servers("piserver") {指定要连接的PI服务器}

srv.Open "UID=piuser;pwd=password" {根据用户和密码连接上面的服务器}

Set pn = srv.PIPoints(Text1.Text) {想要取值的点名}

Set pv = pn.Data.Snapshot {取快照的值}

Text2.Text = pv.Value

End Sub

读取快照值很简单,比API更简单。但是要读取归档值就要麻烦一点,因为要给定读取的时间和模式。

Private Sub Command2_Click() {读取归档值}

Dim srv As server

Dim pn As PIPoint

Dim dt As PITimeFormat

Dim pv As PIValue

Dim t1 As String

Set srv = Servers("piserver") {指定要连接的PI服务器}

srv.Open "UID=piuser;pwd=password" {根据用户和密码连接上面的服务器}

Set pn = srv.PIPoints(Text1.Text) {想要取值的 点名}

Set dt = New PITimeFormat

t1=Format (text3.text , "YY-MMM - DDHH:MM:SS")

dt.InputString = t1 {把指定的时间转换成PI的时间格式}

Setpv=pn.Data.ArcValue(dt,rtInterpolated){获取指定时间的归档值,第一个参数就是时间,第二个参数是取数的模式,因为PI数据库并不是每个时间都存有数据的,所以用户可以选择模式是读取用户输入时间的当前点,后面一个点,前面一个点或者插值表示的时间}

Text2.Text = pv.Value

End Sub

PI-API尝试过了,PI-SDK当然也要尝试一下。某热电厂的新建的#10#11机组准备上一块LED大屏,用来显示机组的主要运行参数,方便员工了解机组运行状况。为了能方便地显示机组运行参数,打算从PI数据库中获取相关运行参数,然后写入到大屏显示数据库中,大屏控制软件能通过读取大屏数据库显示相关参数,程序界面截图如图5所示。

image.png 

图5 程序界面

部分代码截图如图6所示。该段代码是程序利用PI-SDK从PI数据库中获取相关数据,经过处理后写入大屏显示数据库的部分代码。程序应用了定时器,定时从PI数据库中获取数据,从而达到刷新大屏参数的目的。

image.png 

图6 部分代码截图

6 结束语

PI作为工厂底层控制系统与上层管理信息系统之间连接的桥梁,在工厂的信息化建设中扮演着特殊和重要的角色。PI是一个通用性的实时数据平台,开发接口也比较方便,经过一段时间的摸索,在看了PI系统的帮助文件,对PI的开发有了初步的认识。总的说来,利用OSI提供的PI-API和PI-SDK开发也很方便,两种方法各有各的优点,可以满足不同场合的不同需求的应用。

作者简介:

朱国海(1977-),男,浙江绍兴人,工程师,学士,现就职于浙江巨化热电有限公司,主要从事信息化管理工作。

参考文献:

[1] OSIsoft. PI Server System Management Guide[Z]. 2011.

[2] OSIsoft. PI Server Reference Guide[Z]. 2011.

[3] 陈卫. 火力发电厂SISI建设的思考[J]. 电力信息化. 2006, (12) : 31 - 34.

摘自《自动化博览》2023年8月刊

热点新闻

推荐产品

x
  • 在线反馈
1.我有以下需求:



2.详细的需求:
姓名:
单位:
电话:
邮件: