Exemple #1
0
 protected internal DataTrend_Index _DataTrend_Index_VirtualBase = null;         //绑定对象(虚拟对象是存在)
 public DataTrend_Index(double value, DateTime time, DataAnalyse_Trend dataAnalyse_Index, DataTrend_Index dataVBase = null) : base(value, time)
 {
     _Tag                         = "DataIndex";
     _IsVirtual                   = dataVBase != null;
     _DataAnalyse_Trend           = dataAnalyse_Index;
     _DataTrend_Index_VirtualBase = dataVBase;
     _LabelInfo                   = new DataTrend_LabelInfo();
 }
        //数据处理--数据趋势
        protected virtual bool dataHandle_DataTrend(DataTrend_Index data)
        {
            //趋势判断
            DataTrend_LabelInfo pLabelInfo = data.LabelInfo;
            double dDelta = pLabelInfo.Difference;

            if (Math.Abs(dDelta) >= _valueStep || Math.Abs(pLabelInfo.Difference_Ratio) >= _valueDelta)
            {
                pLabelInfo.DataTrend = dDelta > 0 ? typeDataTrend.RAISE : dDelta < 0 ? typeDataTrend.FALL : typeDataTrend.NONE;
            }
            else
            {
                pLabelInfo.DataTrend = typeDataTrend.NONE;
            }
            return(true);
        }
        //数据处理--数据趋势关键线
        protected virtual bool dataHandle_DataTrend_KeyLine(DataTrend_Index data)
        {
            bool bResult = true;
            DataTrend_LabelInfo pLabelInfo       = data.LabelInfo;
            DataTrend_LabelInfo pLabelInfo_Orgin = null;

            foreach (var item in _dataKeyLines)
            {
                (typeDataTrend, typeDataTrend_KeyPoint, double)pResult = item.Value.Analysis(data.Value);
                if (pResult.Item1 != typeDataTrend.NONE)
                {
                    if (_useConsole)
                    {
                        zxcConsoleHelper.Debug(true, "监测值:{3}, {0} {1} ({2})", pResult.Item1.ToString(), pResult.Item2.ToString(), pResult.Item3, Math.Round(data.Value, 6));
                    }

                    //复制备用
                    if (pLabelInfo_Orgin == null)
                    {
                        pLabelInfo_Orgin = zxcCloneDeep.Clone <DataTrend_LabelInfo>(pLabelInfo);
                    }

                    //更新值
                    pLabelInfo.Tag                = item.Key;
                    pLabelInfo.DataTrend          = pResult.Item1;
                    pLabelInfo.DataTrend_KeyPoint = pResult.Item2;
                    pLabelInfo.Value_KeyLine      = pResult.Item3;
                    bResult = bResult && this.dataHandle_Event(data);
                }
            }

            //还原
            if (pLabelInfo_Orgin != null)
            {
                pLabelInfo.Tag                = pLabelInfo_Orgin.Tag;
                pLabelInfo.DataTrend          = pLabelInfo_Orgin.DataTrend;
                pLabelInfo.DataTrend_KeyPoint = pLabelInfo_Orgin.DataTrend_KeyPoint;
                pLabelInfo.Value_KeyLine      = pLabelInfo_Orgin.Value_KeyLine;
            }
            return(bResult);
        }
        //数据处理--数据趋势关键点
        protected virtual bool dataHandle_DataTrend_KeyPoint(DataTrend_Index data, DataTrend_Index dataLast_Recursion = null)
        {
            //计算变化幅度
            DataTrend_LabelInfo pLabelInfo = data.LabelInfo;
            double dRatio = Math.Round(pLabelInfo.Difference / this._valueBase.Value, 6);

            pLabelInfo.Difference_Ratio = dRatio;
            if (_useConsole)
            {
                zxcConsoleHelper.Debug(true, "监测值:{1} ({0}),变动:{2},时间:{3}", Math.Round(data.Value, 6), dataLast_Recursion.Value, dRatio, data.Time.ToString("HH:mm:ss"));
            }
            if (dRatio == 0)
            {
                return(true);
            }


            //识别变化方向
            double dValue          = data.Value;
            int    nDirection_Last = (int)this._valueLast_Amend.LabelInfo.DataTrend; //升降标识,升为正,降为负

            if (dRatio * nDirection_Last >= 0)                                       //同方向,超限触发超限点及该值
            {
                if (dRatio > 0 && _valueMax <= data.Value)                           //上升,关键点--阶段新高
                {
                    if (data.Value - _valueMax >= 0.5 * _dataStatistics.Value_interval)
                    {
                        _valueMax = data.IsHitPoint ? this._dataStatistics.Max : this._dataStatistics.Max + 0.5 * _dataStatistics.Value_interval;
                        pLabelInfo.DataTrend_KeyPoint = typeDataTrend_KeyPoint.MAX;
                    }
                }
                else if (dRatio < 0 && _valueMin >= data.Value) //下降,关键点--阶段新低
                {
                    if (_valueMin - data.Value >= 0.5 * _dataStatistics.Value_interval)
                    {
                        _valueMin = data.IsHitPoint ? this._dataStatistics.Min : this._dataStatistics.Min - 0.5 * _dataStatistics.Value_interval;
                        pLabelInfo.DataTrend_KeyPoint = typeDataTrend_KeyPoint.MIN;
                    }
                }
                else if (_canRetreat && dRatio < 0 && _dataStatistics.Max_Original - data.Value >= _valueRetreatStep)     //回撤,关键点--阶段回撤
                {
                    if (_dataStatistics.Max_Original > _dataStatistics.Min_Original)
                    {
                        pLabelInfo.DataTrend_KeyPoint = typeDataTrend_KeyPoint.RETREAT;
                        pLabelInfo.Value_KeyLine      = this._dataStatistics.Max_Original;  //记录前值极点
                        pLabelInfo.DataTrend          = typeDataTrend.FALL;                 //修正当前方向
                        _canRetreat = false;
                    }
                }
            }
            else
            {
                //拐点判断(反向超限即为拐点)
                double valueLimit = nDirection_Last > 0 ? this._dataStatistics.Max_Original : this._dataStatistics.Min_Original;
                double ratioLimit = dValue - valueLimit;
                if (Math.Abs(ratioLimit) - this._valueStep > -0.00000001)
                {
                    //初始新统计对象
                    double dMin = nDirection_Last < 0 ? this._dataStatistics.Min_Original : dValue;
                    double dMax = nDirection_Last > 0 ? this._dataStatistics.Max_Original : dValue;
                    this.InitStatistics(dValue, data.Time, dMax, dMin);

                    //标识关键点--拐点信息
                    pLabelInfo.Value_KeyLine                  = valueLimit + _valueStep * nDirection_Last;
                    pLabelInfo.DataTrend_KeyPoint             = typeDataTrend_KeyPoint.INFLECTION;
                    pLabelInfo.Value_KeyLine                  = ratioLimit > 0 ? dMin : dMax;                              //记录前值极点
                    pLabelInfo.DataTrend                      = ratioLimit > 0 ? typeDataTrend.RAISE : typeDataTrend.FALL; //修正当前方向
                    this._valueLast_Amend.LabelInfo.DataTrend = pLabelInfo.DataTrend;                                      //修正前一(缓存修正对象)方向
                }
            }
            return(this.dataHandle_Event(data));
        }
        //数据处理--数据趋势详情
        protected virtual bool dataHandle_DataTrend_Detail(DataTrend_Index data)
        {
            //趋势详情判断
            DataTrend_LabelInfo pLabelInfo = data.LabelInfo;
            double dDelta = pLabelInfo.Difference;

            //利用前值进行计算(屏蔽第一个值)
            if (data._DataTrend_Index_Last._DataTrend_Index_Last != null)
            {
                double dDelta1    = data._DataTrend_Index_Last.LabelInfo.Difference;
                double dDirection = dDelta * dDelta1;               //同向标识,升为正,降为负
                double dDRatio    = dDelta / dDelta1;               //前后差值升降幅度

                pLabelInfo.DataTrend_Detail = typeDataTrend_Detail.NONE;
                if (dDirection > 0)
                {
                    if (dDRatio > 1.125 && dDRatio < 1.5)
                    {
                        pLabelInfo.DataTrend_Detail = typeDataTrend_Detail.SPEEDUP;
                    }
                    else if (dDRatio >= 1.5)
                    {
                        pLabelInfo.DataTrend_Detail = typeDataTrend_Detail.SPEEDTOP;
                    }
                    else if (dDRatio < -0.25 && dDRatio > -1)
                    {
                        pLabelInfo.DataTrend_Detail = typeDataTrend_Detail.SLOWDOWN;
                    }
                    else if (dDRatio <= -1)
                    {
                        pLabelInfo.DataTrend_Detail = typeDataTrend_Detail.SLOWTOP;
                    }
                }
                else
                {
                    // 波动处
                    if (dDelta1 > 0)
                    {
                        if (dDRatio < -0.25 && dDRatio > -1)
                        {
                            pLabelInfo.DataTrend_Detail = typeDataTrend_Detail.SLOWDOWN;
                        }
                        else if (dDRatio <= -1)
                        {
                            pLabelInfo.DataTrend_Detail = typeDataTrend_Detail.SLOWTOP;
                        }
                    }
                    else
                    {
                        if (dDRatio > 1.125 && dDRatio < 1.5)
                        {
                            pLabelInfo.DataTrend_Detail = typeDataTrend_Detail.SPEEDUP;
                        }
                        else if (dDRatio >= 1.5)
                        {
                            pLabelInfo.DataTrend_Detail = typeDataTrend_Detail.SPEEDTOP;
                        }
                    }
                }
            }
            return(true);
        }