PI开发面面谈

说起基于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,

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

原文地址:https://www.cnblogs.com/88223100/p/1518743.html