最近在作一個數據上傳的C#程序,經過獲取websocket數據,讀取ini配置文件,依據相關文檔完成數據上傳。web
ini配置文件展現json
[煤礦代碼] CS_MINE_CODE=411481B0012010000011 [IP地址(KJ66的IP地址)] URL=192.168.100.23 [備用IP地址] backupUrl=192.168.100.231 [端口號] PORT=9999 [文件時間間隔] intervalTime=12 fiveMinuter=300 [文件目錄] fileReserve=E:\mine\template fileReserveBuffer=E:\mine\template\buffer [ftp] ftpurl=192.168.100.19:31 file=lxx username=guor password=123 [備用IP地址] backupUrl=192.168.100.23
界面展現緩存
一切皆配置安全
[{ "resource":"FTP", "separator":",", "isNeed":"0" } ,{ "resource":"DEV", "filename": "devcgq", "fields":[1,3,2,4,5,6,7,8,9,10,11,12,13], "separator":",", "filter":"([15]==0)&&([12]==1)", "isNeed":"1" } ,{ "resource":"RTDATA", "filename": "ssdata", "fields":[1,2,3], "separator":",", "filter":"([15]==0)&&([12]==1)", "isNeed":"1" } ]
配置文件中數字含義websocket
[dev] 1=分站編號 2=傳感器編號 3=工做面編號 4=安裝地點 5=傳感器名稱 6=傳感器類型代碼 7=單位 8=量程下限 9=量程上限 10=報警下限 11=報警上限 12=斷電值 13=覆電值 14=斷電區域 [rtdata] 1=傳感器編號 2=實時測量值 3=測點狀態
程序源碼socket
/* * Created by SharpDevelop. * User: Administrator * Date: 2018/9/27 星期四 * Time: 8:49 * * To change this template use Tools | Options | Coding | Edit Standard Headers. */ using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Windows.Forms; using Newtonsoft.Json.Linq; using WebSocket4Net; namespace DataUploadTemplate{ public partial class MainForm : Form{ public MainForm(){ //The InitializeComponent() call is required for Windows Forms designer support. InitializeComponent(); iniReader(); InitUI(); if(isFTP().Equals("0")){ setFtpEnabled(); } //首先判斷列表框中的項是否大於0 if(logReveal.Items.Count > 0){ //清空全部項 logReveal.Items.Clear(); } } //讀取ini配置文件-----------------------------begin------------------------------------------------------- //基本信息 MainForm configIni = null; //狀態 MainForm stateIni = null; //延展狀態 MainForm exstateIni = null; //傳感器名稱代碼 MainForm transducerIni = null; //傳感器類型的代碼 MainForm transducer_name_codeIni = null; //生成文件 MainForm templateIni = null; //文件字段 MainForm generateFileIni = null; //工做面類型 MainForm workface_typeIni = null; //測點名稱 MainForm station_nameIni = null; //傳感器類型 MainForm typeIni = null; //開關量IO類型 MainForm switch_io_dIni = null; //控制量IO類型 MainForm switch_io_cIni = null; //傳感器類型編碼表 MainForm transducer_typeIni = null; //煤礦名稱 string cs_mine_code = ""; //存儲路徑 string file_name_save = ""; //讀取INI配置文件 void iniReader(){ //基本信息 configIni = new MainForm("./config.ini"); //狀態 stateIni = new MainForm("./state.ini"); //延展狀態 exstateIni = new MainForm("./exstate.ini"); //傳感器名稱代碼 transducerIni = new MainForm("./transducer.ini"); //傳感器類型的代碼 transducer_name_codeIni = new MainForm("./transducer_name_code.ini"); //生成文件 templateIni = new MainForm("./template.ini"); //文件字段 generateFileIni = new MainForm("./generateFile.ini"); //工做面類型 workface_typeIni = new MainForm("./workface_type.ini"); //測點名稱 station_nameIni = new MainForm("./station_name.ini"); //傳感器類型 typeIni = new MainForm("./type.ini"); //開關量IO類型 switch_io_dIni = new MainForm("./switch_io_d.ini"); //控制量IO類型 switch_io_cIni = new MainForm("./switch_io_c.ini"); //傳感器類型編碼表 transducer_typeIni = new MainForm("./transducer_type.ini"); //煤礦名稱 cs_mine_code = configIni.ReadValue("煤礦代碼","CS_MINE_CODE"); //存儲路徑 file_name_save = configIni.ReadValue("文件目錄","fileReserve"); } //讀取ini文件 // 聲明INI文件的寫操做函數 WritePrivateProfileString() [System.Runtime.InteropServices.DllImport("kernel32")] static extern long WritePrivateProfileString(string section, string key, string val, string filePath); // 聲明INI文件的讀操做函數 GetPrivateProfileString() [System.Runtime.InteropServices.DllImport("kernel32")] static extern int GetPrivateProfileString(string section, string key, string def, System.Text.StringBuilder retVal, int size, string filePath); string sPath = null; public MainForm(string path){ this.sPath = path; } string ReadValue(string section, string key){ // 每次從ini中讀取多少字節 System.Text.StringBuilder temp = new System.Text.StringBuilder(255); // section=配置節,key=鍵名,temp=上面,path=路徑 GetPrivateProfileString(section, key, "", temp, 255, sPath); return temp.ToString(); } //congig.ini路徑 static string INIFileName =Path.Combine(Directory.GetCurrentDirectory(), "config.ini"); //寫入ini文件 void WriteValue(string SECTION,string key, string value){ if (!File.Exists(INIFileName)){ FileStream fs = new FileStream(INIFileName, FileMode.OpenOrCreate); } WritePrivateProfileString(SECTION, key, value, INIFileName); return; } //-----------------------------------鏈接websocket---------------------------------------------- void websocket_MessageReceived(object sender, MessageReceivedEventArgs e){ MessageReceivedEventArgs responseMsg = (MessageReceivedEventArgs)e; //接收服務端發來的消息 string strMsg = responseMsg.Message; recieveMessage(strMsg); } Boolean websocketConn = true; void websocket_Closed(object sender, EventArgs e){ if(websocketConn){ Log("websocekt connect fail!啓用備用IP!"); connectWebsocketBackup(); }else{ Log("websocekt connect fail! 請確認KJ66 IP地址的準確性!"); websocketConn = false; } } void websocket_Opened(object sender, EventArgs e){ Log("websocket_Opened"); } //websocket鏈接 void connectWebsocket(){ string url = configIni.ReadValue("IP地址(KJ66的IP地址)","URL"); string port = configIni.ReadValue("端口號","PORT"); websocket = new WebSocket("ws://"+url+":"+port); websocket.Opened += websocket_Opened; websocket.Closed += websocket_Closed; websocket.MessageReceived += websocket_MessageReceived; websocket.Open(); } //備用websocket鏈接 private void connectWebsocketBackup(){ string url = configIni.ReadValue("備用IP地址","backupUrl"); string port = configIni.ReadValue("端口號","PORT"); websocket = new WebSocket("ws://"+url+":"+port); websocket.Opened += websocket_Opened; websocket.Closed += websocket_Closed; websocket.MessageReceived += websocket_MessageReceived; websocket.Open(); websocketConn = false; } //------------------------------------接收websocket數據------------------------------------------- //測點定義 string CMD101 = ""; //控制定義 string CMD102 = ""; //區域定義 string CMD103 = ""; //工做面定義 string CMD104 = ""; //位置定義 string CMD105 = ""; //增量數據 string CMD106 = ""; //測試狀態測點集合 string[] strArray = new string[2048]; int strI = 0; WebSocket websocket = null; List<string> listFiveMinuter = new List<string>(); Boolean bFiveMinute = false; long lLastTimeFiveMinute = 0; Boolean bStart30 = false; long lLastTime30 = 0; //修改標誌 int editSign = 0; void recieveMessage(string jsonText){ var obj = JObject.Parse(jsonText); var id = obj["CMD_ID"].ToString(); switch (id) { case "101": CMD101 = jsonText; editSign = 1; break; case "102": CMD102 = jsonText; break; case "103": CMD103 = jsonText; break; case "104": CMD104 = jsonText; break; case "105": CMD105 = jsonText; break; case "106": CMD106 = jsonText; break; default: break; } //根據類型不一樣分別建立XML文件 if(!CMD101.Equals("")&&!CMD102.Equals("")&&!CMD103.Equals("")&&!CMD104.Equals("")&&!CMD105.Equals("")&&!CMD106.Equals("")){ //獲取數據生成時間 string cs_data_time = getCurrentTime(); try{ //接收數據並存入本地hashtable //測點定義數據 InitCMD101(cs_data_time); //控制定義 InitCMD102(); //分站數據 InitCMD101_fz(); getValueByIndex(); }catch(Exception e){ Log(e.Message); } CMD102 = ""; CMD103 = ""; CMD104 = ""; CMD105 = ""; } if(!CMD101.Equals("")&&!CMD106.Equals("")){ try{ InitCMD106(); listFiveMinuter.Add(CMD106); string cs_data_time = getCurrentTime(); //全量數據hash化 InitCMD_all(); //生成實時狀態下的所需文件 getValueBySSSJ(); //存儲模擬量測點值對應時間 getTimeJktjsj(cs_data_time); }catch(Exception e){ Log(e.Message); } } long lCurrentTime30 = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000; if(!bStart30){ lLastTime30 = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000; bStart30 = true; } if(bStart30 && ((lCurrentTime30-lLastTime30)>=long.Parse(configIni.ReadValue("文件時間間隔","intervalTime")))){ lLastTime30 = lCurrentTime30; try{ //何崗煤礦傳感器全局定時顯示(模擬量顯示、開關量顯示、實時數據) getValueByAllAnalogDisplay(); }catch(Exception e){ Log(e.Message); } } //等待五分鐘執行監測文件 long lCurrentTime = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000; if(!bFiveMinute){ lLastTimeFiveMinute = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000; bFiveMinute = true; } if(bFiveMinute && ((lCurrentTime-lLastTimeFiveMinute)>=long.Parse(configIni.ReadValue("文件時間間隔","fiveMinuter")))){ lLastTimeFiveMinute = lCurrentTime; try{ //統計數據文件 getValueByIndexFive(); }catch(Exception e){ Log(e.Message); } } } //獲取配置文件中-基本定義文件 void getValueByIndex(){ //讀取generateFile.txt文件內容 JArray array = readGenerateFile(); string fileName = ""; foreach (JObject items in array){ string resource = items["resource"].ToString(); string separator = items["separator"].ToString(); string isNeed = items["isNeed"].ToString(); if(isNeed.Equals("0")){ continue; } switch (resource){ case "DEV": string devFields = items["fields"].ToString(); fileName = items["filename"].ToString(); //測點信息數據文件 createDev(devFields,separator,fileName); break; case "控制關係定義": string fields102 = items["fields"].ToString(); fileName = items["filename"].ToString(); createCdkzgx(fields102,separator,fileName); break; case "分站定義": string fzxxFields = items["fields"].ToString(); fileName = items["filename"].ToString(); createFzxx(fzxxFields,separator,fileName); break; case "工做面定義": string gzmxxFields = items["fields"].ToString(); fileName = items["filename"].ToString(); createGzmxx(gzmxxFields,separator,fileName); break; case "模擬量初始化": string AQMCFields = items["fields"].ToString(); fileName = items["filename"].ToString(); createAQMC(AQMCFields,separator,fileName); break; case "開關量初始化": string AQKCFields = items["fields"].ToString(); fileName = items["filename"].ToString(); createAQKC(AQKCFields,separator,fileName); break; case "傳感器描述文件": string fields = items["fields"].ToString(); var obj = JObject.Parse(fields); string CDDYFields_A = obj["A"].ToString(); string CDDYFields_D = obj["D"].ToString(); string CDDYFields_C = obj["C"].ToString(); fileName = items["filename"].ToString(); string CDDY_time = DateTime.Now.ToString("yyyyMMddHHmmss",new System.Globalization.DateTimeFormatInfo()); string CDDY_filePath = cs_mine_code+"_"+fileName+"_"+CDDY_time; createCDDY(CDDYFields_D,CDDYFields_A,separator,CDDY_filePath); break; default: break; } } } //獲取配置文件中-實時狀態文件 void getValueBySSSJ(){ //讀取generateFile.txt文件內容 JArray array = readGenerateFile(); string fileName = ""; foreach (JObject items in array){ string resource = items["resource"].ToString(); string separator = items["separator"].ToString(); string isNeed = items["isNeed"].ToString(); if(isNeed.Equals("0")){ continue; } switch (resource){ case "RTDATA": string rtdataFields = items["fields"].ToString(); fileName = items["filename"].ToString(); createRtdata(rtdataFields,separator,fileName); break; case "開關量狀態變化": string AQKDFields = items["fields"].ToString(); fileName = items["filename"].ToString(); createAQKD(AQKDFields,separator,fileName); break; default: break; } } } //獲取配置文件中-分鐘累計文件 void getValueByIndexFive(){ string cs_data_time = getCurrentTime(); //讀取generateFile.txt文件內容 JArray array = readGenerateFile(); string fileName = ""; foreach (JObject items in array){ string resource = items["resource"].ToString(); string separator = items["separator"].ToString(); string isNeed = items["isNeed"].ToString(); if(isNeed.Equals("0")){ continue; } switch (resource){ case "五分鐘統計文件": string fiveMinuFields = items["fields"].ToString(); fileName = items["filename"].ToString(); createJktjsj_list(fiveMinuFields,separator,fileName); break; default: break; } } } //-------------------------------------------何崗煤礦傳感器全局定時顯示--------------------------- void getValueByAllAnalogDisplay(){ //讀取generateFile.txt文件內容 JArray array = readGenerateFile(); string fileName = ""; foreach (JObject items in array){ string resource = items["resource"].ToString(); string separator = items["separator"].ToString(); string isNeed = items["isNeed"].ToString(); if(isNeed.Equals("0")){ continue; } switch (resource){ case "模擬量顯示": string analogDisplayFields = items["fields"].ToString(); fileName = items["filename"].ToString(); //何崗煤礦全局模擬量定時顯示 createAnalogDisplay(analogDisplayFields,separator,fileName); break; case "開關量顯示": string switchDisplayFields = items["fields"].ToString(); fileName = items["filename"].ToString(); //何崗煤礦全局開關量定時顯示 createSwitchDisplay(switchDisplayFields,separator,fileName); break; case "實時數據": string AQSSFields = items["fields"].ToString(); fileName = items["filename"].ToString(); createAQSS(AQSSFields,separator,fileName); break; case "實時數據文件": string SSSJFields = items["fields"].ToString(); fileName = items["filename"].ToString(); createSSSJ(SSSJFields,separator,fileName); break; } } } //何崗煤礦全局開關量定時顯示 void createSwitchDisplay(string switchDisplayFields,string separator,string fileName){ int sum = 0; string rowStr = ""; string[] fields = switchDisplayFields.Split(','); foreach (string key in CMD_all_Hash.Keys){ if (key.Contains("C")||key.Contains("D")){ //數值、狀態、延展狀態、名稱、安裝地點、分站編號、傳感器編號、時間 string[] data = (string[])CMD_all_Hash[key]; //類型 int ss_transducer_type = 0; //io類型 string ss_transducer_type_io = ""; //狀態 string ss_transducer_value = ""; if(key.Contains("D")){ //類型 ss_transducer_type = 1; //io類型 ss_transducer_type_io = switch_io_dIni.ReadValue("開關量輸入I/0類型",data[3]); //狀態 ss_transducer_value = getState(data[2],"D"); }else if(key.Contains("C")){ //類型 ss_transducer_type = 2; //io類型 ss_transducer_type_io = switch_io_cIni.ReadValue("開關量控制輸出I/O類型",data[3]); //狀態 ss_transducer_value = getState(data[2],"C"); } for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //分站編號 rowStr += data[5] + separator; break; case "2": //傳感器編號 rowStr += data[6] + separator; break; case "3": //傳感器類型 rowStr += ss_transducer_type + separator; break; case "4": //安裝地點 rowStr += data[4] + separator; break; case "5": //io類型 rowStr += ss_transducer_type_io + separator; break; case "6": //狀態 rowStr += ss_transducer_value + separator; break; case "7": //煤礦代碼 rowStr += cs_mine_code + separator; break; case "8": //數據生成時間 rowStr += data[7] + separator; break; default: break; } } rowStr += "\r\n"; sum++; } } rowStr = rowStr.Replace(separator+"\r\n","\r\n"); // 關聯文件 string filename = configIni.ReadValue("文件目錄","fileReserve")+"\\"+fileName+".txt"; //建立或覆蓋文件 File.WriteAllText(@filename, rowStr, Encoding.GetEncoding("gb2312")); Log(filename+"-開關量顯示文件!"); fileFtpUpload(rowStr,filename,fileName); } //何崗煤礦全局模擬量定時顯示 void createAnalogDisplay(string analogDisplayFields,string separator,string fileName){ int sum = 0; string rowStr = ""; string[] fields = analogDisplayFields.Split(','); foreach (string key in CMD_all_Hash.Keys){ if (key.Contains("A")){ //數值、狀態、延展狀態、名稱、安裝地點、分站編號、傳感器編號、時間 string[] data = (string[])CMD_all_Hash[key]; for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //分站編號 rowStr += data[5] + separator; break; case "2": //傳感器編號 rowStr += data[6] + separator; break; case "3": //傳感器類型 rowStr += typeIni.ReadValue("傳感器類型",data[3]) + separator; break; case "4": //安裝地點 rowStr += data[4] + separator; break; case "5": //值 rowStr += data[0] + separator; break; case "6": //狀態 rowStr += getState(data[1],"A") + separator; break; case "7": //煤礦代碼 rowStr += cs_mine_code + separator; break; case "8": //數據生成時間 rowStr += data[7] + separator; break; default: break; } } rowStr += "\r\n"; sum++; } } rowStr = rowStr.Replace(separator+"\r\n","\r\n"); // 關聯文件 string filename = configIni.ReadValue("文件目錄","fileReserve")+"\\"+fileName+".txt"; //建立或覆蓋文件 File.WriteAllText(@filename, rowStr, Encoding.GetEncoding("gb2312")); Log(filename+"-模擬量顯示文件!"); fileFtpUpload(rowStr,filename,fileName); } //-----------------------------------------------基本定義文件------------------------------------ //模擬量初始化數據 void createAQMC(string AQMCFields,string separator,string fileName){ int sum = 0; string rowStr = ""; StringBuilder builder = new StringBuilder(); string[] fields = AQMCFields.Split(','); string cs_file_time = DateTime.Now.ToString("yyyyMMddHHmmss",new System.Globalization.DateTimeFormatInfo()); string cs_data_time = DateTime.Now.ToString("yyyy-MM-dd/HH:mm:ss",new System.Globalization.DateTimeFormatInfo()); foreach(string key in CMD101_Hash.Keys){ if(key.Contains("A")){ string[] data = (string[])CMD101_Hash[key]; //模擬量斷電下限 string ss_analog_pofflow = ""; //模擬量斷電上限 string ss_analog_poffhigh = ""; //模擬量覆電下限 string ss_analog_ponlow = ""; //模擬量覆電上限 string ss_analog_ponhigh = ""; //上限斷電區域 string ss_poffarea_namehigh = ""; //下限斷電區域 string ss_poffarea_namelow = ""; foreach (string key102 in CMD102_Hash.Keys){ string[] data102 = (string[])CMD102_Hash[key102]; if(key.Equals(key102)){ string[] channels = new string[0]; if (data102[1] != null) { channels = bitChannel(int.Parse(data102[1]),8); } foreach (string channel in channels){ string code = formatToTwo(data102[2]) + "C" + formatToTwo(channel); string[] tpProperty_c = (string[])(CMD101_Hash[code]); if(tpProperty_c!=null) { //區域定義 string[] workarea_property = getProperty_workarea(tpProperty_c[42]); if(workarea_property==null){ continue; } if ("0".Equals(data102[3])) { //上限斷電區域 ss_poffarea_namehigh = workarea_property[3]; break; } if ("1".Equals(data102[3])) { //下限斷電區域 ss_poffarea_namelow = workarea_property[3]; break; } } } string format = getFormat(data[41],"format"); if ("0".Equals(data102[3])){ //模擬量斷電上限 ss_analog_poffhigh = float.Parse(data102[0]).ToString(format); //模擬量覆電上限 ss_analog_ponhigh = float.Parse(data102[7]).ToString(format); } if ("1".Equals(data102[3])){ //模擬量斷電下限 ss_analog_pofflow = float.Parse(data102[0]).ToString(format); //模擬量覆電下限 ss_analog_ponlow = float.Parse(data102[7]).ToString(format); } } } for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //系統類型 rowStr += "1"+separator; break; case "2": //分站編號 rowStr += data[26]+separator; break; case "3": //傳感器編號 rowStr += data[24]+separator; break; case "4": //安裝地點 string ss_transducer_point = ""; if(data[21].Equals("")||data[22].Equals("")){ ss_transducer_point = data[21]+data[22]; }else{ ss_transducer_point = data[21]+"\\"+data[22]; } rowStr += ss_transducer_point+separator; break; case "5": //傳感器名稱 rowStr += station_nameIni.ReadValue("測點名稱",data[41])+separator; break; case "6": //傳感器類型代碼 rowStr += transducer_name_codeIni.ReadValue("傳感器類型的代碼","模擬量")+separator; break; case "7": //單位 rowStr += data[34]+separator; break; case "8": //量程下限 string ss_analog_lower = float.Parse(data[33]).ToString(getFormat(data[41],"format")); rowStr += ss_analog_lower+separator; break; case "9": //量程上限 string ss_analog_high = float.Parse(data[31]).ToString(getFormat(data[41],"format")); rowStr += ss_analog_high+separator; break; case "10": //報警下限 string ss_analog_alarmlow = float.Parse(data[32]).ToString(getFormat(data[41],"format")); rowStr += ss_analog_alarmlow+separator; break; case "11": //報警上限 string ss_analog_alarmhigh = float.Parse(data[30]).ToString(getFormat(data[41],"format")); rowStr += ss_analog_alarmhigh+separator; break; case "12": //模擬量斷電下限 rowStr += ss_analog_pofflow+separator; break; case "13": //模擬量斷電上限 rowStr += ss_analog_poffhigh+separator; break; case "14": //模擬量覆電下限 rowStr += ss_analog_ponlow+separator; break; case "15": //模擬量覆電上限 rowStr += ss_analog_ponhigh+separator; break; case "16": //上限斷電區域 rowStr += ss_poffarea_namehigh+separator; break; case "17": //下限斷電區域 rowStr += ss_poffarea_namelow+separator; break; case "18": //設備使用標記 rowStr += "0"+separator; break; default: break; } } rowStr += "~\r\n"; sum++; } } rowStr = rowStr.Replace(separator+"~\r\n","~\r\n"); string title = "KJ;AQMC|"+cs_mine_code+";"+cs_data_time+";"+sum+"~"; string fileSaveName = file_name_save+"\\"+fileName+cs_file_time+".txt"; builder.Append(title+"\r\n"); builder.Append(rowStr+"||"); string ret = builder.ToString().Replace("~\r\n||","~||"); File.WriteAllText(@fileSaveName, ret, Encoding.GetEncoding("gb2312")); Log(fileSaveName+"--模擬量初始化數據文件生成成功!"); fileFtpUpload(rowStr,fileSaveName,fileName); } //開關量初始化數據 void createAQKC(string AQKCFields,string separator,string fileName){ int sum = 0; string rowStr = ""; StringBuilder builder = new StringBuilder(); string[] fields = AQKCFields.Split(','); string cs_file_time = DateTime.Now.ToString("yyyyMMddHHmmss",new System.Globalization.DateTimeFormatInfo()); string cs_data_time = DateTime.Now.ToString("yyyy-MM-dd/HH:mm:ss",new System.Globalization.DateTimeFormatInfo()); foreach(string key in CMD101_Hash.Keys){ if(key.Contains("C")||key.Contains("D")){ string[] data = (string[])CMD101_Hash[key]; //0態斷電 int ss_transducer_outage0 = 0; //0態斷電區域 string ss_transducer_outage_area0 = ""; //1態斷電 int ss_transducer_outage1 = 0; //1態斷電區域 string ss_transducer_outage_area1 = ""; //2態斷電 string ss_transducer_outage2 = ""; if(!data[38].Equals("")){ ss_transducer_outage2 = "0"; } //2態斷電區域 string ss_transducer_outage_area2 = ""; foreach (string key102 in CMD102_Hash.Keys){ string[] data102 = (string[])CMD102_Hash[key102]; if(key.Equals(key102)){ string[] channels = new string[0]; if (data102[1] != null) { channels = bitChannel(int.Parse(data102[1]),8); } foreach (string channel in channels){ string code = formatToTwo(data102[2]) + "C" + formatToTwo(channel); string[] tpProperty_c = (string[])(CMD101_Hash[code]); if(tpProperty_c!=null){ //區域定義 string[] workarea_property = getProperty_workarea(tpProperty_c[42]); if(workarea_property==null){ continue; } if ("0".Equals(data102[3])){ //0態斷電 ss_transducer_outage0 = 1; //0態斷電區域 ss_transducer_outage_area0 = workarea_property[3]; }else if ("1".Equals(data102[3])){ //1態斷電 ss_transducer_outage1 = 1; //1態斷電區域 ss_transducer_outage_area1 = workarea_property[3]; }else if("2".Equals(data102[3])){ //2態斷電 ss_transducer_outage2 = "1"; //2態斷電區域 ss_transducer_outage_area2 = workarea_property[3]; } } } } } for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //系統類型 rowStr += "1"+separator; break; case "2": //分站編號 rowStr += data[26]+separator; break; case "3": //傳感器編號 rowStr += data[24]+separator; break; case "4": //安裝地點 string ss_transducer_point = ""; if(data[21].Equals("")||data[22].Equals("")){ ss_transducer_point = data[21]+data[22]; }else{ ss_transducer_point = data[21]+"\\"+data[22]; } rowStr += ss_transducer_point+separator; break; case "5": //傳感器名稱 rowStr += station_nameIni.ReadValue("測點名稱",data[41])+separator; break; case "6": //傳感器類型代碼 if(key.Contains("C")){ rowStr += transducer_name_codeIni.ReadValue("傳感器類型的代碼","開關量")+separator; }else{ rowStr += transducer_name_codeIni.ReadValue("傳感器類型的代碼","控制量")+separator; } break; case "7": //0態含義 rowStr += data[36]+separator; break; case "8": //0態告警 rowStr += data[18].Equals("1")?"1":"0"+separator; break; case "9": //0態斷電 rowStr += ss_transducer_outage0 + separator; break; case "10": //0態斷電區域 rowStr += ss_transducer_outage_area0 + separator; break; case "11": //1態含義 rowStr += data[37] + separator; break; case "12": //1態告警 rowStr += data[18].Equals("9")?"1":"0"+separator; break; case "13": //1態斷電 rowStr += ss_transducer_outage1 + separator; break; case "14": //1態斷電區域 rowStr += ss_transducer_outage_area1 + separator; break; case "15": //2態含義 rowStr += data[38] + separator; break; case "16": //2態告警 rowStr += separator; break; case "17": //2態斷電 rowStr += ss_transducer_outage2 + separator; break; case "18": //2態斷電區域 rowStr += ss_transducer_outage_area2 + separator; break; default: break; } } rowStr += "~\r\n"; sum++; } } rowStr = rowStr.Replace(separator+"~\r\n","~\r\n"); string title = "KJ;AQKC|"+cs_mine_code+";"+cs_data_time+";"+sum+"~"; string fileSaveName = file_name_save+"\\"+fileName+cs_file_time+".txt"; builder.Append(title+"\r\n"); builder.Append(rowStr+"||"); string ret = builder.ToString().Replace("~\r\n||","~||"); File.WriteAllText(@fileSaveName, ret, Encoding.GetEncoding("gb2312")); Log(fileSaveName+"--開關量初始化數據文件生成成功!"); fileFtpUpload(rowStr,fileSaveName,fileName); } //開關量狀態變化 void createAQKD(string AQKDFields,string separator,string fileName){ int sum = 0; string rowStr = ""; StringBuilder builder = new StringBuilder(); string[] fields = AQKDFields.Split(','); string cs_file_time = DateTime.Now.ToString("yyyyMMddHHmmss",new System.Globalization.DateTimeFormatInfo()); string cs_data_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss",new System.Globalization.DateTimeFormatInfo()); foreach(string key in CMD106_Hash.Keys){ if(key.Contains("D")){ string[] data = (string[])CMD106_Hash[key]; string[] data101 = (string[])CMD101_Hash[key]; //是否告警 string isAlarm = "0"; //是否斷電 string isOutage = "0"; //傳感器運行狀態代碼 double exstatus = double.Parse(data[2]); int exstate = (int) exstatus; string[] str_d = bitChannel(exstate,8); if(str_d[1].Equals("1")){ isOutage = "1"; } if(str_d[2].Equals("1")){ isAlarm = "1"; } for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //系統類型 rowStr += 1+separator; break; case "2": //分站編號 rowStr += data[3]+separator; break; case "3": //傳感器編號 rowStr += data[1]+separator; break; case "4": //安裝地點 string ss_transducer_point = ""; if(data101[21].Equals("")||data101[22].Equals("")){ ss_transducer_point = data101[21]+data101[22]; }else{ ss_transducer_point = data101[21]+"\\"+data101[22]; } rowStr += ss_transducer_point+separator; break; case "5": //傳感器名稱 rowStr += station_nameIni.ReadValue("測點名稱",data101[41])+separator; break; case "6": //當前狀態 rowStr += getState(data[6],"D") + separator; break; case "7": //是否告警 rowStr += isAlarm + separator; break; case "8": //是否斷電 rowStr += isOutage + separator; break; case "9": //數據生成時間 rowStr += cs_data_time + separator; break; case "10": //測點編號(礦井編碼+系統編碼+傳感器數值類型編碼+傳感器類型編碼+原系統測點編碼) //傳感器類型編碼 string transducer_code = transducer_typeIni.ReadValue("傳感器類型編碼表",data101[41]); rowStr += cs_mine_code+"01"+"KG"+transducer_code+key + separator; break; default: break; } } rowStr += "~\r\n"; sum++; } } if(rowStr.Equals("")){ return; } rowStr = rowStr.Replace(separator+"~\r\n","~\r\n"); //文件內容更新時間,數據個數,保留; string other = ";"; string save = ";"; string title = cs_data_time+";"+sum+other+save+"~"; string fileSaveName = file_name_save+"\\"+cs_mine_code+"_"+fileName+"_"+cs_file_time+".txt"; builder.Append(title+"\r\n"); builder.Append(rowStr+"||"); string ret = builder.ToString().Replace("~\r\n||","~||"); File.WriteAllText(@fileSaveName, ret, Encoding.GetEncoding("gb2312")); Log(fileSaveName+"--開關量狀態變化文件生成成功!"); fileFtpUpload(rowStr,fileSaveName,fileName); } //工做面信息數據 void createGzmxx(string gzmxxFields,string separator,string fileName){ int sum = 0; string rowStr = ""; string[] fields = gzmxxFields.Split(','); StringBuilder builder = new StringBuilder(); string cs_data_time = getCurrentTime(); JObject obj = JObject.Parse(CMD104); int nLen = obj["CONTENT"].ToString().Trim().Length; if(nLen>0){ JArray content = (JArray)obj["CONTENT"]; for(int i=0;i<content.Count;i++){ JArray content1 = (JArray)content[i]; string[] data = new string[content1.Count]; for(int j=0;j<content1.Count;j++){ data[j] = content1[j].ToString(); } for(int k=0;k<fields.Length;k++){ string field = fields[k].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //工做面編號 rowStr += data[2]+separator; break; case "2": //工做面名稱 rowStr += data[3]+separator; break; case "3": //工做面類型編號(工做面類型爲哪一個值 去對應附錄4) rowStr += workface_typeIni.ReadValue("工做面類型",data[3])+separator; break; default: break; } } rowStr += "\r\n"; sum++; } } rowStr = rowStr.Replace(separator+"\r\n","\r\n"); string other = "0"; string save = "0"; string title = cs_mine_code+","+cs_data_time+","+sum+","+other+","+save; string fileSaveName = file_name_save+"\\"+fileName+".txt"; builder.Append(title+"\r\n"); builder.Append(rowStr); File.WriteAllText(@fileSaveName, builder.ToString(), Encoding.GetEncoding("gb2312")); Log(fileSaveName+"--工做面信息數據生成成功!"); fileFtpUpload(rowStr,fileSaveName,fileName); } //分站信息數據文件 void createFzxx(string fzxxFields,string separator,string fileName){ int sum = 0; string rowStr = ""; string[] fields = fzxxFields.Split(','); StringBuilder builder = new StringBuilder(); string cs_data_time = getCurrentTime(); foreach(string key in CMD101_FZ_Hash.Keys){ string[] data = (string[])CMD101_FZ_Hash[key]; for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //傳感器編號 rowStr += formatToTwo(data[26])+separator; break; case "2": //工做面編號(分站所在工做面的編號,該編號對應工做面信息文件中的工做面編號) rowStr += data[42]+separator; break; case "3": //安裝地點 string ss_transducer_point = ""; if(data[21].Equals("")||data[22].Equals("")){ ss_transducer_point = data[21]+data[22]; }else{ ss_transducer_point = data[21]+"\\"+data[22]; } rowStr += ss_transducer_point+separator; break; case "4": //分站規格型號(分站的規格型號) rowStr += separator; break; case "5": //分站其它屬性 rowStr += "0"+separator; break; default: break; } } rowStr += "\r\n"; sum++; } rowStr = rowStr.Replace(separator+"\r\n","\r\n"); string other = "0"; string save = "0"; string title = cs_mine_code+","+cs_data_time+","+sum+","+other+","+save; string fileSaveName = file_name_save+"\\"+fileName+".txt"; builder.Append(title+"\r\n"); builder.Append(rowStr); File.WriteAllText(@fileSaveName, builder.ToString(), Encoding.GetEncoding("gb2312")); Log(fileSaveName+"--分站信息數據文件生成成功!"); fileFtpUpload(rowStr,fileSaveName,fileName); } //控制關係數據文件 void createCdkzgx(string fields102,string separator,string fileName){ int sum = 0; string rowStr = ""; string[] fields = fields102.Split(','); StringBuilder builder = new StringBuilder(); string cs_data_time = getCurrentTime(); foreach (string key in CMD102_Hash.Keys){ if(key.Contains("A")||key.Contains("C")||key.Contains("D")){ string[] data = (string[])CMD102_Hash[key]; //測試狀態的過濾 bool bss = false; for(int k=0;k<strI;k++){ if(strArray[k].Equals(key)){ bss = true; } } if(bss){ continue; } for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //源測點編號 rowStr += formatToTwo(data[13])+data[10]+formatToTwo(data[11])+separator; break; case "2": //目的測點編號 rowStr += formatToTwo(data[2])+"C"+formatToTwo(data[1])+separator; break; case "3": //斷電門限 string ss_outage_value = ""; if(key.Contains("A")){ ss_outage_value = formatToDouble(data[0]); }else{ ss_outage_value = data[0]; } rowStr += ss_outage_value+separator; break; case "4": //覆電門限 string ss_analog_value = ""; if(key.Contains("A")){ ss_analog_value = formatToDouble(data[7]); }else{ ss_analog_value = data[7]; } rowStr += ss_analog_value+separator; break; case "5": //饋電傳感器編號 rowStr += separator; break; default: break; } } rowStr += "\r\n"; sum++; } } rowStr = rowStr.Replace(separator+"\r\n","\r\n"); string other = "0"; string save = "0"; string title = cs_mine_code+","+cs_data_time+","+sum+","+other+","+save; string fileSaveName = file_name_save+"\\"+fileName+".txt"; builder.Append(title+"\r\n"); builder.Append(rowStr); File.WriteAllText(@fileSaveName, builder.ToString(), Encoding.GetEncoding("gb2312")); Log(fileSaveName+"--控制關係數據文件生成成功!"); fileFtpUpload(rowStr,fileSaveName,fileName); } //傳感器描述文件(開關量測點屬性) void createCDDY(string DFields,string AFields,string separator,string fileName){ string[] array_D = createCDDY_D(DFields,separator); string[] array_A = createCDDY_A(AFields,separator); string rowStr_D = array_D[0]; string rowStr_A = array_A[0]; string rowStr = rowStr_D+rowStr_A+"||"; rowStr = rowStr.Replace(separator+"~\r\n","~\r\n"); rowStr = rowStr.Replace("\r\n||","||"); int sum_D = int.Parse(array_D[1]); int sum_A = int.Parse(array_A[1]); StringBuilder builder = new StringBuilder(); string cs_data_time = getCurrentTime(); string other = ""; string save = ""; //系統型號;系統名稱;生產廠家;文件內容更新時間;開關量點數;模擬量點數;多態點數;0;0;累計量點數;備用;備用; string title = "01"+";"+"安全監控系統"+";"+configIni.ReadValue("生產廠家","factory")+";"+cs_data_time+";"+sum_D+";"+sum_A+";0;0;0;0;"+other+";"+save+"~"; string fileSaveName = file_name_save+"\\"+fileName+".txt"; builder.Append(title+"\r\n"); builder.Append(rowStr); File.WriteAllText(@fileSaveName, builder.ToString(), Encoding.GetEncoding("gb2312")); Log(fileSaveName+"--傳感器描述文件生成成功!"); fileFtpUpload(rowStr,fileSaveName,fileName); } //傳感器描述文件(開關量測點屬性) string[] createCDDY_D(string DFields,string separator){ int sum = 0; string rowStr = ""; string[] fields = DFields.Split(','); string[] array = new string[2]; List<string> m_str = new List<string>(); foreach (string key in CMD101_Hash.Keys){ if(key.Contains("D")){ string[] data = (string[])CMD101_Hash[key]; string transducer_code = transducer_typeIni.ReadValue("傳感器類型編碼表",data[41]); for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //測點編號(礦井編碼+系統編碼+傳感器數值類型編碼+傳感器類型編碼+原系統測點編碼) //傳感器類型編碼 rowStr += cs_mine_code+"01"+"KG"+transducer_code+key + separator; break; case "2": //分站號 rowStr += cs_mine_code+"01"+"KG"+transducer_code+data[26] + separator; break; case "3": //測點名稱 rowStr += data[22] + separator; break; case "4": //測點所屬區域名稱 string ss_transducer_area = ""; if(getProperty_workarea(data[42])!=null&&getProperty_area(getProperty_workarea(data[42])[1])!=null){ ss_transducer_area = getProperty_area(getProperty_workarea(data[42])[1])[2]; } if(ss_transducer_area.Equals("")&&getProperty_workarea(data[42])!=null){ ss_transducer_area = getProperty_workarea(data[42])[3]; } rowStr += ss_transducer_area + separator; break; case "5": //傳感器所在區域的位置編碼 rowStr += data[42] + separator; break; case "6": //開描述 if(data[46].Equals("1")){ rowStr += "開" + separator; }else{ rowStr += separator; } break; case "7": //停描述 if(data[46].Equals("0")){ rowStr += "關" + separator; }else{ rowStr += separator; } break; case "8": //報警狀態 if(data[46].Equals("1")){ rowStr += "1" + separator; }else{ rowStr += separator; } break; case "9": //解報狀態 if(data[46].Equals("0")){ rowStr += "0" + separator; }else{ rowStr += separator; } break; case "10": //斷電狀態 string ss_outage_value = separator; if(CMD102_Hash.ContainsKey(key)){ //控制定義-控制限 ss_outage_value = ((string[])CMD102_Hash[key])[0]; } rowStr += ss_outage_value + separator; break; case "11": //覆電狀態 string ss_analog_value = ""; if(CMD102_Hash.ContainsKey(key)){ //控制定義-回差限 ss_analog_value = ((string[])CMD102_Hash[key])[7]; } rowStr += ss_analog_value + separator; break; case "12": //傳感器關聯關係 //(1)如該測點 A 與斷電器 B、饋電器 C 存在關係, 則描述爲:D-B-斷電區域的區域名稱(多個區域 之間用「&」隔離):K-C //(2)如該測點 A,與 B 互爲主備關係,則描述爲 Z-B。 //(3)如存在多個相同關係,中間有「◇」隔離。 //閉鎖關係 B 主備關係 Z 關聯風門 G 斷電關係 D 控制關係 K 調節關係 T 保護關係 H //D-B-斷電區域的區域名稱 if(!getSs_poffarea_name(key).Equals("")){ rowStr += "D-B-" + getSs_poffarea_name(key) + separator; }else{ rowStr += ""; } break; default: break; } } rowStr += "~\r\n"; m_str.Add(rowStr); rowStr = ""; sum++; } } rowStr = ""; m_str.Sort(); foreach (string list_d in m_str){ rowStr += list_d; } array[0] = rowStr; array[1] = sum.ToString(); return array; } //傳感器描述文件(開關量測點屬性) string[] createCDDY_A(string AFields,string separator){ int sum = 0; string rowStr = ""; string[] fields = AFields.Split(','); string[] array = new string[2]; List<string> m_str = new List<string>(); foreach (string key in CMD101_Hash.Keys){ if(key.Contains("A")){ string[] data = (string[])CMD101_Hash[key]; string transducer_code = transducer_typeIni.ReadValue("傳感器類型編碼表",data[41]); for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //測點編號(礦井編碼+系統編碼+傳感器數值類型編碼+傳感器類型編碼+原系統測點編碼) //傳感器類型編碼 rowStr += cs_mine_code+"01"+"MN"+transducer_code+key + separator; break; case "2": //分站號 rowStr += cs_mine_code+"01"+"MN"+transducer_code + data[26] + separator; break; case "3": //測點名稱 rowStr += data[41] + separator; break; case "4": //測點所屬區域名稱 string ss_transducer_area = ""; if(getProperty_workarea(data[42])!=null&&getProperty_area(getProperty_workarea(data[42])[1])!=null){ ss_transducer_area = getProperty_area(getProperty_workarea(data[42])[1])[2]; } if(ss_transducer_area.Equals("")&&getProperty_workarea(data[42])!=null){ ss_transducer_area = getProperty_workarea(data[42])[3]; } rowStr += ss_transducer_area + separator; break; case "5": //傳感器所在區域的位置編碼 rowStr += data[42] + separator; break; case "6": //測點值單位 rowStr += data[34] + separator; break; case "7": //高量程 rowStr += formatToDouble(data[31])+separator; break; case "8": //低量程 rowStr += formatToDouble(data[33])+separator; break; case "9": //上限報警門限 rowStr += formatToDouble(data[30])+separator; break; case "10": //上限解報門限 rowStr += formatToDouble(data[30])+separator; break; case "11": //下限報警門限 rowStr += formatToDouble(data[32])+separator; break; case "12": //下限解報門限 rowStr += formatToDouble(data[32])+separator; break; case "13": //上限斷電門限 string ss_outage_value_up = separator; if(CMD102_Hash.ContainsKey(key)){ if(((string[])CMD102_Hash[key])[3].Equals("0")){ //控制定義-控制限 ss_outage_value_up = formatToDouble(((string[])CMD102_Hash[key])[0]); } } rowStr += ss_outage_value_up+separator; break; case "14": //上限覆電門限 string ss_analog_value_up = ""; if(CMD102_Hash.ContainsKey(key)){ if(((string[])CMD102_Hash[key])[3].Equals("0")){ //控制定義-回差限 ss_analog_value_up = formatToDouble(((string[])CMD102_Hash[key])[7]); } } rowStr += ss_analog_value_up+separator; break; case "15": //下限斷電門限 string ss_outage_value_low = separator; if(CMD102_Hash.ContainsKey(key)){ if(((string[])CMD102_Hash[key])[3].Equals("1")){ //控制定義-控制限 ss_outage_value_low = formatToDouble(((string[])CMD102_Hash[key])[0]); } } rowStr += ss_outage_value_low+separator; break; case "16": //下限覆電門限 string ss_analog_value_low = ""; if(CMD102_Hash.ContainsKey(key)){ if(((string[])CMD102_Hash[key])[3].Equals("1")){ //控制定義-回差限 ss_analog_value_low = formatToDouble(((string[])CMD102_Hash[key])[7]); } } rowStr += ss_analog_value_low+separator; break; case "17": //傳感器關聯關係 //D-B-斷電區域的區域名稱 if(!getSs_poffarea_name(key).Equals("")){ rowStr += "D-B-" + getSs_poffarea_name(key) + separator; }else{ rowStr += ""; } break; default: break; } } rowStr += "~\r\n"; m_str.Add(rowStr); rowStr = ""; sum++; } } rowStr = ""; m_str.Sort(); foreach (string list_d in m_str){ rowStr += list_d; } array[0] = rowStr; array[1] = sum.ToString(); return array; } //-----------------------------測點信息數據文件------------------------------------------------------------------------- void createDev(string devFields,string separator,string fileName){ string[] array_A = createDev_A(devFields,separator); string[] array_D = createDev_D(devFields,separator); string[] array_C = createDev_C(devFields,separator); string rowStr_A = array_A[0]; string rowStr_D = array_D[0]; string rowStr_C = array_C[0]; string rowStr = rowStr_A+rowStr_D+rowStr_C; rowStr = rowStr.Replace(",\r\n","\r\n"); int sum_A = int.Parse(array_A[1]); int sum_D = int.Parse(array_D[1]); int sum_C = int.Parse(array_C[1]); int sum = sum_A+sum_D+sum_C; StringBuilder builder = new StringBuilder(); string cs_data_time = getCurrentTime(); //string other = ""; string save = ""; string title = cs_mine_code+","+cs_data_time+","+sum+","+save; string fileSaveName = file_name_save+"\\"+fileName+".txt"; builder.Append(title+"\r\n"); builder.Append(rowStr); File.WriteAllText(@fileSaveName, builder.ToString(), Encoding.GetEncoding("gb2312")); Log(fileSaveName+"--測點信息數據文件生成成功!"); fileFtpUpload(rowStr,fileSaveName,fileName); } //測點信息數據文件-模擬量 string[] createDev_A(string devFields,string separator){ int sum = 0; string rowStr_A = ""; string[] fields = devFields.Split(','); string[] array = new string[2]; List<string> m_strA = new List<string>(); foreach(string key in CMD101_Hash.Keys){ if(key.Contains("A")){ //測試狀態的過濾 string[] data = (string[])CMD101_Hash[key]; if(bitChannel(int.Parse(data[18]),16)[3].Equals("1")){ continue; } for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //分站編號 rowStr_A += formatToTwo(data[26])+separator; break; case "2": //傳感器編號 rowStr_A += formatToTwo(data[26])+data[23]+formatToTwo(data[24])+separator; break; case "3": //工做面編號 rowStr_A += data[42]+separator; break; case "4": //安裝地點 string ss_transducer_point = ""; if(data[21].Equals("")||data[22].Equals("")){ ss_transducer_point = data[21]+data[22]; }else{ ss_transducer_point = data[21]+"\\"+data[22]; } rowStr_A += ss_transducer_point+separator; break; case "5": //傳感器名稱 string ss_transducer_name_code = transducerIni.ReadValue("傳感器名稱",data[41]); if(ss_transducer_name_code.Equals("")){ ss_transducer_name_code = transducerIni.ReadValue("傳感器名稱","其它模擬量"); } rowStr_A += ss_transducer_name_code+separator; break; case "6": //傳感器類型代碼 rowStr_A += transducer_name_codeIni.ReadValue("傳感器類型的代碼","模擬量")+separator; break; case "7": //單位 rowStr_A += data[34]+separator; break; case "8": //模擬量量程下限 rowStr_A += formatToDouble(data[33])+separator; break; case "9": //模擬量量程上限 rowStr_A += formatToDouble(data[31])+separator; break; case "10": //模擬量報警下限 rowStr_A += formatToDouble(data[32])+separator; break; case "11": //模擬量報警上限 rowStr_A += formatToDouble(data[30])+separator; break; case "12": //斷電值 string ss_outage_value = separator; if(CMD102_Hash.ContainsKey(key)){ //控制定義-控制限 ss_outage_value = formatToDouble(((string[])CMD102_Hash[key])[0]); } rowStr_A += ss_outage_value+separator; break; case "13": //覆電值 string ss_analog_value = ""; if(CMD102_Hash.ContainsKey(key)){ //控制定義-回差限 ss_analog_value = formatToDouble(((string[])CMD102_Hash[key])[7]); } rowStr_A += ss_analog_value+separator; break; case "14": //斷電區域 rowStr_A += getSs_poffarea_name(key)+separator; break; default: break; } } rowStr_A += "\r\n"; m_strA.Add(rowStr_A); rowStr_A = ""; sum++; } } rowStr_A = ""; m_strA.Sort(); foreach (string list_a in m_strA){ rowStr_A += list_a; } array[0] = rowStr_A; array[1] = sum.ToString(); return array; } //測點信息數據文件-開關量 string[] createDev_D(string devFields,string separator){ int sum = 0; string rowStr_D = ""; string[] fields = devFields.Split(','); string[] array = new string[2]; List<string> m_strD = new List<string>(); foreach(string key in CMD101_Hash.Keys){ if(key.Contains("D")){ string[] data = (string[])CMD101_Hash[key]; if(bitChannel(int.Parse(data[18]),16)[3].Equals("1")){ continue; } for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //分站編號 rowStr_D += formatToTwo(data[26])+separator; break; case "2": //傳感器編號 rowStr_D += formatToTwo(data[26])+data[23]+formatToTwo(data[24])+separator; break; case "3": //工做面編號 rowStr_D += data[42]+separator; break; case "4": //安裝地點 string ss_transducer_point = ""; if(data[21].Equals("")||data[22].Equals("")){ ss_transducer_point = data[21]+data[22]; }else{ ss_transducer_point = data[21]+"\\"+data[22]; } rowStr_D += ss_transducer_point+separator; break; case "5": //傳感器名稱 string ss_transducer_name_code = transducerIni.ReadValue("傳感器名稱",data[41]); if(ss_transducer_name_code.Equals("")){ ss_transducer_name_code = transducerIni.ReadValue("傳感器名稱","其它開關量"); } rowStr_D += ss_transducer_name_code+separator; break; case "6": //傳感器類型代碼 rowStr_D += transducer_name_codeIni.ReadValue("傳感器類型的代碼","開關量")+separator; break; case "7": //單位 rowStr_D += separator; break; case "8": //模擬量量程下限 rowStr_D += separator; break; case "9": //模擬量量程上限 rowStr_D += separator; break; case "10": //模擬量報警下限 rowStr_D += separator; break; case "11": //模擬量報警上限 rowStr_D += separator; break; case "12": //斷電值 string ss_outage_value = separator; if(CMD102_Hash.ContainsKey(key)){ //控制定義-控制限 ss_outage_value = ((string[])CMD102_Hash[key])[0]; } rowStr_D += ss_outage_value+separator; break; case "13": //覆電值 string ss_analog_value = ""; if(CMD102_Hash.ContainsKey(key)){ //控制定義-回差限 ss_analog_value = ((string[])CMD102_Hash[key])[7]; } rowStr_D += ss_analog_value+separator; break; case "14": //斷電區域 rowStr_D += getSs_poffarea_name(key)+separator; break; default: break; } } rowStr_D += "\r\n"; m_strD.Add(rowStr_D); rowStr_D = ""; sum++; } } rowStr_D = ""; m_strD.Sort(); foreach (string list_d in m_strD){ rowStr_D += list_d; } array[0] = rowStr_D; array[1] = sum.ToString(); return array; } //測點信息數據文件-控制量 string[] createDev_C(string devFields,string separator){ int sum = 0; string rowStr_C = ""; string[] fields = devFields.Split(','); string[] array = new string[2]; List<string> m_strC = new List<string>(); foreach(string key in CMD101_Hash.Keys){ if(key.Contains("C")){ string[] data = (string[])CMD101_Hash[key]; if(bitChannel(int.Parse(data[18]),16)[3].Equals("1")){ continue; } for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //分站編號 rowStr_C += formatToTwo(data[26])+separator; break; case "2": //傳感器編號 rowStr_C += formatToTwo(data[26])+data[23]+formatToTwo(data[24])+separator; break; case "3": //工做面編號 rowStr_C += data[42]+separator; break; case "4": //安裝地點 string ss_transducer_point = ""; if(data[21].Equals("")||data[22].Equals("")){ ss_transducer_point = data[21]+data[22]; }else{ ss_transducer_point = data[21]+"\\"+data[22]; } rowStr_C += ss_transducer_point+separator; break; case "5": //傳感器名稱 string ss_transducer_name_code = transducerIni.ReadValue("傳感器名稱",data[41]); if(ss_transducer_name_code.Equals("")){ ss_transducer_name_code = transducerIni.ReadValue("傳感器名稱","其它控制器"); } rowStr_C += ss_transducer_name_code+separator; break; case "6": //傳感器類型代碼 rowStr_C += transducer_name_codeIni.ReadValue("傳感器類型的代碼","控制量")+separator; break; case "7": //單位 rowStr_C += separator; break; case "8": //模擬量量程下限 rowStr_C += separator; break; case "9": //模擬量量程上限 rowStr_C += separator; break; case "10": //模擬量報警下限 rowStr_C += separator; break; case "11": //模擬量報警上限 rowStr_C += separator; break; case "12": //斷電值 string ss_outage_value = separator; if(CMD102_Hash.ContainsKey(key)){ //控制定義-控制限 ss_outage_value = ((string[])CMD102_Hash[key])[0]; } rowStr_C += ss_outage_value+separator; break; case "13": //覆電值 string ss_analog_value = ""; if(CMD102_Hash.ContainsKey(key)){ //控制定義-回差限 ss_analog_value = ((string[])CMD102_Hash[key])[7]; } rowStr_C += ss_analog_value+separator; break; case "14": //斷電區域 rowStr_C += getSs_poffarea_name(key)+separator; break; default: break; } } rowStr_C += "\r\n"; m_strC.Add(rowStr_C); rowStr_C = ""; sum++; } } rowStr_C = ""; m_strC.Sort(); foreach (string list_c in m_strC){ rowStr_C += list_c; } array[0] = rowStr_C; array[1] = sum.ToString(); return array; } //------------------------------------------統計數據文件------------------------------------------------------ //統計數據文件list void createJktjsj_list(string fiveMinuFields,string separator,string fileName){ //傳感器代碼 string ss_transducer_code = ""; //模擬量檢測值 string ss_analog_value = ""; List<string> list = new List<string>(); List<string> list_state = new List<string>(); string cs_data_time = getCurrentTime(); //定義數據列表 foreach(string key in CMD101_Hash.Keys){ if(key.Contains("A")){ string[] data = (string[])CMD101_Hash[key]; //過濾測試測點 if(bitChannel(int.Parse(data[18]),16)[3].Equals("1")){ continue; } //傳感器編號+數值 string strs = key+","+data[46]; string stateStr = key+","+data[44]+","+data[45]; list.Add(strs); list_state.Add(stateStr); } } //增量數據106的數值、狀態集合 foreach (string jsonList in listFiveMinuter){ JObject obj = JObject.Parse(jsonList); int nLen = obj["CONTENT"].ToString().Trim().Length; if(nLen>0){ JArray content = (JArray)obj["CONTENT"]; for(int i=0;i<content.Count;i++){ JArray content1 = (JArray)content[i]; string[] data = new string[content1.Count]; for(int j=0;j<content1.Count;j++){ data[j] = content1[j].ToString(); } if(data[0].Equals("A")){ //傳感器代碼 ss_transducer_code = formatToTwo(data[3])+"A"+formatToTwo(data[1]); ss_analog_value = data[5]; //傳感器編號+數值 string strs = ss_transducer_code +","+ ss_analog_value; string stateStr = ss_transducer_code+","+data[6]+","+data[2]; //測試狀態的過濾 bool bss = false; for(int k=0;k<strI;k++){ if(strArray[k].Equals(ss_transducer_code)){ bss = true; } } if(!bss){ list.Add(strs); list_state.Add(stateStr); } } } } } createCodeStateHash(list_state); createCodeValHash(list); //獲取平均值、最大值、最小值 getAvgMaxMin(); //統計數據文件 createJktjsj(fiveMinuFields,separator,fileName); listFiveMinuter.Clear(); } //統計數據文件 void createJktjsj(string fiveMinuFields,string separator,string fileName){ int sum = 0; string rowStr = ""; string[] fields = fiveMinuFields.Split(','); StringBuilder builder = new StringBuilder(); string cs_file_time = DateTime.Now.ToString("yyyyMMddHHmmss",new System.Globalization.DateTimeFormatInfo()); string cs_data_time = getCurrentTime(); DateTime et = DateTime.Now.AddSeconds(-double.Parse("300")); string cs_data_time_begin = et.ToString("yyyy-MM-dd/HH:mm:ss"); foreach (string key in key_avg_Hash.Keys){ if(key.Contains("A")){ List<float> list = (List<float>)key_avg_Hash[key]; string[] data = (string[])CMD101_Hash[key]; //工做狀態 string ss_transducer_state = ""; //狀態 int state = 0; List<int> list_state = (List<int>)key_state_Hash[key]; for(int i = 0;i<list_state.Count;i++){ state = list_state[i]; string hex = Convert.ToString(state,16); ss_transducer_state = stateIni.ReadValue("狀態","A-"+hex); switch(hex){ case "10" : ss_transducer_state = "正常"; break; case "11" : ss_transducer_state = "超下限"; break; case "12" : ss_transducer_state = "超上限"; break; case "f8" : ss_transducer_state = "負漂"; break; case "f9" : ss_transducer_state = "溢出"; break; case "fe" : ss_transducer_state = "斷線"; break; case "ff" : ss_transducer_state = "中斷"; break; case "80" : ss_transducer_state = "未知"; break; } } //延展狀態 int exstate = 0; List<int> list_exstate = (List<int>)key_exstate_Hash[key]; for(int i = 0;i<list_exstate.Count;i++){ exstate = list_exstate[i]; string[] str_a = bitChannel(exstate,8); if (exstate == 0){ ss_transducer_state = "正常"; } if (str_a[0].Equals("1")){ ss_transducer_state = "調試"; } if (str_a[1].Equals("1")){ ss_transducer_state = "斷電"; } if (str_a[2].Equals("1")){ ss_transducer_state = "報警"; } if (str_a[3].Equals("1")){ ss_transducer_state = "預警"; } if (str_a[4].Equals("1")){ ss_transducer_state = "僞數據"; } if (str_a[5].Equals("1")){ ss_transducer_state = "異常數據"; } } for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //安全監控系統分站代碼 rowStr += key.Substring(0,3) + "F00" + separator; break; case "2": //傳感器編號代碼 rowStr += key+ separator+"~"; break; case "3": //最大值 rowStr += formatToDouble(list[1].ToString())+ separator; break; case "4": //最大值時間 rowStr += getTime_Hash[key+formatToDouble(list[1].ToString())].ToString()+ separator; break; case "5": //最小值 rowStr += formatToDouble(list[2].ToString())+ separator; break; case "6": //最小值時間 rowStr += getTime_Hash[key+formatToDouble(list[2].ToString())].ToString()+ separator; break; case "7": //平均值 rowStr += formatToDouble(list[0].ToString())+ separator; break; case "8": //系統類型 rowStr += "1" + separator; break; case "9": //安裝地點 string ss_transducer_point = ""; if(data[21].Equals("")||data[22].Equals("")){ ss_transducer_point = data[21]+data[22]; }else{ ss_transducer_point = data[21]+"\\"+data[22]; } rowStr += ss_transducer_point+separator; break; case "10": //傳感器名稱 rowStr += station_nameIni.ReadValue("測點名稱",data[41])+separator; break; case "11": //統計開始時間 rowStr += cs_data_time_begin+separator; break; case "12": //統計結束時間 rowStr += cs_data_time+separator; break; case "13": //工做狀態 rowStr += ss_transducer_state+separator; break; case "14": //測點編號(礦井編碼+系統編碼+傳感器數值類型編碼+傳感器類型編碼+原系統測點編碼) string transducer_code = transducer_typeIni.ReadValue("傳感器類型編碼表",data[41]); rowStr += cs_mine_code+"01"+"MN"+transducer_code+key + separator; break; default: break; } } rowStr += "~\r\n"; sum++; } } rowStr = rowStr.Replace(separator+"~\r\n","~\r\n"); string other = ""; string save = ""; string title = cs_data_time+";"+sum+";"+other+";"+save; string fileSaveName = file_name_save+"\\"+cs_mine_code+"_"+fileName+"_"+cs_file_time+".txt"; builder.Append(title+"\r\n"); builder.Append(rowStr+"||"); string ret = builder.ToString().Replace("~\r\n||","~||"); File.WriteAllText(@fileSaveName, ret.ToString(), Encoding.GetEncoding("gb2312")); Log(fileSaveName+"--統計數據文件生成成功!"); fileFtpUpload(rowStr,fileSaveName,fileName); } //-----------------------------------------------實時數據文件------------------------------------ //實時數據 每10秒生成一次,含全部測點數據 void createAQSS(string AQSSFields,string separator,string fileName){ int sum = 0; string rowStr = ""; string[] fields = AQSSFields.Split(','); StringBuilder builder = new StringBuilder(); string cs_file_time = DateTime.Now.ToString("yyyyMMddHHmmss",new System.Globalization.DateTimeFormatInfo()); string cs_data_time = getCurrentTime(); foreach(string key in CMD_all_Hash.Keys){ if(key.Contains("A")||key.Contains("C")||key.Contains("D")){ //值 狀態 拓展狀態 名稱 string[] data = (string[])CMD_all_Hash[key]; string[] data101 = (string[])CMD101_Hash[key]; //當前監測值 string format = getFormat(data[3],"format"); float ss_transducer_value = 0; //顯示值 string ss_transducer_show_value = ""; if(key.Contains("A")){ ss_transducer_value = float.Parse(double.Parse(data[0]).ToString(format)); ss_transducer_show_value = ss_transducer_value.ToString(); }else{ if(data[0].Equals("1")){ ss_transducer_show_value = "開"; }else if(data[0].Equals("0")){ ss_transducer_show_value = "關"; } } //當前狀態 string ss_transducer_state = ""; if(key.Contains("A")){ ss_transducer_state = getState(data[1],"A"); }else if(key.Contains("D")){ ss_transducer_state = getState(data[1],"D"); }else if(key.Contains("C")){ ss_transducer_state = getState(data[1],"C"); } for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //系統類型 rowStr += "1" + separator; break; case "2": //分站編號 rowStr += data101[26]+ separator; break; case "3": //傳感器編號 rowStr += data101[23]+ separator; break; case "4": //安裝地點 string ss_transducer_point = ""; if(data101[21].Equals("")||data101[22].Equals("")){ ss_transducer_point = data101[21]+data101[22]; }else{ ss_transducer_point = data101[21]+"\\"+data101[22]; } rowStr += ss_transducer_point+separator; break; case "5": //傳感器名稱 rowStr += station_nameIni.ReadValue("測點名稱",data[3])+separator; break; case "6": //當前監測值 rowStr += ss_transducer_value+separator; break; case "7": //顯示值 rowStr += ss_transducer_show_value+separator; break; case "8": //當前狀態 rowStr += ss_transducer_state+separator; break; default: break; } } rowStr += "~\r\n"; sum++; } } rowStr = rowStr.Replace(separator+"~\r\n","~\r\n"); string title = "KJ;AQSS|"+cs_mine_code+";"+cs_data_time+";"+sum+"~"; string fileSaveName = file_name_save+"\\"+fileName+".txt"; builder.Append(title+"\r\n"); builder.Append(rowStr+"||"); string ret = builder.ToString().Replace("~\r\n||","~||"); File.WriteAllText(@fileSaveName, ret, Encoding.GetEncoding("gb2312")); Log(fileSaveName+"--實時數據文件生成成功!"); fileFtpUpload(rowStr,fileSaveName,fileName); } //實時數據文件 void createRtdata(string rtdataFields,string separator,string fileName){ StringBuilder builder = new StringBuilder(); string cs_data_time = getCurrentTime(); string[] array_A = createRtdata_A(rtdataFields,separator); string[] array_D = createRtdata_D(rtdataFields,separator); string[] array_C = createRtdata_C(rtdataFields,separator); string rowStr_A = array_A[0]; string rowStr_D = array_D[0]; string rowStr_C = array_C[0]; string rowStr = rowStr_A+rowStr_D+rowStr_C; rowStr = rowStr.Replace(",\r\n","\r\n"); int sum_A = int.Parse(array_A[1]); int sum_D = int.Parse(array_D[1]); int sum_C = int.Parse(array_C[1]); int sum = sum_A+sum_D+sum_C; //string other = "0"; string save = ""; string title = cs_mine_code+","+cs_data_time+","+sum+","+editSign+","+save; editSign = 0; string fileSaveName = file_name_save+"\\"+fileName+".txt"; builder.Append(title+"\r\n"); builder.Append(rowStr); File.WriteAllText(@fileSaveName, builder.ToString(), Encoding.GetEncoding("gb2312")); Log(fileSaveName+"--實時數據文件生成成功!"); fileFtpUpload(rowStr,fileSaveName,fileName); } //實時數據文件-模擬量 string[] createRtdata_A(string rtdataFields,string separator){ string rowStr = ""; int sum = 0; string[] fields = rtdataFields.Split(','); List<string> m_str = new List<string>(); //全量數據 foreach(string key in CMD_all_Hash.Keys){ if(key.Contains("A")){ string[] data = (string[])CMD_all_Hash[key]; string[] data101 = (string[])CMD101_Hash[key]; for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //傳感器編號 rowStr += key+separator; break; case "2": //值 rowStr += formatToDouble(data[0])+separator; break; case "3": //傳感器運行狀態代碼 rowStr += getState(data[1],"A")+separator; break; default: break; } } rowStr += "\r\n"; m_str.Add(rowStr); rowStr = ""; sum++; } } rowStr = ""; m_str.Sort(); foreach (string list_a in m_str){ rowStr += list_a; } string[] array = new string[2]; array[0] = rowStr; array[1] = sum.ToString(); return array; } //實時數據文件-開關量 string[] createRtdata_D(string rtdataFields,string separator){ string rowStr = ""; int sum = 0; string[] fields = rtdataFields.Split(','); List<string> m_str = new List<string>(); foreach(string key in CMD_all_Hash.Keys){ if(key.Contains("D")){ string[] data = (string[])CMD_all_Hash[key]; string[] data101 = (string[])CMD101_Hash[key]; for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //傳感器編號 rowStr += key+separator; break; case "2": //值 string ss_transducer_value = ""; int status = int.Parse(data[1]); string hex = Convert.ToString(status,16); switch(hex){ case "0": //數字量0態 ss_transducer_value = "1"; break; case "1": //數字量1態 ss_transducer_value = "0"; break; case "2": //數字量2態 ss_transducer_value = "0"; break; case "ff": //中斷 ss_transducer_value = "0"; break; case "80": //未知 ss_transducer_value = "0"; break; default: break; } rowStr += ss_transducer_value+separator; break; case "3": //傳感器運行狀態代碼 rowStr += getState(data[1],"D")+separator; break; default: break; } } rowStr += "\r\n"; m_str.Add(rowStr); rowStr = ""; sum++; } } rowStr = ""; m_str.Sort(); foreach (string list_a in m_str){ rowStr += list_a; } string[] array = new string[2]; array[0] = rowStr; array[1] = sum.ToString(); return array; } //實時數據文件-數字量 string[] createRtdata_C(string rtdataFields,string separator){ string rowStr = ""; int sum = 0; string[] fields = rtdataFields.Split(','); List<string> m_str = new List<string>(); foreach(string key in CMD_all_Hash.Keys){ if(key.Contains("C")){ string[] data = (string[])CMD_all_Hash[key]; string[] data101 = (string[])CMD101_Hash[key]; for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //傳感器編號 rowStr += key+separator; break; case "2": //值 string ss_transducer_value = ""; int status = int.Parse(data[1]); string hex = Convert.ToString(status,16); switch(hex){ case "0": //饋電正常 ss_transducer_value = "0"; break; case "1": //饋電異常 ss_transducer_value = "1"; break; case "ff": //中斷 ss_transducer_value = "1"; break; case "80": //未知 ss_transducer_value = "1"; break; default: break; } rowStr += ss_transducer_value+separator; break; case "3": //傳感器運行狀態代碼 rowStr += getState(data[1],"C")+separator; break; default: break; } } rowStr += "\r\n"; m_str.Add(rowStr); rowStr = ""; sum++; } } rowStr = ""; m_str.Sort(); foreach (string list_a in m_str){ rowStr += list_a; } string[] array = new string[2]; array[0] = rowStr; array[1] = sum.ToString(); return array; } //實時數據文件 void createSSSJ(string SSSJFields,string separator,string fileName){ StringBuilder builder = new StringBuilder(); string cs_data_time = getCurrentTime(); string[] array_A = createSSSJ_A(SSSJFields,separator); string[] array_D = createSSSJ_D(SSSJFields,separator); string[] array_C = createSSSJ_C(SSSJFields,separator); string rowStr_A = array_A[0]; string rowStr_D = array_D[0]; string rowStr_C = array_C[0]; string rowStr = rowStr_A+rowStr_D+rowStr_C+"||"; rowStr = rowStr.Replace(separator+"~\r\n","~\r\n"); rowStr = rowStr.Replace("\r\n||","||"); int sum_A = int.Parse(array_A[1]); int sum_D = int.Parse(array_D[1]); int sum_C = int.Parse(array_C[1]); int sum = sum_A+sum_D+sum_C; string save = ""; string title = cs_data_time+";"+sum+";"+save+"~"; string cs_file_time = DateTime.Now.ToString("yyyyMMddHHmmss",new System.Globalization.DateTimeFormatInfo()); string fileSaveName = file_name_save+"\\"+cs_mine_code+"_"+fileName+"_"+cs_file_time+".txt"; builder.Append(title+"\r\n"); builder.Append(rowStr); File.WriteAllText(@fileSaveName, builder.ToString(), Encoding.GetEncoding("gb2312")); Log(fileSaveName+"--實時數據文件生成成功!"); fileFtpUpload(rowStr,fileSaveName,fileName); } //實時數據文件-模擬量 string[] createSSSJ_A(string SSSJFields,string separator){ string rowStr = ""; int sum = 0; string[] fields = SSSJFields.Split(','); List<string> m_str = new List<string>(); //全量數據 foreach(string key in CMD_all_Hash.Keys){ if(key.Contains("A")){ string[] data = (string[])CMD_all_Hash[key]; string transducer_code = transducer_typeIni.ReadValue("傳感器類型編碼表",data[3]); for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //測點編號(礦井編碼+系統編碼+傳感器數值類型編碼+傳感器類型編碼+原系統測點編碼) //傳感器類型編碼 rowStr += cs_mine_code+"01"+"MN"+transducer_code+key + separator; break; case "2": //值 rowStr += formatToDouble(data[0])+separator; break; case "3": //傳感器運行狀態代碼 rowStr += getState(data[1],"A")+separator; break; default: break; } } rowStr += "~\r\n"; m_str.Add(rowStr); rowStr = ""; sum++; } } rowStr = ""; m_str.Sort(); foreach (string list_a in m_str){ rowStr += list_a; } string[] array = new string[2]; array[0] = rowStr; array[1] = sum.ToString(); return array; } //實時數據文件-開關量 string[] createSSSJ_D(string SSSJFields,string separator){ string rowStr = ""; int sum = 0; string[] fields = SSSJFields.Split(','); List<string> m_str = new List<string>(); foreach(string key in CMD_all_Hash.Keys){ if(key.Contains("D")){ //數值、狀態、延展狀態、名稱、安裝地點、分站編號、傳感器編號、時間 string[] data = (string[])CMD_all_Hash[key]; string transducer_code = transducer_typeIni.ReadValue("傳感器類型編碼表",data[3]); for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //測點編號(礦井編碼+系統編碼+傳感器數值類型編碼+傳感器類型編碼+原系統測點編碼) //傳感器類型編碼 rowStr += cs_mine_code+"01"+"KG"+transducer_code+key + separator; break; case "2": //值 string ss_transducer_value = ""; int status = int.Parse(data[1]); string hex = Convert.ToString(status,16); switch(hex){ case "0": //數字量0態 ss_transducer_value = "0"; break; case "1": //數字量1態 ss_transducer_value = "1"; break; case "2": //數字量2態 ss_transducer_value = "2"; break; case "ff": //中斷 ss_transducer_value = "2"; break; case "80": //未知 ss_transducer_value = "2"; break; default: break; } rowStr += ss_transducer_value+separator; break; case "3": //傳感器運行狀態代碼 rowStr += getState(data[1],"D")+separator; break; default: break; } } rowStr += "~\r\n"; m_str.Add(rowStr); rowStr = ""; sum++; } } rowStr = ""; m_str.Sort(); foreach (string list_a in m_str){ rowStr += list_a; } string[] array = new string[2]; array[0] = rowStr; array[1] = sum.ToString(); return array; } //實時數據文件-數字量 string[] createSSSJ_C(string SSSJFields,string separator){ string rowStr = ""; int sum = 0; string[] fields = SSSJFields.Split(','); List<string> m_str = new List<string>(); foreach(string key in CMD_all_Hash.Keys){ if(key.Contains("C")){ string[] data = (string[])CMD_all_Hash[key]; string transducer_code = transducer_typeIni.ReadValue("傳感器類型編碼表",data[3]); for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //測點編號(礦井編碼+系統編碼+傳感器數值類型編碼+傳感器類型編碼+原系統測點編碼) //傳感器類型編碼 rowStr += cs_mine_code+"01"+"KG"+transducer_code+key + separator; break; case "2": //值 string ss_transducer_value = ""; int status = int.Parse(data[1]); string hex = Convert.ToString(status,16); switch(hex){ case "0": //饋電正常 ss_transducer_value = "1"; break; case "1": //饋電異常 ss_transducer_value = "1"; break; case "ff": //中斷 ss_transducer_value = "0"; break; case "80": //未知 ss_transducer_value = "2"; break; default: break; } rowStr += ss_transducer_value+separator; break; case "3": //傳感器運行狀態代碼 rowStr += getState(data[1],"C")+separator; break; default: break; } } rowStr += "~\r\n"; m_str.Add(rowStr); rowStr = ""; sum++; } } rowStr = ""; m_str.Sort(); foreach (string list_a in m_str){ rowStr += list_a; } string[] array = new string[2]; array[0] = rowStr; array[1] = sum.ToString(); return array; } //------------------------------------接收數據並存入本地hashtable------------------------------------------- //測點定義數據 Hashtable CMD101_Hash = new Hashtable(); void InitCMD101(string cs_data_time){ strI = 0; CMD101_Hash.Clear(); JObject obj = JObject.Parse(CMD101); //過濾爲空的數據 int nLen = obj["CONTENT"].ToString().Trim().Length; if(nLen>0){ JArray content = (JArray)obj["CONTENT"]; for(int i=0;i<content.Count;i++){ JArray content1 = (JArray)content[i]; string[] data = new string[content1.Count+1]; for(int j=0;j<content1.Count;j++){ data[j] = content1[j].ToString(); } data[content1.Count] = cs_data_time; //傳感器編號(26-分站編號,23-測點getState類型,24-測點號) string code = formatToTwo(data[26])+data[23]+formatToTwo(data[24]); //測試狀態的過濾 if(bitChannel(int.Parse(data[18]),16)[3].Equals("1")){ strArray[strI] = code; strI++; } CMD101_Hash[code] = data; } } } //分站數據 Hashtable CMD101_FZ_Hash = new Hashtable(); void InitCMD101_fz(){ CMD101_FZ_Hash.Clear(); JObject obj = JObject.Parse(CMD101); int nLen = obj["CONTENT"].ToString().Trim().Length; if(nLen>0){ JArray content = (JArray)obj["CONTENT"]; for(int i=0;i<content.Count;i++){ JArray content1 = (JArray)content[i]; string[] data = new string[content1.Count]; for(int j=0;j<content1.Count;j++){ data[j] = content1[j].ToString(); } //測試狀態的過濾 if(bitChannel(int.Parse(data[18]),16)[3].Equals("1")){ continue; } string code = formatToTwo(data[26]); //42-區域編號 if(CMD101_FZ_Hash.ContainsKey(code)&&data[42].Equals("0")){ continue; } CMD101_FZ_Hash[code] = data; } } } //控制定義數據 Hashtable CMD102_Hash = new Hashtable(); void InitCMD102(){ CMD102_Hash.Clear(); JObject obj = JObject.Parse(CMD102); int nLen = obj["CONTENT"].ToString().Trim().Length; if(nLen>0){ JArray content = (JArray)obj["CONTENT"]; for(int i=0;i<content.Count;i++){ JArray content1 = (JArray)content[i]; string[] data = new string[content1.Count]; for(int j=0;j<content1.Count;j++){ data[j] = content1[j].ToString(); } string code = formatToTwo(data[13]) + data[10] + formatToTwo(data[11]); CMD102_Hash[code] = data; } } } //增量數據 Hashtable CMD106_Hash = new Hashtable(); void InitCMD106(){ CMD106_Hash.Clear(); JObject obj = JObject.Parse(CMD106); int nLen = obj["CONTENT"].ToString().Trim().Length; if(nLen>0){ JArray content = (JArray)obj["CONTENT"]; for(int i=0;i<content.Count;i++){ JArray content1 = (JArray)content[i]; string[] data = new string[content1.Count]; for(int j=0;j<content1.Count;j++){ data[j] = content1[j].ToString(); } string code = formatToTwo(data[3]) + data[0] + formatToTwo(data[1]); CMD106_Hash[code] = data; } } } //全量數據 Hashtable CMD_all_Hash = new Hashtable(); void InitCMD_all(){ CMD_all_Hash.Clear(); JObject obj = JObject.Parse(CMD101); int nLen = obj["CONTENT"].ToString().Trim().Length; if(nLen>0){ JArray content = (JArray)obj["CONTENT"]; for(int i=0;i<content.Count;i++){ JArray content1 = (JArray)content[i]; string[] data = new string[content1.Count]; for(int j=0;j<content1.Count;j++){ data[j] = content1[j].ToString(); } if(data[23].Equals("A")||data[23].Equals("D")||data[23].Equals("C")){ if(bitChannel(int.Parse(data[18]),16)[3].Equals("1")){ continue; } //安裝地點 string ss_transducer_point = ""; if(data[21].Equals("")||data[22].Equals("")){ ss_transducer_point = data[21]+data[22]; }else{ ss_transducer_point = data[21]+"\\"+data[22]; } //獲取數據生成時間 string time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss",new System.Globalization.DateTimeFormatInfo()); //數值、狀態、延展狀態、名稱、安裝地點、分站編號、傳感器編號、時間 string code = formatToTwo(data[26])+data[23]+formatToTwo(data[24]); string[] array = {data[46],data[44],data[45],data[41],ss_transducer_point,data[26],data[24],time}; CMD_all_Hash[code] = array; } } } JObject obj106 = JObject.Parse(CMD106); int nLen106 = obj106["CONTENT"].ToString().Trim().Length; if(nLen106>0){ JArray content106 = (JArray)obj106["CONTENT"]; for(int i=0;i<content106.Count;i++){ JArray content1 = (JArray)content106[i]; string[] data = new string[content1.Count]; for(int j=0;j<content1.Count;j++){ data[j] = content1[j].ToString(); } if(data[0].Equals("A")||data[0].Equals("D")||data[0].Equals("C")){ string code = formatToTwo(data[3])+data[0]+formatToTwo(data[1]); string time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss",new System.Globalization.DateTimeFormatInfo()); //數值、狀態、延展狀態、名稱、安裝地點、分站編號、傳感器編號、時間 string[] data1 = (string[])CMD_all_Hash[code]; if(data1!=null){ string[] array = {data[5],data[6],data[2],data1[3],data1[4],data1[5],data1[6],time}; CMD_all_Hash[code] = array; } } } } } //鍵值hashtable Hashtable key_val_Hash = new Hashtable(); void createCodeValHash(List<string> list){ key_val_Hash.Clear(); foreach(string list_value in list){ string[] sArray=list_value.Split(',') ; //傳感器編號 string key = sArray[0]; //數值 string value = sArray[1]; if (!key_val_Hash.ContainsKey(key)) { List<float> list1 = new List<float>(); list1.Add(float.Parse(value)); key_val_Hash[key] = list1; }else { List<float> list1 = (List<float>)key_val_Hash[key]; list1.Add(float.Parse(value)); key_val_Hash[key] = list1; } } list = new List<string>(); } //求平均值 Hashtable key_avg_Hash = new Hashtable(); void getAvgMaxMin(){ key_avg_Hash.Clear(); foreach (string key in key_val_Hash.Keys){ List<float> list = (List<float>)key_val_Hash[key]; float sum = 0; foreach(float list_value in list){ sum += list_value; } List<float> list_val = new List<float>(); //平均值 float ss_analog_avgvalue = sum/list.Count; //最大值 float ss_analog_maxvalue = list.Max(); //最小值 float ss_analog_minvalue = list.Min(); list_val.Add(ss_analog_avgvalue); list_val.Add(ss_analog_maxvalue); list_val.Add(ss_analog_minvalue); key_avg_Hash.Add(key,list_val); } } //存儲模擬量測點值對應時間 Hashtable getTime_Hash = new Hashtable(); void getTimeJktjsj(string time){ foreach(string key in CMD101_Hash.Keys){ if(key.Contains("A")){ string[] data = (string[])CMD101_Hash[key]; //測點操做狀態 if(bitChannel(int.Parse(data[18]),16)[3].Equals("1")){ continue; } string code_value = key+formatToDouble(data[46]); getTime_Hash[code_value] = time; } } JObject obj = JObject.Parse(CMD106); int nLen = obj["CONTENT"].ToString().Trim().Length; if(nLen>0){ JArray content = (JArray)obj["CONTENT"]; for(int i=0;i<content.Count;i++){ JArray content1 = (JArray)content[i]; string[] data = new string[content1.Count]; for(int j=0;j<content1.Count;j++){ data[j] = content1[j].ToString(); } if(data[0].Equals("A")){ string code = formatToTwo(data[3]) + data[0] + formatToTwo(data[1]); string code_value = code + formatToDouble(data[5]); getTime_Hash[code_value] = time; } } } } //狀態hashtable Hashtable key_state_Hash = new Hashtable(); //延展狀態hashtable Hashtable key_exstate_Hash = new Hashtable(); //獲取五分鐘內測點對應的狀態集合 void createCodeStateHash(List<string> list_state){ key_state_Hash.Clear(); key_exstate_Hash.Clear(); foreach(string list in list_state){ string[] sArray=list.Split(',') ; string key = sArray[0]; string state = sArray[1]; string exstate = sArray[2]; if (!key_state_Hash.ContainsKey(key)) { List<int> list1 = new List<int>(); list1.Add(int.Parse(state)); key_state_Hash[key] = list1; } else { List<int> list1 = (List<int>)key_state_Hash[key]; list1.Add(int.Parse(state)); key_state_Hash[key] = list1; } if (!key_exstate_Hash.ContainsKey(key)) { List<int> list1 = new List<int>(); list1.Add(int.Parse(exstate)); key_exstate_Hash[key] = list1; } else { List<int> list1 = (List<int>)key_exstate_Hash[key]; list1.Add(int.Parse(exstate)); key_exstate_Hash[key] = list1; } } } //----------------------------------------------通用函數------------------------------------------------------------ //讀取generateFile.txt文件內容 JArray readGenerateFile(){ StreamReader sr = new StreamReader("./generateFile.txt",Encoding.UTF8); StringBuilder builder = new StringBuilder(); string line; while ((line = sr.ReadLine()) != null){ builder.Append(line); } JArray array = JArray.Parse(builder.ToString()); return array; } //讀取KJ66.txt配置文件,獲取數據格式和單位 string getFormat(string name,string str){ StreamReader sr = new StreamReader("./kj66.txt",Encoding.GetEncoding("gb2312")); StringBuilder builder = new StringBuilder(); string line; while ((line = sr.ReadLine()) != null){ builder.Append(line); } JObject obj = JObject.Parse(builder.ToString()); JArray array = (JArray)obj["simulate"]; foreach (JObject items in array){ if(items["name"].ToString().Equals(name)){ if(str.Equals("format")){ return items[str].ToString(); } if(str.Equals("unit")){ return items[str].ToString(); } } } sr.Close(); return null; } //獲取測點狀態 string getState(string state,string type){ string ss_transducer_status = ""; int status = int.Parse(state); string hex = Convert.ToString(status,16); ss_transducer_status = stateIni.ReadValue("狀態",type+"-"+hex); return ss_transducer_status; } //檢測傳感器狀態 string[] bitChannel(int ctbit,int num){ string[] channel = new string[num]; for (int i = 0; i < channel.Length; i++){ if((ctbit&0x1)==1){ channel[i]="1"; }else{ channel[i]="0"; } ctbit = ctbit>>1; } return channel; } //區域定義(獲取安裝地點數據--區域) string[] getProperty_area(string str){ JObject obj = JObject.Parse(CMD103); int nLen = obj["CONTENT"].ToString().Trim().Length; if(nLen>0){ JArray content = (JArray)obj["CONTENT"]; for(int i=0;i<content.Count;i++){ JArray content1 = (JArray)content[i]; string[] data = new string[content1.Count]; for(int j=0;j<content1.Count;j++){ data[j] = content1[j].ToString(); } if(data[1].Equals(str)){ return data; } } } return null; } //工做面定義(獲取安裝地點數據--工做面) 根據工做面編號 string[] getProperty_workarea(string str){ JObject obj = JObject.Parse(CMD104); int nLen = obj["CONTENT"].ToString().Trim().Length; if(nLen>0){ JArray content = (JArray)obj["CONTENT"]; for(int i=0;i<content.Count;i++){ JArray content1 = (JArray)content[i]; string[] data = new string[content1.Count]; for(int j=0;j<content1.Count;j++){ data[j] = content1[j].ToString(); } if(data[2].Equals(str)){ return data; } } } return null; } //獲取斷電區域 string getSs_poffarea_name(string key){ string ss_poffarea_name = ""; foreach (string key102 in CMD102_Hash.Keys){ string[] data102 = (string[])CMD102_Hash[key102]; if(key.Equals(key102)){ string[] channels = new string[0]; if (data102[1] != null) { //data102[1] 被控通道位 channels = bitChannel(int.Parse(data102[1]),8); } foreach (string channel in channels){ string code = formatToTwo(data102[2]) + "C" + formatToTwo(channel); string[] tpProperty_c = (string[])(CMD101_Hash[code]); if(tpProperty_c!=null) { //區域定義 工做面定義104-42-區域編號 string[] workarea_property = getProperty_workarea(tpProperty_c[42]); if(workarea_property==null){ continue; } //斷電區域名稱 ss_poffarea_name = workarea_property[3]; break; } } } } return ss_poffarea_name; } //測點所屬區域名稱 private string getSs_transducer_point(string key){ string[] data = (string[])CMD101_Hash[key]; //安裝地點 string ss_transducer_point = ""; if(getProperty_workarea(data[42])!=null){ ss_transducer_point = getProperty_workarea(data[42])[3]; } //string point_str = configIni.ReadValue("地點","AddrOrWNameOrRName"); if(getProperty_workarea(data[42])!=null&&getProperty_area(getProperty_workarea(data[42])[1])!=null){ ss_transducer_point = getProperty_area(getProperty_workarea(data[42])[1])[2]; } // if(point_str.Equals("addr")){ // ss_transducer_point = data[22]; // }else if(point_str.Equals("wname")){ // if(getProperty_workarea(data[42])!=null){ // ss_transducer_point = getProperty_workarea(data[42])[3]; // } // }else if(point_str.Equals("rname")){ // if(getProperty_workarea(data[42])!=null&&getProperty_area(getProperty_workarea(data[42])[1])!=null){ // ss_transducer_point = getProperty_area(getProperty_workarea(data[42])[1])[2]; // } // } return ss_transducer_point; } string getCurrentTime(){ return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss",new System.Globalization.DateTimeFormatInfo()); } //轉換數據格式 string formatToTwo(string str){ return double.Parse(str).ToString("00"); } string formatToDouble(string str){ return double.Parse(str).ToString("0.00"); } //----------------------------------------FTP上傳----------------------------------------------------- //ftp上傳 string ftpServerIP; string ftpRemotePath; string ftpUserID = null; string ftpPassword = null; string ftpURI; Boolean ftp_buffer = true; Boolean ftp_boo = true; string ftpUpload(string filename){ ftpServerIP = configIni.ReadValue("ftp","ftpurl"); ftpRemotePath = configIni.ReadValue("ftp","file"); ftpUserID = configIni.ReadValue("ftp","username"); ftpPassword = configIni.ReadValue("ftp","password"); ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/"; string ret = Upload(filename); return ret; } //根據generateFile.txt判斷是否使用FTP上傳 string isFTP(){ string isNeed = ""; //讀取generateFile.txt文件內容 JArray array = readGenerateFile(); foreach (JObject items in array){ string resource = items["resource"].ToString(); if(resource.Equals("FTP")){ isNeed = items["isNeed"].ToString(); } } return isNeed; } //上傳 string Upload(string filename){ string ret = "success"; FileInfo fileInf = new FileInfo(filename); string uri = ftpURI + fileInf.Name; FtpWebRequest reqFTP; reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); if (ftpUserID != null){ reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); } reqFTP.KeepAlive = false; reqFTP.Method = WebRequestMethods.Ftp.UploadFile; reqFTP.UseBinary = true; reqFTP.UsePassive = false; reqFTP.ContentLength = fileInf.Length; int buffLength = 2048; byte[] buff = new byte[buffLength]; int contentLen; FileStream fs = fileInf.OpenRead(); try { Stream strm = reqFTP.GetRequestStream(); contentLen = fs.Read(buff, 0, buffLength); while (contentLen != 0) { strm.Write(buff, 0, contentLen); contentLen = fs.Read(buff, 0, buffLength); } strm.Close(); fs.Close(); } catch (Exception ex) { ret = "error"; //throw new Exception("Ftphelper Upload Error --> " + ex.Message); } return ret; } //ftp具體文件上傳 void fileFtpUpload(string rowStr,string fileSaveName,string fileName){ if(isFTP().Equals("1")){ string ret = ftpUpload(fileSaveName); if(ret.Equals("success")){ //上傳緩存數據文件 ftpBufferFile(); Log(fileSaveName+"-"+fileName+"文件-ftp上傳成功!"); }else{ Log(fileSaveName+"-"+fileName+"文件-ftp上傳失敗!"); ftp_boo = true; string time = DateTime.Now.ToString("yyyyMMddHHmmss",new System.Globalization.DateTimeFormatInfo()); fileSaveName = configIni.ReadValue("文件目錄","fileReserveBuffer")+"\\"+fileName+"文件"+time+".txt"; File.WriteAllText(@fileSaveName, rowStr, Encoding.GetEncoding("gb2312")); } } } //ftp上傳緩存文件 void ftpBufferFile(){ if(ftp_boo){ string path = configIni.ReadValue("文件目錄","fileReserveBuffer"); DirectoryInfo folder = new DirectoryInfo(path); foreach (FileInfo file in folder.GetFiles("*.txt")){ ftpUpload(file.FullName); if(ftp_buffer){ Log(path+"--ftp上傳緩存成功!"); ftp_buffer = false; } } DeleteFolder(path); ftp_boo = false; } } //清空緩存中文件 void DeleteFolder(string dir){ foreach (string d in Directory.GetFileSystemEntries(dir)){ if (File.Exists(d)){ FileInfo fi = new FileInfo(d); if (fi.Attributes.ToString().IndexOf("ReadOnly") != -1){ fi.Attributes = FileAttributes.Normal; } File.Delete(d);//直接刪除其中的文件 }else{ DirectoryInfo d1 = new DirectoryInfo(d); if (d1.GetFiles().Length != 0){ DeleteFolder(d1.FullName);//遞歸刪除子文件夾 } Directory.Delete(d); } } } //----------------------------------------窗口程序------------------------------------------------------ //輸入框不可爲空 int textIsNull(){ if (this.minecode.Text.Trim().Equals("")) { Log("煤礦代碼不能爲空"); this.minecode.Focus(); return 1; } if (this.url.Text.Trim().Equals("")) { Log("IP地址不能爲空"); this.url.Focus(); return 1; } if (this.backupUrl.Text.Trim().Equals("")) { Log("備用IP地址不能爲空"); this.backupUrl.Focus(); return 1; } if (this.port.Text.Trim().Equals("")) { Log("端口號不能爲空"); this.port.Focus(); return 1; } if (this.intervalTime.Text.Trim().Equals("")) { Log("時間間隔不能爲空"); this.intervalTime.Focus(); return 1; } return 0; } void SaveBtnClick(object sender, EventArgs e){ int isNull = textIsNull(); //生成config.ini文件 generateIni(); //讀取ini配置文件 iniReader(); if(isNull==0){ //輸入框置不可選 setEnabled(); setFtpEnabled(); //獲取KJ66數據 connectWebsocket(); Log("保存成功!"); Log("websocket connecting..."); } } void FileReserveBtnClick(object sender, EventArgs e){ FolderBrowserDialog path = new FolderBrowserDialog(); path.ShowDialog(); this.fileReserve.Text = path.SelectedPath; } void FileReserveBufferBtnClick(object sender, EventArgs e){ FolderBrowserDialog path = new FolderBrowserDialog(); path.ShowDialog(); this.fileReserveBuffer.Text = path.SelectedPath; } //生成config.ini文件 void generateIni(){ WriteValue("煤礦代碼","CS_MINE_CODE", this.minecode.Text); WriteValue("IP地址(KJ66的IP地址)","URL", this.url.Text); WriteValue("備用IP地址","backupUrl", this.backupUrl.Text); WriteValue("端口號","PORT", this.port.Text); WriteValue("文件時間間隔","intervalTime", this.intervalTime.Text); WriteValue("文件目錄","fileReserve", this.fileReserve.Text); WriteValue("ftp","ftpurl", this.ftpurl.Text); WriteValue("ftp","file", this.ftpfile.Text); WriteValue("ftp","username", this.ftpusername.Text); WriteValue("ftp","password", this.ftppassword1.Text); WriteValue("文件目錄","fileReserveBuffer", this.fileReserveBuffer.Text); } //config.ini頁面初始化 void InitUI(){ this.minecode.Text = configIni.ReadValue("煤礦代碼","CS_MINE_CODE"); this.url.Text = configIni.ReadValue("IP地址(KJ66的IP地址)","URL"); this.backupUrl.Text = configIni.ReadValue("備用IP地址","backupUrl"); this.port.Text = configIni.ReadValue("端口號","PORT"); this.intervalTime.Text = configIni.ReadValue("文件時間間隔","intervalTime"); this.fileReserve.Text = configIni.ReadValue("文件目錄","fileReserve"); this.ftpurl.Text = configIni.ReadValue("ftp","ftpurl"); this.ftpfile.Text = configIni.ReadValue("ftp","file"); this.ftpusername.Text = configIni.ReadValue("ftp","username"); this.ftppassword1.Text = configIni.ReadValue("ftp","password"); this.fileReserveBuffer.Text = configIni.ReadValue("文件目錄","fileReserveBuffer"); this.minecode.Focus(); } //輸入框置不可選 void setEnabled(){ this.saveBtn.Enabled = false; this.minecode.Enabled = false; this.url.Enabled = false; this.backupUrl.Enabled = false; this.port.Enabled = false; this.intervalTime.Enabled = false; this.fileReserveBtn.Enabled = false; } //FTP輸入框置不可選 void setFtpEnabled(){ this.ftpurl.Enabled = false; this.ftpfile.Enabled = false; this.ftpusername.Enabled = false; this.ftppassword1.Enabled = false; this.fileReserveBufferBtn.Enabled = false; } //listBox輸出日誌 private delegate void DoLog(string msg);//代理 void Log(string msg){ if (this.InvokeRequired){ DoLog doLog = new DoLog(Log); this.Invoke(doLog, new object[] { msg }); }else{ if (logReveal.Items.Count > 20) { logReveal.Items.RemoveAt(0); } msg = DateTime.Now.ToLocalTime().ToString() + " " + msg; logReveal.Items.Add(msg); } } } }