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

阅读: 评论:0

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

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

2019独角兽企业重金招聘Python工程师标准>>>

最近在做一个数据上传的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:minetemplate
fileReserveBuffer=E:minetemplatebuffer
[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();}//首先判断列表框中的项是否大于0if(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(){//读取文件内容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(){//读取文件内容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();//读取文件内容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(){//读取文件内容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 += "rn";sum++;}}rowStr = rowStr.Replace(separator+"rn","rn");// 关联文件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 += "rn";sum++;}}rowStr = rowStr.Replace(separator+"rn","rn");// 关联文件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 += "~rn";sum++;}}rowStr = rowStr.Replace(separator+"~rn","~rn");string title = "KJ;AQMC|"+cs_mine_code+";"+cs_data_time+";"+sum+"~";string fileSaveName = file_name_save+"\"+fileName+cs_file_time+".txt";builder.Append(title+"rn");builder.Append(rowStr+"||");string ret = builder.ToString().Replace("~rn||","~||");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 += "~rn";sum++;}}rowStr = rowStr.Replace(separator+"~rn","~rn");string title = "KJ;AQKC|"+cs_mine_code+";"+cs_data_time+";"+sum+"~";string fileSaveName = file_name_save+"\"+fileName+cs_file_time+".txt";builder.Append(title+"rn");builder.Append(rowStr+"||");string ret = builder.ToString().Replace("~rn||","~||");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 += "~rn";sum++;}}if(rowStr.Equals("")){return;}rowStr = rowStr.Replace(separator+"~rn","~rn");//文件内容更新时间,数据个数,保留; 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+"rn");builder.Append(rowStr+"||");string ret = builder.ToString().Replace("~rn||","~||");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 += "rn";sum++;}}rowStr = rowStr.Replace(separator+"rn","rn");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+"rn");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 += "rn";sum++;}rowStr = rowStr.Replace(separator+"rn","rn");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+"rn");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 += "rn";sum++;}}rowStr = rowStr.Replace(separator+"rn","rn");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+"rn");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+"~rn","~rn");rowStr = rowStr.Replace("rn||","||");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+"rn");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 += "~rn";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 += "~rn";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(",rn","rn");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+"rn");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 += "rn";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 += "rn";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 += "rn";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;}//------------------------------------------统计数据文件------------------------------------------------------//统计数据文件listvoid 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 += "~rn";sum++;}}rowStr = rowStr.Replace(separator+"~rn","~rn");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+"rn");builder.Append(rowStr+"||");string ret = builder.ToString().Replace("~rn||","~||");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 += "~rn";sum++;}}rowStr = rowStr.Replace(separator+"~rn","~rn");string title = "KJ;AQSS|"+cs_mine_code+";"+cs_data_time+";"+sum+"~";string fileSaveName = file_name_save+"\"+fileName+".txt";builder.Append(title+"rn");builder.Append(rowStr+"||");string ret = builder.ToString().Replace("~rn||","~||");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(",rn","rn");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+"rn");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 += "rn";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 += "rn";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 += "rn";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+"~rn","~rn");rowStr = rowStr.Replace("rn||","||");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+"rn");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 += "~rn";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 += "~rn";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 += "~rn";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;}}}}}//键值hashtableHashtable 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;}}}}//状态hashtableHashtable key_state_Hash = new Hashtable();//延展状态hashtableHashtable 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;}}}//----------------------------------------------通用函数------------------------------------------------------------//读取文件内容JArray readGenerateFile(){StreamReader sr = new StreamReader("./",Encoding.UTF8);StringBuilder builder = new StringBuilder();string line;while ((line = sr.ReadLine()) != null){builder.Append(line);}JArray array = JArray.Parse(builder.ToString());return array;}//读取配置文件,获取数据格式和单位string getFormat(string name,string str){StreamReader sr = new StreamReader("./",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;}//根据判断是否使用FTP上传string isFTP(){string isNeed = "";//读取文件内容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("");}}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);}}}
}

 

转载于:

本文发布于:2024-01-29 18:55:41,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170652574317557.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:一切皆   窗口   上传   程序   数据
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23