using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using GetData_PLC; using ConsoleGetPLCData.CS; using System.Net; namespace ConsoleGetPLCData { public struct stStation { public string ip; public int port; public string ZCID; public int readDiffTime; public string strError; public string ZCName; public string MeterTYPE; public string NetTYPE; } class ProgramGetData { public static DataSet dsJLDataRealTime = new DataSet(); //实时采集数据集 public static DataSet dsPparameter = new DataSet(); //站场参数数据集 public static DataTable dtScRealTime = new DataTable(); // 实时输差数据集 public static DataSet dsZhanDateTime = new DataSet(); // 实时PLC时间 public static DataTable dtZhan = new DataTable(); //站场数据集 public static DataTable dtZhanNet = new DataTable(); //局域网站场数据集 public static DataTable dtZhanGPRS = new DataTable(); //GPRS站场数据集 public static string strAPPDataPath = Environment.CurrentDirectory + @"\Data\"; //采集程序路径 public static string strParPath = strAPPDataPath + @"par\"; //计量参数文件存储路径 public static string strConfigPath = strAPPDataPath + @"Config\"; //采集程序参数保存路径 public static string strDataPath = strAPPDataPath + @"RealTime\"; //实时数据存储路径 public static string strDataPath_JlData = strDataPath + @"JlData\"; //分站计量实时数据存储路径 public static string strDataPath_ScData = strDataPath + @"ScData\"; //输差数据XML存储文件夹 public static string strDataPath_DataTime = strDataPath + @"DateTime\"; //分站时间xml存储文件夹 public static string strDataPath_Log = strDataPath + @"Log\"; //日志存储文件夹 //log 日志存放数据 public static string strLogPath = strDataPath + @"log\" + DateTime.Now.Year.ToString() + "-" + DateTime.Now.Month.ToString() + "-" + DateTime.Now.Day.ToString() + "_log.txt"; public static string strLogPath_Data = strDataPath + @"log\" + DateTime.Now.Year.ToString() + "-" + DateTime.Now.Month.ToString() + "-" + DateTime.Now.Day.ToString() + "_Datalog_"; private string strErr = ""; private string strSQL = ""; public static bool blWriteParXMLFlag; private Thread[] GetPLCDataThread; Dictionary ThreadDictionary = new Dictionary(); static void Main(string[] args) { strAppend(DateTime.Now.ToString() + "------启动实时采集程序!"); System.IO.Directory.CreateDirectory(strAPPDataPath); //Data文件夹 System.IO.Directory.CreateDirectory(strParPath); //Data\par文件夹 System.IO.Directory.CreateDirectory(strDataPath); //Data\realtime文件夹 System.IO.Directory.CreateDirectory(strConfigPath); //Data\realtime文件夹 System.IO.Directory.CreateDirectory(strDataPath_JlData + "JSON\\"); //分站xml存储文件夹 System.IO.Directory.CreateDirectory(strDataPath_ScData); //输差数据XML存储文件夹 System.IO.Directory.CreateDirectory(strDataPath_DataTime);//分站时间xml存储文件夹 System.IO.Directory.CreateDirectory(strDataPath_Log); //日志存储文件夹 FileInfo fi = new FileInfo(ProgramGetData.strLogPath); if (fi.Exists == false) { File.CreateText(ProgramGetData.strLogPath); } ProgramGetData objPLC = new ProgramGetData(); objPLC.InitialTalbe();// 初始化采集相关表格 Thread.Sleep(5000); //objPLC.GetPLCDataStart(); objPLC.GetGPRSStart(); objPLC.GetNetStart(); Thread.Sleep(3000); strAppend(DateTime.Now.ToString() + "------启动输差实时计算线程!"); objPLC.ScCal();//启动输差实时计算 Thread.Sleep(3000); objPLC.SaveXML();//启动保存xml线程 Console.ReadKey(); } private void SaveXML() //输差计算 { //保存实时数据到xml Thread th = new Thread(SaveXML_ReadPar); th.Start(); } private void ScCal() //输差计算 { ScCal newSccal = new ScCal(); Thread ScThread = new Thread(new ThreadStart(newSccal.ZhanXianScCal)); ScThread.Start(); strAppend(DateTime.Now.ToString() + "------启动输差实时计算线程---完成!"); } /// /// 向IP端口发json /// /// /// /// public static string HttpWebRequestPost(string url, string param) { HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url); Encoding encoding = Encoding.UTF8; byte[] byteArray = Encoding.ASCII.GetBytes(param); string responseData = String.Empty; req.Method = "POST"; req.ContentType = "application/x-www-form-urlencoded"; req.ContentLength = byteArray.Length; using (Stream reqStream = req.GetRequestStream()) { reqStream.Write(byteArray, 0, byteArray.Length); } using (HttpWebResponse response = (HttpWebResponse)req.GetResponse()) { using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding)) { responseData = reader.ReadToEnd(); } return responseData; } } public string HttpWebRequestGet(string url, string param) { param = param.IndexOf('?') > -1 ? (param) : ("?" + param); HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url + param); Encoding encoding = Encoding.UTF8; string responseData = String.Empty; req.Method = "GET"; using (HttpWebResponse response = (HttpWebResponse)req.GetResponse()) { using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding)) { responseData = reader.ReadToEnd(); } return responseData; } } /// /// 实时保存采集的数据到XML文件,监控是否有读取计量点参数的命令 /// private void SaveXML_ReadPar() { while (true) { #region 保存实时采集数据 XML string name = strDataPath + "SsData.xml"; try { dsJLDataRealTime.WriteXml(name, XmlWriteMode.WriteSchema);//保存所有站场实时采集的计量数据集 dsZhanDateTime.WriteXml(strDataPath + "dtTime.xml", XmlWriteMode.WriteSchema);//保存所有站场实时采集的时钟数据集 string strTotalJson = "{"; int ii = 0; foreach (DataTable dtTemp in dsJLDataRealTime.Tables) //分站保存所有站场实时采集的计量数据集 { string strID = dtTemp.TableName; dtTemp.WriteXml(strDataPath_JlData + dtTemp.TableName + ".xml", XmlWriteMode.WriteSchema); try { string json = DataTableToJson(dtTemp, dsZhanDateTime.Tables[strID], strID); strTotalJson += "\"" + dtTemp.TableName + "\":" + json + ","; File.WriteAllText(strDataPath_JlData + "\\JSON\\" + dtTemp.TableName + ".json", json); } catch (Exception ex) { } //ii += 1; //if (ii > 6) //{ // break; //} } strTotalJson = strTotalJson.TrimEnd(',') + "}"; //HttpWebRequestPost("Http://10.75.166.59:8081", strTotalJson); File.WriteAllText(strDataPath_JlData + "\\JSON\\" + "Total.json", strTotalJson); foreach (DataTable dtTemp in dsZhanDateTime.Tables)//分站保存所有站场实时采集的时钟数据集 { dtTemp.WriteXml(strDataPath_DataTime + dtTemp.TableName + ".xml", XmlWriteMode.WriteSchema); } if (blWriteParXMLFlag) //分站保存计量点参数数据集 { foreach (DataTable dtTemp in dsPparameter.Tables) { dtTemp.WriteXml(strParPath + dtTemp.TableName + ".xml", XmlWriteMode.WriteSchema); } blWriteParXMLFlag = false; } //Console.WriteLine("。。。。。保存实时数据,PLC时间,计量点参数到xml!"); } catch (SystemException err) { if (err.Message != null) { //strErr = "注意:" + DateTime.Now + "保存到实时数据到xml出错" + err.Message + err.StackTrace.Substring(err.StackTrace.LastIndexOf("行号") - 1) + "\r\n"; } } #endregion #region 读取参数 try { ; //从数据库中查询出所有站场的名称和站场ID//返回不带重复记录的站场ID表格 DataTable dtReadFlag = OracleLink.ExecuteDataTable(SQL_Strings.strReadParFlag + " and readparflag='1'", "JLXT", strErr); if (dtReadFlag.Rows.Count > 0) { foreach (DataRow drFlag in dtReadFlag.Rows) { string strTempZCID = drFlag["STATION_NAME"].ToString(); string strTempJLD_ID = drFlag["JLD_ID"].ToString(); DataRow[] drJldPar = dsJLDataRealTime.Tables[strTempZCID].Select("jld_id='" + strTempJLD_ID + "'"); drJldPar[0]["readparflag"] = "1"; blWriteParXMLFlag = true; string SQL = "update RV2_BASEINFO set readparflag='' where xh='" + drFlag["ID"] + "'"; OracleLink.ExecuteNonQuery(SQL, "JLXT", strErr); } } //启动或停止某个站的线程 try { string strQuery = "select * from control"; //从数据库中查询出所有站场的名称和站场ID//返回不带重复记录的站场ID表格 string RestartFlag = ""; DataTable ReadFlagTable = OracleLink.ExecuteDataTable(strQuery, "DTJK", ""); RestartFlag = ReadFlagTable.Rows[0]["ThreadRestartFlag"].ToString(); string zcid = ReadFlagTable.Rows[0]["Thread_ZCID"].ToString(); if (RestartFlag == "1") { ThreadDictionary[zcid].Abort(); dtJldList(zcid); strQuery = "update control set ThreadRestartFlag='0',Thread_ZCID='' where id=1 "; //从数据库中查询出所有站场的名称和站场ID//返回不带重复记录的站场ID表格 OracleLink.ExecuteNonQuery(strQuery, "DTJK", strErr); GetPLCDataStart(zcid); } } catch { } //同步PLC时间 DataTable dtTBTime = OracleLink.ExecuteDataTable(SQL_Strings.strSQLZhan + " and TBTime='1'", "JLXT", strErr); if (dtTBTime.Rows.Count > 0) { foreach (DataRow drFlag in dtTBTime.Rows) { string strTempZCID = drFlag["ID"].ToString(); dsZhanDateTime.Tables[strTempZCID].Rows[0]["TongBuFlag"] = "同步"; string SQL = "update 集输站场 set TBTime='' where ID='" + strTempZCID + "'"; OracleLink.ExecuteNonQuery(SQL, "JLXT", strErr); } } } catch { } #endregion Thread.Sleep(1111); } } /// /// 启动各站数据采集线程 /// private void GetPLCDataStart() //启动各站数据采集线程 { //int ThreadNum = dtZhan.Rows.Count; //GetDataThread[] arrayThread; //GetPLCDataThread = new Thread[ThreadNum]; //arrayThread = new GetDataThread[ThreadNum]; try { int ThreadNum = dtZhan.Rows.Count; GetDataThread[] arrayThread; GetPLCDataThread = new Thread[ThreadNum]; arrayThread = new GetDataThread[ThreadNum]; for (int i = 0; i < ThreadNum; i++) { string ZCID = dtZhan.Rows[i]["ORG_ID"].ToString(); if (dsJLDataRealTime.Tables[ZCID].Rows.Count > 0) { //if (dtZhan.Rows[i]["PORT"].ToString() == "1512") { //if (ZCID.Split('_').Length > 1) { try { stStation Station = new stStation(); Station.ZCID = dtZhan.Rows[i]["ORG_ID"].ToString(); Station.ZCName = dtZhan.Rows[i]["ORG_NAME"].ToString(); Station.ip = dtZhan.Rows[i]["IP"].ToString(); Station.port = Convert.ToInt32(dtZhan.Rows[i]["PORT"].ToString()); Station.NetTYPE = dtZhan.Rows[i]["NETTYPE"].ToString(); Station.MeterTYPE = dtZhan.Rows[i]["DEVICETYPE"].ToString(); Station.readDiffTime = Convert.ToInt32(dtZhan.Rows[i]["READTIMESPAN"].ToString()); arrayThread[i] = new GetDataThread(Station); GetPLCDataThread[i] = new Thread(new ThreadStart(arrayThread[i].GetPLCData)); //string[] tempIp = dtZhan.Rows[i]["IP"].ToString().Split(','); GetPLCDataThread[i].Start(); ThreadDictionary.Add(Station.ZCID, GetPLCDataThread[i]); } catch (Exception ex) { continue; } } } // } } } catch (Exception ex) { } } /// /// 启动GPRS数据采集线程 /// private void GetGPRSStart() //启动各站数据采集线程 { //int ThreadNum = dtZhan.Rows.Count; //GetDataThread[] arrayThread; //GetPLCDataThread = new Thread[ThreadNum]; //arrayThread = new GetDataThread[ThreadNum]; try { int ThreadNum = dtZhanGPRS.Rows.Count; GETDataGPRS[] arrayThread; GetPLCDataThread = new Thread[ThreadNum]; arrayThread = new GETDataGPRS[ThreadNum]; for (int i = 0; i < ThreadNum; i++) { string ZCID = dtZhanGPRS.Rows[i]["ORG_ID"].ToString(); if (dsJLDataRealTime.Tables[ZCID].Rows.Count > 0) { //if (dtZhanGPRS.Rows[i]["PORT"].ToString() == "8059") { //if (ZCID.Split('_').Length > 1) { try { stStation Station = new stStation(); Station.ZCID = dtZhanGPRS.Rows[i]["ORG_ID"].ToString(); Station.ZCName = dtZhanGPRS.Rows[i]["ORG_NAME"].ToString(); Station.ip = dtZhanGPRS.Rows[i]["IP"].ToString(); Station.port = Convert.ToInt32(dtZhanGPRS.Rows[i]["PORT"].ToString()); Station.NetTYPE = dtZhanGPRS.Rows[i]["NETTYPE"].ToString(); Station.MeterTYPE = dtZhanGPRS.Rows[i]["DEVICETYPE"].ToString(); Station.readDiffTime = Convert.ToInt32(dtZhanGPRS.Rows[i]["READTIMESPAN"].ToString()); arrayThread[i] = new GETDataGPRS(Station); GetPLCDataThread[i] = new Thread(new ThreadStart(arrayThread[i].GetDataStart)); //string[] tempIp = dtZhan.Rows[i]["IP"].ToString().Split(','); GetPLCDataThread[i].Start(); ThreadDictionary.Add(Station.ZCID, GetPLCDataThread[i]); } catch (Exception ex) { continue; } } } // } } } catch (Exception ex) { } } /// /// 启动Net数据采集线程 /// private void GetNetStart() //启动各站数据采集线程 { //int ThreadNum = dtZhan.Rows.Count; //GetDataThread[] arrayThread; //GetPLCDataThread = new Thread[ThreadNum]; //arrayThread = new GetDataThread[ThreadNum]; try { int ThreadNum = dtZhanNet.Rows.Count; GetDataNet[] arrayThread; GetPLCDataThread = new Thread[ThreadNum]; arrayThread = new GetDataNet[ThreadNum]; for (int i = 0; i < ThreadNum; i++) { string ZCID = dtZhanNet.Rows[i]["ORG_ID"].ToString(); if (dsJLDataRealTime.Tables[ZCID].Rows.Count > 0) { //if (dtZhanNet.Rows[i]["ORG_ID"].ToString() == "6C1AB9BC-AFEC-48B5-AD7D-3932DE414641") { //if (ZCID.Split('_').Length > 1) { try { stStation Station = new stStation(); Station.ZCID = dtZhanNet.Rows[i]["ORG_ID"].ToString(); Station.ZCName = dtZhanNet.Rows[i]["ORG_NAME"].ToString(); Station.ip = dtZhanNet.Rows[i]["IP"].ToString(); Station.port = Convert.ToInt32(dtZhanNet.Rows[i]["PORT"].ToString()); Station.NetTYPE = dtZhanNet.Rows[i]["NETTYPE"].ToString(); Station.MeterTYPE = dtZhanNet.Rows[i]["DEVICETYPE"].ToString(); Station.readDiffTime = Convert.ToInt32(dtZhanNet.Rows[i]["READTIMESPAN"].ToString()); arrayThread[i] = new GetDataNet(Station); GetPLCDataThread[i] = new Thread(new ThreadStart(arrayThread[i].GetPLCData)); //string[] tempIp = dtZhan.Rows[i]["IP"].ToString().Split(','); GetPLCDataThread[i].Start(); ThreadDictionary.Add(Station.ZCID, GetPLCDataThread[i]); } catch (Exception ex) { continue; } } } // } } } catch (Exception ex) { } } private void GetPLCDataStart(string ZCID) //启动各站数据采集线程 { DataRow[] drZhan = dtZhan.Select("ID='" + ZCID + "'"); if (dsJLDataRealTime.Tables[ZCID].Rows.Count > 0) { try { stStation Station = new stStation(); Station.ZCID = drZhan[0]["ID"].ToString(); Station.ZCName = drZhan[0]["ZCMC"].ToString(); Station.ip = drZhan[0]["IP"].ToString(); Station.port = Convert.ToInt32(drZhan[0]["PORT"].ToString()); Station.NetTYPE = drZhan[0]["NETTYPE"].ToString(); Station.MeterTYPE = drZhan[0]["SBTYPE"].ToString(); Station.readDiffTime = Convert.ToInt32(drZhan[0]["READTIMESPAN"].ToString()); GetDataThread arrayThread = new GetDataThread(Station); Thread ThreadZCID = new Thread(new ThreadStart(arrayThread.GetPLCData)); ThreadZCID.Start(); ThreadDictionary[ZCID] = ThreadZCID; strAppend("重启" + Station.ZCName + "采集成功"); } catch (Exception ex) { } } } /// /// 初始化系统所需要的DataSet 和DataTable 结构和数据 /// protected void InitialTalbe() //初始化实时数据表格过程,以便添加计量点后重新构建实时数据表格 { strAppend(DateTime.Now.ToString() + "------开始初始化相关表格!"); try { DataTable dtDateTime = new DataTable(); dtDateTime.Columns.Add("ZCID", typeof(string)); dtDateTime.Columns.Add("ZCNAME", typeof(string)); dtDateTime.Columns.Add("PLCTime", typeof(string)); dtDateTime.Columns.Add("TongBuTime", typeof(string)); dtDateTime.Columns.Add("TongBuFlag", typeof(string)); DataTable parTable = new DataTable(); parTable.Columns.Add("CH4", typeof(string)); parTable.Columns.Add("N2", typeof(string)); parTable.Columns.Add("CO2", typeof(string)); parTable.Columns.Add("C2H6", typeof(string)); parTable.Columns.Add("C3H8", typeof(string)); parTable.Columns.Add("H2O", typeof(string)); parTable.Columns.Add("H2S", typeof(string)); parTable.Columns.Add("H2", typeof(string)); parTable.Columns.Add("CO ", typeof(string)); parTable.Columns.Add("O2", typeof(string)); parTable.Columns.Add("i-C4H10", typeof(string)); parTable.Columns.Add("n-C4H10", typeof(string)); parTable.Columns.Add("i-C5H12", typeof(string)); parTable.Columns.Add("n-C5H12", typeof(string)); parTable.Columns.Add("n-C6H14", typeof(string)); parTable.Columns.Add("n-C7H16", typeof(string)); parTable.Columns.Add("n-C8H18", typeof(string)); parTable.Columns.Add("n-C9H20", typeof(string)); parTable.Columns.Add("n-C10H22", typeof(string)); parTable.Columns.Add("He", typeof(string)); parTable.Columns.Add("Ar", typeof(string)); parTable.Columns.Add("bak", typeof(string)); parTable.Columns.Add("GJ", typeof(string)); parTable.Columns.Add("KJ", typeof(string)); parTable.Columns.Add("Gr", typeof(string)); parTable.Columns.Add("DLND", typeof(string)); parTable.Columns.Add("DSZS", typeof(string)); parTable.Columns.Add("BAK1", typeof(string)); parTable.Columns.Add("BAK2", typeof(string)); parTable.Columns.Add("BAK3", typeof(string)); parTable.Columns.Add("Station_ID", typeof(string)); parTable.Columns.Add("ID", typeof(string)); parTable.Columns.Add("JLD_ID", typeof(string)); parTable.Columns.Add("ReadTime", typeof(string)); parTable.Columns.Add("JLD_NAME", typeof(string)); parTable.Columns.Add("CLXX", typeof(string)); parTable.Columns.Add("CLSX", typeof(string)); dtZhan.Clear(); dsJLDataRealTime.Tables.Clear(); #region 初始化站场表格,获取所有自动计量站场 strAppend(DateTime.Now.ToString() + "------查询数据库获取所有站场资料!"); try { dtZhan = new DataTable(); dtZhan = OracleLink.ExecuteDataTable(SQL_Strings.strSQLZhan, "JLXT", strErr); } catch (Exception ex) { string strFileName = strDataPath + "dtZhan.xml"; dtZhan.ReadXml(strFileName); } dtZhan.TableName = "集输站场"; DataTable dtStationNew = dtZhan.Copy(); for (int i = 0; i < dtZhan.Rows.Count; i++) { //柳屯配气站两台PLC 区分 string[] tempIp = dtZhan.Rows[i]["IP"].ToString().Split(','); string[] tempPORT = dtZhan.Rows[i]["PORT"].ToString().Split(','); if (tempIp.Length > 1) { DataRow drTemp = dtStationNew.NewRow(); drTemp.ItemArray = dtZhan.Rows[i].ItemArray; dtStationNew.Rows[i]["org_id"] = dtZhan.Rows[i]["org_id"].ToString() + "_0"; dtStationNew.Rows[i]["org_name"] = dtZhan.Rows[i]["org_name"].ToString() + "_0"; dtStationNew.Rows[i]["IP"] = tempIp[0]; dtStationNew.Rows[i]["PORT"] = tempPORT[0]; for (int j = 1; j < tempIp.Length; j++) { drTemp["org_id"] = dtZhan.Rows[i]["org_id"].ToString() + "_" + j.ToString(); drTemp["org_name"] = dtZhan.Rows[i]["org_name"].ToString() + "_" + j.ToString(); drTemp["IP"] = tempIp[j]; drTemp["PORT"] = tempPORT[j]; dtStationNew.Rows.Add(drTemp); } } } DataView dv = dtStationNew.DefaultView; dv.RowFilter = "NETTYPE='0'"; dtZhanNet = dv.ToTable(); dv.RowFilter = "NETTYPE='1'"; dtZhanGPRS = dv.ToTable(); strAppend(DateTime.Now.ToString() + "------站场资料获取成功!"); #endregion #region 初始化站场计量点结构Dataset DataTable dtDataRealTime = new DataTable(); //ID,JLD_NAME,WD,YL,CY,SSL,JRL,ZRL,LJL,BYL,SYL,ZRSJ,JRSJ,YBZT,RTIME,JLD_ID,STATION_ID,STATION_NAME,DEPT_ID dtDataRealTime.Columns.Add("ID", typeof(string)); dtDataRealTime.Columns.Add("RTIME", typeof(string)); dtDataRealTime.Columns.Add("JLD_NAME", typeof(string)); dtDataRealTime.Columns.Add("WD", typeof(string)); dtDataRealTime.Columns.Add("YL", typeof(string)); dtDataRealTime.Columns.Add("CY", typeof(string)); dtDataRealTime.Columns.Add("SSL", typeof(string)); dtDataRealTime.Columns.Add("JRL", typeof(string)); dtDataRealTime.Columns.Add("ZRL", typeof(string)); dtDataRealTime.Columns.Add("LJL", typeof(string)); dtDataRealTime.Columns.Add("BYL", typeof(string)); dtDataRealTime.Columns.Add("SYL", typeof(string)); dtDataRealTime.Columns.Add("JRSJ", typeof(string)); dtDataRealTime.Columns.Add("ZRSJ", typeof(string)); dtDataRealTime.Columns.Add("YBZT", typeof(string)); dtDataRealTime.Columns.Add("SSGKLL", typeof(string)); dtDataRealTime.Columns.Add("JLD_ID", typeof(string)); dtDataRealTime.Columns.Add("STATION_ID", typeof(string)); dtDataRealTime.Columns.Add("STATION_NAME", typeof(string)); dtDataRealTime.Columns.Add("DEPT_ID", typeof(string)); dtDataRealTime.Columns.Add("MeterTYPE", typeof(string)); dtDataRealTime.Columns.Add("readparflag", typeof(string)); dtDataRealTime.Columns.Add("TongBuFlag", typeof(string)); dtDataRealTime.Columns.Add("CXFlag", typeof(string)); dtDataRealTime.Columns.Add("LinkStatu", typeof(string)); //计量点连接情况,对于流量积算仪的模式 如果没装表读不上来数可以设置 // 初始化站场计量点表格 strAppend(DateTime.Now.ToString() + "------初始化站场计量点表格和计量点参数"); for (int i = 0; i < dtStationNew.Rows.Count; i++) { DataTable dtPar = new DataTable(); DataTable dtJLD = new DataTable(); dtJLD = dtJldList(dtStationNew.Rows[i]["ORG_ID"].ToString(), dtStationNew.Rows[i]["PARENT_ORG_ID"].ToString(), dtDataRealTime, parTable, out dtPar); dsPparameter.Tables.Add(dtPar); dsJLDataRealTime.Tables.Add(dtJLD); //初始化站场时间表格结构和数据 DataTable dtTimeTemp = dtDateTime.Clone(); dtTimeTemp.TableName = dtStationNew.Rows[i]["ORG_ID"].ToString(); DataRow drTime = dtTimeTemp.NewRow(); drTime["ZCID"] = dtStationNew.Rows[i]["ORG_ID"]; drTime["ZCNAME"] = dtStationNew.Rows[i]["ORG_NAME"]; dtTimeTemp.Rows.Add(drTime); dsZhanDateTime.Tables.Add(dtTimeTemp); } strAppend(DateTime.Now.ToString() + "------站场参数、计量点、时间结构和数据表格初始化完成!"); #endregion #region 初始化输差表格 strAppend(DateTime.Now.ToString() + "------初始化输差表格 开始!"); blWriteParXMLFlag = true; dtScRealTime.Columns.Add("SCID", typeof(string)); dtScRealTime.Columns.Add("RTIME", typeof(string)); dtScRealTime.Columns.Add("SCNAME", typeof(string)); dtScRealTime.Columns.Add("SCTYPE", typeof(string)); dtScRealTime.Columns.Add("IN_P", typeof(string)); dtScRealTime.Columns.Add("OUT_P", typeof(string)); dtScRealTime.Columns.Add("SsInTotal", typeof(string)); dtScRealTime.Columns.Add("SsOutTotal", typeof(string)); dtScRealTime.Columns.Add("SsSc", typeof(string)); dtScRealTime.Columns.Add("SsPer", typeof(string)); dtScRealTime.Columns.Add("JrInTotal", typeof(string)); dtScRealTime.Columns.Add("JrOutTotal", typeof(string)); dtScRealTime.Columns.Add("JrSc", typeof(string)); dtScRealTime.Columns.Add("JrPer", typeof(string)); dtScRealTime.Columns.Add("ZrInTotal", typeof(string)); dtScRealTime.Columns.Add("ZrOutTotal", typeof(string)); dtScRealTime.Columns.Add("ZrSc", typeof(string)); dtScRealTime.Columns.Add("ZrPer", typeof(string)); dtScRealTime.Columns.Add("IN_JLD_ID", typeof(string)); dtScRealTime.Columns.Add("OUT_JLD_ID", typeof(string)); dtScRealTime.Columns.Add("DEPT_ID", typeof(string)); dtScRealTime.Columns.Add("STATION_ID", typeof(string)); dtScRealTime.Columns.Add("RE_DEPT_ID", typeof(string)); dtScRealTime.TableName = "SsSC"; strSQL = SQL_Strings.strSQLScConfig + " order by ID"; DataTable dtScConfig = new DataTable(); dtScConfig = OracleLink.ExecuteDataTable(strSQL, "JLXT", strErr); if (dtScConfig.Rows.Count > 0) { foreach (DataRow dr1 in dtScConfig.Rows) { DataRow drJld = dtScRealTime.NewRow(); drJld["SCID"] = dr1["ID"]; drJld["SCNAME"] = dr1["TRANS_NAME"]; drJld["IN_JLD_ID"] = dr1["IN_POINTS"]; drJld["OUT_JLD_ID"] = dr1["OUT_POINTS"]; drJld["DEPT_ID"] = dr1["DEPT_ID"]; drJld["STATION_ID"] = dr1["STATION_ID"]; drJld["SCTYPE"] = dr1["TRANS_TYPE"]; drJld["RE_DEPT_ID"] = dr1["RE_DEPT_ID"]; dtScRealTime.Rows.Add(drJld); } } File.Delete(strConfigPath + "dsJlDataRealTime.xml"); File.Delete(strConfigPath + "dsPparameter.xml"); File.Delete(strConfigPath + "dsZhanDateTime.xml"); dsJLDataRealTime.WriteXml(strConfigPath + "dsJlDataRealTime.xml", XmlWriteMode.WriteSchema);//暂存数据结构表 dsPparameter.WriteXml(strConfigPath + "dsPparameter.xml", XmlWriteMode.WriteSchema);//暂存数据结构表 dsZhanDateTime.WriteXml(strConfigPath + "dsZhanDateTime.xml", XmlWriteMode.WriteSchema);//暂存数据结构表 } catch (Exception ex) { } strAppend(DateTime.Now.ToString() + "------初始化完成!"); #endregion } /// /// 获取某个站场的计量点结构 和参数表结构 /// /// 传递站场ID /// 传递单位ID /// 计量点表结构 /// 参数表结构 /// 返回参数表结构 /// 返回计量点表结构 private DataTable dtJldList(string ZCID, string Dept_ID, DataTable dtDataRealTime, DataTable parTable, out DataTable dtParList) { DataTable dtTempStation = new DataTable(); DataTable dtJLD = new DataTable(); string strSTATION_Name = ""; string[] tempZCID = ZCID.Split('_'); strSQL = SQL_Strings.strSQLJld + tempZCID[0] + "' and plc='1' order by jld_id"; dtTempStation = OracleLink.ExecuteDataTable("select * from SYS_ORGANISE where ORG_ID='" + tempZCID[0] + "'", "JLXT", ""); string[] tempIp = dtTempStation.Rows[0]["IP"].ToString().Split(','); strSTATION_Name = dtTempStation.Rows[0]["ORG_NAME"].ToString();// OracleLink.getStationName(ZCID); try { if (tempZCID.Length > 1) { dtJLD = OracleLink.ExecuteDataTable(SQL_Strings.strSQLJld + tempZCID[0] + "' and plc='1' and device_id='" + tempZCID[1] + "' order by jld_id", "JLXT", strErr); } else { dtJLD = OracleLink.ExecuteDataTable(strSQL, "JLXT", strErr); } } catch (Exception ex) { } if (dtJLD.Rows.Count > 0) { DataTable dtTemp = dtDataRealTime.Clone(); DataTable dtPar = parTable.Clone(); foreach (DataRow dr1 in dtJLD.Rows) { // 初始化站场计量点表格结构和数据 DataRow drJld = dtTemp.NewRow(); drJld["ID"] = dr1["ID"]; drJld["JLD_NAME"] = dr1["Jld_name"]; drJld["JLD_ID"] = dr1["JLD_ID"]; drJld["MeterTYPE"] = dr1["FLOWMETER_TYPE"]; drJld["STATION_ID"] = dr1["STATION_NAME"]; drJld["STATION_NAME"] = strSTATION_Name; drJld["readparflag"] = "1"; drJld["DEPT_ID"] = Dept_ID; dtTemp.Rows.Add(drJld); // 初始化站场参数表格结构和数据 DataRow drPar = dtPar.NewRow(); drPar["ID"] = dr1["ID"]; drPar["JLD_ID"] = dr1["JLD_ID"]; drPar["Station_ID"] = dr1["STATION_NAME"]; drPar["JLD_NAME"] = dr1["Jld_name"]; try { string strTempSQL = "select clsbmc,ccbh,clfw from 测量设备台帐 where sycfdd='" + dr1["AZDD"].ToString() + "' and ZT='在用' and clsbmc like'%流量计%'"; DataTable dtTempCLSB = OracleLink.ExecuteDataTable(strTempSQL, "JLXT", strErr); if (dtTempCLSB.Rows.Count > 0) { string[] strCLFW = dtTempCLSB.Rows[0]["CLFW"].ToString().Split('~'); drPar["CLXX"] = strCLFW[0].Substring(1, strCLFW[0].Length - 1); drPar["CLSX"] = strCLFW[1].Substring(0, strCLFW[1].IndexOf(')')); } } catch { } dtPar.Rows.Add(drPar); } dtTemp.TableName = ZCID; dtPar.TableName = ZCID; dtParList = dtPar.Copy(); return dtTemp; } else { DataTable dtTemp = dtDataRealTime.Clone(); DataTable dtPar = parTable.Clone(); dtTemp.TableName = ZCID; dtPar.TableName = ZCID; dtParList = dtPar.Copy(); return dtTemp; } } private DataTable dtJldList(string ZCID) { dsJLDataRealTime.Tables[ZCID].Clear(); dsPparameter.Tables[ZCID].Clear(); string strTempFileName = @"D:\GetPLCData\Data\Config\"; DataSet dsJldTemp = new DataSet(); dsJldTemp.ReadXml(strTempFileName + "dsJlDataRealTime.xml");//暂存数据结构表 DataSet dsParTemp = new DataSet(); dsParTemp.ReadXml(strTempFileName + "dsPparameter.xml");//暂存数据结构表 foreach (DataRow dr1 in dsJldTemp.Tables[ZCID].Rows) { // 初始化站场计量点表格结构和数据 DataRow drJld = dsJLDataRealTime.Tables[ZCID].NewRow(); drJld["ID"] = dr1["ID"]; drJld["JLD_NAME"] = dr1["Jld_name"]; drJld["JLD_ID"] = dr1["JLD_ID"]; drJld["MeterTYPE"] = dr1["FLOWMETER_TYPE"]; drJld["STATION_ID"] = dr1["STATION_ID"]; drJld["STATION_NAME"] = dr1["STATION_NAME"]; drJld["readparflag"] = dr1["readparflag"]; drJld["DEPT_ID"] = dr1["DEPT_ID"]; dsJLDataRealTime.Tables[ZCID].Rows.Add(drJld); // 初始化站场参数表格结构和数据 DataRow drPar = dsPparameter.Tables[ZCID].NewRow(); drPar["ID"] = dr1["ID"]; drPar["JLD_ID"] = dr1["JLD_ID"]; drPar["Station_ID"] = dr1["ZCID"]; drPar["JLD_NAME"] = dr1["Jld_name"]; drPar["CLFW"] = dr1["CLFW"]; drPar["CLXX"] = dr1["CLXX"]; drPar["CLSX"] = dr1["CLSX"]; dsPparameter.Tables[ZCID].Rows.Add(drPar); } return null; } /// /// 控制台输出运行信息,并写入日志文件 /// /// public static void strAppend(string strMessage) { string strFilePath = strLogPath; try { Console.WriteLine(strMessage); using (StreamWriter sw = File.AppendText(strFilePath)) { sw.WriteLine(strMessage); sw.Flush(); sw.Close(); } } catch (Exception) { } } /// /// 控制台输出运行信息,并写入日志文件 /// /// public static void strAppend(string strMessage, string ZCMC) { string strFilePath = strLogPath_Data + ZCMC + ".txt"; try { Console.WriteLine(strMessage); using (StreamWriter sw = File.AppendText(strFilePath)) { sw.WriteLine(strMessage); sw.Flush(); sw.Close(); } } catch (Exception) { } } protected bool isNumberic(string message) { System.Text.RegularExpressions.Regex rex = new System.Text.RegularExpressions.Regex(@"^(-)?[1-9][0-9]*$"); if (rex.IsMatch(message)) { return true; } else return false; } /// /// 把DataTable数据转换为Json格式 /// /// 传入DataTable数据 /// public string DataTableToJson(DataTable dt, DataTable dtTime, string strStationID) { try { string[] stationid = strStationID.Split('_'); string strDept_ID = ""; string strStationName = ""; string strDeptName = ""; if (stationid.Length > 1) { strStationName = OracleLink.getStationName(stationid[0], ref strDept_ID) + stationid[1]; strDeptName = OracleLink.getStationName(strDept_ID); } else { strStationName = OracleLink.getStationName(stationid[0], ref strDept_ID); strDeptName = OracleLink.getStationName(strDept_ID); } StringBuilder jsonBuilder = new StringBuilder(); jsonBuilder.Append("{\"total\""); jsonBuilder.Append(":"); jsonBuilder.Append(dt.Rows.Count); jsonBuilder.Append(",\"Dept_ID\""); jsonBuilder.Append(":\""); jsonBuilder.Append(strDept_ID); jsonBuilder.Append("\",\"Dept_Name\""); jsonBuilder.Append(":\""); jsonBuilder.Append(strDeptName); jsonBuilder.Append("\",\"Station_ID\""); jsonBuilder.Append(":\""); jsonBuilder.Append(strStationID); jsonBuilder.Append("\",\"Station_Name\""); jsonBuilder.Append(":\""); jsonBuilder.Append(strStationName); jsonBuilder.Append("\",\"Time\""); jsonBuilder.Append(":\""); jsonBuilder.Append(dtTime.Rows[0]["PLCTime"]); jsonBuilder.Append("\",\"rows"); jsonBuilder.Append("\":["); for (int i = 0; i < dt.Rows.Count; i++) { jsonBuilder.Append("{"); for (int j = 0; j < dt.Columns.Count; j++) { jsonBuilder.Append("\""); jsonBuilder.Append(dt.Columns[j].ColumnName); jsonBuilder.Append("\":\""); if (dt.Columns[j].ColumnName == "RQ") { jsonBuilder.Append(dt.Rows[i][j].ToString().Split(' ')[0]); } else { jsonBuilder.Append(dt.Rows[i][j].ToString()); } jsonBuilder.Append("\","); } jsonBuilder.Remove(jsonBuilder.Length - 1, 1); jsonBuilder.Append("},"); } if (dt.Rows.Count > 0) { jsonBuilder.Remove(jsonBuilder.Length - 1, 1); } jsonBuilder.Append("],"); jsonBuilder.Append("\"title"); //jsonBuilder.Append(dt.TableName); jsonBuilder.Append("\":["); //这是循环获取列名称 for (int n = 0; n < dt.Columns.Count; n++) { jsonBuilder.Append("{"); jsonBuilder.Append("\"field"); jsonBuilder.Append("\":\""); jsonBuilder.Append(dt.Columns[n].ColumnName); jsonBuilder.Append("\","); jsonBuilder.Append("\"title"); jsonBuilder.Append("\":\""); jsonBuilder.Append(getStrColumnName(dt.Columns[n].ColumnName)); jsonBuilder.Append("\""); jsonBuilder.Append("},"); } jsonBuilder.Remove(jsonBuilder.Length - 1, 1); jsonBuilder.Append("},"); jsonBuilder.Remove(jsonBuilder.Length - 2, 2); jsonBuilder.Append("]"); jsonBuilder.Append("}"); return jsonBuilder.ToString(); } catch (Exception ex) { return "错误"; } } private string getStrColumnName(string strName) { string temp = ""; switch (strName) { case "YL": temp = "压力(MPa)"; //temp = "压力(MPa)"; break; case "CY": temp = "压力(kPa)"; break; case "WD": temp = "温度(℃)"; break; case "SSL": temp = "瞬时流量(Nm³/d)"; break; case "JRL": temp = "今日流量(Nm³)"; break; case "ZRL": temp = "昨日流量(Nm³)"; break; case "JLD_NAME": temp = "计量点名称"; break; case "JRSJ": temp = "今日时间(分钟)"; break; case "ZRSJ": temp = "昨日时间(分钟)"; break; case "YBZT": temp = "仪表状态"; break; case "SSGKLL": temp = "瞬时工况流量"; break; case "JLD_ID": temp = "站内ID"; break; } return temp; } } }