/// <summary> /// hour avg value calculation--month /// </summary> /// <param name="st"></param> /// <param name="et"></param> public void HourAvgValue_Month(DateTime st, DateTime et, EPASync.ComparerEngine ce) { //get raw data from machine_startstop_reversed for start stop span then deal with these rds //[machineid],[starttime],[endtime],[grouptype] //with these rds, get pi avg value DataSet mrunningrd = (new SQLPart()).GetRelatedMachineRunningRd(st, et); if (mrunningrd != null) { foreach (DataRow dr in mrunningrd.Tables[0].Rows) { List<StartEndPair> sepl = GetStartEndPair_Month(DateTime.Parse(dr["starttime"].ToString()), DateTime.Parse(dr["endtime"].ToString())); if (sepl != null) { foreach (StartEndPair sep in sepl) { if ((sep.StartTime <= et) && (sep.StartTime >= st)) { // add biz logic if ((dr["grouptype"].ToString() == "") && (sep == sepl.Last())) { continue; } DataSet pointsofmachine = (new SQLPart()).GetPointsOfMachine_avg(int.Parse(dr["machineid"].ToString())); if (pointsofmachine != null) { foreach (DataRow dr2 in pointsofmachine.Tables[0].Rows) { double? avgvalue = (new PIAvgData()).GetAvgValue(dr2["pointname"].ToString(), sep.StartTime, sep.EndTime, int.Parse(dr2["shiftsecs"].ToString())); //if it is null, check whether destination set has the related rd, if it has, delete it from destination set to avoid synchronizing if (avgvalue == null) { if (ce.hal_dst.Where(i => i.pointname == dr2["pointname"].ToString() && i.starttime == sep.StartTime && i.endtime == sep.EndTime).Count() > 0) { ce.hal_dst.RemoveAll(i => i.pointname == dr2["pointname"].ToString() && i.starttime == sep.StartTime && i.endtime == sep.EndTime); } } else { ce.AddToHal(dr2["pointname"].ToString(), sep.StartTime, sep.EndTime, (double)avgvalue); } } } } } } } } }
/// <summary> /// machine stop span month statistic /// </summary> /// <param name="st"></param> /// <param name="et"></param> public void MachineStopStatistic_Month(DateTime st, DateTime et, EPASync.ComparerEngine ce) { //get raw data from machine_startstop then deal with these rds //[pointname],[starttime],[endtime],[grouptype] DataSet mstoprd = (new SQLPart()).GetRelatedMachineStopRd(st, et); if (mstoprd != null) { foreach (DataRow dr in mstoprd.Tables[0].Rows) { //Get span for monthly biz List<StartEndPair> sepl = GetStartEndPair_Month(DateTime.Parse(dr["starttime"].ToString()), DateTime.Parse(dr["endtime"].ToString())); if (sepl != null) { foreach (StartEndPair sep in sepl) { //if the span is between the seach area if ((sep.StartTime <= et) && (sep.StartTime >= st)) { //if it has undetermined condition, jump over the last rd if ((dr["grouptype"].ToString() == "") && (sep == sepl.Last())) { continue; } ce.AddToMsl(dr["pointname"].ToString(), sep.StartTime, sep.EndTime); } } } } } }
/// <summary> /// /// </summary> /// <param name="st"></param> /// <param name="et"></param> /// <param name="ce"></param> public void HourAvgValue_ForFurnace_Web(DateTime st, DateTime et, EPASync.ComparerEngine ce) { DataSet frunningrd = (new SQLPart()).GetRelatedFurnaceRunningRd(st, et); List<string> output_web_config = LoadOutputWebConfig(); if (frunningrd != null) { foreach (DataRow dr in frunningrd.Tables[0].Rows) { List<StartEndPair> sepl = GetStartEndPair_Hour(DateTime.Parse(dr["starttime"].ToString()), DateTime.Parse(dr["endtime"].ToString())); if (sepl != null) { foreach (StartEndPair sep in sepl) { if ((sep.StartTime <= et) && (sep.StartTime >= st)) { // add biz logic if ((dr["grouptype"].ToString() == "") && (sep == sepl.Last())) { continue; } if ((output_web_config != null)&&(output_web_config.Count>0)) { foreach (string c in output_web_config) { if (int.Parse(c.Split(',')[1]) == int.Parse(dr["machineid"].ToString())) { DataSet ds = (new SQLPart()).GetSingleAvgRd_Web(c.Split(',')[1], c.Split(',')[2], DateTime.Parse(sep.StartTime.ToString("yyyy-MM-dd HH:00:00"))); if (ds != null && ds.Tables[0].Rows.Count > 0) { double? avgvalue = double.Parse(ds.Tables[0].Rows[0][0].ToString()); //if it is null, check whether destination set has the related rd, if it has, delete it from destination set to avoid synchronizing if (avgvalue == null) { if (ce.par_otw_dst.Where(i => i.pname == c.Split(',')[0].ToString() && i.timestamps == DateTime.Parse(sep.StartTime.ToString("yyyy-MM-dd HH:00:00"))).Count() > 0) { ce.par_otw_dst.RemoveAll(i => i.pname == c.Split(',')[0].ToString() && i.timestamps == DateTime.Parse(sep.StartTime.ToString("yyyy-MM-dd HH:00:00"))); } } else { ce.AddToPar_otwls(c.Split(',')[0].ToString(), DateTime.Parse(sep.StartTime.ToString("yyyy-MM-dd HH:00:00")), (double)avgvalue); } } } } } } } } } } }
/// <summary> /// /// </summary> /// <param name="st"></param> /// <param name="et"></param> /// <param name="ce"></param> public void HourAvgValue_ForFurnace_Web_Parallel(DateTime st, DateTime et, EPASync.ComparerEngine ce) { DateTime[] dt_a = EPASync.CocurrencyT.GetAppropriateTimeArray(st, et); Parallel.Invoke( () => HourAvgValue_ForFurnace_Web_1(dt_a[0], dt_a[1], ce), () => HourAvgValue_ForFurnace_Web_2(dt_a[2], dt_a[3], ce), () => HourAvgValue_ForFurnace_Web_3(dt_a[4], dt_a[5], ce), () => HourAvgValue_ForFurnace_Web_4(dt_a[6], dt_a[7], ce) ); }
/// <summary> /// /// </summary> /// <param name="st"></param> /// <param name="et"></param> /// <param name="ce"></param> public void HourAvgValue_ForFurnace(DateTime st, DateTime et, EPASync.ComparerEngine ce) { DataSet frunningrd = (new SQLPart()).GetRelatedFurnaceRunningRd(st, et); if (frunningrd != null) { foreach (DataRow dr in frunningrd.Tables[0].Rows) { List<StartEndPair> sepl = GetStartEndPair_Hour(DateTime.Parse(dr["starttime"].ToString()), DateTime.Parse(dr["endtime"].ToString())); if (sepl != null) { foreach (StartEndPair sep in sepl) { if ((sep.StartTime <= et) && (sep.StartTime >= st)) { // add biz logic if ((dr["grouptype"].ToString() == "") && (sep == sepl.Last())) { continue; } DataSet pointsofmachine = (new SQLPart()).GetPIAvgPoints(); if (pointsofmachine != null) { foreach (DataRow dr2 in pointsofmachine.Tables[0].Rows) { if (int.Parse(dr2["machineid"].ToString()) == int.Parse(dr["machineid"].ToString())) { double? avgvalue = (new PIAvgData()).GetAvgValue(dr2["pointname"].ToString(), sep.StartTime, sep.EndTime, 0); //if it is null, check whether destination set has the related rd, if it has, delete it from destination set to avoid synchronizing if (avgvalue == null) { if (ce.par_ot_dst.Where(i => i.pname == dr2["pointname"].ToString() && i.timestamps == DateTime.Parse(sep.StartTime.ToString("yyyy-MM-dd HH:00:00"))).Count() > 0) { ce.par_ot_dst.RemoveAll(i => i.pname == dr2["pointname"].ToString() && i.timestamps == DateTime.Parse(sep.StartTime.ToString("yyyy-MM-dd HH:00:00"))); } } else { ce.AddToPar_otls(dr2["pointname"].ToString(), DateTime.Parse(sep.StartTime.ToString("yyyy-MM-dd HH:00:00")), (double)avgvalue); } } } } } } } } } }
/// <summary> /// 标定时间区间业务, sync mode /// </summary> /// <param name="st"></param> /// <param name="et"></param> public void CalibSpanBiz_Sync(DateTime st, DateTime et, EPASync.ComparerEngine ce) { DataSet calibpoints; calibpoints = (new SQLPart()).GetCalibPoints(); if (calibpoints != null) { DataSet calibends; foreach (DataRow dr in calibpoints.Tables[0].Rows) { calibends = (new SQLPart()).GetCalibEndRds(dr["pointname"].ToString(), st, et); if (calibends != null) { DataSet firstbegin; foreach (DataRow dr2 in calibends.Tables[0].Rows) { firstbegin = (new SQLPart()).GetFirstCalibBeginRd(dr2["rulename"].ToString(), DateTime.Parse(dr2["timelog"].ToString())); if (firstbegin != null) { foreach (DataRow dr3 in firstbegin.Tables[0].Rows) { //(new SQLPart()).AddCalibSpanRd(dr2["rulename"].ToString(), DateTime.Parse(dr3["timelog"].ToString()), DateTime.Parse(dr2["timelog"].ToString())); ce.AddToCrl2(dr2["rulename"].ToString(), DateTime.Parse(dr3["timelog"].ToString()), DateTime.Parse(dr2["timelog"].ToString())); } } } } } } }
/// <summary> /// 标定规则值业务, sync mode /// </summary> /// <param name="st"></param> /// <param name="et"></param> public void CalibRuleValueBiz_Sync(DateTime st, DateTime et, EPASync.ComparerEngine ce) { DataSet calibpoints; calibpoints = (new SQLPart()).GetCalibPoints(); DateTime tempdt; if (calibpoints != null) { //biz for foreintersect,backintersect,inside DataSet calibspans; foreach (DataRow dr in calibpoints.Tables[0].Rows) { tempdt = st; List<SingleSpanInfo> ssis = new List<SingleSpanInfo>(); while (tempdt < et) { ssis.Clear(); SingleSpanInfo ssi = new SingleSpanInfo() { st = tempdt, et = tempdt.AddHours(1.0), spanavg = null }; ssis.Add(ssi); //Outside calibspans = (new SQLPart()).GetRelatedSpans(dr["pointname"].ToString(), tempdt, tempdt.AddHours(1.0), RelatedType.OutSide); if (calibspans != null) { if (calibspans.Tables[0].Rows.Count > 0) { tempdt = tempdt.AddHours(1); continue; } } //Fore calibspans = (new SQLPart()).GetRelatedSpans(dr["pointname"].ToString(), tempdt, tempdt.AddHours(1.0), RelatedType.ForeIntersect); if (calibspans != null) { foreach (DataRow dr2 in calibspans.Tables[0].Rows) { //如果span的结束时间>ssis[0]的开始时间,则用此结束时间替换ssis[0]的开始时间 if (DateTime.Parse(dr2["endtime"].ToString()) > ssis[0].st) { ssis[0].st = DateTime.Parse(dr2["endtime"].ToString()); } } } //Back calibspans = (new SQLPart()).GetRelatedSpans(dr["pointname"].ToString(), tempdt, tempdt.AddHours(1.0), RelatedType.BackIntersect); if (calibspans != null) { foreach (DataRow dr2 in calibspans.Tables[0].Rows) { //如果span的开始时间<ssis[0]的结束时间,则用此开始时间替换ssis[0]的结束时间 if (DateTime.Parse(dr2["starttime"].ToString()) < ssis[0].et) { ssis[0].et = DateTime.Parse(dr2["starttime"].ToString()); } } } //Inside calibspans = (new SQLPart()).GetRelatedSpans(dr["pointname"].ToString(), tempdt, tempdt.AddHours(1.0), RelatedType.Inside); if (calibspans != null) { foreach (DataRow dr2 in calibspans.Tables[0].Rows) { foreach (SingleSpanInfo s in ssis) { // 查看s的时间区间是否覆盖span区间,如果是,则调整当前区间,并加入新的区间 if ((DateTime.Parse(dr2["starttime"].ToString()) >= s.st) && (DateTime.Parse(dr2["endtime"].ToString()) <= s.et)) { DateTime temp = s.et; s.et = DateTime.Parse(dr2["starttime"].ToString()); SingleSpanInfo ssin = new SingleSpanInfo() { st = DateTime.Parse(dr2["endtime"].ToString()), et = temp, spanavg = null }; ssis.Add(ssin); break; } if ((DateTime.Parse(dr2["starttime"].ToString()) <= s.st) && (DateTime.Parse(dr2["endtime"].ToString()) > s.st)) { s.st = DateTime.Parse(dr2["endtime"].ToString()); } } } } //从PI中获取相应的均值 int totalmins = 0; double avg = 0; //如果没有span存在 if ((ssis.Count == 1) && (ssis[0].st == tempdt) && (ssis[0].et == tempdt.AddHours(1.0))) { //do nothing } //add rd into calibavg table else { foreach (SingleSpanInfo s in ssis) { totalmins += (int)(s.et - s.st).TotalMinutes; //s.spanavg = (new PI.PIFunc2(null, null, null)).GetAverageValue(dr["pointname"].ToString(), s.st, s.et); s.spanavg = (new PIAvgData()).GetAvgValue(dr["pointname"].ToString(), s.st, s.et, 0/*int.Parse(dr["shiftsecs"].ToString())*/); } //计算该小时的均值 if (totalmins != 0) { foreach (SingleSpanInfo s in ssis) { if (s.spanavg != null) { avg += (double)s.spanavg * ((s.et - s.st).TotalMinutes / totalmins); } } } //(new SQLPart()).AddCalibAvgRd(dr["pointname"].ToString(), tempdt, avg, totalmins); ce.AddToCrvl2(dr["pointname"].ToString(), tempdt, avg, totalmins); } tempdt = tempdt.AddHours(1.0); } } } }
/// <summary> /// 标定规则值业务--outside span情形, sync mode /// </summary> /// <param name="st"></param> /// <param name="et"></param> public void CalibRuleValueBiz_Outside_Sync(DateTime st, DateTime et, EPASync.ComparerEngine ce) { DataSet calibpoints; calibpoints = (new SQLPart()).GetCalibPoints(); DateTime tempdt; if (calibpoints != null) { DataSet calibspans; //biz for outside foreach (DataRow dr in calibpoints.Tables[0].Rows) { tempdt = st.AddHours(-3.0); List<SingleSpanInfo> ssis = new List<SingleSpanInfo>(); while (tempdt < et.AddHours(-3.0)) { ssis.Clear(); //Outside calibspans = (new SQLPart()).GetRelatedSpans(dr["pointname"].ToString(), tempdt, tempdt.AddHours(1.0), RelatedType.OutSide); if (calibspans != null) { foreach (DataRow dr2 in calibspans.Tables[0].Rows) { //如果标定开始为整点时间,则需要向前推一个小时 if ((DateTime.Parse(dr2["starttime"].ToString()).Minute == 0) && (DateTime.Parse(dr2["starttime"].ToString()).Second == 0)) { //starttime 需要整点时间 SingleSpanInfo ssi = new SingleSpanInfo() { st = DateTime.Parse(DateTime.Parse(dr2["starttime"].ToString()).ToString("yyyy-MM-dd HH:00:00")).AddHours(-1.0), et = DateTime.Parse(DateTime.Parse(dr2["starttime"].ToString()).ToString("yyyy-MM-dd HH:00:00")).AddHours(-1.0).AddHours(1.0), spanavg = null }; ssis.Add(ssi); } else { //starttime 需要整点时间 SingleSpanInfo ssi = new SingleSpanInfo() { st = DateTime.Parse(DateTime.Parse(dr2["starttime"].ToString()).ToString("yyyy-MM-dd HH:00:00")), et = DateTime.Parse(DateTime.Parse(dr2["starttime"].ToString()).ToString("yyyy-MM-dd HH:00:00")).AddHours(1.0), spanavg = null }; ssis.Add(ssi); } //endtime 需要整点时间 SingleSpanInfo ssi2 = new SingleSpanInfo() { st = DateTime.Parse(DateTime.Parse(dr2["endtime"].ToString()).ToString("yyyy-MM-dd HH:00:00")), et = DateTime.Parse(DateTime.Parse(dr2["endtime"].ToString()).ToString("yyyy-MM-dd HH:00:00")).AddHours(1.0), spanavg = null }; ssis.Add(ssi2); } bool canbecalculated = false; foreach (SingleSpanInfo s in ssis) { if ((new SQLPart()).IsCalibAvgRdExisted(dr["pointname"].ToString(), s.st) == true) { //canbecalculated = true; DataSet sav = (new SQLPart()).GetSingleCalibAvgRd(dr["pointname"].ToString(), s.st); if (sav != null) { foreach (DataRow dr5 in sav.Tables[0].Rows) { s.et = s.st.AddMinutes(int.Parse(dr5["actualminutes"].ToString())); s.spanavg = double.Parse(dr5["pvalue"].ToString()); } canbecalculated = true; } } else if ((new SQLPart()).IsAvgRdExisted(dr["pointname"].ToString(), s.st) == true) { //canbecalculated = true; DataSet sav = (new SQLPart()).GetSingleAvgRd(dr["pointname"].ToString(), s.st); if (sav != null) { foreach (DataRow dr5 in sav.Tables[0].Rows) { s.et = s.st.AddHours(1.0); s.spanavg = double.Parse(dr5["pvalue"].ToString()); } canbecalculated = true; } } else { canbecalculated = false; break; } } //如果可被计算 if (canbecalculated == true) { if ((ssis[0].spanavg != null) || (ssis[1].spanavg != null)) { //add rd into calibavg table //(new SQLPart()).AddCalibAvgRd(dr["pointname"].ToString(), tempdt, (double)(ssis[0].spanavg + ssis[1].spanavg) / 2, 0); ce.AddToCrvl2(dr["pointname"].ToString(), tempdt, (double)(ssis[0].spanavg + ssis[1].spanavg) / 2, 0); } } } tempdt = tempdt.AddHours(1.0); } } } }
/// <summary> /// async running /// </summary> /// <param name="st"></param> /// <param name="et"></param> public void RunningAsync_Month(DateTime st, DateTime et, EPASync.ComparerEngine ce) { //get raw data from SCR_StartStop_Outlet_async then deal with these rds //[machineid],[pointname],[ts1],[ts2],[scrgrouptype],[machinegrouptype],[src] DataSet asyncrd = (new SQLPart()).GetRelatedAsyncRd(st, et); if (asyncrd != null) { foreach (DataRow dr in asyncrd.Tables[0].Rows) { //find appropriate rds if (!((int.Parse(dr["src"].ToString()) == 2) && (dr["machinegrouptype"].ToString() == ""))) { //Get span for monthly biz List<StartEndPair> sepl = GetStartEndPair_Month(DateTime.Parse(dr["ts1"].ToString()), DateTime.Parse(dr["ts2"].ToString())); if (sepl != null) { foreach (StartEndPair sep in sepl) { //if the span is between the seach area if ((sep.StartTime <= et) && (sep.StartTime >= st)) { if ((dr["scrgrouptype"].ToString() == "") && (sep == sepl.Last()) && (int.Parse(dr["src"].ToString()) == 3)) { continue; } ce.AddToAscrl(dr["pointname"].ToString(), sep.StartTime, sep.EndTime); } } } } } } }