最近在作一个数据上传的C#程序,经过获取websocket数据,读取ini配置文件,依据相关文档完成数据上传。web
ini配置文件展现json
[煤矿代码] CS_MINE_CODE=411481B0012010000011 [IP地址(KJ66的IP地址)] URL=192.168.100.23 [备用IP地址] backupUrl=192.168.100.231 [端口号] PORT=9999 [文件时间间隔] intervalTime=12 fiveMinuter=300 [文件目录] fileReserve=E:\mine\template fileReserveBuffer=E:\mine\template\buffer [ftp] ftpurl=192.168.100.19:31 file=lxx username=guor password=123 [备用IP地址] backupUrl=192.168.100.23
界面展现缓存
一切皆配置安全
[{ "resource":"FTP", "separator":",", "isNeed":"0" } ,{ "resource":"DEV", "filename": "devcgq", "fields":[1,3,2,4,5,6,7,8,9,10,11,12,13], "separator":",", "filter":"([15]==0)&&([12]==1)", "isNeed":"1" } ,{ "resource":"RTDATA", "filename": "ssdata", "fields":[1,2,3], "separator":",", "filter":"([15]==0)&&([12]==1)", "isNeed":"1" } ]
配置文件中数字含义websocket
[dev] 1=分站编号 2=传感器编号 3=工做面编号 4=安装地点 5=传感器名称 6=传感器类型代码 7=单位 8=量程下限 9=量程上限 10=报警下限 11=报警上限 12=断电值 13=复电值 14=断电区域 [rtdata] 1=传感器编号 2=实时测量值 3=测点状态
程序源码socket
/* * Created by SharpDevelop. * User: Administrator * Date: 2018/9/27 星期四 * Time: 8:49 * * To change this template use Tools | Options | Coding | Edit Standard Headers. */ using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Windows.Forms; using Newtonsoft.Json.Linq; using WebSocket4Net; namespace DataUploadTemplate{ public partial class MainForm : Form{ public MainForm(){ //The InitializeComponent() call is required for Windows Forms designer support. InitializeComponent(); iniReader(); InitUI(); if(isFTP().Equals("0")){ setFtpEnabled(); } //首先判断列表框中的项是否大于0 if(logReveal.Items.Count > 0){ //清空全部项 logReveal.Items.Clear(); } } //读取ini配置文件-----------------------------begin------------------------------------------------------- //基本信息 MainForm configIni = null; //状态 MainForm stateIni = null; //延展状态 MainForm exstateIni = null; //传感器名称代码 MainForm transducerIni = null; //传感器类型的代码 MainForm transducer_name_codeIni = null; //生成文件 MainForm templateIni = null; //文件字段 MainForm generateFileIni = null; //工做面类型 MainForm workface_typeIni = null; //测点名称 MainForm station_nameIni = null; //传感器类型 MainForm typeIni = null; //开关量IO类型 MainForm switch_io_dIni = null; //控制量IO类型 MainForm switch_io_cIni = null; //传感器类型编码表 MainForm transducer_typeIni = null; //煤矿名称 string cs_mine_code = ""; //存储路径 string file_name_save = ""; //读取INI配置文件 void iniReader(){ //基本信息 configIni = new MainForm("./config.ini"); //状态 stateIni = new MainForm("./state.ini"); //延展状态 exstateIni = new MainForm("./exstate.ini"); //传感器名称代码 transducerIni = new MainForm("./transducer.ini"); //传感器类型的代码 transducer_name_codeIni = new MainForm("./transducer_name_code.ini"); //生成文件 templateIni = new MainForm("./template.ini"); //文件字段 generateFileIni = new MainForm("./generateFile.ini"); //工做面类型 workface_typeIni = new MainForm("./workface_type.ini"); //测点名称 station_nameIni = new MainForm("./station_name.ini"); //传感器类型 typeIni = new MainForm("./type.ini"); //开关量IO类型 switch_io_dIni = new MainForm("./switch_io_d.ini"); //控制量IO类型 switch_io_cIni = new MainForm("./switch_io_c.ini"); //传感器类型编码表 transducer_typeIni = new MainForm("./transducer_type.ini"); //煤矿名称 cs_mine_code = configIni.ReadValue("煤矿代码","CS_MINE_CODE"); //存储路径 file_name_save = configIni.ReadValue("文件目录","fileReserve"); } //读取ini文件 // 声明INI文件的写操做函数 WritePrivateProfileString() [System.Runtime.InteropServices.DllImport("kernel32")] static extern long WritePrivateProfileString(string section, string key, string val, string filePath); // 声明INI文件的读操做函数 GetPrivateProfileString() [System.Runtime.InteropServices.DllImport("kernel32")] static extern int GetPrivateProfileString(string section, string key, string def, System.Text.StringBuilder retVal, int size, string filePath); string sPath = null; public MainForm(string path){ this.sPath = path; } string ReadValue(string section, string key){ // 每次从ini中读取多少字节 System.Text.StringBuilder temp = new System.Text.StringBuilder(255); // section=配置节,key=键名,temp=上面,path=路径 GetPrivateProfileString(section, key, "", temp, 255, sPath); return temp.ToString(); } //congig.ini路径 static string INIFileName =Path.Combine(Directory.GetCurrentDirectory(), "config.ini"); //写入ini文件 void WriteValue(string SECTION,string key, string value){ if (!File.Exists(INIFileName)){ FileStream fs = new FileStream(INIFileName, FileMode.OpenOrCreate); } WritePrivateProfileString(SECTION, key, value, INIFileName); return; } //-----------------------------------链接websocket---------------------------------------------- void websocket_MessageReceived(object sender, MessageReceivedEventArgs e){ MessageReceivedEventArgs responseMsg = (MessageReceivedEventArgs)e; //接收服务端发来的消息 string strMsg = responseMsg.Message; recieveMessage(strMsg); } Boolean websocketConn = true; void websocket_Closed(object sender, EventArgs e){ if(websocketConn){ Log("websocekt connect fail!启用备用IP!"); connectWebsocketBackup(); }else{ Log("websocekt connect fail! 请确认KJ66 IP地址的准确性!"); websocketConn = false; } } void websocket_Opened(object sender, EventArgs e){ Log("websocket_Opened"); } //websocket链接 void connectWebsocket(){ string url = configIni.ReadValue("IP地址(KJ66的IP地址)","URL"); string port = configIni.ReadValue("端口号","PORT"); websocket = new WebSocket("ws://"+url+":"+port); websocket.Opened += websocket_Opened; websocket.Closed += websocket_Closed; websocket.MessageReceived += websocket_MessageReceived; websocket.Open(); } //备用websocket链接 private void connectWebsocketBackup(){ string url = configIni.ReadValue("备用IP地址","backupUrl"); string port = configIni.ReadValue("端口号","PORT"); websocket = new WebSocket("ws://"+url+":"+port); websocket.Opened += websocket_Opened; websocket.Closed += websocket_Closed; websocket.MessageReceived += websocket_MessageReceived; websocket.Open(); websocketConn = false; } //------------------------------------接收websocket数据------------------------------------------- //测点定义 string CMD101 = ""; //控制定义 string CMD102 = ""; //区域定义 string CMD103 = ""; //工做面定义 string CMD104 = ""; //位置定义 string CMD105 = ""; //增量数据 string CMD106 = ""; //测试状态测点集合 string[] strArray = new string[2048]; int strI = 0; WebSocket websocket = null; List<string> listFiveMinuter = new List<string>(); Boolean bFiveMinute = false; long lLastTimeFiveMinute = 0; Boolean bStart30 = false; long lLastTime30 = 0; //修改标志 int editSign = 0; void recieveMessage(string jsonText){ var obj = JObject.Parse(jsonText); var id = obj["CMD_ID"].ToString(); switch (id) { case "101": CMD101 = jsonText; editSign = 1; break; case "102": CMD102 = jsonText; break; case "103": CMD103 = jsonText; break; case "104": CMD104 = jsonText; break; case "105": CMD105 = jsonText; break; case "106": CMD106 = jsonText; break; default: break; } //根据类型不一样分别建立XML文件 if(!CMD101.Equals("")&&!CMD102.Equals("")&&!CMD103.Equals("")&&!CMD104.Equals("")&&!CMD105.Equals("")&&!CMD106.Equals("")){ //获取数据生成时间 string cs_data_time = getCurrentTime(); try{ //接收数据并存入本地hashtable //测点定义数据 InitCMD101(cs_data_time); //控制定义 InitCMD102(); //分站数据 InitCMD101_fz(); getValueByIndex(); }catch(Exception e){ Log(e.Message); } CMD102 = ""; CMD103 = ""; CMD104 = ""; CMD105 = ""; } if(!CMD101.Equals("")&&!CMD106.Equals("")){ try{ InitCMD106(); listFiveMinuter.Add(CMD106); string cs_data_time = getCurrentTime(); //全量数据hash化 InitCMD_all(); //生成实时状态下的所需文件 getValueBySSSJ(); //存储模拟量测点值对应时间 getTimeJktjsj(cs_data_time); }catch(Exception e){ Log(e.Message); } } long lCurrentTime30 = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000; if(!bStart30){ lLastTime30 = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000; bStart30 = true; } if(bStart30 && ((lCurrentTime30-lLastTime30)>=long.Parse(configIni.ReadValue("文件时间间隔","intervalTime")))){ lLastTime30 = lCurrentTime30; try{ //何岗煤矿传感器全局定时显示(模拟量显示、开关量显示、实时数据) getValueByAllAnalogDisplay(); }catch(Exception e){ Log(e.Message); } } //等待五分钟执行监测文件 long lCurrentTime = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000; if(!bFiveMinute){ lLastTimeFiveMinute = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000; bFiveMinute = true; } if(bFiveMinute && ((lCurrentTime-lLastTimeFiveMinute)>=long.Parse(configIni.ReadValue("文件时间间隔","fiveMinuter")))){ lLastTimeFiveMinute = lCurrentTime; try{ //统计数据文件 getValueByIndexFive(); }catch(Exception e){ Log(e.Message); } } } //获取配置文件中-基本定义文件 void getValueByIndex(){ //读取generateFile.txt文件内容 JArray array = readGenerateFile(); string fileName = ""; foreach (JObject items in array){ string resource = items["resource"].ToString(); string separator = items["separator"].ToString(); string isNeed = items["isNeed"].ToString(); if(isNeed.Equals("0")){ continue; } switch (resource){ case "DEV": string devFields = items["fields"].ToString(); fileName = items["filename"].ToString(); //测点信息数据文件 createDev(devFields,separator,fileName); break; case "控制关系定义": string fields102 = items["fields"].ToString(); fileName = items["filename"].ToString(); createCdkzgx(fields102,separator,fileName); break; case "分站定义": string fzxxFields = items["fields"].ToString(); fileName = items["filename"].ToString(); createFzxx(fzxxFields,separator,fileName); break; case "工做面定义": string gzmxxFields = items["fields"].ToString(); fileName = items["filename"].ToString(); createGzmxx(gzmxxFields,separator,fileName); break; case "模拟量初始化": string AQMCFields = items["fields"].ToString(); fileName = items["filename"].ToString(); createAQMC(AQMCFields,separator,fileName); break; case "开关量初始化": string AQKCFields = items["fields"].ToString(); fileName = items["filename"].ToString(); createAQKC(AQKCFields,separator,fileName); break; case "传感器描述文件": string fields = items["fields"].ToString(); var obj = JObject.Parse(fields); string CDDYFields_A = obj["A"].ToString(); string CDDYFields_D = obj["D"].ToString(); string CDDYFields_C = obj["C"].ToString(); fileName = items["filename"].ToString(); string CDDY_time = DateTime.Now.ToString("yyyyMMddHHmmss",new System.Globalization.DateTimeFormatInfo()); string CDDY_filePath = cs_mine_code+"_"+fileName+"_"+CDDY_time; createCDDY(CDDYFields_D,CDDYFields_A,separator,CDDY_filePath); break; default: break; } } } //获取配置文件中-实时状态文件 void getValueBySSSJ(){ //读取generateFile.txt文件内容 JArray array = readGenerateFile(); string fileName = ""; foreach (JObject items in array){ string resource = items["resource"].ToString(); string separator = items["separator"].ToString(); string isNeed = items["isNeed"].ToString(); if(isNeed.Equals("0")){ continue; } switch (resource){ case "RTDATA": string rtdataFields = items["fields"].ToString(); fileName = items["filename"].ToString(); createRtdata(rtdataFields,separator,fileName); break; case "开关量状态变化": string AQKDFields = items["fields"].ToString(); fileName = items["filename"].ToString(); createAQKD(AQKDFields,separator,fileName); break; default: break; } } } //获取配置文件中-分钟累计文件 void getValueByIndexFive(){ string cs_data_time = getCurrentTime(); //读取generateFile.txt文件内容 JArray array = readGenerateFile(); string fileName = ""; foreach (JObject items in array){ string resource = items["resource"].ToString(); string separator = items["separator"].ToString(); string isNeed = items["isNeed"].ToString(); if(isNeed.Equals("0")){ continue; } switch (resource){ case "五分钟统计文件": string fiveMinuFields = items["fields"].ToString(); fileName = items["filename"].ToString(); createJktjsj_list(fiveMinuFields,separator,fileName); break; default: break; } } } //-------------------------------------------何岗煤矿传感器全局定时显示--------------------------- void getValueByAllAnalogDisplay(){ //读取generateFile.txt文件内容 JArray array = readGenerateFile(); string fileName = ""; foreach (JObject items in array){ string resource = items["resource"].ToString(); string separator = items["separator"].ToString(); string isNeed = items["isNeed"].ToString(); if(isNeed.Equals("0")){ continue; } switch (resource){ case "模拟量显示": string analogDisplayFields = items["fields"].ToString(); fileName = items["filename"].ToString(); //何岗煤矿全局模拟量定时显示 createAnalogDisplay(analogDisplayFields,separator,fileName); break; case "开关量显示": string switchDisplayFields = items["fields"].ToString(); fileName = items["filename"].ToString(); //何岗煤矿全局开关量定时显示 createSwitchDisplay(switchDisplayFields,separator,fileName); break; case "实时数据": string AQSSFields = items["fields"].ToString(); fileName = items["filename"].ToString(); createAQSS(AQSSFields,separator,fileName); break; case "实时数据文件": string SSSJFields = items["fields"].ToString(); fileName = items["filename"].ToString(); createSSSJ(SSSJFields,separator,fileName); break; } } } //何岗煤矿全局开关量定时显示 void createSwitchDisplay(string switchDisplayFields,string separator,string fileName){ int sum = 0; string rowStr = ""; string[] fields = switchDisplayFields.Split(','); foreach (string key in CMD_all_Hash.Keys){ if (key.Contains("C")||key.Contains("D")){ //数值、状态、延展状态、名称、安装地点、分站编号、传感器编号、时间 string[] data = (string[])CMD_all_Hash[key]; //类型 int ss_transducer_type = 0; //io类型 string ss_transducer_type_io = ""; //状态 string ss_transducer_value = ""; if(key.Contains("D")){ //类型 ss_transducer_type = 1; //io类型 ss_transducer_type_io = switch_io_dIni.ReadValue("开关量输入I/0类型",data[3]); //状态 ss_transducer_value = getState(data[2],"D"); }else if(key.Contains("C")){ //类型 ss_transducer_type = 2; //io类型 ss_transducer_type_io = switch_io_cIni.ReadValue("开关量控制输出I/O类型",data[3]); //状态 ss_transducer_value = getState(data[2],"C"); } for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //分站编号 rowStr += data[5] + separator; break; case "2": //传感器编号 rowStr += data[6] + separator; break; case "3": //传感器类型 rowStr += ss_transducer_type + separator; break; case "4": //安装地点 rowStr += data[4] + separator; break; case "5": //io类型 rowStr += ss_transducer_type_io + separator; break; case "6": //状态 rowStr += ss_transducer_value + separator; break; case "7": //煤矿代码 rowStr += cs_mine_code + separator; break; case "8": //数据生成时间 rowStr += data[7] + separator; break; default: break; } } rowStr += "\r\n"; sum++; } } rowStr = rowStr.Replace(separator+"\r\n","\r\n"); // 关联文件 string filename = configIni.ReadValue("文件目录","fileReserve")+"\\"+fileName+".txt"; //建立或覆盖文件 File.WriteAllText(@filename, rowStr, Encoding.GetEncoding("gb2312")); Log(filename+"-开关量显示文件!"); fileFtpUpload(rowStr,filename,fileName); } //何岗煤矿全局模拟量定时显示 void createAnalogDisplay(string analogDisplayFields,string separator,string fileName){ int sum = 0; string rowStr = ""; string[] fields = analogDisplayFields.Split(','); foreach (string key in CMD_all_Hash.Keys){ if (key.Contains("A")){ //数值、状态、延展状态、名称、安装地点、分站编号、传感器编号、时间 string[] data = (string[])CMD_all_Hash[key]; for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //分站编号 rowStr += data[5] + separator; break; case "2": //传感器编号 rowStr += data[6] + separator; break; case "3": //传感器类型 rowStr += typeIni.ReadValue("传感器类型",data[3]) + separator; break; case "4": //安装地点 rowStr += data[4] + separator; break; case "5": //值 rowStr += data[0] + separator; break; case "6": //状态 rowStr += getState(data[1],"A") + separator; break; case "7": //煤矿代码 rowStr += cs_mine_code + separator; break; case "8": //数据生成时间 rowStr += data[7] + separator; break; default: break; } } rowStr += "\r\n"; sum++; } } rowStr = rowStr.Replace(separator+"\r\n","\r\n"); // 关联文件 string filename = configIni.ReadValue("文件目录","fileReserve")+"\\"+fileName+".txt"; //建立或覆盖文件 File.WriteAllText(@filename, rowStr, Encoding.GetEncoding("gb2312")); Log(filename+"-模拟量显示文件!"); fileFtpUpload(rowStr,filename,fileName); } //-----------------------------------------------基本定义文件------------------------------------ //模拟量初始化数据 void createAQMC(string AQMCFields,string separator,string fileName){ int sum = 0; string rowStr = ""; StringBuilder builder = new StringBuilder(); string[] fields = AQMCFields.Split(','); string cs_file_time = DateTime.Now.ToString("yyyyMMddHHmmss",new System.Globalization.DateTimeFormatInfo()); string cs_data_time = DateTime.Now.ToString("yyyy-MM-dd/HH:mm:ss",new System.Globalization.DateTimeFormatInfo()); foreach(string key in CMD101_Hash.Keys){ if(key.Contains("A")){ string[] data = (string[])CMD101_Hash[key]; //模拟量断电下限 string ss_analog_pofflow = ""; //模拟量断电上限 string ss_analog_poffhigh = ""; //模拟量复电下限 string ss_analog_ponlow = ""; //模拟量复电上限 string ss_analog_ponhigh = ""; //上限断电区域 string ss_poffarea_namehigh = ""; //下限断电区域 string ss_poffarea_namelow = ""; foreach (string key102 in CMD102_Hash.Keys){ string[] data102 = (string[])CMD102_Hash[key102]; if(key.Equals(key102)){ string[] channels = new string[0]; if (data102[1] != null) { channels = bitChannel(int.Parse(data102[1]),8); } foreach (string channel in channels){ string code = formatToTwo(data102[2]) + "C" + formatToTwo(channel); string[] tpProperty_c = (string[])(CMD101_Hash[code]); if(tpProperty_c!=null) { //区域定义 string[] workarea_property = getProperty_workarea(tpProperty_c[42]); if(workarea_property==null){ continue; } if ("0".Equals(data102[3])) { //上限断电区域 ss_poffarea_namehigh = workarea_property[3]; break; } if ("1".Equals(data102[3])) { //下限断电区域 ss_poffarea_namelow = workarea_property[3]; break; } } } string format = getFormat(data[41],"format"); if ("0".Equals(data102[3])){ //模拟量断电上限 ss_analog_poffhigh = float.Parse(data102[0]).ToString(format); //模拟量复电上限 ss_analog_ponhigh = float.Parse(data102[7]).ToString(format); } if ("1".Equals(data102[3])){ //模拟量断电下限 ss_analog_pofflow = float.Parse(data102[0]).ToString(format); //模拟量复电下限 ss_analog_ponlow = float.Parse(data102[7]).ToString(format); } } } for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //系统类型 rowStr += "1"+separator; break; case "2": //分站编号 rowStr += data[26]+separator; break; case "3": //传感器编号 rowStr += data[24]+separator; break; case "4": //安装地点 string ss_transducer_point = ""; if(data[21].Equals("")||data[22].Equals("")){ ss_transducer_point = data[21]+data[22]; }else{ ss_transducer_point = data[21]+"\\"+data[22]; } rowStr += ss_transducer_point+separator; break; case "5": //传感器名称 rowStr += station_nameIni.ReadValue("测点名称",data[41])+separator; break; case "6": //传感器类型代码 rowStr += transducer_name_codeIni.ReadValue("传感器类型的代码","模拟量")+separator; break; case "7": //单位 rowStr += data[34]+separator; break; case "8": //量程下限 string ss_analog_lower = float.Parse(data[33]).ToString(getFormat(data[41],"format")); rowStr += ss_analog_lower+separator; break; case "9": //量程上限 string ss_analog_high = float.Parse(data[31]).ToString(getFormat(data[41],"format")); rowStr += ss_analog_high+separator; break; case "10": //报警下限 string ss_analog_alarmlow = float.Parse(data[32]).ToString(getFormat(data[41],"format")); rowStr += ss_analog_alarmlow+separator; break; case "11": //报警上限 string ss_analog_alarmhigh = float.Parse(data[30]).ToString(getFormat(data[41],"format")); rowStr += ss_analog_alarmhigh+separator; break; case "12": //模拟量断电下限 rowStr += ss_analog_pofflow+separator; break; case "13": //模拟量断电上限 rowStr += ss_analog_poffhigh+separator; break; case "14": //模拟量复电下限 rowStr += ss_analog_ponlow+separator; break; case "15": //模拟量复电上限 rowStr += ss_analog_ponhigh+separator; break; case "16": //上限断电区域 rowStr += ss_poffarea_namehigh+separator; break; case "17": //下限断电区域 rowStr += ss_poffarea_namelow+separator; break; case "18": //设备使用标记 rowStr += "0"+separator; break; default: break; } } rowStr += "~\r\n"; sum++; } } rowStr = rowStr.Replace(separator+"~\r\n","~\r\n"); string title = "KJ;AQMC|"+cs_mine_code+";"+cs_data_time+";"+sum+"~"; string fileSaveName = file_name_save+"\\"+fileName+cs_file_time+".txt"; builder.Append(title+"\r\n"); builder.Append(rowStr+"||"); string ret = builder.ToString().Replace("~\r\n||","~||"); File.WriteAllText(@fileSaveName, ret, Encoding.GetEncoding("gb2312")); Log(fileSaveName+"--模拟量初始化数据文件生成成功!"); fileFtpUpload(rowStr,fileSaveName,fileName); } //开关量初始化数据 void createAQKC(string AQKCFields,string separator,string fileName){ int sum = 0; string rowStr = ""; StringBuilder builder = new StringBuilder(); string[] fields = AQKCFields.Split(','); string cs_file_time = DateTime.Now.ToString("yyyyMMddHHmmss",new System.Globalization.DateTimeFormatInfo()); string cs_data_time = DateTime.Now.ToString("yyyy-MM-dd/HH:mm:ss",new System.Globalization.DateTimeFormatInfo()); foreach(string key in CMD101_Hash.Keys){ if(key.Contains("C")||key.Contains("D")){ string[] data = (string[])CMD101_Hash[key]; //0态断电 int ss_transducer_outage0 = 0; //0态断电区域 string ss_transducer_outage_area0 = ""; //1态断电 int ss_transducer_outage1 = 0; //1态断电区域 string ss_transducer_outage_area1 = ""; //2态断电 string ss_transducer_outage2 = ""; if(!data[38].Equals("")){ ss_transducer_outage2 = "0"; } //2态断电区域 string ss_transducer_outage_area2 = ""; foreach (string key102 in CMD102_Hash.Keys){ string[] data102 = (string[])CMD102_Hash[key102]; if(key.Equals(key102)){ string[] channels = new string[0]; if (data102[1] != null) { channels = bitChannel(int.Parse(data102[1]),8); } foreach (string channel in channels){ string code = formatToTwo(data102[2]) + "C" + formatToTwo(channel); string[] tpProperty_c = (string[])(CMD101_Hash[code]); if(tpProperty_c!=null){ //区域定义 string[] workarea_property = getProperty_workarea(tpProperty_c[42]); if(workarea_property==null){ continue; } if ("0".Equals(data102[3])){ //0态断电 ss_transducer_outage0 = 1; //0态断电区域 ss_transducer_outage_area0 = workarea_property[3]; }else if ("1".Equals(data102[3])){ //1态断电 ss_transducer_outage1 = 1; //1态断电区域 ss_transducer_outage_area1 = workarea_property[3]; }else if("2".Equals(data102[3])){ //2态断电 ss_transducer_outage2 = "1"; //2态断电区域 ss_transducer_outage_area2 = workarea_property[3]; } } } } } for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //系统类型 rowStr += "1"+separator; break; case "2": //分站编号 rowStr += data[26]+separator; break; case "3": //传感器编号 rowStr += data[24]+separator; break; case "4": //安装地点 string ss_transducer_point = ""; if(data[21].Equals("")||data[22].Equals("")){ ss_transducer_point = data[21]+data[22]; }else{ ss_transducer_point = data[21]+"\\"+data[22]; } rowStr += ss_transducer_point+separator; break; case "5": //传感器名称 rowStr += station_nameIni.ReadValue("测点名称",data[41])+separator; break; case "6": //传感器类型代码 if(key.Contains("C")){ rowStr += transducer_name_codeIni.ReadValue("传感器类型的代码","开关量")+separator; }else{ rowStr += transducer_name_codeIni.ReadValue("传感器类型的代码","控制量")+separator; } break; case "7": //0态含义 rowStr += data[36]+separator; break; case "8": //0态告警 rowStr += data[18].Equals("1")?"1":"0"+separator; break; case "9": //0态断电 rowStr += ss_transducer_outage0 + separator; break; case "10": //0态断电区域 rowStr += ss_transducer_outage_area0 + separator; break; case "11": //1态含义 rowStr += data[37] + separator; break; case "12": //1态告警 rowStr += data[18].Equals("9")?"1":"0"+separator; break; case "13": //1态断电 rowStr += ss_transducer_outage1 + separator; break; case "14": //1态断电区域 rowStr += ss_transducer_outage_area1 + separator; break; case "15": //2态含义 rowStr += data[38] + separator; break; case "16": //2态告警 rowStr += separator; break; case "17": //2态断电 rowStr += ss_transducer_outage2 + separator; break; case "18": //2态断电区域 rowStr += ss_transducer_outage_area2 + separator; break; default: break; } } rowStr += "~\r\n"; sum++; } } rowStr = rowStr.Replace(separator+"~\r\n","~\r\n"); string title = "KJ;AQKC|"+cs_mine_code+";"+cs_data_time+";"+sum+"~"; string fileSaveName = file_name_save+"\\"+fileName+cs_file_time+".txt"; builder.Append(title+"\r\n"); builder.Append(rowStr+"||"); string ret = builder.ToString().Replace("~\r\n||","~||"); File.WriteAllText(@fileSaveName, ret, Encoding.GetEncoding("gb2312")); Log(fileSaveName+"--开关量初始化数据文件生成成功!"); fileFtpUpload(rowStr,fileSaveName,fileName); } //开关量状态变化 void createAQKD(string AQKDFields,string separator,string fileName){ int sum = 0; string rowStr = ""; StringBuilder builder = new StringBuilder(); string[] fields = AQKDFields.Split(','); string cs_file_time = DateTime.Now.ToString("yyyyMMddHHmmss",new System.Globalization.DateTimeFormatInfo()); string cs_data_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss",new System.Globalization.DateTimeFormatInfo()); foreach(string key in CMD106_Hash.Keys){ if(key.Contains("D")){ string[] data = (string[])CMD106_Hash[key]; string[] data101 = (string[])CMD101_Hash[key]; //是否告警 string isAlarm = "0"; //是否断电 string isOutage = "0"; //传感器运行状态代码 double exstatus = double.Parse(data[2]); int exstate = (int) exstatus; string[] str_d = bitChannel(exstate,8); if(str_d[1].Equals("1")){ isOutage = "1"; } if(str_d[2].Equals("1")){ isAlarm = "1"; } for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //系统类型 rowStr += 1+separator; break; case "2": //分站编号 rowStr += data[3]+separator; break; case "3": //传感器编号 rowStr += data[1]+separator; break; case "4": //安装地点 string ss_transducer_point = ""; if(data101[21].Equals("")||data101[22].Equals("")){ ss_transducer_point = data101[21]+data101[22]; }else{ ss_transducer_point = data101[21]+"\\"+data101[22]; } rowStr += ss_transducer_point+separator; break; case "5": //传感器名称 rowStr += station_nameIni.ReadValue("测点名称",data101[41])+separator; break; case "6": //当前状态 rowStr += getState(data[6],"D") + separator; break; case "7": //是否告警 rowStr += isAlarm + separator; break; case "8": //是否断电 rowStr += isOutage + separator; break; case "9": //数据生成时间 rowStr += cs_data_time + separator; break; case "10": //测点编号(矿井编码+系统编码+传感器数值类型编码+传感器类型编码+原系统测点编码) //传感器类型编码 string transducer_code = transducer_typeIni.ReadValue("传感器类型编码表",data101[41]); rowStr += cs_mine_code+"01"+"KG"+transducer_code+key + separator; break; default: break; } } rowStr += "~\r\n"; sum++; } } if(rowStr.Equals("")){ return; } rowStr = rowStr.Replace(separator+"~\r\n","~\r\n"); //文件内容更新时间,数据个数,保留; string other = ";"; string save = ";"; string title = cs_data_time+";"+sum+other+save+"~"; string fileSaveName = file_name_save+"\\"+cs_mine_code+"_"+fileName+"_"+cs_file_time+".txt"; builder.Append(title+"\r\n"); builder.Append(rowStr+"||"); string ret = builder.ToString().Replace("~\r\n||","~||"); File.WriteAllText(@fileSaveName, ret, Encoding.GetEncoding("gb2312")); Log(fileSaveName+"--开关量状态变化文件生成成功!"); fileFtpUpload(rowStr,fileSaveName,fileName); } //工做面信息数据 void createGzmxx(string gzmxxFields,string separator,string fileName){ int sum = 0; string rowStr = ""; string[] fields = gzmxxFields.Split(','); StringBuilder builder = new StringBuilder(); string cs_data_time = getCurrentTime(); JObject obj = JObject.Parse(CMD104); int nLen = obj["CONTENT"].ToString().Trim().Length; if(nLen>0){ JArray content = (JArray)obj["CONTENT"]; for(int i=0;i<content.Count;i++){ JArray content1 = (JArray)content[i]; string[] data = new string[content1.Count]; for(int j=0;j<content1.Count;j++){ data[j] = content1[j].ToString(); } for(int k=0;k<fields.Length;k++){ string field = fields[k].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //工做面编号 rowStr += data[2]+separator; break; case "2": //工做面名称 rowStr += data[3]+separator; break; case "3": //工做面类型编号(工做面类型为哪一个值 去对应附录4) rowStr += workface_typeIni.ReadValue("工做面类型",data[3])+separator; break; default: break; } } rowStr += "\r\n"; sum++; } } rowStr = rowStr.Replace(separator+"\r\n","\r\n"); string other = "0"; string save = "0"; string title = cs_mine_code+","+cs_data_time+","+sum+","+other+","+save; string fileSaveName = file_name_save+"\\"+fileName+".txt"; builder.Append(title+"\r\n"); builder.Append(rowStr); File.WriteAllText(@fileSaveName, builder.ToString(), Encoding.GetEncoding("gb2312")); Log(fileSaveName+"--工做面信息数据生成成功!"); fileFtpUpload(rowStr,fileSaveName,fileName); } //分站信息数据文件 void createFzxx(string fzxxFields,string separator,string fileName){ int sum = 0; string rowStr = ""; string[] fields = fzxxFields.Split(','); StringBuilder builder = new StringBuilder(); string cs_data_time = getCurrentTime(); foreach(string key in CMD101_FZ_Hash.Keys){ string[] data = (string[])CMD101_FZ_Hash[key]; for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //传感器编号 rowStr += formatToTwo(data[26])+separator; break; case "2": //工做面编号(分站所在工做面的编号,该编号对应工做面信息文件中的工做面编号) rowStr += data[42]+separator; break; case "3": //安装地点 string ss_transducer_point = ""; if(data[21].Equals("")||data[22].Equals("")){ ss_transducer_point = data[21]+data[22]; }else{ ss_transducer_point = data[21]+"\\"+data[22]; } rowStr += ss_transducer_point+separator; break; case "4": //分站规格型号(分站的规格型号) rowStr += separator; break; case "5": //分站其它属性 rowStr += "0"+separator; break; default: break; } } rowStr += "\r\n"; sum++; } rowStr = rowStr.Replace(separator+"\r\n","\r\n"); string other = "0"; string save = "0"; string title = cs_mine_code+","+cs_data_time+","+sum+","+other+","+save; string fileSaveName = file_name_save+"\\"+fileName+".txt"; builder.Append(title+"\r\n"); builder.Append(rowStr); File.WriteAllText(@fileSaveName, builder.ToString(), Encoding.GetEncoding("gb2312")); Log(fileSaveName+"--分站信息数据文件生成成功!"); fileFtpUpload(rowStr,fileSaveName,fileName); } //控制关系数据文件 void createCdkzgx(string fields102,string separator,string fileName){ int sum = 0; string rowStr = ""; string[] fields = fields102.Split(','); StringBuilder builder = new StringBuilder(); string cs_data_time = getCurrentTime(); foreach (string key in CMD102_Hash.Keys){ if(key.Contains("A")||key.Contains("C")||key.Contains("D")){ string[] data = (string[])CMD102_Hash[key]; //测试状态的过滤 bool bss = false; for(int k=0;k<strI;k++){ if(strArray[k].Equals(key)){ bss = true; } } if(bss){ continue; } for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //源测点编号 rowStr += formatToTwo(data[13])+data[10]+formatToTwo(data[11])+separator; break; case "2": //目的测点编号 rowStr += formatToTwo(data[2])+"C"+formatToTwo(data[1])+separator; break; case "3": //断电门限 string ss_outage_value = ""; if(key.Contains("A")){ ss_outage_value = formatToDouble(data[0]); }else{ ss_outage_value = data[0]; } rowStr += ss_outage_value+separator; break; case "4": //复电门限 string ss_analog_value = ""; if(key.Contains("A")){ ss_analog_value = formatToDouble(data[7]); }else{ ss_analog_value = data[7]; } rowStr += ss_analog_value+separator; break; case "5": //馈电传感器编号 rowStr += separator; break; default: break; } } rowStr += "\r\n"; sum++; } } rowStr = rowStr.Replace(separator+"\r\n","\r\n"); string other = "0"; string save = "0"; string title = cs_mine_code+","+cs_data_time+","+sum+","+other+","+save; string fileSaveName = file_name_save+"\\"+fileName+".txt"; builder.Append(title+"\r\n"); builder.Append(rowStr); File.WriteAllText(@fileSaveName, builder.ToString(), Encoding.GetEncoding("gb2312")); Log(fileSaveName+"--控制关系数据文件生成成功!"); fileFtpUpload(rowStr,fileSaveName,fileName); } //传感器描述文件(开关量测点属性) void createCDDY(string DFields,string AFields,string separator,string fileName){ string[] array_D = createCDDY_D(DFields,separator); string[] array_A = createCDDY_A(AFields,separator); string rowStr_D = array_D[0]; string rowStr_A = array_A[0]; string rowStr = rowStr_D+rowStr_A+"||"; rowStr = rowStr.Replace(separator+"~\r\n","~\r\n"); rowStr = rowStr.Replace("\r\n||","||"); int sum_D = int.Parse(array_D[1]); int sum_A = int.Parse(array_A[1]); StringBuilder builder = new StringBuilder(); string cs_data_time = getCurrentTime(); string other = ""; string save = ""; //系统型号;系统名称;生产厂家;文件内容更新时间;开关量点数;模拟量点数;多态点数;0;0;累计量点数;备用;备用; string title = "01"+";"+"安全监控系统"+";"+configIni.ReadValue("生产厂家","factory")+";"+cs_data_time+";"+sum_D+";"+sum_A+";0;0;0;0;"+other+";"+save+"~"; string fileSaveName = file_name_save+"\\"+fileName+".txt"; builder.Append(title+"\r\n"); builder.Append(rowStr); File.WriteAllText(@fileSaveName, builder.ToString(), Encoding.GetEncoding("gb2312")); Log(fileSaveName+"--传感器描述文件生成成功!"); fileFtpUpload(rowStr,fileSaveName,fileName); } //传感器描述文件(开关量测点属性) string[] createCDDY_D(string DFields,string separator){ int sum = 0; string rowStr = ""; string[] fields = DFields.Split(','); string[] array = new string[2]; List<string> m_str = new List<string>(); foreach (string key in CMD101_Hash.Keys){ if(key.Contains("D")){ string[] data = (string[])CMD101_Hash[key]; string transducer_code = transducer_typeIni.ReadValue("传感器类型编码表",data[41]); for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //测点编号(矿井编码+系统编码+传感器数值类型编码+传感器类型编码+原系统测点编码) //传感器类型编码 rowStr += cs_mine_code+"01"+"KG"+transducer_code+key + separator; break; case "2": //分站号 rowStr += cs_mine_code+"01"+"KG"+transducer_code+data[26] + separator; break; case "3": //测点名称 rowStr += data[22] + separator; break; case "4": //测点所属区域名称 string ss_transducer_area = ""; if(getProperty_workarea(data[42])!=null&&getProperty_area(getProperty_workarea(data[42])[1])!=null){ ss_transducer_area = getProperty_area(getProperty_workarea(data[42])[1])[2]; } if(ss_transducer_area.Equals("")&&getProperty_workarea(data[42])!=null){ ss_transducer_area = getProperty_workarea(data[42])[3]; } rowStr += ss_transducer_area + separator; break; case "5": //传感器所在区域的位置编码 rowStr += data[42] + separator; break; case "6": //开描述 if(data[46].Equals("1")){ rowStr += "开" + separator; }else{ rowStr += separator; } break; case "7": //停描述 if(data[46].Equals("0")){ rowStr += "关" + separator; }else{ rowStr += separator; } break; case "8": //报警状态 if(data[46].Equals("1")){ rowStr += "1" + separator; }else{ rowStr += separator; } break; case "9": //解报状态 if(data[46].Equals("0")){ rowStr += "0" + separator; }else{ rowStr += separator; } break; case "10": //断电状态 string ss_outage_value = separator; if(CMD102_Hash.ContainsKey(key)){ //控制定义-控制限 ss_outage_value = ((string[])CMD102_Hash[key])[0]; } rowStr += ss_outage_value + separator; break; case "11": //复电状态 string ss_analog_value = ""; if(CMD102_Hash.ContainsKey(key)){ //控制定义-回差限 ss_analog_value = ((string[])CMD102_Hash[key])[7]; } rowStr += ss_analog_value + separator; break; case "12": //传感器关联关系 //(1)如该测点 A 与断电器 B、馈电器 C 存在关系, 则描述为:D-B-断电区域的区域名称(多个区域 之间用“&”隔离):K-C //(2)如该测点 A,与 B 互为主备关系,则描述为 Z-B。 //(3)如存在多个相同关系,中间有“◇”隔离。 //闭锁关系 B 主备关系 Z 关联风门 G 断电关系 D 控制关系 K 调节关系 T 保护关系 H //D-B-断电区域的区域名称 if(!getSs_poffarea_name(key).Equals("")){ rowStr += "D-B-" + getSs_poffarea_name(key) + separator; }else{ rowStr += ""; } break; default: break; } } rowStr += "~\r\n"; m_str.Add(rowStr); rowStr = ""; sum++; } } rowStr = ""; m_str.Sort(); foreach (string list_d in m_str){ rowStr += list_d; } array[0] = rowStr; array[1] = sum.ToString(); return array; } //传感器描述文件(开关量测点属性) string[] createCDDY_A(string AFields,string separator){ int sum = 0; string rowStr = ""; string[] fields = AFields.Split(','); string[] array = new string[2]; List<string> m_str = new List<string>(); foreach (string key in CMD101_Hash.Keys){ if(key.Contains("A")){ string[] data = (string[])CMD101_Hash[key]; string transducer_code = transducer_typeIni.ReadValue("传感器类型编码表",data[41]); for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //测点编号(矿井编码+系统编码+传感器数值类型编码+传感器类型编码+原系统测点编码) //传感器类型编码 rowStr += cs_mine_code+"01"+"MN"+transducer_code+key + separator; break; case "2": //分站号 rowStr += cs_mine_code+"01"+"MN"+transducer_code + data[26] + separator; break; case "3": //测点名称 rowStr += data[41] + separator; break; case "4": //测点所属区域名称 string ss_transducer_area = ""; if(getProperty_workarea(data[42])!=null&&getProperty_area(getProperty_workarea(data[42])[1])!=null){ ss_transducer_area = getProperty_area(getProperty_workarea(data[42])[1])[2]; } if(ss_transducer_area.Equals("")&&getProperty_workarea(data[42])!=null){ ss_transducer_area = getProperty_workarea(data[42])[3]; } rowStr += ss_transducer_area + separator; break; case "5": //传感器所在区域的位置编码 rowStr += data[42] + separator; break; case "6": //测点值单位 rowStr += data[34] + separator; break; case "7": //高量程 rowStr += formatToDouble(data[31])+separator; break; case "8": //低量程 rowStr += formatToDouble(data[33])+separator; break; case "9": //上限报警门限 rowStr += formatToDouble(data[30])+separator; break; case "10": //上限解报门限 rowStr += formatToDouble(data[30])+separator; break; case "11": //下限报警门限 rowStr += formatToDouble(data[32])+separator; break; case "12": //下限解报门限 rowStr += formatToDouble(data[32])+separator; break; case "13": //上限断电门限 string ss_outage_value_up = separator; if(CMD102_Hash.ContainsKey(key)){ if(((string[])CMD102_Hash[key])[3].Equals("0")){ //控制定义-控制限 ss_outage_value_up = formatToDouble(((string[])CMD102_Hash[key])[0]); } } rowStr += ss_outage_value_up+separator; break; case "14": //上限复电门限 string ss_analog_value_up = ""; if(CMD102_Hash.ContainsKey(key)){ if(((string[])CMD102_Hash[key])[3].Equals("0")){ //控制定义-回差限 ss_analog_value_up = formatToDouble(((string[])CMD102_Hash[key])[7]); } } rowStr += ss_analog_value_up+separator; break; case "15": //下限断电门限 string ss_outage_value_low = separator; if(CMD102_Hash.ContainsKey(key)){ if(((string[])CMD102_Hash[key])[3].Equals("1")){ //控制定义-控制限 ss_outage_value_low = formatToDouble(((string[])CMD102_Hash[key])[0]); } } rowStr += ss_outage_value_low+separator; break; case "16": //下限复电门限 string ss_analog_value_low = ""; if(CMD102_Hash.ContainsKey(key)){ if(((string[])CMD102_Hash[key])[3].Equals("1")){ //控制定义-回差限 ss_analog_value_low = formatToDouble(((string[])CMD102_Hash[key])[7]); } } rowStr += ss_analog_value_low+separator; break; case "17": //传感器关联关系 //D-B-断电区域的区域名称 if(!getSs_poffarea_name(key).Equals("")){ rowStr += "D-B-" + getSs_poffarea_name(key) + separator; }else{ rowStr += ""; } break; default: break; } } rowStr += "~\r\n"; m_str.Add(rowStr); rowStr = ""; sum++; } } rowStr = ""; m_str.Sort(); foreach (string list_d in m_str){ rowStr += list_d; } array[0] = rowStr; array[1] = sum.ToString(); return array; } //-----------------------------测点信息数据文件------------------------------------------------------------------------- void createDev(string devFields,string separator,string fileName){ string[] array_A = createDev_A(devFields,separator); string[] array_D = createDev_D(devFields,separator); string[] array_C = createDev_C(devFields,separator); string rowStr_A = array_A[0]; string rowStr_D = array_D[0]; string rowStr_C = array_C[0]; string rowStr = rowStr_A+rowStr_D+rowStr_C; rowStr = rowStr.Replace(",\r\n","\r\n"); int sum_A = int.Parse(array_A[1]); int sum_D = int.Parse(array_D[1]); int sum_C = int.Parse(array_C[1]); int sum = sum_A+sum_D+sum_C; StringBuilder builder = new StringBuilder(); string cs_data_time = getCurrentTime(); //string other = ""; string save = ""; string title = cs_mine_code+","+cs_data_time+","+sum+","+save; string fileSaveName = file_name_save+"\\"+fileName+".txt"; builder.Append(title+"\r\n"); builder.Append(rowStr); File.WriteAllText(@fileSaveName, builder.ToString(), Encoding.GetEncoding("gb2312")); Log(fileSaveName+"--测点信息数据文件生成成功!"); fileFtpUpload(rowStr,fileSaveName,fileName); } //测点信息数据文件-模拟量 string[] createDev_A(string devFields,string separator){ int sum = 0; string rowStr_A = ""; string[] fields = devFields.Split(','); string[] array = new string[2]; List<string> m_strA = new List<string>(); foreach(string key in CMD101_Hash.Keys){ if(key.Contains("A")){ //测试状态的过滤 string[] data = (string[])CMD101_Hash[key]; if(bitChannel(int.Parse(data[18]),16)[3].Equals("1")){ continue; } for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //分站编号 rowStr_A += formatToTwo(data[26])+separator; break; case "2": //传感器编号 rowStr_A += formatToTwo(data[26])+data[23]+formatToTwo(data[24])+separator; break; case "3": //工做面编号 rowStr_A += data[42]+separator; break; case "4": //安装地点 string ss_transducer_point = ""; if(data[21].Equals("")||data[22].Equals("")){ ss_transducer_point = data[21]+data[22]; }else{ ss_transducer_point = data[21]+"\\"+data[22]; } rowStr_A += ss_transducer_point+separator; break; case "5": //传感器名称 string ss_transducer_name_code = transducerIni.ReadValue("传感器名称",data[41]); if(ss_transducer_name_code.Equals("")){ ss_transducer_name_code = transducerIni.ReadValue("传感器名称","其它模拟量"); } rowStr_A += ss_transducer_name_code+separator; break; case "6": //传感器类型代码 rowStr_A += transducer_name_codeIni.ReadValue("传感器类型的代码","模拟量")+separator; break; case "7": //单位 rowStr_A += data[34]+separator; break; case "8": //模拟量量程下限 rowStr_A += formatToDouble(data[33])+separator; break; case "9": //模拟量量程上限 rowStr_A += formatToDouble(data[31])+separator; break; case "10": //模拟量报警下限 rowStr_A += formatToDouble(data[32])+separator; break; case "11": //模拟量报警上限 rowStr_A += formatToDouble(data[30])+separator; break; case "12": //断电值 string ss_outage_value = separator; if(CMD102_Hash.ContainsKey(key)){ //控制定义-控制限 ss_outage_value = formatToDouble(((string[])CMD102_Hash[key])[0]); } rowStr_A += ss_outage_value+separator; break; case "13": //复电值 string ss_analog_value = ""; if(CMD102_Hash.ContainsKey(key)){ //控制定义-回差限 ss_analog_value = formatToDouble(((string[])CMD102_Hash[key])[7]); } rowStr_A += ss_analog_value+separator; break; case "14": //断电区域 rowStr_A += getSs_poffarea_name(key)+separator; break; default: break; } } rowStr_A += "\r\n"; m_strA.Add(rowStr_A); rowStr_A = ""; sum++; } } rowStr_A = ""; m_strA.Sort(); foreach (string list_a in m_strA){ rowStr_A += list_a; } array[0] = rowStr_A; array[1] = sum.ToString(); return array; } //测点信息数据文件-开关量 string[] createDev_D(string devFields,string separator){ int sum = 0; string rowStr_D = ""; string[] fields = devFields.Split(','); string[] array = new string[2]; List<string> m_strD = new List<string>(); foreach(string key in CMD101_Hash.Keys){ if(key.Contains("D")){ string[] data = (string[])CMD101_Hash[key]; if(bitChannel(int.Parse(data[18]),16)[3].Equals("1")){ continue; } for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //分站编号 rowStr_D += formatToTwo(data[26])+separator; break; case "2": //传感器编号 rowStr_D += formatToTwo(data[26])+data[23]+formatToTwo(data[24])+separator; break; case "3": //工做面编号 rowStr_D += data[42]+separator; break; case "4": //安装地点 string ss_transducer_point = ""; if(data[21].Equals("")||data[22].Equals("")){ ss_transducer_point = data[21]+data[22]; }else{ ss_transducer_point = data[21]+"\\"+data[22]; } rowStr_D += ss_transducer_point+separator; break; case "5": //传感器名称 string ss_transducer_name_code = transducerIni.ReadValue("传感器名称",data[41]); if(ss_transducer_name_code.Equals("")){ ss_transducer_name_code = transducerIni.ReadValue("传感器名称","其它开关量"); } rowStr_D += ss_transducer_name_code+separator; break; case "6": //传感器类型代码 rowStr_D += transducer_name_codeIni.ReadValue("传感器类型的代码","开关量")+separator; break; case "7": //单位 rowStr_D += separator; break; case "8": //模拟量量程下限 rowStr_D += separator; break; case "9": //模拟量量程上限 rowStr_D += separator; break; case "10": //模拟量报警下限 rowStr_D += separator; break; case "11": //模拟量报警上限 rowStr_D += separator; break; case "12": //断电值 string ss_outage_value = separator; if(CMD102_Hash.ContainsKey(key)){ //控制定义-控制限 ss_outage_value = ((string[])CMD102_Hash[key])[0]; } rowStr_D += ss_outage_value+separator; break; case "13": //复电值 string ss_analog_value = ""; if(CMD102_Hash.ContainsKey(key)){ //控制定义-回差限 ss_analog_value = ((string[])CMD102_Hash[key])[7]; } rowStr_D += ss_analog_value+separator; break; case "14": //断电区域 rowStr_D += getSs_poffarea_name(key)+separator; break; default: break; } } rowStr_D += "\r\n"; m_strD.Add(rowStr_D); rowStr_D = ""; sum++; } } rowStr_D = ""; m_strD.Sort(); foreach (string list_d in m_strD){ rowStr_D += list_d; } array[0] = rowStr_D; array[1] = sum.ToString(); return array; } //测点信息数据文件-控制量 string[] createDev_C(string devFields,string separator){ int sum = 0; string rowStr_C = ""; string[] fields = devFields.Split(','); string[] array = new string[2]; List<string> m_strC = new List<string>(); foreach(string key in CMD101_Hash.Keys){ if(key.Contains("C")){ string[] data = (string[])CMD101_Hash[key]; if(bitChannel(int.Parse(data[18]),16)[3].Equals("1")){ continue; } for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //分站编号 rowStr_C += formatToTwo(data[26])+separator; break; case "2": //传感器编号 rowStr_C += formatToTwo(data[26])+data[23]+formatToTwo(data[24])+separator; break; case "3": //工做面编号 rowStr_C += data[42]+separator; break; case "4": //安装地点 string ss_transducer_point = ""; if(data[21].Equals("")||data[22].Equals("")){ ss_transducer_point = data[21]+data[22]; }else{ ss_transducer_point = data[21]+"\\"+data[22]; } rowStr_C += ss_transducer_point+separator; break; case "5": //传感器名称 string ss_transducer_name_code = transducerIni.ReadValue("传感器名称",data[41]); if(ss_transducer_name_code.Equals("")){ ss_transducer_name_code = transducerIni.ReadValue("传感器名称","其它控制器"); } rowStr_C += ss_transducer_name_code+separator; break; case "6": //传感器类型代码 rowStr_C += transducer_name_codeIni.ReadValue("传感器类型的代码","控制量")+separator; break; case "7": //单位 rowStr_C += separator; break; case "8": //模拟量量程下限 rowStr_C += separator; break; case "9": //模拟量量程上限 rowStr_C += separator; break; case "10": //模拟量报警下限 rowStr_C += separator; break; case "11": //模拟量报警上限 rowStr_C += separator; break; case "12": //断电值 string ss_outage_value = separator; if(CMD102_Hash.ContainsKey(key)){ //控制定义-控制限 ss_outage_value = ((string[])CMD102_Hash[key])[0]; } rowStr_C += ss_outage_value+separator; break; case "13": //复电值 string ss_analog_value = ""; if(CMD102_Hash.ContainsKey(key)){ //控制定义-回差限 ss_analog_value = ((string[])CMD102_Hash[key])[7]; } rowStr_C += ss_analog_value+separator; break; case "14": //断电区域 rowStr_C += getSs_poffarea_name(key)+separator; break; default: break; } } rowStr_C += "\r\n"; m_strC.Add(rowStr_C); rowStr_C = ""; sum++; } } rowStr_C = ""; m_strC.Sort(); foreach (string list_c in m_strC){ rowStr_C += list_c; } array[0] = rowStr_C; array[1] = sum.ToString(); return array; } //------------------------------------------统计数据文件------------------------------------------------------ //统计数据文件list void createJktjsj_list(string fiveMinuFields,string separator,string fileName){ //传感器代码 string ss_transducer_code = ""; //模拟量检测值 string ss_analog_value = ""; List<string> list = new List<string>(); List<string> list_state = new List<string>(); string cs_data_time = getCurrentTime(); //定义数据列表 foreach(string key in CMD101_Hash.Keys){ if(key.Contains("A")){ string[] data = (string[])CMD101_Hash[key]; //过滤测试测点 if(bitChannel(int.Parse(data[18]),16)[3].Equals("1")){ continue; } //传感器编号+数值 string strs = key+","+data[46]; string stateStr = key+","+data[44]+","+data[45]; list.Add(strs); list_state.Add(stateStr); } } //增量数据106的数值、状态集合 foreach (string jsonList in listFiveMinuter){ JObject obj = JObject.Parse(jsonList); int nLen = obj["CONTENT"].ToString().Trim().Length; if(nLen>0){ JArray content = (JArray)obj["CONTENT"]; for(int i=0;i<content.Count;i++){ JArray content1 = (JArray)content[i]; string[] data = new string[content1.Count]; for(int j=0;j<content1.Count;j++){ data[j] = content1[j].ToString(); } if(data[0].Equals("A")){ //传感器代码 ss_transducer_code = formatToTwo(data[3])+"A"+formatToTwo(data[1]); ss_analog_value = data[5]; //传感器编号+数值 string strs = ss_transducer_code +","+ ss_analog_value; string stateStr = ss_transducer_code+","+data[6]+","+data[2]; //测试状态的过滤 bool bss = false; for(int k=0;k<strI;k++){ if(strArray[k].Equals(ss_transducer_code)){ bss = true; } } if(!bss){ list.Add(strs); list_state.Add(stateStr); } } } } } createCodeStateHash(list_state); createCodeValHash(list); //获取平均值、最大值、最小值 getAvgMaxMin(); //统计数据文件 createJktjsj(fiveMinuFields,separator,fileName); listFiveMinuter.Clear(); } //统计数据文件 void createJktjsj(string fiveMinuFields,string separator,string fileName){ int sum = 0; string rowStr = ""; string[] fields = fiveMinuFields.Split(','); StringBuilder builder = new StringBuilder(); string cs_file_time = DateTime.Now.ToString("yyyyMMddHHmmss",new System.Globalization.DateTimeFormatInfo()); string cs_data_time = getCurrentTime(); DateTime et = DateTime.Now.AddSeconds(-double.Parse("300")); string cs_data_time_begin = et.ToString("yyyy-MM-dd/HH:mm:ss"); foreach (string key in key_avg_Hash.Keys){ if(key.Contains("A")){ List<float> list = (List<float>)key_avg_Hash[key]; string[] data = (string[])CMD101_Hash[key]; //工做状态 string ss_transducer_state = ""; //状态 int state = 0; List<int> list_state = (List<int>)key_state_Hash[key]; for(int i = 0;i<list_state.Count;i++){ state = list_state[i]; string hex = Convert.ToString(state,16); ss_transducer_state = stateIni.ReadValue("状态","A-"+hex); switch(hex){ case "10" : ss_transducer_state = "正常"; break; case "11" : ss_transducer_state = "超下限"; break; case "12" : ss_transducer_state = "超上限"; break; case "f8" : ss_transducer_state = "负漂"; break; case "f9" : ss_transducer_state = "溢出"; break; case "fe" : ss_transducer_state = "断线"; break; case "ff" : ss_transducer_state = "中断"; break; case "80" : ss_transducer_state = "未知"; break; } } //延展状态 int exstate = 0; List<int> list_exstate = (List<int>)key_exstate_Hash[key]; for(int i = 0;i<list_exstate.Count;i++){ exstate = list_exstate[i]; string[] str_a = bitChannel(exstate,8); if (exstate == 0){ ss_transducer_state = "正常"; } if (str_a[0].Equals("1")){ ss_transducer_state = "调试"; } if (str_a[1].Equals("1")){ ss_transducer_state = "断电"; } if (str_a[2].Equals("1")){ ss_transducer_state = "报警"; } if (str_a[3].Equals("1")){ ss_transducer_state = "预警"; } if (str_a[4].Equals("1")){ ss_transducer_state = "伪数据"; } if (str_a[5].Equals("1")){ ss_transducer_state = "异常数据"; } } for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //安全监控系统分站代码 rowStr += key.Substring(0,3) + "F00" + separator; break; case "2": //传感器编号代码 rowStr += key+ separator+"~"; break; case "3": //最大值 rowStr += formatToDouble(list[1].ToString())+ separator; break; case "4": //最大值时间 rowStr += getTime_Hash[key+formatToDouble(list[1].ToString())].ToString()+ separator; break; case "5": //最小值 rowStr += formatToDouble(list[2].ToString())+ separator; break; case "6": //最小值时间 rowStr += getTime_Hash[key+formatToDouble(list[2].ToString())].ToString()+ separator; break; case "7": //平均值 rowStr += formatToDouble(list[0].ToString())+ separator; break; case "8": //系统类型 rowStr += "1" + separator; break; case "9": //安装地点 string ss_transducer_point = ""; if(data[21].Equals("")||data[22].Equals("")){ ss_transducer_point = data[21]+data[22]; }else{ ss_transducer_point = data[21]+"\\"+data[22]; } rowStr += ss_transducer_point+separator; break; case "10": //传感器名称 rowStr += station_nameIni.ReadValue("测点名称",data[41])+separator; break; case "11": //统计开始时间 rowStr += cs_data_time_begin+separator; break; case "12": //统计结束时间 rowStr += cs_data_time+separator; break; case "13": //工做状态 rowStr += ss_transducer_state+separator; break; case "14": //测点编号(矿井编码+系统编码+传感器数值类型编码+传感器类型编码+原系统测点编码) string transducer_code = transducer_typeIni.ReadValue("传感器类型编码表",data[41]); rowStr += cs_mine_code+"01"+"MN"+transducer_code+key + separator; break; default: break; } } rowStr += "~\r\n"; sum++; } } rowStr = rowStr.Replace(separator+"~\r\n","~\r\n"); string other = ""; string save = ""; string title = cs_data_time+";"+sum+";"+other+";"+save; string fileSaveName = file_name_save+"\\"+cs_mine_code+"_"+fileName+"_"+cs_file_time+".txt"; builder.Append(title+"\r\n"); builder.Append(rowStr+"||"); string ret = builder.ToString().Replace("~\r\n||","~||"); File.WriteAllText(@fileSaveName, ret.ToString(), Encoding.GetEncoding("gb2312")); Log(fileSaveName+"--统计数据文件生成成功!"); fileFtpUpload(rowStr,fileSaveName,fileName); } //-----------------------------------------------实时数据文件------------------------------------ //实时数据 每10秒生成一次,含全部测点数据 void createAQSS(string AQSSFields,string separator,string fileName){ int sum = 0; string rowStr = ""; string[] fields = AQSSFields.Split(','); StringBuilder builder = new StringBuilder(); string cs_file_time = DateTime.Now.ToString("yyyyMMddHHmmss",new System.Globalization.DateTimeFormatInfo()); string cs_data_time = getCurrentTime(); foreach(string key in CMD_all_Hash.Keys){ if(key.Contains("A")||key.Contains("C")||key.Contains("D")){ //值 状态 拓展状态 名称 string[] data = (string[])CMD_all_Hash[key]; string[] data101 = (string[])CMD101_Hash[key]; //当前监测值 string format = getFormat(data[3],"format"); float ss_transducer_value = 0; //显示值 string ss_transducer_show_value = ""; if(key.Contains("A")){ ss_transducer_value = float.Parse(double.Parse(data[0]).ToString(format)); ss_transducer_show_value = ss_transducer_value.ToString(); }else{ if(data[0].Equals("1")){ ss_transducer_show_value = "开"; }else if(data[0].Equals("0")){ ss_transducer_show_value = "关"; } } //当前状态 string ss_transducer_state = ""; if(key.Contains("A")){ ss_transducer_state = getState(data[1],"A"); }else if(key.Contains("D")){ ss_transducer_state = getState(data[1],"D"); }else if(key.Contains("C")){ ss_transducer_state = getState(data[1],"C"); } for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //系统类型 rowStr += "1" + separator; break; case "2": //分站编号 rowStr += data101[26]+ separator; break; case "3": //传感器编号 rowStr += data101[23]+ separator; break; case "4": //安装地点 string ss_transducer_point = ""; if(data101[21].Equals("")||data101[22].Equals("")){ ss_transducer_point = data101[21]+data101[22]; }else{ ss_transducer_point = data101[21]+"\\"+data101[22]; } rowStr += ss_transducer_point+separator; break; case "5": //传感器名称 rowStr += station_nameIni.ReadValue("测点名称",data[3])+separator; break; case "6": //当前监测值 rowStr += ss_transducer_value+separator; break; case "7": //显示值 rowStr += ss_transducer_show_value+separator; break; case "8": //当前状态 rowStr += ss_transducer_state+separator; break; default: break; } } rowStr += "~\r\n"; sum++; } } rowStr = rowStr.Replace(separator+"~\r\n","~\r\n"); string title = "KJ;AQSS|"+cs_mine_code+";"+cs_data_time+";"+sum+"~"; string fileSaveName = file_name_save+"\\"+fileName+".txt"; builder.Append(title+"\r\n"); builder.Append(rowStr+"||"); string ret = builder.ToString().Replace("~\r\n||","~||"); File.WriteAllText(@fileSaveName, ret, Encoding.GetEncoding("gb2312")); Log(fileSaveName+"--实时数据文件生成成功!"); fileFtpUpload(rowStr,fileSaveName,fileName); } //实时数据文件 void createRtdata(string rtdataFields,string separator,string fileName){ StringBuilder builder = new StringBuilder(); string cs_data_time = getCurrentTime(); string[] array_A = createRtdata_A(rtdataFields,separator); string[] array_D = createRtdata_D(rtdataFields,separator); string[] array_C = createRtdata_C(rtdataFields,separator); string rowStr_A = array_A[0]; string rowStr_D = array_D[0]; string rowStr_C = array_C[0]; string rowStr = rowStr_A+rowStr_D+rowStr_C; rowStr = rowStr.Replace(",\r\n","\r\n"); int sum_A = int.Parse(array_A[1]); int sum_D = int.Parse(array_D[1]); int sum_C = int.Parse(array_C[1]); int sum = sum_A+sum_D+sum_C; //string other = "0"; string save = ""; string title = cs_mine_code+","+cs_data_time+","+sum+","+editSign+","+save; editSign = 0; string fileSaveName = file_name_save+"\\"+fileName+".txt"; builder.Append(title+"\r\n"); builder.Append(rowStr); File.WriteAllText(@fileSaveName, builder.ToString(), Encoding.GetEncoding("gb2312")); Log(fileSaveName+"--实时数据文件生成成功!"); fileFtpUpload(rowStr,fileSaveName,fileName); } //实时数据文件-模拟量 string[] createRtdata_A(string rtdataFields,string separator){ string rowStr = ""; int sum = 0; string[] fields = rtdataFields.Split(','); List<string> m_str = new List<string>(); //全量数据 foreach(string key in CMD_all_Hash.Keys){ if(key.Contains("A")){ string[] data = (string[])CMD_all_Hash[key]; string[] data101 = (string[])CMD101_Hash[key]; for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //传感器编号 rowStr += key+separator; break; case "2": //值 rowStr += formatToDouble(data[0])+separator; break; case "3": //传感器运行状态代码 rowStr += getState(data[1],"A")+separator; break; default: break; } } rowStr += "\r\n"; m_str.Add(rowStr); rowStr = ""; sum++; } } rowStr = ""; m_str.Sort(); foreach (string list_a in m_str){ rowStr += list_a; } string[] array = new string[2]; array[0] = rowStr; array[1] = sum.ToString(); return array; } //实时数据文件-开关量 string[] createRtdata_D(string rtdataFields,string separator){ string rowStr = ""; int sum = 0; string[] fields = rtdataFields.Split(','); List<string> m_str = new List<string>(); foreach(string key in CMD_all_Hash.Keys){ if(key.Contains("D")){ string[] data = (string[])CMD_all_Hash[key]; string[] data101 = (string[])CMD101_Hash[key]; for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //传感器编号 rowStr += key+separator; break; case "2": //值 string ss_transducer_value = ""; int status = int.Parse(data[1]); string hex = Convert.ToString(status,16); switch(hex){ case "0": //数字量0态 ss_transducer_value = "1"; break; case "1": //数字量1态 ss_transducer_value = "0"; break; case "2": //数字量2态 ss_transducer_value = "0"; break; case "ff": //中断 ss_transducer_value = "0"; break; case "80": //未知 ss_transducer_value = "0"; break; default: break; } rowStr += ss_transducer_value+separator; break; case "3": //传感器运行状态代码 rowStr += getState(data[1],"D")+separator; break; default: break; } } rowStr += "\r\n"; m_str.Add(rowStr); rowStr = ""; sum++; } } rowStr = ""; m_str.Sort(); foreach (string list_a in m_str){ rowStr += list_a; } string[] array = new string[2]; array[0] = rowStr; array[1] = sum.ToString(); return array; } //实时数据文件-数字量 string[] createRtdata_C(string rtdataFields,string separator){ string rowStr = ""; int sum = 0; string[] fields = rtdataFields.Split(','); List<string> m_str = new List<string>(); foreach(string key in CMD_all_Hash.Keys){ if(key.Contains("C")){ string[] data = (string[])CMD_all_Hash[key]; string[] data101 = (string[])CMD101_Hash[key]; for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //传感器编号 rowStr += key+separator; break; case "2": //值 string ss_transducer_value = ""; int status = int.Parse(data[1]); string hex = Convert.ToString(status,16); switch(hex){ case "0": //馈电正常 ss_transducer_value = "0"; break; case "1": //馈电异常 ss_transducer_value = "1"; break; case "ff": //中断 ss_transducer_value = "1"; break; case "80": //未知 ss_transducer_value = "1"; break; default: break; } rowStr += ss_transducer_value+separator; break; case "3": //传感器运行状态代码 rowStr += getState(data[1],"C")+separator; break; default: break; } } rowStr += "\r\n"; m_str.Add(rowStr); rowStr = ""; sum++; } } rowStr = ""; m_str.Sort(); foreach (string list_a in m_str){ rowStr += list_a; } string[] array = new string[2]; array[0] = rowStr; array[1] = sum.ToString(); return array; } //实时数据文件 void createSSSJ(string SSSJFields,string separator,string fileName){ StringBuilder builder = new StringBuilder(); string cs_data_time = getCurrentTime(); string[] array_A = createSSSJ_A(SSSJFields,separator); string[] array_D = createSSSJ_D(SSSJFields,separator); string[] array_C = createSSSJ_C(SSSJFields,separator); string rowStr_A = array_A[0]; string rowStr_D = array_D[0]; string rowStr_C = array_C[0]; string rowStr = rowStr_A+rowStr_D+rowStr_C+"||"; rowStr = rowStr.Replace(separator+"~\r\n","~\r\n"); rowStr = rowStr.Replace("\r\n||","||"); int sum_A = int.Parse(array_A[1]); int sum_D = int.Parse(array_D[1]); int sum_C = int.Parse(array_C[1]); int sum = sum_A+sum_D+sum_C; string save = ""; string title = cs_data_time+";"+sum+";"+save+"~"; string cs_file_time = DateTime.Now.ToString("yyyyMMddHHmmss",new System.Globalization.DateTimeFormatInfo()); string fileSaveName = file_name_save+"\\"+cs_mine_code+"_"+fileName+"_"+cs_file_time+".txt"; builder.Append(title+"\r\n"); builder.Append(rowStr); File.WriteAllText(@fileSaveName, builder.ToString(), Encoding.GetEncoding("gb2312")); Log(fileSaveName+"--实时数据文件生成成功!"); fileFtpUpload(rowStr,fileSaveName,fileName); } //实时数据文件-模拟量 string[] createSSSJ_A(string SSSJFields,string separator){ string rowStr = ""; int sum = 0; string[] fields = SSSJFields.Split(','); List<string> m_str = new List<string>(); //全量数据 foreach(string key in CMD_all_Hash.Keys){ if(key.Contains("A")){ string[] data = (string[])CMD_all_Hash[key]; string transducer_code = transducer_typeIni.ReadValue("传感器类型编码表",data[3]); for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //测点编号(矿井编码+系统编码+传感器数值类型编码+传感器类型编码+原系统测点编码) //传感器类型编码 rowStr += cs_mine_code+"01"+"MN"+transducer_code+key + separator; break; case "2": //值 rowStr += formatToDouble(data[0])+separator; break; case "3": //传感器运行状态代码 rowStr += getState(data[1],"A")+separator; break; default: break; } } rowStr += "~\r\n"; m_str.Add(rowStr); rowStr = ""; sum++; } } rowStr = ""; m_str.Sort(); foreach (string list_a in m_str){ rowStr += list_a; } string[] array = new string[2]; array[0] = rowStr; array[1] = sum.ToString(); return array; } //实时数据文件-开关量 string[] createSSSJ_D(string SSSJFields,string separator){ string rowStr = ""; int sum = 0; string[] fields = SSSJFields.Split(','); List<string> m_str = new List<string>(); foreach(string key in CMD_all_Hash.Keys){ if(key.Contains("D")){ //数值、状态、延展状态、名称、安装地点、分站编号、传感器编号、时间 string[] data = (string[])CMD_all_Hash[key]; string transducer_code = transducer_typeIni.ReadValue("传感器类型编码表",data[3]); for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //测点编号(矿井编码+系统编码+传感器数值类型编码+传感器类型编码+原系统测点编码) //传感器类型编码 rowStr += cs_mine_code+"01"+"KG"+transducer_code+key + separator; break; case "2": //值 string ss_transducer_value = ""; int status = int.Parse(data[1]); string hex = Convert.ToString(status,16); switch(hex){ case "0": //数字量0态 ss_transducer_value = "0"; break; case "1": //数字量1态 ss_transducer_value = "1"; break; case "2": //数字量2态 ss_transducer_value = "2"; break; case "ff": //中断 ss_transducer_value = "2"; break; case "80": //未知 ss_transducer_value = "2"; break; default: break; } rowStr += ss_transducer_value+separator; break; case "3": //传感器运行状态代码 rowStr += getState(data[1],"D")+separator; break; default: break; } } rowStr += "~\r\n"; m_str.Add(rowStr); rowStr = ""; sum++; } } rowStr = ""; m_str.Sort(); foreach (string list_a in m_str){ rowStr += list_a; } string[] array = new string[2]; array[0] = rowStr; array[1] = sum.ToString(); return array; } //实时数据文件-数字量 string[] createSSSJ_C(string SSSJFields,string separator){ string rowStr = ""; int sum = 0; string[] fields = SSSJFields.Split(','); List<string> m_str = new List<string>(); foreach(string key in CMD_all_Hash.Keys){ if(key.Contains("C")){ string[] data = (string[])CMD_all_Hash[key]; string transducer_code = transducer_typeIni.ReadValue("传感器类型编码表",data[3]); for(int i=0;i<fields.Length;i++){ string field = fields[i].Replace("[","").Replace("]","").Trim(); switch (field){ case "1": //测点编号(矿井编码+系统编码+传感器数值类型编码+传感器类型编码+原系统测点编码) //传感器类型编码 rowStr += cs_mine_code+"01"+"KG"+transducer_code+key + separator; break; case "2": //值 string ss_transducer_value = ""; int status = int.Parse(data[1]); string hex = Convert.ToString(status,16); switch(hex){ case "0": //馈电正常 ss_transducer_value = "1"; break; case "1": //馈电异常 ss_transducer_value = "1"; break; case "ff": //中断 ss_transducer_value = "0"; break; case "80": //未知 ss_transducer_value = "2"; break; default: break; } rowStr += ss_transducer_value+separator; break; case "3": //传感器运行状态代码 rowStr += getState(data[1],"C")+separator; break; default: break; } } rowStr += "~\r\n"; m_str.Add(rowStr); rowStr = ""; sum++; } } rowStr = ""; m_str.Sort(); foreach (string list_a in m_str){ rowStr += list_a; } string[] array = new string[2]; array[0] = rowStr; array[1] = sum.ToString(); return array; } //------------------------------------接收数据并存入本地hashtable------------------------------------------- //测点定义数据 Hashtable CMD101_Hash = new Hashtable(); void InitCMD101(string cs_data_time){ strI = 0; CMD101_Hash.Clear(); JObject obj = JObject.Parse(CMD101); //过滤为空的数据 int nLen = obj["CONTENT"].ToString().Trim().Length; if(nLen>0){ JArray content = (JArray)obj["CONTENT"]; for(int i=0;i<content.Count;i++){ JArray content1 = (JArray)content[i]; string[] data = new string[content1.Count+1]; for(int j=0;j<content1.Count;j++){ data[j] = content1[j].ToString(); } data[content1.Count] = cs_data_time; //传感器编号(26-分站编号,23-测点getState类型,24-测点号) string code = formatToTwo(data[26])+data[23]+formatToTwo(data[24]); //测试状态的过滤 if(bitChannel(int.Parse(data[18]),16)[3].Equals("1")){ strArray[strI] = code; strI++; } CMD101_Hash[code] = data; } } } //分站数据 Hashtable CMD101_FZ_Hash = new Hashtable(); void InitCMD101_fz(){ CMD101_FZ_Hash.Clear(); JObject obj = JObject.Parse(CMD101); int nLen = obj["CONTENT"].ToString().Trim().Length; if(nLen>0){ JArray content = (JArray)obj["CONTENT"]; for(int i=0;i<content.Count;i++){ JArray content1 = (JArray)content[i]; string[] data = new string[content1.Count]; for(int j=0;j<content1.Count;j++){ data[j] = content1[j].ToString(); } //测试状态的过滤 if(bitChannel(int.Parse(data[18]),16)[3].Equals("1")){ continue; } string code = formatToTwo(data[26]); //42-区域编号 if(CMD101_FZ_Hash.ContainsKey(code)&&data[42].Equals("0")){ continue; } CMD101_FZ_Hash[code] = data; } } } //控制定义数据 Hashtable CMD102_Hash = new Hashtable(); void InitCMD102(){ CMD102_Hash.Clear(); JObject obj = JObject.Parse(CMD102); int nLen = obj["CONTENT"].ToString().Trim().Length; if(nLen>0){ JArray content = (JArray)obj["CONTENT"]; for(int i=0;i<content.Count;i++){ JArray content1 = (JArray)content[i]; string[] data = new string[content1.Count]; for(int j=0;j<content1.Count;j++){ data[j] = content1[j].ToString(); } string code = formatToTwo(data[13]) + data[10] + formatToTwo(data[11]); CMD102_Hash[code] = data; } } } //增量数据 Hashtable CMD106_Hash = new Hashtable(); void InitCMD106(){ CMD106_Hash.Clear(); JObject obj = JObject.Parse(CMD106); int nLen = obj["CONTENT"].ToString().Trim().Length; if(nLen>0){ JArray content = (JArray)obj["CONTENT"]; for(int i=0;i<content.Count;i++){ JArray content1 = (JArray)content[i]; string[] data = new string[content1.Count]; for(int j=0;j<content1.Count;j++){ data[j] = content1[j].ToString(); } string code = formatToTwo(data[3]) + data[0] + formatToTwo(data[1]); CMD106_Hash[code] = data; } } } //全量数据 Hashtable CMD_all_Hash = new Hashtable(); void InitCMD_all(){ CMD_all_Hash.Clear(); JObject obj = JObject.Parse(CMD101); int nLen = obj["CONTENT"].ToString().Trim().Length; if(nLen>0){ JArray content = (JArray)obj["CONTENT"]; for(int i=0;i<content.Count;i++){ JArray content1 = (JArray)content[i]; string[] data = new string[content1.Count]; for(int j=0;j<content1.Count;j++){ data[j] = content1[j].ToString(); } if(data[23].Equals("A")||data[23].Equals("D")||data[23].Equals("C")){ if(bitChannel(int.Parse(data[18]),16)[3].Equals("1")){ continue; } //安装地点 string ss_transducer_point = ""; if(data[21].Equals("")||data[22].Equals("")){ ss_transducer_point = data[21]+data[22]; }else{ ss_transducer_point = data[21]+"\\"+data[22]; } //获取数据生成时间 string time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss",new System.Globalization.DateTimeFormatInfo()); //数值、状态、延展状态、名称、安装地点、分站编号、传感器编号、时间 string code = formatToTwo(data[26])+data[23]+formatToTwo(data[24]); string[] array = {data[46],data[44],data[45],data[41],ss_transducer_point,data[26],data[24],time}; CMD_all_Hash[code] = array; } } } JObject obj106 = JObject.Parse(CMD106); int nLen106 = obj106["CONTENT"].ToString().Trim().Length; if(nLen106>0){ JArray content106 = (JArray)obj106["CONTENT"]; for(int i=0;i<content106.Count;i++){ JArray content1 = (JArray)content106[i]; string[] data = new string[content1.Count]; for(int j=0;j<content1.Count;j++){ data[j] = content1[j].ToString(); } if(data[0].Equals("A")||data[0].Equals("D")||data[0].Equals("C")){ string code = formatToTwo(data[3])+data[0]+formatToTwo(data[1]); string time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss",new System.Globalization.DateTimeFormatInfo()); //数值、状态、延展状态、名称、安装地点、分站编号、传感器编号、时间 string[] data1 = (string[])CMD_all_Hash[code]; if(data1!=null){ string[] array = {data[5],data[6],data[2],data1[3],data1[4],data1[5],data1[6],time}; CMD_all_Hash[code] = array; } } } } } //键值hashtable Hashtable key_val_Hash = new Hashtable(); void createCodeValHash(List<string> list){ key_val_Hash.Clear(); foreach(string list_value in list){ string[] sArray=list_value.Split(',') ; //传感器编号 string key = sArray[0]; //数值 string value = sArray[1]; if (!key_val_Hash.ContainsKey(key)) { List<float> list1 = new List<float>(); list1.Add(float.Parse(value)); key_val_Hash[key] = list1; }else { List<float> list1 = (List<float>)key_val_Hash[key]; list1.Add(float.Parse(value)); key_val_Hash[key] = list1; } } list = new List<string>(); } //求平均值 Hashtable key_avg_Hash = new Hashtable(); void getAvgMaxMin(){ key_avg_Hash.Clear(); foreach (string key in key_val_Hash.Keys){ List<float> list = (List<float>)key_val_Hash[key]; float sum = 0; foreach(float list_value in list){ sum += list_value; } List<float> list_val = new List<float>(); //平均值 float ss_analog_avgvalue = sum/list.Count; //最大值 float ss_analog_maxvalue = list.Max(); //最小值 float ss_analog_minvalue = list.Min(); list_val.Add(ss_analog_avgvalue); list_val.Add(ss_analog_maxvalue); list_val.Add(ss_analog_minvalue); key_avg_Hash.Add(key,list_val); } } //存储模拟量测点值对应时间 Hashtable getTime_Hash = new Hashtable(); void getTimeJktjsj(string time){ foreach(string key in CMD101_Hash.Keys){ if(key.Contains("A")){ string[] data = (string[])CMD101_Hash[key]; //测点操做状态 if(bitChannel(int.Parse(data[18]),16)[3].Equals("1")){ continue; } string code_value = key+formatToDouble(data[46]); getTime_Hash[code_value] = time; } } JObject obj = JObject.Parse(CMD106); int nLen = obj["CONTENT"].ToString().Trim().Length; if(nLen>0){ JArray content = (JArray)obj["CONTENT"]; for(int i=0;i<content.Count;i++){ JArray content1 = (JArray)content[i]; string[] data = new string[content1.Count]; for(int j=0;j<content1.Count;j++){ data[j] = content1[j].ToString(); } if(data[0].Equals("A")){ string code = formatToTwo(data[3]) + data[0] + formatToTwo(data[1]); string code_value = code + formatToDouble(data[5]); getTime_Hash[code_value] = time; } } } } //状态hashtable Hashtable key_state_Hash = new Hashtable(); //延展状态hashtable Hashtable key_exstate_Hash = new Hashtable(); //获取五分钟内测点对应的状态集合 void createCodeStateHash(List<string> list_state){ key_state_Hash.Clear(); key_exstate_Hash.Clear(); foreach(string list in list_state){ string[] sArray=list.Split(',') ; string key = sArray[0]; string state = sArray[1]; string exstate = sArray[2]; if (!key_state_Hash.ContainsKey(key)) { List<int> list1 = new List<int>(); list1.Add(int.Parse(state)); key_state_Hash[key] = list1; } else { List<int> list1 = (List<int>)key_state_Hash[key]; list1.Add(int.Parse(state)); key_state_Hash[key] = list1; } if (!key_exstate_Hash.ContainsKey(key)) { List<int> list1 = new List<int>(); list1.Add(int.Parse(exstate)); key_exstate_Hash[key] = list1; } else { List<int> list1 = (List<int>)key_exstate_Hash[key]; list1.Add(int.Parse(exstate)); key_exstate_Hash[key] = list1; } } } //----------------------------------------------通用函数------------------------------------------------------------ //读取generateFile.txt文件内容 JArray readGenerateFile(){ StreamReader sr = new StreamReader("./generateFile.txt",Encoding.UTF8); StringBuilder builder = new StringBuilder(); string line; while ((line = sr.ReadLine()) != null){ builder.Append(line); } JArray array = JArray.Parse(builder.ToString()); return array; } //读取KJ66.txt配置文件,获取数据格式和单位 string getFormat(string name,string str){ StreamReader sr = new StreamReader("./kj66.txt",Encoding.GetEncoding("gb2312")); StringBuilder builder = new StringBuilder(); string line; while ((line = sr.ReadLine()) != null){ builder.Append(line); } JObject obj = JObject.Parse(builder.ToString()); JArray array = (JArray)obj["simulate"]; foreach (JObject items in array){ if(items["name"].ToString().Equals(name)){ if(str.Equals("format")){ return items[str].ToString(); } if(str.Equals("unit")){ return items[str].ToString(); } } } sr.Close(); return null; } //获取测点状态 string getState(string state,string type){ string ss_transducer_status = ""; int status = int.Parse(state); string hex = Convert.ToString(status,16); ss_transducer_status = stateIni.ReadValue("状态",type+"-"+hex); return ss_transducer_status; } //检测传感器状态 string[] bitChannel(int ctbit,int num){ string[] channel = new string[num]; for (int i = 0; i < channel.Length; i++){ if((ctbit&0x1)==1){ channel[i]="1"; }else{ channel[i]="0"; } ctbit = ctbit>>1; } return channel; } //区域定义(获取安装地点数据--区域) string[] getProperty_area(string str){ JObject obj = JObject.Parse(CMD103); int nLen = obj["CONTENT"].ToString().Trim().Length; if(nLen>0){ JArray content = (JArray)obj["CONTENT"]; for(int i=0;i<content.Count;i++){ JArray content1 = (JArray)content[i]; string[] data = new string[content1.Count]; for(int j=0;j<content1.Count;j++){ data[j] = content1[j].ToString(); } if(data[1].Equals(str)){ return data; } } } return null; } //工做面定义(获取安装地点数据--工做面) 根据工做面编号 string[] getProperty_workarea(string str){ JObject obj = JObject.Parse(CMD104); int nLen = obj["CONTENT"].ToString().Trim().Length; if(nLen>0){ JArray content = (JArray)obj["CONTENT"]; for(int i=0;i<content.Count;i++){ JArray content1 = (JArray)content[i]; string[] data = new string[content1.Count]; for(int j=0;j<content1.Count;j++){ data[j] = content1[j].ToString(); } if(data[2].Equals(str)){ return data; } } } return null; } //获取断电区域 string getSs_poffarea_name(string key){ string ss_poffarea_name = ""; foreach (string key102 in CMD102_Hash.Keys){ string[] data102 = (string[])CMD102_Hash[key102]; if(key.Equals(key102)){ string[] channels = new string[0]; if (data102[1] != null) { //data102[1] 被控通道位 channels = bitChannel(int.Parse(data102[1]),8); } foreach (string channel in channels){ string code = formatToTwo(data102[2]) + "C" + formatToTwo(channel); string[] tpProperty_c = (string[])(CMD101_Hash[code]); if(tpProperty_c!=null) { //区域定义 工做面定义104-42-区域编号 string[] workarea_property = getProperty_workarea(tpProperty_c[42]); if(workarea_property==null){ continue; } //断电区域名称 ss_poffarea_name = workarea_property[3]; break; } } } } return ss_poffarea_name; } //测点所属区域名称 private string getSs_transducer_point(string key){ string[] data = (string[])CMD101_Hash[key]; //安装地点 string ss_transducer_point = ""; if(getProperty_workarea(data[42])!=null){ ss_transducer_point = getProperty_workarea(data[42])[3]; } //string point_str = configIni.ReadValue("地点","AddrOrWNameOrRName"); if(getProperty_workarea(data[42])!=null&&getProperty_area(getProperty_workarea(data[42])[1])!=null){ ss_transducer_point = getProperty_area(getProperty_workarea(data[42])[1])[2]; } // if(point_str.Equals("addr")){ // ss_transducer_point = data[22]; // }else if(point_str.Equals("wname")){ // if(getProperty_workarea(data[42])!=null){ // ss_transducer_point = getProperty_workarea(data[42])[3]; // } // }else if(point_str.Equals("rname")){ // if(getProperty_workarea(data[42])!=null&&getProperty_area(getProperty_workarea(data[42])[1])!=null){ // ss_transducer_point = getProperty_area(getProperty_workarea(data[42])[1])[2]; // } // } return ss_transducer_point; } string getCurrentTime(){ return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss",new System.Globalization.DateTimeFormatInfo()); } //转换数据格式 string formatToTwo(string str){ return double.Parse(str).ToString("00"); } string formatToDouble(string str){ return double.Parse(str).ToString("0.00"); } //----------------------------------------FTP上传----------------------------------------------------- //ftp上传 string ftpServerIP; string ftpRemotePath; string ftpUserID = null; string ftpPassword = null; string ftpURI; Boolean ftp_buffer = true; Boolean ftp_boo = true; string ftpUpload(string filename){ ftpServerIP = configIni.ReadValue("ftp","ftpurl"); ftpRemotePath = configIni.ReadValue("ftp","file"); ftpUserID = configIni.ReadValue("ftp","username"); ftpPassword = configIni.ReadValue("ftp","password"); ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/"; string ret = Upload(filename); return ret; } //根据generateFile.txt判断是否使用FTP上传 string isFTP(){ string isNeed = ""; //读取generateFile.txt文件内容 JArray array = readGenerateFile(); foreach (JObject items in array){ string resource = items["resource"].ToString(); if(resource.Equals("FTP")){ isNeed = items["isNeed"].ToString(); } } return isNeed; } //上传 string Upload(string filename){ string ret = "success"; FileInfo fileInf = new FileInfo(filename); string uri = ftpURI + fileInf.Name; FtpWebRequest reqFTP; reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); if (ftpUserID != null){ reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); } reqFTP.KeepAlive = false; reqFTP.Method = WebRequestMethods.Ftp.UploadFile; reqFTP.UseBinary = true; reqFTP.UsePassive = false; reqFTP.ContentLength = fileInf.Length; int buffLength = 2048; byte[] buff = new byte[buffLength]; int contentLen; FileStream fs = fileInf.OpenRead(); try { Stream strm = reqFTP.GetRequestStream(); contentLen = fs.Read(buff, 0, buffLength); while (contentLen != 0) { strm.Write(buff, 0, contentLen); contentLen = fs.Read(buff, 0, buffLength); } strm.Close(); fs.Close(); } catch (Exception ex) { ret = "error"; //throw new Exception("Ftphelper Upload Error --> " + ex.Message); } return ret; } //ftp具体文件上传 void fileFtpUpload(string rowStr,string fileSaveName,string fileName){ if(isFTP().Equals("1")){ string ret = ftpUpload(fileSaveName); if(ret.Equals("success")){ //上传缓存数据文件 ftpBufferFile(); Log(fileSaveName+"-"+fileName+"文件-ftp上传成功!"); }else{ Log(fileSaveName+"-"+fileName+"文件-ftp上传失败!"); ftp_boo = true; string time = DateTime.Now.ToString("yyyyMMddHHmmss",new System.Globalization.DateTimeFormatInfo()); fileSaveName = configIni.ReadValue("文件目录","fileReserveBuffer")+"\\"+fileName+"文件"+time+".txt"; File.WriteAllText(@fileSaveName, rowStr, Encoding.GetEncoding("gb2312")); } } } //ftp上传缓存文件 void ftpBufferFile(){ if(ftp_boo){ string path = configIni.ReadValue("文件目录","fileReserveBuffer"); DirectoryInfo folder = new DirectoryInfo(path); foreach (FileInfo file in folder.GetFiles("*.txt")){ ftpUpload(file.FullName); if(ftp_buffer){ Log(path+"--ftp上传缓存成功!"); ftp_buffer = false; } } DeleteFolder(path); ftp_boo = false; } } //清空缓存中文件 void DeleteFolder(string dir){ foreach (string d in Directory.GetFileSystemEntries(dir)){ if (File.Exists(d)){ FileInfo fi = new FileInfo(d); if (fi.Attributes.ToString().IndexOf("ReadOnly") != -1){ fi.Attributes = FileAttributes.Normal; } File.Delete(d);//直接删除其中的文件 }else{ DirectoryInfo d1 = new DirectoryInfo(d); if (d1.GetFiles().Length != 0){ DeleteFolder(d1.FullName);//递归删除子文件夹 } Directory.Delete(d); } } } //----------------------------------------窗口程序------------------------------------------------------ //输入框不可为空 int textIsNull(){ if (this.minecode.Text.Trim().Equals("")) { Log("煤矿代码不能为空"); this.minecode.Focus(); return 1; } if (this.url.Text.Trim().Equals("")) { Log("IP地址不能为空"); this.url.Focus(); return 1; } if (this.backupUrl.Text.Trim().Equals("")) { Log("备用IP地址不能为空"); this.backupUrl.Focus(); return 1; } if (this.port.Text.Trim().Equals("")) { Log("端口号不能为空"); this.port.Focus(); return 1; } if (this.intervalTime.Text.Trim().Equals("")) { Log("时间间隔不能为空"); this.intervalTime.Focus(); return 1; } return 0; } void SaveBtnClick(object sender, EventArgs e){ int isNull = textIsNull(); //生成config.ini文件 generateIni(); //读取ini配置文件 iniReader(); if(isNull==0){ //输入框置不可选 setEnabled(); setFtpEnabled(); //获取KJ66数据 connectWebsocket(); Log("保存成功!"); Log("websocket connecting..."); } } void FileReserveBtnClick(object sender, EventArgs e){ FolderBrowserDialog path = new FolderBrowserDialog(); path.ShowDialog(); this.fileReserve.Text = path.SelectedPath; } void FileReserveBufferBtnClick(object sender, EventArgs e){ FolderBrowserDialog path = new FolderBrowserDialog(); path.ShowDialog(); this.fileReserveBuffer.Text = path.SelectedPath; } //生成config.ini文件 void generateIni(){ WriteValue("煤矿代码","CS_MINE_CODE", this.minecode.Text); WriteValue("IP地址(KJ66的IP地址)","URL", this.url.Text); WriteValue("备用IP地址","backupUrl", this.backupUrl.Text); WriteValue("端口号","PORT", this.port.Text); WriteValue("文件时间间隔","intervalTime", this.intervalTime.Text); WriteValue("文件目录","fileReserve", this.fileReserve.Text); WriteValue("ftp","ftpurl", this.ftpurl.Text); WriteValue("ftp","file", this.ftpfile.Text); WriteValue("ftp","username", this.ftpusername.Text); WriteValue("ftp","password", this.ftppassword1.Text); WriteValue("文件目录","fileReserveBuffer", this.fileReserveBuffer.Text); } //config.ini页面初始化 void InitUI(){ this.minecode.Text = configIni.ReadValue("煤矿代码","CS_MINE_CODE"); this.url.Text = configIni.ReadValue("IP地址(KJ66的IP地址)","URL"); this.backupUrl.Text = configIni.ReadValue("备用IP地址","backupUrl"); this.port.Text = configIni.ReadValue("端口号","PORT"); this.intervalTime.Text = configIni.ReadValue("文件时间间隔","intervalTime"); this.fileReserve.Text = configIni.ReadValue("文件目录","fileReserve"); this.ftpurl.Text = configIni.ReadValue("ftp","ftpurl"); this.ftpfile.Text = configIni.ReadValue("ftp","file"); this.ftpusername.Text = configIni.ReadValue("ftp","username"); this.ftppassword1.Text = configIni.ReadValue("ftp","password"); this.fileReserveBuffer.Text = configIni.ReadValue("文件目录","fileReserveBuffer"); this.minecode.Focus(); } //输入框置不可选 void setEnabled(){ this.saveBtn.Enabled = false; this.minecode.Enabled = false; this.url.Enabled = false; this.backupUrl.Enabled = false; this.port.Enabled = false; this.intervalTime.Enabled = false; this.fileReserveBtn.Enabled = false; } //FTP输入框置不可选 void setFtpEnabled(){ this.ftpurl.Enabled = false; this.ftpfile.Enabled = false; this.ftpusername.Enabled = false; this.ftppassword1.Enabled = false; this.fileReserveBufferBtn.Enabled = false; } //listBox输出日志 private delegate void DoLog(string msg);//代理 void Log(string msg){ if (this.InvokeRequired){ DoLog doLog = new DoLog(Log); this.Invoke(doLog, new object[] { msg }); }else{ if (logReveal.Items.Count > 20) { logReveal.Items.RemoveAt(0); } msg = DateTime.Now.ToLocalTime().ToString() + " " + msg; logReveal.Items.Add(msg); } } } }