// //根据通道编号获取传感器信息 public static IDataProcess GetDataProcess(string data, out string dataType) { try { string tdno = common.GetTdno(data); Device device = common.GetDeviceByTdno(tdno); dataType = device.type; IDataProcess dataProcess = null; switch (device.type) { //震弦式 case "轴力-单弦": case "土压": case "轴力-三弦": case "锚索-三弦": case "表面应变": case "钢筋": case "渗压": dataProcess = new DataProcessZX(); break; //485式 } return(dataProcess); } catch (Exception ex) { FileOperation.WriteAppenFile("判断传感器类型失败," + ex.Message); throw ex; } }
//从字符串中提取有效数据 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); } }