/// <summary> /// 计算物理量 /// </summary> /// <param name="orignalConfig"></param> /// <param name="wave"></param> /// <param name="calculator"></param> /// <param name="extensionConfig"></param> /// <param name="exWave"></param> /// <returns></returns> public static decimal CalcPhysicalValue(SensorConfig orignalConfig, decimal?wave, IPhysicalCalculator calculator, SensorConfig extensionConfig = null, decimal?exWave = null) { var midPoint = 2; // 小数点几位 var result = decimal.Zero; if (orignalConfig != null && orignalConfig.SensorType.HasValue) { switch (orignalConfig.SensorType.Value) { case 1: midPoint = 2; var tempEx = calculator.CalculateTemperature(extensionConfig, exWave); var val = calculator.CalculateStructuralStrain(orignalConfig, wave, tempEx); result = val ?? decimal.Zero; break; case 2: midPoint = 1; var temp = calculator.CalculateTemperature(orignalConfig, wave); result = temp ?? decimal.Zero; break; } } return(Math.Round(result, midPoint, MidpointRounding.AwayFromZero)); }
public static PhysicalQuantity LoadFrom(FrequencyMessage message, IPhysicalCalculator calc, DateTime recTime) { try { var instance = new PhysicalQuantity(); instance.CurrentTime = recTime; //计算各通道的管壳温度 var shellTempDic = ShellTempDic(message, instance.ChannelValues.Length); //预先计算温补通道的物理量 var tempExValuePairs = TempExValuePairs(message, calc, shellTempDic); // 计算各传感器的物理量 CalcPhysical(message, calc, instance, tempExValuePairs, shellTempDic); return(instance); } catch (Exception) { throw; } }
public async Task <List <PhysicalQuantity> > ReadLoop(IPhysicalCalculator calc) { try { var list = new List <PhysicalQuantity>(); var breakCount = GlobalSetting.Instance.GatherDataFilter; var i = 0; while (i < breakCount) { var result = await Communication.ReceiveDataAsync(); if (result.Length < 530) { continue; } if (i == breakCount - 1) { var recTime = DateTime.Now; var message = new FrequencyMessage(); message.Parse(result); var quantity = PhysicalQuantity.LoadFrom(message, calc, recTime); list.Add(quantity); } i++; } return(list); } catch (BoundaryException) { throw; } catch (Exception ex) { throw new BoundaryException(ex); } }
private static void CalcPhysical(FrequencyMessage message, IPhysicalCalculator calc, PhysicalQuantity instance, Dictionary <int, QuantityValuePair> tempExValuePairs, Dictionary <int, decimal> shellTempDic) { for (var i = 0; i < instance.ChannelValues.Length; i++) { for (var j = 0; j < instance.ChannelValues[i].GratingValues.Length; j++) { var current = SensorConfigManager.GetConfigBy(i + 1, j + 1); if (current != null && tempExValuePairs.ContainsKey(current.SensorId)) { instance.ChannelValues[i].GratingValues[j] = tempExValuePairs[current.SensorId]; } else { instance.ChannelValues[i].GratingValues[j].Orignal = QuantityValuePair.CalculateFrequency(message.Channels[i].Gratings[j]); instance.ChannelValues[i].GratingValues[j].WaveLength = QuantityValuePair.FrequencyToWavelength(instance.ChannelValues[i].GratingValues[j].Orignal); var wave = instance.ChannelValues[i].GratingValues[j].WaveLengthExtension = QuantityValuePair.CalcFrequencyExtension( instance.ChannelValues[i].GratingValues[j].WaveLength, shellTempDic[i]); var extension = SensorConfigManager.GetTemperatureExtensionConfig(current); decimal?exWave = null; if (extension != null && tempExValuePairs.ContainsKey(extension.SensorId)) { exWave = tempExValuePairs[extension.SensorId].WaveLengthExtension; } instance.ChannelValues[i].GratingValues[j].PhysicalValue = QuantityValuePair.CalcPhysicalValue(current, wave, calc, extension, exWave); } } } }
private static Dictionary <int, QuantityValuePair> TempExValuePairs(FrequencyMessage message, IPhysicalCalculator calc, Dictionary <int, decimal> shellTempDic) { var tempExConfigs = SensorConfigManager.GetAllIncludedTempExSensor(); Dictionary <int, QuantityValuePair> tempExValuePairs = new Dictionary <int, QuantityValuePair>(); foreach (var config in tempExConfigs) { var i = config.ChannelIndex - 1; var j = config.SensorIndex - 1; QuantityValuePair pair = new QuantityValuePair(); pair.Orignal = QuantityValuePair.CalculateFrequency(message.Channels[i].Gratings[j]); pair.WaveLength = QuantityValuePair.FrequencyToWavelength(pair.Orignal); var wave = pair.WaveLengthExtension = QuantityValuePair.CalcFrequencyExtension( pair.WaveLength, shellTempDic[i]); var current = SensorConfigManager.GetConfigBy(i + 1, j + 1); //var extension = SensorConfigManager.GetTemperatureExtensionConfig(current); pair.PhysicalValue = QuantityValuePair.CalcPhysicalValue(current, wave, calc); // 温补通道 tempExValuePairs.Add(config.SensorId, pair); } return(tempExValuePairs); }