介绍:

 

PI Web Services 已经发布了较长的时间。 这种数据传输的方法可以向所有支持web services的平台发布数据。PI Web Services 丰富了PI系统数据传输的类型, 并使得跨平台的PI数据传输变得简单方便。PI Web Services可与PI Server和PI AF Server链接并协同工作。李捍永,OSIsoft COE 工程师已经写过一篇博客,关于PI Web Services如何与PI AF Server协同工作。这篇博客将使用一些C#程序的例子介绍PI Web Services与PI Server工作的基本方法。在这篇博客中,您将看到PI Web Services如何从PI Server中获取数据,及如何向PI Server写入数据。

 

首先,PI Web Service 可以通过 “Add Service Reference” 添加到一个新建的项目中。

1.jpg

在点击“Add Service Reference”后, 请输入PI Web Services安装后的URL  (详情请见PI Web Services的安装手册).  注意:请在“Namespace”处填写在本项目中,PI Web Services所使用的名字。

2.jpg

当上述的配置完成后,您可以开始在您的项目中使用PI Web Services了。您可以参考下面的例子:

 

 

 

GetSnapshot from PI server:

PIWebService.PITimeSeriesClient client = new PIWebService.PITimeSeriesClient();    // 创建一个PI Web Services的链接

string[] path = new string[1];

path[0] = @"pi:\\WIN-01ARJPPGTEJ\SINUSOID";  //  PI Web Services可使用批次的概念获取数据

                                                                                             这意味着您可以使用一个数组储存一系列PI点的路径,并获取这些PI点的快照值,而仅仅与PI Server进行一次通信

PIWebService.TimeSeries[] values = client.GetPISnapshotData(path);

foreach (PIWebService.TimedValue value in values[0].TimedValues)

Console.WriteLine("{0} --- {1}", value.Value, value.Time.ToLocalTime());

Console.Read();

 

GetPIarchiveData from PI Server:

 

与GetSnapshot类似, GetPIarchiveData可以使用一次通信获取多个PI点的归档值。

 

PIWebService.PITimeSeriesClient client = new PIWebService.PITimeSeriesClient();
PIWebService.TimeRange timerange = new PIWebService.TimeRange();
timerange.Start = "*-1h";
timerange.End = "*";

 

PIWebService.PIArcDataRequest[] list = new PIWebService.PIArcDataRequest[1];   // 创建一个PIArcDataRequest 数组来储存所有的条件信息。请看下面条件信息的详情:

 

PIWebService.PIArcDataRequest single = new PIWebService.PIArcDataRequest(); //  创建一个PIArcDataRequest实例将来会将这个实例添加到上面的数组中

 

PIWebService.PIArcManner manner = new PIWebService.PIArcManner();  //  PIArcManner 包含很多获取数据的过滤条件条件:

 

manner.Boundaries = PIWebService.PIArcMannerBoundaries.Inside;
manner.RetrievalType = PIWebService.PIArcMannerRetrievalType.Compressed;
manner.Updates = false;

 

single.TimeRange = timerange;

 

single.PIArcManner = manner;    //  将所有的 PIArcManner中的过滤条件添加到PIArcDataRequest实例中

 

single.Path = @"pi:\\WIN-01ARJPPGTEJ\cdt158";

 

list[0] = new PIWebService.PIArcDataRequest();

 

list[0] = single;    //  为了测试的简单明了,本次只创建一个PIArcDataRequest实例

 

PIWebService.TimeSeries[] values = client.GetPIArchiveData(list);
foreach (PIWebService.TimedValue value in values[0].TimedValues)
Console.WriteLine("{0} --- {1}", value.Value, value.Time.ToLocalTime());
Console.Read();

 

 

 

GetPISummaryData (Total) from PI server:

 

GetPISummaryData包括Average, Count, Maximum, Minimum, PStdDev, Range, StdDev and Total等功能.  这些公能实现的代码类似。因此,本次使用Total 作程序示例。

 

