using JiShe.CollectBus.Common.Extensions; using JiShe.CollectBus.Protocol.Contracts.Protocol.Dto; using JiShe.CollectBus.Protocol.Dto; using JiShe.CollectBus.Protocol.Interfaces; using JiShe.CollectBus.Protocol3761; using Microsoft.Extensions.Logging; namespace JiShe.CollectBus.Protocol.AnalysisData.AFN_0AH { /// /// 5.10.1.3.1 F10:终端电能表/交流采样装置配置参数 /// internal class AFN10_F10_Analysis : IAnalysisStrategy> { private readonly ILogger _logger; public AFN10_F10_Analysis(ILogger logger) { _logger = logger; } public Task> ExecuteAsync(TB3761 input) { try { ArgumentNullException.ThrowIfNull(input); ArgumentNullException.ThrowIfNull(input.UnitData.HexMessageList); Tuple> tuple = AFN10F10EntityAnalysis(input.UnitData.HexMessageList); UnitDataAnalysis dto = new UnitDataAnalysis { Code = input.A.Code, AFN = input.AFN_FC.AFN, Fn = input.DT.Fn, Pn = input.DA.Pn, Data=new AFN10_F10_AnalysisDto() { AFN10F10Entitys = tuple.Item2, ConfigNum = tuple.Item1 } }; return Task.FromResult(dto); } catch (Exception ex) { _logger.LogError(ex, $"0A_10解析失败:{input.A?.Code}-{input.DT?.Fn ?? 0}-{input?.BaseHexMessage?.HexMessageString},{ex.Message}"); return null; } } public Tuple> AFN10F10EntityAnalysis(List hexMessageList) { List> meterList = new List>(); int total = $"{hexMessageList[5]}{hexMessageList[4]}".HexToDec(); List aFN10F10Entitys = new List(); for (int i = 0; i < total; i++) { List sArray = hexMessageList.GetRange(6 + 27 * i, 27); AFN10F10Entity aFN10F10Entity = new AFN10F10Entity() { SerialNum = $"{sArray[1]}{sArray[0]}".HexToDec(), Point = $"{sArray[3]}{sArray[2]}".HexToDec(), RuleType= GetProtocol(sArray[5]), ComAddress= $"{sArray[11]}{sArray[10]}{sArray[9]}{sArray[8]}{sArray[7]}{sArray[6]}", ComPwd= $"{sArray[17]}{sArray[16]}{sArray[15]}{sArray[14]}{sArray[13]}{sArray[12]}".Substring(6, 6), ElectricityRatesNum= sArray[18].HexToBin().Substring(2, 6).BinToDec(), CollectorAddress = $"{sArray[25]}{sArray[24]}{sArray[23]}{sArray[22]}{sArray[21]}{sArray[20]}", }; string baudPort = sArray[4].HexToBin().PadLeft(8, '0'); //波特率和端口号放在一个字节内 aFN10F10Entity.BaudRate = GetBaudrate(baudPort.Substring(0, 3)); aFN10F10Entity.Port = baudPort.Substring(3, 5).BinToDec(); string dataDigit = sArray[19].HexToBin().PadLeft(8, '0'); //有功电能示值整数位及小数位个数 aFN10F10Entity.IntegerBitsNum = dataDigit.Substring(4, 2).BinToDec() + 4; aFN10F10Entity.DecimalPlacesNum = dataDigit.Substring(6, 2).BinToDec() + 1; string classNo = sArray[26].HexToBin().PadLeft(8, '0');//用户大类号及用户小类号 aFN10F10Entity.UserCategoryNum = classNo.Substring(0, 4).BinToDec() + 1; aFN10F10Entity.UserCategoryNum = classNo.Substring(4, 4).BinToDec() + 1; aFN10F10Entitys.Add(aFN10F10Entity); } return Tuple.Create(total, aFN10F10Entitys); } /// /// 获取波特率 /// /// /// private int GetBaudrate(string binBaud) { int baudRate = 0; switch (binBaud) { case "001": baudRate = 600; break; case "010": baudRate = 1200; break; case "011": baudRate = 2400; break; case "100": baudRate = 4800; break; case "101": baudRate = 7200; break; case "110": baudRate = 9600; break; case "111": baudRate = 19200; break; default: baudRate = 0; break; } return baudRate; } /// /// 获取通信协议文本说明 /// /// /// private string GetProtocol(string protocol) { int dataUnit = protocol.HexToDec(); if (dataUnit == 1) { return "DL/T 645—1997"; } if (dataUnit == 2) { return "交流采样装置通信协议"; } if (dataUnit == 30) { return "DL/T 645—2007"; } if (dataUnit == 31) { return "串行接口连接窄带低压载波通信模块"; } if (dataUnit == 32) { return "CJ/T 188—2018协议"; } return "其他协议"; } } }