Esempio n. 1
0
 //读取计算数据
 private void ReadCalcuData(PSLCalcuItem currentCalcuItem)
 {
     List <PValue>[] inputs;
     try
     {
         RTDbHelper rtdbhelper = new RTDbHelper();
         //1、从数据库读取数据
         string[] sourcetagname = Regex.Split(currentCalcuItem.sourcetagname, ";|;");
         inputs = new List <PValue> [sourcetagname.Length];             //参与计算的标签历史数据PValue格式
         if (currentCalcuItem.sourcetagdb == "rtdb")
         {
             //实时库实时数据
             for (int i = 0; i < sourcetagname.Length; i++)
             {
                 inputs[i] = rtdbhelper.GetRawValues(currentCalcuItem.sourcetagname, currentCalcuItem.fstarttime, currentCalcuItem.fendtime); //获取历史数据,100000该参数是一次读取数据的最大条数,建议改为xml文件
                 if (inputs[i] == null || inputs[i].Count == 0)
                 {                                                                                                                            //如果任一数据源取数为空,则该数据一定出错,计数器递增。出错信息已经在取数据的DAO中记录。直接跳到下一次计算
                     warningCount = warningCount + 1;
                     warningFlag  = true;
                     //tslb_CalcuWarnings.Text = string.Format("{0} warnings occured in calcuting!", warningCount);
                     logHelper.Error("计算引擎警告!");
                     string moduleInfo = string.Format("——计算模块的名称是:{0},当前计算源标签是:{1},计算起始时间是:{2},计算结束时间是:{3}。", currentCalcuItem.fmodulename, currentCalcuItem.sourcetagname, currentCalcuItem.fstarttime.ToString(), currentCalcuItem.fendtime.ToString());
                     logHelper.Error(moduleInfo);
                     string errInfo = string.Format("——警告统计序号{0}:对应时间段内没有实时数据!", warningCount.ToString());
                     logHelper.Error(errInfo);
                     //goto NEXTCalcu;
                 }
             }
         }
         else
         {
             //概化库概化数据
             for (int i = 0; i < sourcetagname.Length; i++)
             {
                 inputs[i] = PSLDataDAO.Read(TagName2Id[currentCalcuItem.sourcetagname], currentCalcuItem.fstarttime, currentCalcuItem.fendtime); //获取历史数据
                 if (inputs[i] == null || inputs[i].Count == 0)
                 {                                                                                                                                //如果任一数据源取数为空,则该数据一定出错,计数器递增。出错信息已经在取数据的DAO中记录。直接跳到下一次计算
                     warningCount = warningCount + 1;
                     warningFlag  = true;
                     //tslb_CalcuWarnings.Text = string.Format("{0} warnings occured in calcuting!", warningCount);
                     logHelper.Error("计算引擎警告!");
                     string moduleInfo = string.Format("——计算模块的名称是:{0},当前计算源标签是:{1},计算起始时间是:{2},计算结束时间是:{3}。", currentCalcuItem.fmodulename, currentCalcuItem.sourcetagname, currentCalcuItem.fstarttime.ToString(), currentCalcuItem.fendtime.ToString());
                     logHelper.Error(moduleInfo);
                     string errInfo = string.Format("——警告统计序号{0}。对应时间段内没有概化数据!", warningCount.ToString());
                     logHelper.Error(errInfo);
                     //goto NEXTCalcu;
                 }
             }
         }
         CalcuData = inputs;
     }
     catch (Exception ex)
     {
         errorCount = errorCount + 1;
         errorFlag  = true;
         //tslb_CalcuErrors.Text = string.Format("{0} errors occured in calcuting!", errorCount);
         logHelper.Error("计算引擎主循环错误!");
         string moduleInfo = string.Format("——计算模块的名称是:{0},当前计算源标签是:{1},计算起始时间是:{2},计算结束时间是:{3}。", currentCalcuItem.fmodulename, currentCalcuItem.sourcetagname, currentCalcuItem.fstarttime.ToString(), currentCalcuItem.fendtime.ToString());
         logHelper.Error(moduleInfo);
         string errInfo = string.Format("——错误统计序号{0}:详细错误信息{1}", errorCount.ToString(), ex);
         logHelper.Error(errInfo);
     } //end try
 }