GetPISummaryData功能与GetPIarchiveData类似,都使用数组来存储条件信息。不同在于使用不同的类。

 

PIWebService.PITimeSeriesClient client = new PIWebService.PITimeSeriesClient();

PIWebService.PISummaryDataRequest[] list = new PIWebService.PISummaryDataRequest[1];  //  类名变为PISummaryDataRequest.

PIWebService.PISummaryDataRequest request = new PIWebService.PISummaryDataRequest();

PIWebService.PISummaryManner manner = new PIWebService.PISummaryManner();

 

manner.SummaryValue = PIWebService.PISummaryMannerSummaryValue.Total;  //  这里可以选择不同的统计方法,如Average, Count, Maximum, Minimum, PStdDev, Range, StdDev and Total.

manner.WeightType = PIWebService.PISummaryMannerWeightType.EventWeighted;
manner.Updates = false;

manner.Intervals = 1;   //  Intervals是一个非常重要得条件。

 

                                             它将觉得在给定时间段内有多少的返回值。

 

                                              如,如果Intervals = 10, 并且给定的时间段是*-1h”到 “*”, 之后,如果统计方法选择了Average, Maximum and Minimum,那么将有10个值返回。

 

                                             意思是,将给定的时间段做i10等分,每个返回值对应每一等分时间段的统计值。

// manner.TimeStep = "20m";  //  TimeStep是PI Web Services 2012的新参数。

 

                                                           这个参数可以代替Intervals来分割给定的时间段。

 

                                                           如,如果TimeStep = "40m", 并且给定时间段是"*-1h" 到“*"。

 

                                                           那么返回值只有一个,因为1小时内只有一个”40分钟“。

 

                                                           TimeStep的读取优先级高于Intervals。

 

                                                          意思是如果这两个参数都被配置,那么Intervals的配置将被忽视。

PIWebService.TimeRange timerange = new PIWebService.TimeRange();
timerange.Start = "*-1h";
timerange.End = "*";

request.Path = @"pi:\\WIN-01ARJPPGTEJ\cdt158";
request.TimeRange = timerange;
request.PISummaryManner = manner;

list[0] = new PIWebService.PISummaryDataRequest();
list[0] = request;

PIWebService.TimeSeries[] values = client.GetPISummaryData(list);
foreach (PIWebService.TimedValue value in values[0].TimedValues)
Console.WriteLine("{0} --- {1}", value.Value, value.Time.ToLocalTime());
Console.Read();

 

 

 

InsertPIData:

 

这是向PI Server写数据的方法。注意:如果使用这个方法,运行方法的账户必须有目的PI服务器的”写“权限。

 

如果上面的代码已经理解,那么下面的代码将会非常简单。

 

PI Web Services 2012 可以使用本地的 PI Buffer Subsystem来向PI Server或PI集群缓存并发送数据。详情请见PI Web Services 2012用户手册。

 

PIWebService.PITimeSeriesClient client = new PIWebService.PITimeSeriesClient();
PIWebService.TimeSeries[] input = new PIWebService.TimeSeries[1];
PIWebService.TimeSeries time_series = new PIWebService.TimeSeries();
PIWebService.TimedValue my_value = new PIWebService.TimedValue();

my_value.Path = @"pi:\\WIN-01ARJPPGTEJ\cdt158";
my_value.Time = DateTime.Now;
my_value.DataType = "dateTime";
my_value.Value = "300.00";
my_value.Status = null;

time_series.TimedValues = new PIWebServices.TimedValue[1];
time_series.TimedValues[0] = my_value;
input[0] = time_series;

PIWebService.TimeSeries my_result = new PIWebService.TimeSeries();
my_result = client.InsertPIData(input, PIWebService.InsertPIDataDuplicateSwitch.InsertDuplicate)

 

 

 

 

 

 

 

 

 

小结:

 

PI Web Services是在网络编程中非常有用的技术,可以跨越不同的平台,如.net 和 JAVA平台。PI Web Services在安全性和可管理性上优于PI API,因此,它将会在JAVA平台上代替PI API。