说起基于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,
需要说明的是此函数返回的值仅是在快照中存在的最新的数据.