stang

AF SDK 开发中级篇

Blog Post created by stang on Aug 19, 2016

: 为了更好的利用站内资源营造一个更好的中文开发资源空间,本文为转发修正帖,原作者为OSIsoft技术工程师王曦(Xi Wang),原帖地址:AF SDK 中级篇

 

本帖旨在介绍AF SDK的一些较为复杂函数的用法。

 

以下所有的函数,需要连接好AF服务器,AF数据库,以及一个Element。因此,以下函数将首先完成这个操作:

 

            PISystems AFSDK = new PISystems();                                                                            // 创建连接实例
            PISystem AFServer = AFSDK["XWANG-KQ8HT8KU8"];                                                 // 连接AF服务器
            AFDatabase Connected_Database = AFServer.Databases["training"];                     // 连接AF数据库
            AFElement Connected_Element = Connected_Database.Elements["osisoft"];     // 连接一个Element

 

1. 查询属性的某一时刻值:

 

            AFAttribute myAttribute = Connected_Element.Elements["Beijing"].Elements["test"].Attributes["Attribute2"];  // 指定一个属性
            AFValue Value = myAttribute.GetValue();   

 

2. 查询属性一段时间内的值:

 

            AFTime starttime = new AFTime("*-2h");                                                                                                                         // 定义开始时间
            AFTime endtime = new AFTime("*");                                                                                                                                // 定义结束时间
            AFTimeRange myTimeRange = new AFTimeRange();                                                                                               // 创建时间段实例
            myTimeRange.StartTime = starttime;                                                                                                                             // 确定时间段的开始时间
            myTimeRange.EndTime = endtime;                                                                                                                               // 确定时间段的结束时间

            AFAttribute myAttribute = Connected_Element.Elements["Beijing"].Elements["test"].Attributes["Attribute2"];   // 确定属性名
            AFValues ValueList = myAttribute.GetValues(myTimeRange, 100, null);                                                                 // 将时间段内的值取出

 

3. 按名称查找Element:

 

AFNamedCollectionList<AFElement> myTreeView = AFElement.FindElements(Connected_Database, Connected_Element, "*Beijing*",   AFSearchField.Name, true, AFSortField.Name, AFSortOrder.Ascending, 100);                            // 这个函数比较长,需要的参数比较多对于对应参数的解释请参看AF SDK帮助文件的说明 

 

4. 根据属性查找Element

 

            AFElementTemplate myTemplate = Connected_Database.ElementTemplates["osisoft"];                                                    // 指定需要按属性查找的Element模板
            AFAttributeTemplate myAttribute = myTemplate.AttributeTemplates["speed"];                                                                          // 指定上述模板中的Attribute模板
            AFAttributeValueQuery ValueQuery = new AFAttributeValueQuery(myAttribute, AFSearchOperator.GreaterThan, 0);         // 定义查询的条件
            AFAttributeValueQuery[] ValueArray = {ValueQuery};                                                                                                                        // 将查询条件加入查询条件数组

 

            AFNamedCollectionList<AFElement> myTreeView = AFElement.FindElementsByAttribute(Connected_Element, "*", ValueArray, true, AFSortField.Name, AFSortOrder.Ascending, 100); // 查询element

 

需要注意的是,如果要根据属性来查找Element,这个属性必须基于模板,也就是说,这些找到的Element, 是用模板制作的。

 

下面要讲的部分是AF SDK 2.5新加入的功能。从此版之后,AF SDK将在功能上全面代替PI SDK。在.NET环境中,AF SDK的性能表现也优于PI SDK。

 

1. 连接PI服务器:

 

            PIServers myServers = new PIServers();                                  // 创建实例
            PIServer myServer = myServers["XWANG-KQ8HT8KU8"];    // 连接服务器

 

这个用法与PI SDK极为类似

 

2. 创建点表:

 

             List<PIPoint> myList = new List<PIPoint>();                        // 创建点表实例
            myList.Add(PIPoint.FindPIPoint(myServer, "cdt158"));        // 将需要的点放入点表实例中
            myList.Add(PIPoint.FindPIPoint(myServer, "cdm158"));

 

