aa405511071 2021-09-17 14:49
浏览 59
已结题

.net读取PI数据汇总问题

就是取一个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;
        }

    }

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 9月25日
    • 创建了问题 9月17日

    悬赏问题

    • ¥15 如何在scanpy上做差异基因和通路富集?
    • ¥20 关于#硬件工程#的问题,请各位专家解答!
    • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
    • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
    • ¥30 截图中的mathematics程序转换成matlab
    • ¥15 动力学代码报错,维度不匹配
    • ¥15 Power query添加列问题
    • ¥50 Kubernetes&Fission&Eleasticsearch
    • ¥15 報錯:Person is not mapped,如何解決?
    • ¥15 c++头文件不能识别CDialog