using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading; using GetData_PLC; namespace ConsoleGetPLCData.CS { class ScCal { string strError=""; public void ZhanXianScCal() //通过selcet语句从 oracle 输差配置读取站内所有输差类型 ,再分系统计算输差 { Thread .Sleep (2000); ProgramGetData.strAppend( DateTime.Now.ToString() + "------开始计算输差"); while (true) { DataSet dsSsData = new DataSet(); ; DataTable dtTotal = new DataTable(); dtTotal.TableName = "TotalData"; try { dsSsData.ReadXml(ProgramGetData.strDataPath + "SsData.xml", XmlReadMode.ReadSchema); for (int i = 0; i < dsSsData.Tables.Count; i++) //构建出实时数据总表 { dtTotal.Merge(dsSsData.Tables[i].Copy()); } dtTotal.WriteXml(ProgramGetData.strDataPath + "TotalData.xml",XmlWriteMode .WriteSchema); if (dtTotal.Rows.Count > 0) { for (int i = 0; i < ProgramGetData.dtScRealTime.Rows.Count; i++) { Thread.Sleep(10); //暂停10毫秒 释放资源 ScDataCal(ProgramGetData.dtScRealTime.Rows[i], dtTotal); } ProgramGetData.dtScRealTime.WriteXml(ProgramGetData.strDataPath + "ScData.xml", XmlWriteMode.WriteSchema); DataRow[] drScRealTime = ProgramGetData.dtScRealTime.Select("sctype='管线输差'"); //写线输差xml DataTable dtScTemp = ProgramGetData.dtScRealTime.Clone(); for (int mm = 0; mm < drScRealTime.Length; mm++) { DataRow dr = dtScTemp.NewRow(); dr.ItemArray = drScRealTime[mm].ItemArray; dtScTemp.Rows.Add(dr); } dtScTemp.WriteXml(ProgramGetData.strDataPath + "\\ScData\\XIANSC.xml", XmlWriteMode.WriteSchema); drScRealTime = ProgramGetData.dtScRealTime.Select("sctype='站场输差'"); //写线输差xml dtScTemp = ProgramGetData.dtScRealTime.Clone(); for (int mm = 0; mm < drScRealTime.Length; mm++) { DataRow dr = dtScTemp.NewRow(); dr.ItemArray = drScRealTime[mm].ItemArray; dtScTemp.Rows.Add(dr); } dtScTemp.WriteXml(ProgramGetData.strDataPath + "\\ScData\\ZHANSC.xml", XmlWriteMode.WriteSchema); drScRealTime = ProgramGetData.dtScRealTime.Select("sctype='自定义输差'"); //写线输差xml dtScTemp = ProgramGetData.dtScRealTime.Clone(); for (int mm = 0; mm < drScRealTime.Length; mm++) { DataRow dr = dtScTemp.NewRow(); dr.ItemArray = drScRealTime[mm].ItemArray; dtScTemp.Rows.Add(dr); } dtScTemp.WriteXml(ProgramGetData.strDataPath + "\\ScData\\ZDYSC.xml", XmlWriteMode.WriteSchema); //drScRealTime = ProgramGetData.dtScRealTime.Select("sctype='管线输差' and DEPT_ID='14'"); //巡线一支队 //dtScTemp = ProgramGetData.dtScRealTime.Clone(); //for (int mm = 0; mm < drScRealTime.Length; mm++) //{ // DataRow dr = dtScTemp.NewRow(); // dr.ItemArray = drScRealTime[mm].ItemArray; // dtScTemp.Rows.Add(dr); //} //dtScTemp.WriteXml(ProgramGetData.strDataPath + "\\ScData\\14.xml", XmlWriteMode.WriteSchema); } } catch (SystemException err) { if (err.Message != null) { ProgramGetData.strAppend( DateTime.Now.ToString() + "------输差计算读取总表格xml时 文件占用"); } } Thread.Sleep(1799); } } private void ScDataCal(DataRow _DataRow, DataTable dtTotalData) { try { //_ScDataTable.Rows.Clear(); string strInJLD = _DataRow["IN_JLD_ID"].ToString(); string strOutJLD = _DataRow["OUT_JLD_ID"].ToString(); string strScType = _DataRow["SCTYPE"].ToString(); string Express = ""; Single SsSumIn = 0; Single JrSumIn = 0; Single ZrSumIn = 0; Single SsSumOut = 0; Single JrSumOut = 0; Single ZrSumOut = 0; string strIn_P = ""; string strOut_P = ""; if (strInJLD != "") { Express = "ID in(" + strInJLD + ")"; DataRow[] SumRow = dtTotalData.Select(Express); if (SumRow.Length >= 0) { SsSumIn = 0; JrSumIn = 0; ZrSumIn = 0; SsSumIn = sumColumon(SumRow, "SSL"); JrSumIn = sumColumon(SumRow, "JRL"); ZrSumIn = sumColumon(SumRow, "ZRL"); if (strScType == "管线输差") { for (int m = 0; m < SumRow.Length; m++) { strIn_P = strIn_P + SumRow[m]["YL"].ToString() + "★"; } if (strIn_P.Length > 0) strIn_P = strIn_P.Substring(0, strIn_P.Length - 1); } } else { SsSumIn = 0; JrSumIn = 0; ZrSumIn = 0; strIn_P = ""; } } if (strOutJLD != "") { Express = "ID in(" + strOutJLD + ")"; DataRow[] SumRow = dtTotalData.Select(Express); if (SumRow.Length >= 0) { SsSumOut = 0; JrSumOut = 0; ZrSumOut = 0; SsSumOut = sumColumon(SumRow, "SSL"); JrSumOut = sumColumon(SumRow, "JRL"); ZrSumOut = sumColumon(SumRow, "ZRL"); if (strScType == "管线输差") { for (int m = 0; m < SumRow.Length; m++) { strOut_P = strOut_P + SumRow[m]["YL"].ToString() + "★"; } if (strOut_P.Length > 0) strOut_P = strOut_P.Substring(0, strOut_P.Length - 1); } } else { SsSumOut = 0; JrSumOut = 0; ZrSumOut = 0; strOut_P = ""; } } _DataRow["IN_P"] =strIn_P ; _DataRow["OUT_P"] = strOut_P ; _DataRow["SsInTotal"] = SsSumIn.ToString("0.####"); _DataRow["SsOutTotal"] = SsSumOut.ToString("0.###"); _DataRow["SsSc"] = (SsSumOut - SsSumIn).ToString("0.####"); if (SsSumIn != 0) { _DataRow["SsPer"] = ((SsSumOut - SsSumIn) * 100 / SsSumIn).ToString("0.##") + "%"; } else { if (SsSumOut == 0) { _DataRow["SsSc"] = "0"; _DataRow["SsPer"] = "0%"; } else { _DataRow["SsPer"] = "故障"; } } _DataRow["JrInTotal"] = JrSumIn.ToString("0.####"); _DataRow["JrOutTotal"] = JrSumOut.ToString("0.###"); _DataRow["JrSc"] = (JrSumOut - JrSumIn).ToString("0.####"); if (JrSumIn != 0) { _DataRow["JrPer"] = ((JrSumOut - JrSumIn) * 100 / JrSumIn).ToString("0.##") + "%"; } else { if (JrSumOut == 0) { _DataRow["JrSc"] = "0"; _DataRow["JrPer"] = "0%"; } else { _DataRow["JrPer"] = "故障"; } } _DataRow["ZrInTotal"] = ZrSumIn.ToString("0.####"); _DataRow["ZrOutTotal"] = ZrSumOut.ToString("0.###"); _DataRow["ZrSc"] = (ZrSumOut - ZrSumIn).ToString("0.####"); if (ZrSumIn != 0) { _DataRow["ZrPer"] = ((ZrSumOut - ZrSumIn) * 100 / ZrSumIn).ToString("0.##") + "%"; } else { if (ZrSumOut == 0) { _DataRow["ZrSc"] = "0"; _DataRow["ZrPer"] = "0%"; } else { _DataRow["ZrPer"] = "故障"; } } } catch (SystemException err) { if (err.Message != null) { ProgramGetData . strAppend( DateTime.Now.ToString() + "------" + "输差计算时出错"); } } } private float sumColumon(DataRow[] _DataRow, string _ColumonName) { float FlowSum = 0; foreach (DataRow Dr1 in _DataRow) { try { FlowSum = FlowSum + float.Parse(Dr1[_ColumonName].ToString()); } catch (SystemException err) { if (err.Message != "") { continue; } } } return FlowSum; } } }