zoukankan      html  css  js  c++  java
  • 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,

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

  • 相关阅读:
    【转】如何解决Verilog中参数化的赋值:赋全0,赋全1,赋全Z,赋全x
    【转】PCIe DMA
    【转】PCIe学习(二)——PCIe DMA关键模块分析之一
    PCIe配置空间
    [转]PCIe学习笔记之MSI/MSI-x中断及代码分析
    [转]常用通信接口保护电路
    [转]原理图和PCB元件对应查找--Altium Designer
    [原]PCB中MARK点制作
    [转]使用Altium Designer软件铺铜后再挖铜
    支持Json进行操作的Javascript类库TAFFY DB
  • 原文地址:https://www.cnblogs.com/88223100/p/1518743.html
Copyright © 2011-2022 走看看