GetPLC_Data/ConsoleGetPLCData/CS/ScCal.cs
2025-11-08 08:17:36 +08:00

283 lines
11 KiB
C#

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;
}
}
}