獲取websocket數據,C#小窗口程序,FTP上傳,一切皆配置

最近在作一個數據上傳的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);
			}
		}
	}
}
相關文章
相關標籤/搜索