using JiShe.CollectBus.Common.Consts; using JiShe.CollectBus.Common.Enums; using JiShe.CollectBus.Common.Extensions; using JiShe.CollectBus.IotSystems.Ammeters; using JiShe.CollectBus.IotSystems.Devices; 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.T37612012.AnalysisData.AFN_0AH { /// /// 5.10.1.3.1 F10:终端电能表/交流采样装置配置参数 /// internal class AFN10_F10_Analysis : IAnalysisStrategy { private readonly ILogger _logger; private readonly DataStorage _dataStorage; public AFN10_F10_Analysis(ILogger logger, DataStorage dataStorage) { _logger = logger; _dataStorage = dataStorage; } public async Task ExecuteAsync(TB3761 input, Action? result = null) { try { ArgumentNullException.ThrowIfNull(input); ArgumentNullException.ThrowIfNull(input.A.Code); ArgumentNullException.ThrowIfNull(input.UnitData.HexMessageList); Tuple> tuple = AFN10F10EntityAnalysis(input.UnitData.HexMessageList); var data = new AnalysisBaseDto() { FiledDesc = "终端电能表/交流采样装置配置参数", DataValue = new AFN10_F10_AnalysisDto() { AFN10F10Entitys = tuple.Item2, ConfigNum = tuple.Item1 }, ItemType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}" }; // 查询设备信息 DeviceCacheInfo? deviceInfo = await _dataStorage.GetDeviceInfoAsync(input.A.Code); if (deviceInfo != null) { data.ProjectId = deviceInfo.ProjectId; data.DeviceId = deviceInfo.FocusId; data.DatabaseBusiID = deviceInfo.DatabaseBusiID; data.DeviceAddress = deviceInfo.FocusAddress; data.DeviceType = MeterTypeEnum.Focus; data.FocusId = deviceInfo.FocusId; } UnitDataAnalysis> dto = new UnitDataAnalysis> { Code = input.A.Code!, AFN = input.AFN_FC.AFN, Fn = input.DT.Fn, Pn = input.DA.Pn, Data = data, ReceivedHexMessage = input.BaseHexMessage.HexMessageString, MessageId = input.MessageId, ReceivedTime = input.ReceivedTime, DensityUnit = DensityUnit.None, TimeDensity = -1, DataType=IOTDBDataTypeConst.Param }; result?.Invoke(dto); await _dataStorage.SaveDataToIotDbAsync(dto); return await Task.FromResult(true); } catch (Exception ex) { _logger.LogError(ex, $"0A_10解析失败:{input.A?.Code}-{input.DT?.Fn ?? 0}-{input?.BaseHexMessage?.HexMessageString},{ex.Message}"); } return await Task.FromResult(false); } 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]}", }; aFN10F10Entity.ComAddress = $"{sArray[11]}{sArray[10]}{sArray[9]}{sArray[8]}{sArray[7]}{sArray[6]}"; aFN10F10Entity.ComPwd = $"{sArray[17]}{sArray[16]}{sArray[15]}{sArray[14]}{sArray[13]}{sArray[12]}".Substring(6, 6); aFN10F10Entity.ElectricityRatesNum = sArray[18].HexTo4BinZero().Substring(2, 6).BinToDec(); aFN10F10Entity.CollectorAddress = $"{sArray[25]}{sArray[24]}{sArray[23]}{sArray[22]}{sArray[21]}{sArray[20]}"; string baudPort = sArray[4].HexTo4BinZero().PadLeft(8, '0'); //波特率和端口号放在一个字节内 aFN10F10Entity.BaudRate = GetBaudrate(baudPort.Substring(0, 3)); aFN10F10Entity.Port = baudPort.Substring(3, 5).BinToDec(); string dataDigit = sArray[19].HexTo4BinZero().PadLeft(8, '0'); //有功电能示值整数位及小数位个数 aFN10F10Entity.IntegerBitsNum = dataDigit.Substring(4, 2).BinToDec() + 4; aFN10F10Entity.DecimalPlacesNum = dataDigit.Substring(6, 2).BinToDec() + 1; string classNo = sArray[26].HexTo4BinZero().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 "其他协议"; } } }