diff --git a/protocols/JiShe.CollectBus.Protocol.T37612012/AnalysisData/AFN_0CH/AFN12_F129_Analysis.cs b/protocols/JiShe.CollectBus.Protocol.T37612012/AnalysisData/AFN_0CH/AFN12_F129_Analysis.cs index 986f004..9f2bb6c 100644 --- a/protocols/JiShe.CollectBus.Protocol.T37612012/AnalysisData/AFN_0CH/AFN12_F129_Analysis.cs +++ b/protocols/JiShe.CollectBus.Protocol.T37612012/AnalysisData/AFN_0CH/AFN12_F129_Analysis.cs @@ -32,7 +32,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0CH ArgumentNullException.ThrowIfNull(input); ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList); ArgumentNullException.ThrowIfNull(input.A.A3?.D1_D7); - UnitDataAnalysis> unitDataAnalysis = new UnitDataAnalysis> + UnitDataAnalysis>> unitDataAnalysis = new UnitDataAnalysis>> { Code = input.A.Code!, AFN = input.AFN_FC.AFN, @@ -47,7 +47,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0CH TimeDensity = 0 }; List datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList); - List list = GenerateFinalResult(2, datas, "正向有功电能示值", input.AFN_FC.AFN, input.DT.Fn); + List> list = GenerateFinalResult(2, datas, "正向有功电能示值", input.AFN_FC.AFN, input.DT.Fn); unitDataAnalysis.Data= list; result?.Invoke(unitDataAnalysis); return await Task.FromResult(true); @@ -89,12 +89,12 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0CH } #endregion - public List GenerateFinalResult(int index, List data, string remark = "", int afn = 0, int fn = 0) + public List> GenerateFinalResult(int index, List data, string remark = "", int afn = 0, int fn = 0) { - List list = new List(); + List> list = new List>(); for (int i = index; i < data.Count; i++) { - AFN12_F129_AnalysisDto meter = new AFN12_F129_AnalysisDto(); + AnalysisBaseDto meter = new AnalysisBaseDto(); decimal value = 0; var errorCode = data[i].CheckErrorCode(); @@ -103,9 +103,8 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0CH else decimal.TryParse(data[i], out value); meter.DataValue = value; - meter.DataType = $"{afn.ToString().PadLeft(2, '0')}_{fn}_{i - index}"; - meter.ReadTime = Convert.ToDateTime($"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)} {data[0].Substring(8, 2)}:{data[0].Substring(10, 2)}:00"); + meter.TimeSpan = Convert.ToDateTime($"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)} {data[0].Substring(8, 2)}:{data[0].Substring(10, 2)}:00"); list.Add(meter); } return list; diff --git a/protocols/JiShe.CollectBus.Protocol.T37612012/AnalysisData/AFN_0CH/AFN12_F130_Analysis.cs b/protocols/JiShe.CollectBus.Protocol.T37612012/AnalysisData/AFN_0CH/AFN12_F130_Analysis.cs index 0d51dd0..adafd2c 100644 --- a/protocols/JiShe.CollectBus.Protocol.T37612012/AnalysisData/AFN_0CH/AFN12_F130_Analysis.cs +++ b/protocols/JiShe.CollectBus.Protocol.T37612012/AnalysisData/AFN_0CH/AFN12_F130_Analysis.cs @@ -91,7 +91,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0CH decimal.TryParse(data[i], out value); meter.DataValue = value; meter.DataType = $"{afn.ToString().PadLeft(2, '0')}_{fn}_{i - index}"; - meter.ReadTime = Convert.ToDateTime($"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)} {data[0].Substring(8, 2)}:{data[0].Substring(10, 2)}:00"); + meter.TimeSpan = Convert.ToDateTime($"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)} {data[0].Substring(8, 2)}:{data[0].Substring(10, 2)}:00"); list.Add(meter); } return list; diff --git a/protocols/JiShe.CollectBus.Protocol.T37612012/AnalysisData/AFN_10H/AFN16_F1_Analysis.cs b/protocols/JiShe.CollectBus.Protocol.T37612012/AnalysisData/AFN_10H/AFN16_F1_Analysis.cs index 018f62b..ba3eba1 100644 --- a/protocols/JiShe.CollectBus.Protocol.T37612012/AnalysisData/AFN_10H/AFN16_F1_Analysis.cs +++ b/protocols/JiShe.CollectBus.Protocol.T37612012/AnalysisData/AFN_10H/AFN16_F1_Analysis.cs @@ -20,54 +20,46 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_10H public class AFN16_F1_Analysis : IAnalysisStrategy { private readonly ILogger _logger; + private readonly AnalysisStrategyContext _analysisStrategyContext; - public AFN16_F1_Analysis(ILogger logger) + public AFN16_F1_Analysis(ILogger logger, AnalysisStrategyContext analysisStrategyContext) { _logger = logger; + _analysisStrategyContext = analysisStrategyContext; } - public Task ExecuteAsync(TB3761 input, Action? result = null) + public async Task ExecuteAsync(TB3761 input, Action? result = null) { try { ArgumentNullException.ThrowIfNull(input); + ArgumentNullException.ThrowIfNull(input.BaseHexMessage.HexMessageList); ArgumentNullException.ThrowIfNull(input.UnitData.HexMessageList); - UnitDataAnalysis dto = new UnitDataAnalysis + // TODO: 待定,等确认如何匹配规则 + string value = string.Join(" ", input.BaseHexMessage.HexMessageList!); + if (value.Contains(F10TranspondMatch.ReadNormal)) { - Code = input.A.Code!, - AFN = input.AFN_FC.AFN, - Fn = input.DT.Fn, - Pn = input.DA.Pn, - Data = AnalysisDataUnit(input.UnitData.HexMessageList), - HexMessage = input.BaseHexMessage.HexMessageString, - MessageId = input.MessageId, - ReceivedTime = input.ReceivedTime - }; - result?.Invoke(dto); - return Task.FromResult(true); + if (value.Contains(F10TranspondMatch.PowerHz))//电网频率 + await _analysisStrategyContext.ExecuteAsync("AFN16_F97_Analysis", input, dto => + { + result?.Invoke(dto); + }); + //else if (value.Contains(F10TranspondMatch.ReadData))//读取电表地址 + // result = "AFN16_F105_Analysis"; + else + { + _logger.LogWarning($"未能找到透明传发解析方式:{input.BaseHexMessage.HexMessageString}"); + } + } + + return await Task.FromResult(true); } catch (Exception ex) { _logger.LogError(ex, $"10_101解析失败:{input.A?.Code}-{input.DT?.Fn ?? 0}-{input?.BaseHexMessage?.HexMessageString},{ex.Message}"); } - return Task.FromResult(false); + return await Task.FromResult(false); } - - - private string AnalysisDataUnit(List hexMessageList) - { - // TODO: 待定,等确认如何匹配规则 - string value = string.Join(" ", hexMessageList); - if (value.Contains(F10TranspondMatch.ReadNormal)) - { - if (value.Contains(F10TranspondMatch.PowerHz))//电网频率 - return "AFN16_F97_Analysis"; - //else if (value.Contains(F10TranspondMatch.ReadData))//读取电表地址 - // result = "AFN16_F105_Analysis"; - } - return ""; - } - } } diff --git a/protocols/JiShe.CollectBus.Protocol.T37612012/AnalysisData/AFN_10H/AFN16_F97_Analysis.cs b/protocols/JiShe.CollectBus.Protocol.T37612012/AnalysisData/AFN_10H/AFN16_F97_Analysis.cs new file mode 100644 index 0000000..876c6fb --- /dev/null +++ b/protocols/JiShe.CollectBus.Protocol.T37612012/AnalysisData/AFN_10H/AFN16_F97_Analysis.cs @@ -0,0 +1,129 @@ +using GatherService.WattMeter.AnalysisData.AFN_10H; +using JiShe.CollectBus.Common.Enums; +using JiShe.CollectBus.Common.Extensions; +using JiShe.CollectBus.Common.Helpers; +using JiShe.CollectBus.IotSystems.Ammeters; +using JiShe.CollectBus.Protocol.Contracts.Protocol.Dto; +using JiShe.CollectBus.Protocol.Dto; +using JiShe.CollectBus.Protocol.Interfaces; +using JiShe.CollectBus.Protocol.T37612012.Appendix; +using JiShe.CollectBus.Protocol3761; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static FreeSql.Internal.GlobalFilter; + +namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_10H +{ + public class AFN16_F97_Analysis : IAnalysisStrategy + { + private readonly ILogger _logger; + private readonly AnalysisStrategyContext _analysisStrategyContext; + private readonly DataStorage _dataStorage; + public AFN16_F97_Analysis(ILogger logger, AnalysisStrategyContext analysisStrategyContext, DataStorage dataStorage) + { + _logger = logger; + _analysisStrategyContext = analysisStrategyContext; + _dataStorage = dataStorage; + } + public async Task ExecuteAsync(TB3761 input, Action? result = null) + { + try + { + ArgumentNullException.ThrowIfNull(input); + ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList); + + List datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList); + AnalysisBaseDto data = GenerateFinalResult(datas); + // 查询电表信息 + AmmeterInfo ammeterInfo = await _dataStorage.GetMeterInfoAsync(data.MeterType.ToString(), "15"); + if (ammeterInfo != null) + { + data.ProjectId = ammeterInfo.ProjectID; + data.MeterId = ammeterInfo.MeterId; + data.DatabaseBusiID = ammeterInfo.DatabaseBusiID; + data.MeterAddress = ammeterInfo.AmmerterAddress; + } + UnitDataAnalysis> unitDataAnalysis = new UnitDataAnalysis> + { + Code = input.A.Code!, + AFN = input.AFN_FC.AFN, + Fn = input.DT.Fn, + Pn = input.DA.Pn, + MSA = input.A.A3!.D1_D7!, + PSEQ = input.SEQ.PSEQ, + Data = data, + HexMessage = input.BaseHexMessage.HexMessageString, + MessageId = input.MessageId, + TimeDensity = 1,//密度-间隔分钟数, + DensityUnit = DensityUnit.Hour, + ReceivedTime = input.ReceivedTime + }; + await _dataStorage.SaveDataToIotDbAsync(unitDataAnalysis); + result?.Invoke(unitDataAnalysis); + return await Task.FromResult(true); + } + catch (Exception ex) + { + _logger.LogError(ex, $"10_97解析失败:{input.A.Code}-{input.DT.Fn}-{input.BaseHexMessage.HexMessageString},{ex.Message}"); + return await Task.FromResult(false); + } + } + + private AnalysisBaseDto GenerateFinalResult(List data) + { + AnalysisBaseDto meter = new AnalysisBaseDto(); + decimal.TryParse(data[7], out decimal value); + var errorCode = data[7].CheckErrorCode(); + if (errorCode != null) + { + meter.ValidData = false; + meter.ErrorCodeMsg = errorCode.Item2; + } + else + meter.DataValue = value; + meter.DataType = "10_97"; + meter.ValidData = data[2].Equals("91") || data[2].Equals("B1"); + meter.FiledDesc = "电网频率";//"电网频率"; + meter.FiledName = meter.DataType.GetDataFieldByGatherDataType() ?? string.Empty; + return meter; + } + private async Task> AnalysisDataUnitAsync(List hexMessageList) + { + List values = new List(); + values.Add(hexMessageList.GetRange(4, 1)[0].HexToDec().ToString());//端口号 + var contentLengthArr = hexMessageList.GetRange(5, 2); + contentLengthArr.Reverse(); + int contentLength = string.Join("", contentLengthArr).HexToDec(); + //TODO:转发内容 + List contentArr = hexMessageList.GetRange(7, contentLength); + //TODO:表地址 + var addressList = contentArr.GetRange(1, 6); + addressList.Reverse(); + var address = string.Join("", addressList); + values.Add(address); + //TODO:控制码 + var controlCode = contentArr.GetRange(8, 1)[0]; + values.Add(controlCode); + //TODO:长度 + var len = contentArr.GetRange(9, 1)[0].HexToDec(); + //values.Add(len.ToString()); + //TODO:数据域 + var dataField = contentArr.GetRange(10, len); + if (dataField.Count > 0) + { + string dataMark = string.Join("",dataField.GetRange(0, 4).ReduceHex33(true)); + values.Add(dataMark);//数据标识 + var readValue = dataField.GetRange(4, len - 4).ReduceHex33(true);//值 + await _analysisStrategyContext.ExecuteAsync>($" Appendix_{dataMark}", readValue, (value) => + { + values.Add(value.ToString()); + }); + } + return values; + } + } +} diff --git a/shared/JiShe.CollectBus.Common/Extensions/HexStringExtensions.cs b/shared/JiShe.CollectBus.Common/Extensions/HexStringExtensions.cs index 20ee829..6eb4b36 100644 --- a/shared/JiShe.CollectBus.Common/Extensions/HexStringExtensions.cs +++ b/shared/JiShe.CollectBus.Common/Extensions/HexStringExtensions.cs @@ -100,14 +100,21 @@ namespace JiShe.CollectBus.Common.Extensions return hexStringList; } - public static List ReduceHex33(this List hexStringList) + /// + /// 字节减33 + /// + /// + /// 是否反转 + /// + public static List ReduceHex33(this List hexStringList,bool isReverse = false) { for (int i = 0; i < hexStringList.Count; i++) { var value = Convert.ToInt32(hexStringList[i], 16) - Convert.ToInt32("33", 16); hexStringList[i] = value.DecToHex().PadLeft(2, '0'); } - + if(isReverse) + hexStringList.Reverse(); return hexStringList; }