//从字符串中提取有效数据 public bool AnalysisData(string data, string port, string dataType, int xmno = 0) { List <Model> models = new List <Model>(); try { #region 根据协议解析数据 string tmp = Regex.Match(data, @"DY=\d+.\d+V").Value; int startIndex = tmp.IndexOf('=') + 1; int endIndex = tmp.Length - 2; string dy = tmp.Substring(startIndex, endIndex - startIndex + 1); string pattern2 = @"\w+:\s+(\w+\s+){2}\d{4}/\d{2}/\d{2}\s+\d{2}:\d{2}:\d{2}\s+\w+\s+\d+.\d+\s+((\d+.\d+)|\d+)\s*"; MatchCollection match2 = Regex.Matches(data, pattern2); if (match2.Count == 0) { string info = "未能提取有效数据"; FileOperation.WriteAppenFile(info); return(false); } else { string info = string.Format("收到{0}条有效数据", match2.Count); FileOperation.WriteAppenFile(info); } #endregion #region 遍历每条数据 将原始数据写入到文本中 foreach (Match item in match2) { Match match1 = Regex.Match(item.Value, @"\w+:\s"); MatchCollection collection = Regex.Matches(item.Value, @"\d+\.\d"); string[] fields = Regex.Split(item.Value, @"\s+"); Model model = new Model() { xmno = xmno, sno = fields[0].Substring(0, fields[0].Length - 1), number = fields[1], cycle = fields[2], time = DateTime.Parse(fields[3] + " " + fields[4]), tdno = fields[5].Substring(2), valueOne = Double.Parse(fields[6]), dy = Double.Parse(dy), port = port, valueTwo = Double.Parse(fields[7]) }; //将收到的数据保存到文本 FileOperation.WriteReceiveData(model.ToString()); models.Add(model); } #endregion #region 添加其他信息并根据公式计算得到结果 // List<Model> resModels = dataProcessCommon.Calculate(models); foreach (var item in models) { //获取该条数据所属的传感器类型 item.dataType = dataProcessCommon.GetDeviceByTdno(item.tdno).type; //计算数据 item.res = dataProcessCommon.Calculate(item); //获取点名 //model.pointName = dataProcessCommon.GetPointName(model.sno, model.tdno); } #endregion #region 将计算结果保存到数据库 if (SaveData(models, 0)) { string info = string.Format("成功保存来自端口{0}的数据", port); FileOperation.WriteAppenFile(info); FileOperation.WriteAppenFile(info); dataProcessCommon.ShowDataInfo(models); return(true); } else { return(false); } #endregion } catch (Exception ex) { string info = string.Format("保存数据失败," + ex.Message); FileOperation.WriteAppenFile(info); return(false); } }
//解析通过Tcp获取的数据 public bool AnalysisData(string data, string port, string dataType, int xmno = 0) { List <Model> models = new List <Model>(); try { #region 根据协议解析数据 string tmp = Regex.Match(data, @"DY=\d+.\d+V").Value; int startIndex = tmp.IndexOf('=') + 1; int endIndex = tmp.Length - 2; string dy = tmp.Substring(startIndex, endIndex - startIndex + 1); string pattern = @"\w+:\s+\w+\s+\d{4}/\d{2}/\d{2}\s+\d{2}:\d{2}:\d{2}\s+\w+\s+((\d+.\d+\s+){1,2})"; MatchCollection match2 = Regex.Matches(data, pattern); if (match2.Count == 0) { string info = "未提取有效数据"; Console.WriteLine(info); FileOperation.WriteAppenFile(info); return(false); } #endregion #region 遍历每条数据 并把数据存入List foreach (Match item in match2) { Match match1 = Regex.Match(item.Value, @"\w+:\s"); MatchCollection collection = Regex.Matches(item.Value, @"\d+\.\d"); string[] fields = Regex.Split(item.Value, @"\s+"); Model model = new Model() { xmno = xmno, sno = fields[0].Substring(0, fields[0].Length - 1), cycle = fields[1], time = DateTime.Parse(fields[2] + " " + fields[3]), tdno = fields[4], valueOne = Double.Parse(fields[5]), dy = Double.Parse(dy), port = port, dataType = dataType }; //传递过来的有value1和value2 if (fields.Length > 6) { if (fields[6] == "") { model.valueTwo = 0; } else { model.valueTwo = Double.Parse(fields[6]); } } else { model.valueTwo = 0; } //将受到的数据保存到文本 FileOperation.WriteAppenFile("../../data.txt", model.ToString()); models.Add(model); } #endregion #region 根据公式计算得到结果 List <Model> resModels = dataProcessCommon.Calculate(models, dataType); if (resModels == null) { string info = string.Format("计算来自端口{0}的{1}数据失败", port, dataType); FileOperation.WriteAppenFile(info); return(false); } #endregion #region 将计算结果保存到数据库 if (SaveData(resModels, 0)) { dataProcessCommon.ShowDataInfo(resModels); return(true); } else { return(false); } #endregion } catch (Exception ex) { string info = string.Format("保存数据失败, {0}", ex.Message); FileOperation.WriteAppenFile(info); return(false); } }