Esempio n. 2
0
        //开始计算
        private void bt_historyCalcu_Click(object sender, EventArgs e)
        {
            //1、选中所有的周期为秒、分、小时、天的计算类型。放入到SelectedCalcuItems中。
            foreach (PSLCalcuItem calcuitem in PslCalcuItems)
            {
                if (calcuitem.fmodulename == "MReadConst" || calcuitem.fmodulename == "MReadShift")
                {
                    continue;
                }
                else if (calcuitem.fintervaltype == "s" ||
                         calcuitem.fintervaltype == "second" ||
                         calcuitem.fintervaltype == "seconds" ||
                         calcuitem.fintervaltype == "min" ||
                         calcuitem.fintervaltype == "minute" ||
                         calcuitem.fintervaltype == "minutes" ||
                         calcuitem.fintervaltype == "h" ||
                         calcuitem.fintervaltype == "hour" ||
                         calcuitem.fintervaltype == "hours" ||
                         calcuitem.fintervaltype == "d" ||
                         calcuitem.fintervaltype == "day" ||
                         calcuitem.fintervaltype == "days"
                         )
                {
                    SelectedCalcuItems.Add(calcuitem);
                }
            }
            //2、根据SelectedCalcuItems刷新界面
            this.Initial_lv_selectedcalcu(this.SelectedCalcuItems);     //更新到计算界面

            //3、开始计算
            //防止重复点击“开始历史数据计算”按钮
            //if (FlagHistoryCalcuRunning == false)
            if (true)
            {
                FlagHistoryCalcuRunning = true;
                //计算前检查点
                //——这里检查的是实时点,但是实际上要进行历史数据计算,不一定都从实时点开始,可能从OPC点开始计算
                //——暂时不检查
                if (this.cb_CheckTags.Checked)
                {
                    RTDbHelper    rtdbhelper = new RTDbHelper();
                    string[]      tagnames   = { "", "", "" };
                    List <string> results    = rtdbhelper.CheckTags(tagnames);
                }

                //计算前检查并发计算项是否符合要求。并发计算是自动添加,无需检查


                //如果选中的计算不为0,则开始计算
                if (this.SelectedCalcuItems.Count != 0)
                {
                    //对选定窗口lv_SelectedCalcuList的样式进行设定,以便UpdateListView可以更改单元格样式
                    //后经测试,无须这两行,也可以改变行的颜色
                    //ListViewItem entryListItem = this.lv_SelectedCalcuList.Items.Add("Items");
                    //entryListItem.UseItemStyleForSubItems = false;                              //设定lv_SelectedCalcuList单元格原样式无效,以便改变颜色

                    //界面信息初始化
                    this.lb_CalcuWarnings.Text = "计算过程中发生0次报警!";
                    this.lb_CalcuErrors.Text   = "计算过程中发生0次错误!";

                    //UI线程运行历史计算主程序
                    //historyCalcu();

                    //独立与UI线程之外运行历史计算主程序
                    Thread thread = new Thread(new ThreadStart(this.historyCalcu));
                    thread.Priority = ThreadPriority.AboveNormal;
                    thread.Start();
                }
                else
                {
                    MessageBox.Show("还未选定要进行历史计算的计算项!");
                }

                FlagHistoryCalcuRunning = false;
            }
            //4、重新设定PslCalcuItems中周期为周、月、年的计算对象到起始时刻之前。这样在重启实时计算后,这些并发计算算不了的长周期计算项,将在实时计算中重算。

            //5、根据界面选项,重置周期为秒、分、小时、天的计算对象的起始时刻到重算的截止时候。
        }