就是取一个PI点全天满足条件(比如说某个点值大于多少或者小于多少)的数据进行平均或者求和,有搞过PI的码友给点建议(用的是PISDk),以下为SDK源码
public class PiSdk
{
#region 变量属性
private static PISDK.PISDK piSdk;
public PISDK.Server piServer; // PI数据库服务器对象
private ILog m_Logger = LogHelper.Logger;
private string serverIp;
private string strConn;
#endregion
#region 构造方法
private PiSdk() { }
#endregion
#region 有参构造
public PiSdk(string serverIp, string conStr)
{
this.strConn = conStr;
this.serverIp = serverIp;
}
#endregion
#region pi连接
/// <summary>
/// 连接PI
/// </summary>
/// <returns>是否成功</returns>
public bool ConnectPi()
{
bool bFlag = false;
try
{
if (piSdk != null && piServer != null && piServer.Connected)
{
return true;
}
if (piSdk == null || piServer == null || !piServer.Connected)
{
try
{
piSdk = new PISDK.PISDK();
}
catch (Exception e)
{
piSdk = null;
m_Logger.ErrorFormat("PiSdk类组件注册失败:" + e.Message + " $$$ " + e.StackTrace, true);
bFlag = false;
}
piServer = piSdk.Servers[serverIp];
if (piServer.Connected)
{
return true;
}
piServer.ConnectTimeout = 30;
piServer.Open(strConn);
bFlag = true;
}
}
catch (Exception e)
{
piSdk = null;
m_Logger.ErrorFormat("PiSdk类ConnectPi函数异常:" + e.Message + " $$$ " + e.StackTrace, true);
bFlag = false;
}
return bFlag;
}
/// <summary>
/// 关闭PI数据库服务器对象
/// </summary>
/// <returns>是否成功</returns>
public bool Close()
{
try
{
if (piServer != null && piServer.Connected)
piServer.Close();
m_Logger.ErrorFormat("PiSdk类Close函数提示:PI 关闭连接成功", true);
}
catch (Exception e)
{
piSdk = null;
m_Logger.ErrorFormat("PiSdk类Close函数异常:" + e.Message + " $$$ " + e.StackTrace, true);
return false;
}
return true;
}
#endregion
#region 一般方法
/// <summary>
/// 获得服务器时间
/// </summary>
/// <returns>服务器时间</returns>
public DateTime GetServerTime()
{
return piServer.ServerTime().LocalDate;
}
/// <summary>
/// 获取某个点
/// </summary>
/// <param name="key">PI点名</param>
/// <returns>PI点对象</returns>
public PISDK.PIPoint GetPoint(string key)
{
try
{
return piServer.PIPoints[key];
}
catch (Exception e)
{
m_Logger.ErrorFormat("PiSdk类GetPoint函数异常:" + e.Message + " $$$ " + e.StackTrace, true);
return null;
}
}
/// <summary>
/// 判断当前PI点是否存在
/// </summary>
/// <param name="tagName">PI点名</param>
/// <param name="point">PI点对象</param>
/// <returns>是否成功</returns>
public bool isExist(string tagName, out int pt)
{
bool bFlag = false;
pt = 0;
try
{
PISDK.PIPoint point = piServer.PIPoints[tagName];
pt = Convert.ToInt32(point.PointAttributes["pointid"].Value.ToString());
bFlag = true;
}
catch (Exception e)
{
m_Logger.ErrorFormat("PiSdk类isExist函数异常:" + e.Message + " $$$ " + e.StackTrace, true);
bFlag = false;
}
return bFlag;
}
/// <summary>
/// 判断当前PI点是否存在
/// </summary>
/// <param name="tagName">PI点名</param>
/// <param name="point">PI点对象</param>
/// <returns>是否成功</returns>
public bool isExist(string tagName, out PISDK.PIPoint point)
{
bool bFlag = false;
point = null;
try
{
point = piServer.PIPoints[tagName];
bFlag = true;
}
catch (Exception e)
{
m_Logger.ErrorFormat("PiSdk类isExist函数异常:" + e.Message + " $$$ " + e.StackTrace, true);
bFlag = false;
}
return bFlag;
}
#endregion
#region 读快照值
/// <summary>
/// 读单个PI点快照值,值输出-99999为坏点
/// </summary>
/// <param name="tagName">PI点名</param>
/// <param name="retime">快照值所处时间戳</param>
/// <param name="dValue">快照值</param>
/// <returns>是否成功</returns>
public bool GetSnapshotValue(string tagName, DateTime retime, out object dValue)
{
bool bFlag = false;
dValue = -99999;
try
{
PIPoint point = null;
if (!isExist(tagName, out point))
{
m_Logger.ErrorFormat("PiSdk类GetSnapshotValue函数提示:PI点不存在,PI点名称:" + tagName, true);
return false;
}
var pvs = point.Data.TimedValues(retime);
if (pvs == null)
return false;
float dValues = 0;
int index = 0;
foreach (PIValue pv in pvs)
{
if (pv.IsGood())
{
if (point.PointType.ToString() == "pttypDigital")
{
dValues+= Convert.ToSingle(((PISDK.DigitalState)pv.Value).Code);
}
else
{
dValues += Convert.ToSingle(pv.Value.ToString());
}
index++;
}
}
dValue = (dValues / index);
bFlag = true;
}
catch (Exception e)
{
m_Logger.ErrorFormat("PiSdk类GetSnapshotValue函数异常:" + e.Message + " $$$ " + e.StackTrace, true);
bFlag = false;
}
return bFlag;
}
/// <summary>
/// 读单个PI点快照值,值输出-99999为坏点
/// </summary>
/// <param name="tagName">PI点名</param>
/// <param name="dValue">快照值</param>
/// <returns>是否成功</returns>
public bool GetSnapshotValue(string tagName, out float dValue)
{
bool bFlag = false;
dValue = -99999;
try
{
PIPoint point = null;
if (!isExist(tagName, out point))
return false;
PIValue pv = point.Data.Snapshot;
if (pv == null)
return false;
if (pv.IsGood())
{
if (point.PointType.ToString() == "pttypDigital")
{
dValue = Convert.ToSingle(((PISDK.DigitalState)pv.Value).Code);
}
else
{
dValue = Convert.ToSingle(pv.Value);
}
}
// m_Logger.ErrorFormat("PiSdk类GetSnapshotValue函数提示:操作成功", true );
bFlag = true;
}
catch (Exception e)
{
m_Logger.ErrorFormat("PiSdk类GetSnapshotValue函数异常:" + e.Message + " $$$ " + e.StackTrace, true);
bFlag = false;
}
return bFlag;
}
#endregion
#region 写单个、多个PI点快照、归档值
/// <summary>
/// 写入单个PI点归档值
/// </summary>
/// <param name="tagName">PI点名称</param>
/// <param name="dtime">时间</param>
/// <param name="value">值</param>
/// <returns>是否成功</returns>
public bool PutValue(string tagName, object dtime, object value)
{
bool bFlag = false;
try
{
PISDK.PIPoint point;
if (isExist(tagName, out point))
{
PISDKCommon.PIAsynchStatus status = new PISDKCommon.PIAsynchStatus();
point.PointAttributes.ReadOnly = false;
piServer.PIPoints[tagName].Data.UpdateValue(value, dtime, PISDK.DataMergeConstants.dmReplaceDuplicates, status);
point.PointAttributes.ReadOnly = true;
bFlag = true;
}
}
catch (Exception e)
{
m_Logger.ErrorFormat("PiSdk类PutValue函数异常:" + e.Message + " $$$ " + e.StackTrace, true);
bFlag = false;
}
return bFlag;
}
#endregion
#region 读指定时间归档值
/// <summary>
/// 读取时间戳数组的归档值,值-99999为坏点
/// </summary>
/// <param name="tagName">PI点名称</param>
/// <param name="timedStamps">时间戳数组</param>
/// <param name="filterExp"></param>
/// <param name="dValues">过滤表达式值数组</param>
/// <returns>是否成功</returns>
public bool GetTimedValues(string tagName, object[] timedStamps, string filterExp, out float[] dValues)
{
bool bFlag = false;
dValues = null;
try
{
PIPoint point = null;
PIValues pvs = null;
if (!isExist(tagName, out point))
return false;
pvs = point.Data.TimedValues(timedStamps, filterExp, FilteredViewConstants.fvShowFilteredState, false, null);
if (pvs == null)
return false;
int count = pvs.Count;
dValues = new float[count];
int index = 0;
foreach (PIValue pv in pvs)
{
if (pv.IsGood())
{
if (point.PointType.ToString() == "pttypDigital")
{
dValues[index] = Convert.ToSingle(((PISDK.DigitalState)pv.Value).Code);
}
else
{
dValues[index] = Convert.ToSingle(pv.Value.ToString());
}
}
else
{
dValues[index] = -99999;
}
index++;
}
bFlag = true;
}
catch (Exception e)
{
m_Logger.ErrorFormat("PiSdk类GetTimedValues函数异常:" + e.Message + " $$$ " + e.StackTrace, true);
bFlag = false;
}
return bFlag;
}
#endregion
/// <summary>
/// 某表达式的实时值
/// </summary>
/// <param name="expression"></param>
/// <param name="dttime"></param>
/// <returns></returns>
public double ExpCurrentValue(string expression)
{
double ReturnValue = 1;
try
{
PISDK.IPICalculation _piServer = (IPICalculation)piServer;
PIValues valsum;
DateTime dtTime = piServer.ServerTime().LocalDate;
valsum = _piServer.TimedCalculate(dtTime, expression);
if (valsum.Count == 1)
{
ReturnValue = (double)valsum[1].Value;
}
}
catch (Exception ex)
{
m_Logger.Error(string.Format("计算表达式【{0}】失败。错误信息:{1}", expression, ex.ToString()));
}
return ReturnValue;
}
public double ExpCurrentValue(DateTime dtTime, string expression)
{
double ReturnValue = 1;
try
{
PISDK.IPICalculation _piServer = (IPICalculation)piServer;
PIValues valsum;
valsum = _piServer.TimedCalculate(dtTime, expression);
if (valsum.Count == 1)
{
ReturnValue = (double)valsum[1].Value;
}
}
catch (Exception ex)
{
m_Logger.Error(string.Format("计算表达式【{0}】失败。错误信息:{1}", expression, ex.ToString()));
}
return ReturnValue;
}
public bool GetPointValue(string tagName, int? backTime, out DateTime reTime, out object dValue, out double maxValue, out double minValue, out double avgValue)
{
bool bFlag = false;
reTime = new DateTime(1999, 1, 1);
dValue = -99999;
maxValue = -99999;
minValue = -99999;
avgValue = -99999;
try
{
PIPoint point = null;
if (!isExist(tagName, out point))
{
m_Logger.ErrorFormat("PiSdk类GetSnapshotValue函数提示:PI点不存在,PI点名称:" + tagName, true);
return false;
}
PIValue pv = point.Data.Snapshot;
if (pv == null)
return false;
reTime = pv.TimeStamp.LocalDate;
if (pv.IsGood())
{
if (point.PointType.ToString() == "pttypDigital")
{
dValue = Convert.ToSingle(((PISDK.DigitalState)pv.Value).Code);
}
else
{
DateTime startDataTime = reTime.AddMinutes(-Convert.ToDouble(backTime));
maxValue = Math.Round(Convert.ToDouble(point.Data.Summary(startDataTime, reTime, ArchiveSummaryTypeConstants.astMaximum).Value), 4);
minValue = Math.Round(Convert.ToDouble(point.Data.Summary(startDataTime, reTime, ArchiveSummaryTypeConstants.astMinimum).Value), 4);
avgValue = Math.Round(Convert.ToDouble(point.Data.Summary(startDataTime, reTime, ArchiveSummaryTypeConstants.astAverage).Value), 4);
dValue = pv.Value;
}
}
bFlag = true;
}
catch (Exception e)
{
m_Logger.ErrorFormat("PiSdk类GetSnapshotValue函数异常:" + e.Message + " $$$ " + e.StackTrace, true);
bFlag = false;
}
return bFlag;
}
}