//读取计算数据 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 }
//开始计算 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、根据界面选项,重置周期为秒、分、小时、天的计算对象的起始时刻到重算的截止时候。 }