获取websocket数据,C#小窗口程序,FTP上传,一切皆配置

最近在做一个数据上传的C#程序,通过获取websocket数据,读取ini配置文件,依据相关文档完成数据上传。

ini配置文件展示

[煤矿代码]
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"
}
]

配置文件中数字含义

[dev]
1=分站编号
2=传感器编号
3=工作面编号
4=安装地点
5=传感器名称
6=传感器类型代码
7=单位
8=量程下限
9=量程上限
10=报警下限
11=报警上限
12=断电值
13=复电值
14=断电区域
[rtdata]
1=传感器编号
2=实时测量值
3=测点状态

程序源码

/*
 * 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);
			}
		}
	}
}

 

转载于:https://my.oschina.net/u/4006148/blog/2252460

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值