3. 数据更新:以上两个功能都是为这个功能服务的,这个功能也是AF SDK新增功能中,极为重要的一个,因为它代替了PI SDK中的EVENT PIPE

 

            PIDataPipe myPipe = new PIDataPipe(AFDataPipeType.Snapshot);                                     // 创建一个PIDataPipe实例,用于获取快照值
            myPipe.AddSignups(myList);                                                                                                          // 将点表导入,即获取这些点的快照值
            AFListResults<PIPoint, AFDataPipeEvent> myResults = myPipe.GetUpdateEvents(4);   // 将获取的值导入到 AFListResults类中,用于其他程序调用

 

这里要说明的是:

 

1. myPipe.GetUpdateEvents(4)中的”4“的意思是每个服务器最大的事件采集量,这个DATAPIPE从一个PI服务器中,一次最多获取多少个事件

 

2. 这个功能只能用于从PI服务器中取数,AF属性中连接关系库的数据是不能用这个方法取的

 

3. 用这个功能取数,可以使用时间或事件触发。使用时间触发,推荐使用FOR循环的方式,比较简单;使用事件触发,将会较复杂,需要使用另一个程序进行事件比较,我们会在以后进行更为详细的讨论。

 

***原作到此为止***

 

以下内容是AF SDK 2.6新加入的常用功能简介。

1. AF数据更新

IList<AFAttribute> myList = new IList<AFAttribute>();    // 创建属性表实例
//***IList 中添加属性***

AFDataPipe myPipe = new AFDataPipe()        //创建AFDataPipe实例
myPipe.AddSignups(myList);                         //将属性表导入,即获取该属性的新值
AFListResults<AFAttribute, AFDataPipeEvent> myResults = myPipe.GetUpdateEvents();    //将获取的新值导入到AFListResults类中,用于其他程序调用

 

以下内容是AF SDK 2.7新加入的常用功能简介

1. AF新安全机制

 

2. 未来数据

 

3. 查询式搜索

元素搜索(AFElementSearch)

AFElementSearch eleSearch = new AFElementSearch(AF数据库对象,"对象名称(任选)",“查询字串”);    //创建元素查询式搜索对象
List<AFElement> = eleSearch.FindElements();                                                  //进行搜索,导入元素表实例,用于其他程序调用

Event Frame搜索 (AFEventFrameSearch)

AFEventFrameSearch eleSearch = new AFEventFrameSearch(AF数据库对象,"对象名称(任选)",“查询字串”);    //创建Event Frame查询式搜索对象
List<AFEventFrame> = eleSearch.FindEventFrames();                                                  //进行搜索,导入Event Frame表实例,用于其他程序调用

 

查询字串格式如 Search Query Syntax Overview

 

以下内容是AF SDK 2.8新加入的常用功能简介

1. 数值更改

PI测点数值(PIPoint.ReplaceValues Method )

            AFTime start = new AFTime("-1d");
            AFTime end = new AFTime("*");
            AFTimeRange timeRange = new AFTimeRange(start, end);
            IList<AFValue> myList = new IList<AFValue>();
            //***IList中添加AFValue对象***
            AFErrors<AFValue> afE = new AFErrors<AFValue>();
             afE = myPIPoint.ReplaceValues(timeRange,myList);    //归档里timeRange中的值换成myList中的值

AF属性数值(AFData.ReplaceValues Method )

            AFTime start = new AFTime("-1d");
            AFTime end = new AFTime("*");
            AFTimeRange timeRange = new AFTimeRange(start, end);
            IList<AFValue> myList = new IList<AFValue>();
            //***IList中添加AFValue对象***
            AFErrors<AFValue> afE = new AFErrors<AFValue>();
            afE = myAttribute.Data.ReplaceValues(timeRange,myList);    //属性数据源里timeRange中的值换成myList中的值

 

注:以上方法需要PI Data Archive 2016才能够使用

Outcomes