PI开发面面谈

  • Post author:
  • Post category:其他



说起基于PI的软件开发主要包括两方面,

1:利用PIAPI直接操作PI,此种方式的好处在于高效率,容易掌控任何操作,缺点在于需要购买PIAPI,下面会详细介绍此类方法;

2:通过国际工业组织约定的OPC通讯协议访问PI,此种方式的好处在于通用,因为只要是实时数据库都会支持OPC协议,有关OPC方面的请参考我的 “[原创]为中华崛起而学习系列[原创]” 下面有关OPC的资料.

下面说说基于PISDK,利用PIAPI对PI的操作:


1.首先需要检测PI的连接:

C       : int32 piut_setservernode (char PIPTR * servername );

c#     : int piut_setservernode (string servername );

servername[passed] : 服务器IP或服务器名,

如果连接成功返回0,这里需要注意的是,如果开发防火墙的话,有可能会出现连接失败的情况.


2.登陆PI

C    :   int32 piut_login (char PIPTR * username, char PIPTR * passwrd, int32 PIPTR * valid);

c#     : int piut_login (string username, string passwrd, ref int valid);

username[passed] : 用户名,如piadmin;

passwrd[passed] : 登陆密码;

valid[returned] : 服务器返回访问级别 ,如下:

#define PINO 0 (PI错误);

#define PIREAD 1 (只读);

#define PIREADWRITE 2 (读写);

如果登陆成功返回0;


3.查找需要的点

C    : int32 pipt_findpoint (char PIPTR * tagname, int32 PIPTR * pt);

c#     :   int pipt_findpoint (string tagname, ref int pt);

tagname[passed] : 点在PI中的名称;

pt[returned] : 返回点在PI中的索引;

如果成功找到该点返回0;


4.断开连接

C    : int32 piut_disconnect (void);

C#     : int32 piut_disconnect (void);

成功断开连接返回0;

到此,通过以上步骤1,2建立与PI的连接,步骤3查找需要的点,步骤4断开连接,一个最基础的PI操作就完成,下面在介绍一些实用的PIAPI函数, 以下以C++为主,C#与其类似.




PIVOID pitm_intsec (int32 PIPTR * timedate, int32 timearray[6]);

timedate[returned] : PI使用的时间

timearray[passed] : 保存时间的数组,如下:

timearray [0] month; // (1-12)

timearray [1] day; // (1-31)

timearray [2] year; // (four digit)

timearray [3] hour; // (0-23)

timearray [4] minute; // (0-59)

timearray [5] second; // (0-59)

此函数将一个给定的时间数组转化为PI时间




PIVOID pitm_secint (int32 PIPTR * timedate, int32 timearray[6]);

timedate[passed] : PI使用的时间

timearray[returned] : 保存时间的数组,如下:

此函数将一个给定的PI时间转化为时间数组,其格式可参考上条;




int32 piar_summary (int32 pt,int32 PIPTR *time1,int32 PIPTR *time2, float PIPTR *rval,

float PIPTR *pctgood, int32 code);

pt[passed] : 点索引

time1[passed,returned] : 开始时间,返回对应时间,如果code属性为ARCMINIMUM,ARCMAXIMUM,ARCSTDEV

time2[passed,returned] : 开始时间,返回对应时间,如果code属性为ARCMINIMUM,ARCMAXIMUM,ARCSTDEV

rval[returned] : 返回计算值

pctgood[returned] : 返回计算结果的品质

code[passed] : 计算方式,如下:

#define ARCTOTAL 0

#define ARCMINIMUM 1

#define ARCMAXIMUM 2

#define ARCSTDEV 3

#define ARCRANGE 4

#define ARCAVERAGE 5

#define ARCMEAN 6

计算成功返回0,

值得注意的有两点: 1.此函数进行计算时,默认的转换因子为1,也就是天,如果需要自己的时间,主要根据转换因子1将计算结果进行转化; 2. pctgood,此参数返回计算品质,如果在进行统计运算时需要乘上此品质,才是真实结果;




int32 piar_compvalues (int32 pt, int32 PIPTR * count, int32 times[], float rvals [], int32 istats[], int32 rev);

pt[passed] : 点索引

count[passed,returned] : 指定返回数据最大个数,返回实际取得最大个数

times[passed,returned] : 指定查询时间段,times[0]表示开始时间,返回各数据实际时间

rvals [returned] : 返回各数据值

istats[returned] : 返回各时间点上数据状态

rev [passed] : 指定查询方向,false(0)表示根据指定时间向前搜索,true表示向后搜索;

查找成功返回0;

值得注意的是,一次查询返回的最后时间还并没有到指定的时间,此时返回的count为指定数组最大数量,表明此查询没有完成,需要将开始时间点设置为返回的最后时间,继续查询,直到count返回值小于指定的最大值为止.




int32 pisn_getsnapshots (int32 PIPTR * pt, float PIPTR * rval, int32 PIPTR * istat, int32 PIPTR * timedate,

int32 PIPTR * error, int32 count );

pt[passed] : 指向点索引数组

rval[returned] : 返回点索引数组对应各点的数据

istat[returned] : 返回点索引数组对应各点数据状态

timedate[returned] : 返回各数据值对应的时间

error[returned] : 返回错误代码

count [passed] : 指定数组大小

成功查询返回0,

需要说明的是此函数返回的值仅是在快照中存在的最新的数据.