接口修改
This commit is contained in:
parent
4162544553
commit
39e1f25889
@ -17,7 +17,7 @@ namespace JiShe.CollectBus.EnergySystem.Dto
|
|||||||
|
|
||||||
public string GatherCode { get; set; }
|
public string GatherCode { get; set; }
|
||||||
|
|
||||||
public AutoReportCollectionItemsSetDetailsInput Details { get; set; }
|
public AutoReportCollectionItemsSetDetailsInput Detail { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class AutoReportCollectionItemsSetCodeInput
|
public class AutoReportCollectionItemsSetCodeInput
|
||||||
|
|||||||
@ -17,7 +17,7 @@ namespace JiShe.CollectBus.EnergySystem.Dto
|
|||||||
|
|
||||||
public string GatherCode { get; set; }
|
public string GatherCode { get; set; }
|
||||||
|
|
||||||
public AutoReportSetDetailsInput Details { get; set; }
|
public AutoReportSetDetailsInput Detail { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class AutoReportSetCodeInput
|
public class AutoReportSetCodeInput
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
using System.Threading.Tasks;
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
using JiShe.CollectBus.EnergySystem.Dto;
|
using JiShe.CollectBus.EnergySystem.Dto;
|
||||||
using Volo.Abp.Application.Services;
|
using Volo.Abp.Application.Services;
|
||||||
|
|
||||||
@ -130,19 +131,19 @@ public interface IEnergySystemAppService : IApplicationService
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="input"></param>
|
/// <param name="input"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<BaseResultDto> AddConrOnlineRecord(AddConrOnlineRecordInput input);
|
Task<BaseResultDto> AddConrOnlineRecord(List<AddConrOnlineRecordInput> input);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 记录信号强度
|
/// 记录信号强度
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="input"></param>
|
/// <param name="input"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<BaseResultDto> AddSignalStrength(AddSignalStrengthInput input);
|
Task<BaseResultDto> AddSignalStrength(List<AddSignalStrengthInput> input);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 集中器上下线、心跳记录
|
/// 集中器上下线、心跳记录
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="input"></param>
|
/// <param name="input"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<BaseResultDto> AddFocusLog(AddFocusLogInput input);
|
Task<BaseResultDto> AddFocusLog(List<AddFocusLogInput> input);
|
||||||
}
|
}
|
||||||
@ -5,6 +5,7 @@ using System.Net;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using DotNetCore.CAP;
|
using DotNetCore.CAP;
|
||||||
|
using JiShe.CollectBus.Common.BuildSendDatas;
|
||||||
using JiShe.CollectBus.Common.Enums;
|
using JiShe.CollectBus.Common.Enums;
|
||||||
using JiShe.CollectBus.Common.Extensions;
|
using JiShe.CollectBus.Common.Extensions;
|
||||||
using JiShe.CollectBus.Common.Models;
|
using JiShe.CollectBus.Common.Models;
|
||||||
@ -55,9 +56,9 @@ namespace JiShe.CollectBus.EnergySystem
|
|||||||
if (ammeter == null) return result;
|
if (ammeter == null) return result;
|
||||||
|
|
||||||
var dataUnit =
|
var dataUnit =
|
||||||
HexStringExtensions.BuildAmmeterValveControlSendDataUnit(ammeter.Address, "", ammeter.Password,
|
Build645SendData.BuildAmmeterValveControlSendDataUnit(ammeter.Address, "", ammeter.Password,
|
||||||
state);
|
state);
|
||||||
bytes = HexStringExtensions.BuildTransparentForwardingSendCmd(address, ammeter.PortNumber ?? 2, ammeter.BaudRate, dataUnit);
|
bytes = Build3761SendData.BuildTransparentForwardingSendCmd(address, ammeter.PortNumber ?? 2, ammeter.BaudRate, dataUnit);
|
||||||
}
|
}
|
||||||
else if(input.MeterType == 2)
|
else if(input.MeterType == 2)
|
||||||
{
|
{
|
||||||
@ -100,7 +101,7 @@ namespace JiShe.CollectBus.EnergySystem
|
|||||||
if (ammeter == null) return result;
|
if (ammeter == null) return result;
|
||||||
|
|
||||||
var address = $"{input.AreaCode}{input.Address}";
|
var address = $"{input.AreaCode}{input.Address}";
|
||||||
var bytesList = HexStringExtensions.BuildReadMeterTimeSetSendCmd(address, ammeter.Code, ammeter.Address, ammeter.Password,
|
var bytesList = Build3761SendData.BuildReadMeterTimeSetSendCmd(address, ammeter.Code, ammeter.Address, ammeter.Password,
|
||||||
ammeter.PortNumber ?? 2, ammeter.BaudRate);
|
ammeter.PortNumber ?? 2, ammeter.BaudRate);
|
||||||
|
|
||||||
foreach (var bytes in bytesList)
|
foreach (var bytes in bytesList)
|
||||||
@ -132,9 +133,9 @@ namespace JiShe.CollectBus.EnergySystem
|
|||||||
{
|
{
|
||||||
SerialNumber = it.SerialNumber,
|
SerialNumber = it.SerialNumber,
|
||||||
Pn = it.Pn,
|
Pn = it.Pn,
|
||||||
BaudRate = HexStringExtensions.GetBaudreate(it.Rate.ToString()),
|
BaudRate = Build3761SendData.GetBaudreate(it.Rate.ToString()),
|
||||||
Port = it.Port,
|
Port = it.Port,
|
||||||
ProtocolType = HexStringExtensions.GetProtocolType(it.AgreementType),
|
ProtocolType = Build3761SendData.GetProtocolType(it.AgreementType),
|
||||||
Address = it.Addrress,
|
Address = it.Addrress,
|
||||||
Password = it.Password.ToString(),
|
Password = it.Password.ToString(),
|
||||||
RateNumber = it.RatesCount,
|
RateNumber = it.RatesCount,
|
||||||
@ -145,7 +146,7 @@ namespace JiShe.CollectBus.EnergySystem
|
|||||||
//UserSubclassNumber = it.UserSmallNumber
|
//UserSubclassNumber = it.UserSmallNumber
|
||||||
|
|
||||||
}).ToList();
|
}).ToList();
|
||||||
var bytes = HexStringExtensions.BuildAmmeterParameterSetSendCmd(address, meterParameters);
|
var bytes = Build3761SendData.BuildAmmeterParameterSetSendCmd(address, meterParameters);
|
||||||
await _capBus.PublishAsync(ProtocolConst.SubscriberIssuedEventName, new IssuedEventMessage
|
await _capBus.PublishAsync(ProtocolConst.SubscriberIssuedEventName, new IssuedEventMessage
|
||||||
{
|
{
|
||||||
//ClientId = messageReceived.ClientId,
|
//ClientId = messageReceived.ClientId,
|
||||||
@ -167,9 +168,27 @@ namespace JiShe.CollectBus.EnergySystem
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
/// <exception cref="NotImplementedException"></exception>
|
/// <exception cref="NotImplementedException"></exception>
|
||||||
[Route("Handmould/ReadMeterAddress_10_105")]
|
[Route("Handmould/ReadMeterAddress_10_105")]
|
||||||
public Task<BaseResultDto> AmmeterArchivesMatch(AmmeterArchivesMatchInput input)
|
public async Task<BaseResultDto> AmmeterArchivesMatch(AmmeterArchivesMatchInput input)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
var result = new BaseResultDto();
|
||||||
|
var address = $"{input.AreaCode}{input.Address}";
|
||||||
|
foreach (var detail in input.Details.Data)
|
||||||
|
{
|
||||||
|
var dataUnit = Build645SendData.BuildReadMeterAddressSendDataUnit(detail.MeterAddress);
|
||||||
|
var bytes =Build3761SendData.BuildTransparentForwardingSendCmd(address, detail.Port, detail.BaudRate.ToString(), dataUnit, StopBit.Stop1, Parity.None);
|
||||||
|
await _capBus.PublishAsync(ProtocolConst.SubscriberIssuedEventName, new IssuedEventMessage
|
||||||
|
{
|
||||||
|
//ClientId = messageReceived.ClientId,
|
||||||
|
DeviceNo = address,
|
||||||
|
Message = bytes,
|
||||||
|
Type = IssuedEventType.Data,
|
||||||
|
MessageId = NewId.NextGuid().ToString()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
result.Status = true;
|
||||||
|
result.Msg = "操作成功";
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -202,7 +221,7 @@ namespace JiShe.CollectBus.EnergySystem
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
var bytes = HexStringExtensions.BuildCommunicationParametersSetSendCmd(address, masterIP, materPort,
|
var bytes = Build3761SendData.BuildCommunicationParametersSetSendCmd(address, masterIP, materPort,
|
||||||
backupIP, backupPort, input.Data.APN);
|
backupIP, backupPort, input.Data.APN);
|
||||||
await _capBus.PublishAsync(ProtocolConst.SubscriberIssuedEventName, new IssuedEventMessage
|
await _capBus.PublishAsync(ProtocolConst.SubscriberIssuedEventName, new IssuedEventMessage
|
||||||
{
|
{
|
||||||
@ -230,7 +249,7 @@ namespace JiShe.CollectBus.EnergySystem
|
|||||||
var result = new BaseResultDto();
|
var result = new BaseResultDto();
|
||||||
var address = $"{input.AreaCode}{input.Address}";
|
var address = $"{input.AreaCode}{input.Address}";
|
||||||
|
|
||||||
var bytes = HexStringExtensions.BuildTerminalCalendarClockSendCmd(address);
|
var bytes = Build3761SendData.BuildTerminalCalendarClockSendCmd(address);
|
||||||
await _capBus.PublishAsync(ProtocolConst.SubscriberIssuedEventName, new IssuedEventMessage
|
await _capBus.PublishAsync(ProtocolConst.SubscriberIssuedEventName, new IssuedEventMessage
|
||||||
{
|
{
|
||||||
//ClientId = messageReceived.ClientId,
|
//ClientId = messageReceived.ClientId,
|
||||||
@ -257,7 +276,7 @@ namespace JiShe.CollectBus.EnergySystem
|
|||||||
var result = new BaseResultDto();
|
var result = new BaseResultDto();
|
||||||
var address = $"{input.AreaCode}{input.Address}";
|
var address = $"{input.AreaCode}{input.Address}";
|
||||||
|
|
||||||
var bytes = HexStringExtensions.BuildConrCheckTimeSendCmd(address,DateTime.Now);
|
var bytes = Build3761SendData.BuildConrCheckTimeSendCmd(address,DateTime.Now);
|
||||||
await _capBus.PublishAsync(ProtocolConst.SubscriberIssuedEventName, new IssuedEventMessage
|
await _capBus.PublishAsync(ProtocolConst.SubscriberIssuedEventName, new IssuedEventMessage
|
||||||
{
|
{
|
||||||
//ClientId = messageReceived.ClientId,
|
//ClientId = messageReceived.ClientId,
|
||||||
@ -284,7 +303,7 @@ namespace JiShe.CollectBus.EnergySystem
|
|||||||
var result = new BaseResultDto();
|
var result = new BaseResultDto();
|
||||||
var address = $"{input.AreaCode}{input.Address}";
|
var address = $"{input.AreaCode}{input.Address}";
|
||||||
|
|
||||||
var bytes = HexStringExtensions.BuildConrRebootSendCmd(address);
|
var bytes = Build3761SendData.BuildConrRebootSendCmd(address);
|
||||||
await _capBus.PublishAsync(ProtocolConst.SubscriberIssuedEventName, new IssuedEventMessage
|
await _capBus.PublishAsync(ProtocolConst.SubscriberIssuedEventName, new IssuedEventMessage
|
||||||
{
|
{
|
||||||
//ClientId = messageReceived.ClientId,
|
//ClientId = messageReceived.ClientId,
|
||||||
@ -312,7 +331,7 @@ namespace JiShe.CollectBus.EnergySystem
|
|||||||
|
|
||||||
var address = $"{input.AreaCode}{input.Address}";
|
var address = $"{input.AreaCode}{input.Address}";
|
||||||
var pnList = input.Data.Split(',').Select(it => int.Parse(it)).ToList();
|
var pnList = input.Data.Split(',').Select(it => int.Parse(it)).ToList();
|
||||||
var bytes = HexStringExtensions.BuildAmmeterParameterReadingSendCmd(address, pnList);
|
var bytes = Build3761SendData.BuildAmmeterParameterReadingSendCmd(address, pnList);
|
||||||
await _capBus.PublishAsync(ProtocolConst.SubscriberIssuedEventName, new IssuedEventMessage
|
await _capBus.PublishAsync(ProtocolConst.SubscriberIssuedEventName, new IssuedEventMessage
|
||||||
{
|
{
|
||||||
//ClientId = messageReceived.ClientId,
|
//ClientId = messageReceived.ClientId,
|
||||||
@ -349,13 +368,13 @@ namespace JiShe.CollectBus.EnergySystem
|
|||||||
var fn = int.Parse(itemCodeArr[1]);
|
var fn = int.Parse(itemCodeArr[1]);
|
||||||
if (aFN == AFN.请求实时数据)
|
if (aFN == AFN.请求实时数据)
|
||||||
{
|
{
|
||||||
var bytes = HexStringExtensions.BuildAmmeterReadRealTimeDataSendCmd(address, ammeter.MeterCode.Value, (ATypeOfDataItems)fn);
|
var bytes = Build3761SendData.BuildAmmeterReadRealTimeDataSendCmd(address, ammeter.MeterCode.Value, (ATypeOfDataItems)fn);
|
||||||
bytesList.Add(bytes);
|
bytesList.Add(bytes);
|
||||||
}
|
}
|
||||||
else if (aFN == AFN.请求历史数据)
|
else if (aFN == AFN.请求历史数据)
|
||||||
{
|
{
|
||||||
var density = (FreezeDensity)input.Density;
|
var density = (FreezeDensity)input.Density;
|
||||||
var bytes = HexStringExtensions.BuildAmmeterReadingIIdataTypeItemsSendCmd(address, ammeter.MeterCode.Value, (IIdataTypeItems)fn, density,0);
|
var bytes = Build3761SendData.BuildAmmeterReadingIIdataTypeItemsSendCmd(address, ammeter.MeterCode.Value, (IIdataTypeItems)fn, density,0);
|
||||||
bytesList.Add(bytes);
|
bytesList.Add(bytes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -391,6 +410,27 @@ namespace JiShe.CollectBus.EnergySystem
|
|||||||
var ammeter = await SqlProvider.Instance.Change(DbEnum.EnergyDB).Select<Vi_BaseAmmeterInfo>().Where(d => d.ID == input.MeterID).FirstAsync();
|
var ammeter = await SqlProvider.Instance.Change(DbEnum.EnergyDB).Select<Vi_BaseAmmeterInfo>().Where(d => d.ID == input.MeterID).FirstAsync();
|
||||||
if (ammeter == null) return result;
|
if (ammeter == null) return result;
|
||||||
|
|
||||||
|
//if (string.IsNullOrEmpty(ammeter.BrandType))
|
||||||
|
//{
|
||||||
|
// resultMsg.Status = false;
|
||||||
|
// resultMsg.Msg = "电表型号为空";
|
||||||
|
// return resultMsg;
|
||||||
|
//}
|
||||||
|
//var listData = ProgramModelConfig.ProgramModels;
|
||||||
|
//var pm = listData.FirstOrDefault(n => n.Model == ammeter.BrandType);
|
||||||
|
//if (pm == null)
|
||||||
|
//{
|
||||||
|
// resultMsg.Status = false;
|
||||||
|
// resultMsg.Msg = $"电表{ammeter.AmmerterAddress}型号{ammeter.BrandType}暂不支持时段设置";
|
||||||
|
// return resultMsg;
|
||||||
|
//}
|
||||||
|
|
||||||
|
//resultMsg.Status = true;
|
||||||
|
//if (pm.IsEnter)
|
||||||
|
//{
|
||||||
|
// resultMsg.Data = pm.cmdData;
|
||||||
|
//}
|
||||||
|
|
||||||
var address = input.FocusCode;
|
var address = input.FocusCode;
|
||||||
var timeDataList = input.Data.Select(it => new TimeSetDetail()
|
var timeDataList = input.Data.Select(it => new TimeSetDetail()
|
||||||
{
|
{
|
||||||
@ -405,7 +445,7 @@ namespace JiShe.CollectBus.EnergySystem
|
|||||||
}).ToList()
|
}).ToList()
|
||||||
}).ToList()
|
}).ToList()
|
||||||
}).ToList();
|
}).ToList();
|
||||||
var bytesList = HexStringExtensions.BuildAmmeterSetTimeSetSendCmd(address, ammeter.Code, ammeter.Address,
|
var bytesList = Build3761SendData.BuildAmmeterSetTimeSetSendCmd(address, ammeter.Code, ammeter.Address,
|
||||||
ammeter.PortNumber ?? 2, ammeter.BaudRate, timeDataList);
|
ammeter.PortNumber ?? 2, ammeter.BaudRate, timeDataList);
|
||||||
|
|
||||||
foreach (var bytes in bytesList)
|
foreach (var bytes in bytesList)
|
||||||
@ -431,9 +471,26 @@ namespace JiShe.CollectBus.EnergySystem
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
/// <exception cref="NotImplementedException"></exception>
|
/// <exception cref="NotImplementedException"></exception>
|
||||||
[Route("Handmould/SetAutoItemCode")]
|
[Route("Handmould/SetAutoItemCode")]
|
||||||
public Task<BaseResultDto> AutoReportCollectionItemsSet(AutoReportCollectionItemsSetInput input)
|
public async Task<BaseResultDto> AutoReportCollectionItemsSet(AutoReportCollectionItemsSetInput input)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
var result = new BaseResultDto();
|
||||||
|
foreach (var code in input.Codes)
|
||||||
|
{
|
||||||
|
var address = $"{code.AreaCode}{code.Address}";
|
||||||
|
var bytes = Build3761SendData.BuildAmmeterReportCollectionItemsSetSendCmd(address,input.Detail.Pn, input.Detail.Unit,input.Detail.Cycle,input.Detail.BaseTime,
|
||||||
|
input.Detail.CurveRatio,input.Detail.Details.Select(it => new PnFn(it.Pn,it.Fn)).ToList());
|
||||||
|
await _capBus.PublishAsync(ProtocolConst.SubscriberIssuedEventName, new IssuedEventMessage
|
||||||
|
{
|
||||||
|
//ClientId = messageReceived.ClientId,
|
||||||
|
DeviceNo = address,
|
||||||
|
Message = bytes,
|
||||||
|
Type = IssuedEventType.Data,
|
||||||
|
MessageId = NewId.NextGuid().ToString()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
result.Status = true;
|
||||||
|
result.Msg = "操作成功";
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -443,21 +500,50 @@ namespace JiShe.CollectBus.EnergySystem
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
/// <exception cref="NotImplementedException"></exception>
|
/// <exception cref="NotImplementedException"></exception>
|
||||||
[Route("Handmould/SetAutoUpSwitch")]
|
[Route("Handmould/SetAutoUpSwitch")]
|
||||||
public Task<BaseResultDto> AutoReportSet(AutoReportSetInput input)
|
public async Task<BaseResultDto> AutoReportSet(AutoReportSetInput input)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
var result = new BaseResultDto();
|
||||||
|
foreach (var code in input.Codes)
|
||||||
|
{
|
||||||
|
var address = $"{code.AreaCode}{code.Address}";
|
||||||
|
var bytes = Build3761SendData.BuildAmmeterAutoUpSwitchSetSendCmd(address, input.Detail.Pn,input.Detail.IsOpen);
|
||||||
|
await _capBus.PublishAsync(ProtocolConst.SubscriberIssuedEventName, new IssuedEventMessage
|
||||||
|
{
|
||||||
|
//ClientId = messageReceived.ClientId,
|
||||||
|
DeviceNo = address,
|
||||||
|
Message = bytes,
|
||||||
|
Type = IssuedEventType.Data,
|
||||||
|
MessageId = NewId.NextGuid().ToString()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
result.Status = true;
|
||||||
|
result.Msg = "操作成功";
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查询自动上报开启状态 数据库操作
|
/// 查询自动上报开启状态
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="input"></param>
|
/// <param name="input"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
/// <exception cref="NotImplementedException"></exception>
|
/// <exception cref="NotImplementedException"></exception>
|
||||||
[Route("Handmould/QueryAutoUpSwitch")]
|
[Route("Handmould/QueryAutoUpSwitch")]
|
||||||
public Task<BaseResultDto> QueryAutoReportOpenStatus(QueryAutoReportOpenStatusInput input)
|
public async Task<BaseResultDto> QueryAutoReportOpenStatus(QueryAutoReportOpenStatusInput input)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
var result = new BaseResultDto();
|
||||||
|
var address = $"{input.AreaCode}{input.Address}";
|
||||||
|
var bytes = Build3761SendData.BuildAmmeterReadAutoUpSwitchSendCmd(address, input.Detail.Pn);
|
||||||
|
await _capBus.PublishAsync(ProtocolConst.SubscriberIssuedEventName, new IssuedEventMessage
|
||||||
|
{
|
||||||
|
//ClientId = messageReceived.ClientId,
|
||||||
|
DeviceNo = address,
|
||||||
|
Message = bytes,
|
||||||
|
Type = IssuedEventType.Data,
|
||||||
|
MessageId = NewId.NextGuid().ToString()
|
||||||
|
});
|
||||||
|
result.Status = true;
|
||||||
|
result.Msg = "操作成功";
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -473,7 +559,7 @@ namespace JiShe.CollectBus.EnergySystem
|
|||||||
foreach (var data in input.Data)
|
foreach (var data in input.Data)
|
||||||
{
|
{
|
||||||
var address = $"{data.AreaCode}{data.Address}";
|
var address = $"{data.AreaCode}{data.Address}";
|
||||||
var bytes = HexStringExtensions.BuildTerminalVersionInfoReadingSendCmd(address);
|
var bytes = Build3761SendData.BuildTerminalVersionInfoReadingSendCmd(address);
|
||||||
await _capBus.PublishAsync(ProtocolConst.SubscriberIssuedEventName, new IssuedEventMessage
|
await _capBus.PublishAsync(ProtocolConst.SubscriberIssuedEventName, new IssuedEventMessage
|
||||||
{
|
{
|
||||||
//ClientId = messageReceived.ClientId,
|
//ClientId = messageReceived.ClientId,
|
||||||
@ -510,13 +596,22 @@ namespace JiShe.CollectBus.EnergySystem
|
|||||||
public async Task<BaseResultDto> AdjustMeterTiming(AdjustMeterTimingInput input)
|
public async Task<BaseResultDto> AdjustMeterTiming(AdjustMeterTimingInput input)
|
||||||
{
|
{
|
||||||
var result = new BaseResultDto();
|
var result = new BaseResultDto();
|
||||||
|
|
||||||
var ammeter = await SqlProvider.Instance.Change(DbEnum.EnergyDB).Select<Vi_BaseAmmeterInfo>().Where(d => d.Address == input.MeterAddress).FirstAsync();
|
|
||||||
if (ammeter == null) return result;
|
|
||||||
|
|
||||||
var address = $"{input.AreaCode}{input.Address}";
|
var address = $"{input.AreaCode}{input.Address}";
|
||||||
var bytesList = HexStringExtensions.BuildAmmeterCorrectionTimeSendCmd(address, ammeter.Code, ammeter.Address, ammeter.Password,
|
|
||||||
ammeter.PortNumber ?? 2, ammeter.BaudRate);
|
var bytesList = new List<byte[]>();
|
||||||
|
var dateDataUnit =
|
||||||
|
Build645SendData.BuildAmmeterCorrectionTimeSendDataUnit(input.MeterAddress, input.Password,
|
||||||
|
"04 00 01 01", 0);
|
||||||
|
var dateBytes = Build3761SendData.BuildTransparentForwardingSendCmd(address, input.Port, input.BaudRate.ToString(),
|
||||||
|
dateDataUnit);
|
||||||
|
bytesList.Add(dateBytes);
|
||||||
|
|
||||||
|
var timeDataUnit =
|
||||||
|
Build645SendData.BuildAmmeterCorrectionTimeSendDataUnit(input.MeterAddress, input.Password,
|
||||||
|
"04 00 01 02", 0);
|
||||||
|
var timeBytes = Build3761SendData.BuildTransparentForwardingSendCmd(address, input.Port, input.BaudRate.ToString(),
|
||||||
|
timeDataUnit);
|
||||||
|
bytesList.Add(timeBytes);
|
||||||
|
|
||||||
foreach (var bytes in bytesList)
|
foreach (var bytes in bytesList)
|
||||||
{
|
{
|
||||||
@ -542,10 +637,10 @@ namespace JiShe.CollectBus.EnergySystem
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
/// <exception cref="NotImplementedException"></exception>
|
/// <exception cref="NotImplementedException"></exception>
|
||||||
[Route("AfterSaleApi/AddConrOnlineRecord")]
|
[Route("AfterSaleApi/AddConrOnlineRecord")]
|
||||||
public async Task<BaseResultDto> AddConrOnlineRecord(AddConrOnlineRecordInput input)
|
public async Task<BaseResultDto> AddConrOnlineRecord(List<AddConrOnlineRecordInput> input)
|
||||||
{
|
{
|
||||||
var conrOnlineRecord = new ConrOnlineRecord(input.AreaCode,input.Address,input.State,input.LastTime);
|
var conrOnlineRecords = input.Select(it => new ConrOnlineRecord(it.AreaCode, it.Address, it.State, it.LastTime)).ToList();
|
||||||
await _conrOnlineRecordRepository.InsertAsync(conrOnlineRecord);
|
await _conrOnlineRecordRepository.InsertManyAsync(conrOnlineRecords);
|
||||||
return new BaseResultDto()
|
return new BaseResultDto()
|
||||||
{
|
{
|
||||||
Status = true
|
Status = true
|
||||||
@ -559,10 +654,11 @@ namespace JiShe.CollectBus.EnergySystem
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
/// <exception cref="NotImplementedException"></exception>
|
/// <exception cref="NotImplementedException"></exception>
|
||||||
[Route("AfterSaleApi/RssiToWebApi")]
|
[Route("AfterSaleApi/RssiToWebApi")]
|
||||||
public async Task<BaseResultDto> AddSignalStrength(AddSignalStrengthInput input)
|
public async Task<BaseResultDto> AddSignalStrength(List<AddSignalStrengthInput> input)
|
||||||
{
|
{
|
||||||
var csqRecord = new CsqRecord(input.Address, input.AreaCode,input.DeviceType,input.Csq);
|
var csqRecords = input.Select(it =>
|
||||||
await _csqRecordRepository.InsertAsync(csqRecord);
|
new CsqRecord(it.Address, it.AreaCode, it.DeviceType, it.Csq)).ToList();
|
||||||
|
await _csqRecordRepository.InsertManyAsync(csqRecords);
|
||||||
|
|
||||||
return new BaseResultDto()
|
return new BaseResultDto()
|
||||||
{
|
{
|
||||||
@ -577,11 +673,13 @@ namespace JiShe.CollectBus.EnergySystem
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
/// <exception cref="NotImplementedException"></exception>
|
/// <exception cref="NotImplementedException"></exception>
|
||||||
[Route("AfterSaleApi/AddFocusLog")]
|
[Route("AfterSaleApi/AddFocusLog")]
|
||||||
public async Task<BaseResultDto> AddFocusLog(AddFocusLogInput input)
|
public async Task<BaseResultDto> AddFocusLog(List<AddFocusLogInput> input)
|
||||||
{
|
{
|
||||||
var focusLog = new FocusRecord(input.Address, input.GatherServerId, int.Parse(input.IntervalTime), input.LogTime,
|
var focusLogs = input.Select(it =>
|
||||||
input.LogType, input.Remark);
|
new FocusRecord(it.Address, it.GatherServerId, int.Parse(it.IntervalTime), it.LogTime,
|
||||||
await _focusRecordRepository.InsertAsync(focusLog);
|
it.LogType, it.Remark)).ToList();
|
||||||
|
|
||||||
|
await _focusRecordRepository.InsertManyAsync(focusLogs);
|
||||||
|
|
||||||
return new BaseResultDto()
|
return new BaseResultDto()
|
||||||
{
|
{
|
||||||
|
|||||||
213
src/JiShe.CollectBus.Common/BuildSendDatas/Build188SendData.cs
Normal file
213
src/JiShe.CollectBus.Common/BuildSendDatas/Build188SendData.cs
Normal file
@ -0,0 +1,213 @@
|
|||||||
|
using JiShe.CollectBus.Common.Enums;
|
||||||
|
using JiShe.CollectBus.Common.Extensions;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace JiShe.CollectBus.Common.BuildSendDatas
|
||||||
|
{
|
||||||
|
public static class Build188SendData
|
||||||
|
{
|
||||||
|
//起始字符
|
||||||
|
private const string startStr = "68";
|
||||||
|
|
||||||
|
//结束字符
|
||||||
|
private const string endStr = "16";
|
||||||
|
|
||||||
|
#region 188 下行命令
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 标准 188协议阀控
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="waterMeterAddress"></param>
|
||||||
|
/// <param name="mtype">表计类型</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static List<string> BuildConfirm188WaterValve(string waterMeterAddress, bool state, string mtype = "10")
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(waterMeterAddress)) return null;
|
||||||
|
|
||||||
|
var dataUnit = new List<string>() { "A0", "17", "00", state ? "55" : "99" };
|
||||||
|
|
||||||
|
var dataList = Build188SendCommand(waterMeterAddress, "04", dataUnit);
|
||||||
|
|
||||||
|
return dataList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 构建188水表抄读下发数据单元
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="waterMeterAddress"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static List<string> Build188WaterMeterReadingSendDataUnit(string waterMeterAddress)
|
||||||
|
{
|
||||||
|
|
||||||
|
var dataUnit = new List<string>() { "1F", "90", "00" };
|
||||||
|
var dataList = Build188SendCommand(waterMeterAddress, "01", dataUnit);
|
||||||
|
|
||||||
|
return dataList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 构建188协议下发命令
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="waterMeterAddress">水表地址</param>
|
||||||
|
/// <param name="controlCode">控制码</param>
|
||||||
|
/// <param name="dataUnit">数据域</param>
|
||||||
|
/// <param name="meterType">表类型</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static List<string> Build188SendCommand(string waterMeterAddress, string controlCode, List<string>? dataUnit = null, string meterType = "10")
|
||||||
|
{
|
||||||
|
//address.Substring(address.Length - 12, 12)
|
||||||
|
var cmdStrList = new List<string>();
|
||||||
|
cmdStrList.Add(startStr);
|
||||||
|
cmdStrList.Add(meterType);
|
||||||
|
|
||||||
|
waterMeterAddress = waterMeterAddress.PadLeft(14, '0');
|
||||||
|
var addressList = waterMeterAddress.StringToPairs();
|
||||||
|
addressList.Reverse();
|
||||||
|
cmdStrList.AddRange(addressList);
|
||||||
|
|
||||||
|
//控制码
|
||||||
|
cmdStrList.Add(controlCode);
|
||||||
|
|
||||||
|
var len = dataUnit != null ? dataUnit.Count.DecToHex().PadLeft(2, '0') : "00";
|
||||||
|
cmdStrList.Add(len);
|
||||||
|
if (dataUnit != null)
|
||||||
|
{
|
||||||
|
cmdStrList.AddRange(dataUnit);
|
||||||
|
}
|
||||||
|
|
||||||
|
var strSum = cmdStrList.Select(i => Convert.ToInt32(i, 16)).Sum().ToString("X");
|
||||||
|
strSum = strSum.Substring(strSum.Length - 2);
|
||||||
|
cmdStrList.Add(strSum);
|
||||||
|
cmdStrList.Add(endStr);
|
||||||
|
|
||||||
|
return cmdStrList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 组装水表阀控
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="waterMeterAddress">水表地址</param>
|
||||||
|
/// <param name="password">The password.</param>
|
||||||
|
/// <param name="protocol">The poprotocol.</param>
|
||||||
|
/// <param name="state">if set to <c>true</c> [isopenvalve].</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static List<string>? WaterMeterValveControl(string waterMeterAddress, string password, int protocol, bool state)
|
||||||
|
{
|
||||||
|
List<string>? turnData = null;
|
||||||
|
if (protocol == 1)
|
||||||
|
turnData = GetControlCode97(waterMeterAddress.Substring(waterMeterAddress.Length - 12, 12), password, state ? "3355" : "9966");//开阀/关阀
|
||||||
|
else if (protocol == 30)
|
||||||
|
turnData = GetControlCode07(waterMeterAddress.Substring(waterMeterAddress.Length - 12, 12), password, state ? "3355" : "9966");//开阀/关阀
|
||||||
|
return turnData;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<string> GetControlCode97(string waterMeterAddress, string password, string valueCode)
|
||||||
|
{
|
||||||
|
var dataList = new List<string>();
|
||||||
|
var passwordList = password.StringToPairs();
|
||||||
|
passwordList.Reverse();
|
||||||
|
|
||||||
|
var valueCodeList = valueCode.StringToPairs();
|
||||||
|
valueCodeList.Reverse();
|
||||||
|
|
||||||
|
dataList.AddRange(valueCodeList);
|
||||||
|
dataList.AddRange(passwordList);
|
||||||
|
dataList.AddRange(valueCodeList);
|
||||||
|
|
||||||
|
return GetCode(waterMeterAddress, "04", dataList);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<string> GetControlCode07(string waterMeterAddress, string password, string valueCode)
|
||||||
|
{
|
||||||
|
var dataList = new List<string>();
|
||||||
|
dataList.Add("02");
|
||||||
|
|
||||||
|
var passwordList = password.StringToPairs();
|
||||||
|
passwordList.Reverse();
|
||||||
|
dataList.AddRange(passwordList);
|
||||||
|
dataList.AddRange("01000000".StringToPairs());
|
||||||
|
|
||||||
|
dataList.AddRange(valueCode.StringToPairs());
|
||||||
|
|
||||||
|
dataList.Add("00");
|
||||||
|
|
||||||
|
var time = DateTime.Now.AddDays(1).ToString("yyMMddHHmmss");
|
||||||
|
var timeList = time.StringToPairs();
|
||||||
|
timeList.Reverse();
|
||||||
|
dataList.AddRange(timeList);
|
||||||
|
|
||||||
|
return GetCode(waterMeterAddress, "1C", dataList);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<string> GetCode(string waterMeterAddress, string controlCode, List<string> childDataList)
|
||||||
|
{
|
||||||
|
var dataList = new List<string> { startStr };
|
||||||
|
|
||||||
|
waterMeterAddress = waterMeterAddress.PadLeft(12, '0');
|
||||||
|
var addressList = waterMeterAddress.StringToPairs();
|
||||||
|
addressList.Reverse();
|
||||||
|
dataList.AddRange(addressList);
|
||||||
|
|
||||||
|
dataList.Add(startStr);
|
||||||
|
dataList.Add(controlCode);
|
||||||
|
|
||||||
|
var num = childDataList.Count;
|
||||||
|
dataList.Add(num.ToString("X2"));
|
||||||
|
|
||||||
|
dataList.AddRange(childDataList.AddHex33());
|
||||||
|
|
||||||
|
var cs = dataList.Select(it => Convert.ToInt32(it, 16)).Sum().ToString("X2");
|
||||||
|
cs = cs.Substring(cs.Length - 2, 2);
|
||||||
|
dataList.Add(cs);
|
||||||
|
|
||||||
|
dataList.Add(endStr);
|
||||||
|
|
||||||
|
return dataList;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static object GetAnalyzeValue(this List<string> hexStringList, CommandChunkEnum188 chunk)
|
||||||
|
{
|
||||||
|
if (hexStringList.Count < 11)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (chunk)
|
||||||
|
{
|
||||||
|
case CommandChunkEnum188.A:
|
||||||
|
var aHexList = hexStringList[(int)CommandChunkEnum188.A].Take(7).ToList();
|
||||||
|
aHexList.Reverse();
|
||||||
|
return string.Join("", aHexList.Skip(1).Take(6).ToList());
|
||||||
|
case CommandChunkEnum188.C:
|
||||||
|
var cHex = hexStringList[(int)CommandChunkEnum188.C];
|
||||||
|
return cHex;
|
||||||
|
case CommandChunkEnum188.Data:
|
||||||
|
var lenIndex = (int)CommandChunkEnum188.L;
|
||||||
|
var len = hexStringList[lenIndex].HexToDec();
|
||||||
|
|
||||||
|
//验证长度 2=(帧校验和+结束字符)
|
||||||
|
if (hexStringList.Count - 2 != 11 + len)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
var dataHexList = hexStringList.Skip(11).Take(len).ToList();
|
||||||
|
return dataHexList;
|
||||||
|
default:
|
||||||
|
throw new ArgumentOutOfRangeException(nameof(chunk), chunk, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//public double AnalyzeCurrentTotalRate(List<string> hexList)
|
||||||
|
//{
|
||||||
|
// var str = string.Join("", hexList);
|
||||||
|
// var number = Convert.ToInt32(str) * 0.01;
|
||||||
|
// return number;
|
||||||
|
//}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
1650
src/JiShe.CollectBus.Common/BuildSendDatas/Build3761SendData.cs
Normal file
1650
src/JiShe.CollectBus.Common/BuildSendDatas/Build3761SendData.cs
Normal file
File diff suppressed because it is too large
Load Diff
755
src/JiShe.CollectBus.Common/BuildSendDatas/Build645SendData.cs
Normal file
755
src/JiShe.CollectBus.Common/BuildSendDatas/Build645SendData.cs
Normal file
@ -0,0 +1,755 @@
|
|||||||
|
using JiShe.CollectBus.Common.Enums;
|
||||||
|
using JiShe.CollectBus.Common.Extensions;
|
||||||
|
using JiShe.CollectBus.Common.Models;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using static System.Runtime.InteropServices.JavaScript.JSType;
|
||||||
|
|
||||||
|
namespace JiShe.CollectBus.Common.BuildSendDatas
|
||||||
|
{
|
||||||
|
public static class Build645SendData
|
||||||
|
{
|
||||||
|
//起始字符
|
||||||
|
private const string startStr = "68";
|
||||||
|
//结束字符
|
||||||
|
private const string endStr = "16";
|
||||||
|
|
||||||
|
#region 645下行命令
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 构建电表阀控下发数据单元
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ammeterAddress">电表地址</param>
|
||||||
|
/// <param name="specialControlCode">特殊控制码</param>
|
||||||
|
/// <param name="password">密码</param>
|
||||||
|
/// <param name="state">是否为开阀</param>
|
||||||
|
/// <param name="modelCode">型号码</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static List<string> BuildAmmeterValveControlSendDataUnit(string ammeterAddress, string specialControlCode, string password, bool state, string modelCode = "")
|
||||||
|
{
|
||||||
|
var code = string.Empty;
|
||||||
|
|
||||||
|
if (state)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(specialControlCode))
|
||||||
|
code = "1B";
|
||||||
|
else
|
||||||
|
code = specialControlCode == "1B" || specialControlCode == "1C" ? specialControlCode : "1C";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
code = "1A";//跳闸
|
||||||
|
|
||||||
|
if (specialControlCode == "1W")
|
||||||
|
{
|
||||||
|
if (state)
|
||||||
|
code = "1A";
|
||||||
|
else
|
||||||
|
code = "1C";
|
||||||
|
}
|
||||||
|
|
||||||
|
var pwdLevel = "02";
|
||||||
|
if (modelCode == "HL_DTSU2625" || modelCode == "DDZY9866")
|
||||||
|
pwdLevel = "04";
|
||||||
|
else if (modelCode == "DDS2705")
|
||||||
|
pwdLevel = "03"; //不带安全认证密级
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(password) && password.Contains("|"))
|
||||||
|
{
|
||||||
|
var sp = password.Split('|');
|
||||||
|
pwdLevel = sp[1];
|
||||||
|
password = sp[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
var strDate = DateTime.Now.AddYears(3).ToString("000012ddMMyy").StrAddSpan();//命令有效截止时间
|
||||||
|
if (specialControlCode == "1D" || modelCode == "SZBD_DDZY1225")
|
||||||
|
strDate = "FF FF FF FF FF FF";
|
||||||
|
var strP = password.StrAddSpan().StrReverseOrder();
|
||||||
|
var strSJY = " " + pwdLevel + " " + strP + " 01 00 00 00 " + code + " 00 " + strDate;
|
||||||
|
var dataUnit = strSJY.Replace(" ", "").StringToPairs();
|
||||||
|
var dataList = Build645SendCommand(ammeterAddress, "1C", dataUnit);
|
||||||
|
return dataList;
|
||||||
|
|
||||||
|
//string strLen = (strSJY.Replace(" ", "").Length / 2).ToString("X2");
|
||||||
|
//string strReturn = "68 " + address.StrAddSpan().StrReverseOrder() + " 68 1C " + strLen + " " + strSJY.StrAddHex33() + " ";
|
||||||
|
//string strSum = strReturn.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries).Select(i => Convert.ToInt32(i, 16)).Sum().ToString("X");
|
||||||
|
//strReturn += strSum.Substring(strSum.Length - 2) + " 16";
|
||||||
|
//return strReturn.Split(' ').ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 构建电表保电下发数据单元
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ammeterAddress">电表地址</param>
|
||||||
|
/// <param name="password"></param>
|
||||||
|
/// <param name="state">true 保电 false 保电解除</param>
|
||||||
|
/// <param name="modelCode">型号码</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static List<string> BuildAmmeterLockSendDataUnit(string ammeterAddress, string password, bool state, string modelCode = "")
|
||||||
|
{
|
||||||
|
var code = state ? "3A" : "3B";
|
||||||
|
|
||||||
|
var strDate = (code + DateTime.Now.AddDays(1).ToString("00000012ddMMyy")).StrAddSpan();
|
||||||
|
|
||||||
|
if (modelCode == "SZBD_DDZY1225")
|
||||||
|
strDate = $"{code} 00 FF FF FF FF FF FF";
|
||||||
|
|
||||||
|
var strP = password.StrAddSpan().StrReverseOrder();
|
||||||
|
var strSJY = " 02 " + strP + " 01 00 00 00 " + strDate;
|
||||||
|
|
||||||
|
var dataUnit = strSJY.Replace(" ", "").StringToPairs();
|
||||||
|
var dataList = Build645SendCommand(ammeterAddress, "1C", dataUnit);
|
||||||
|
return dataList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 构建电表认证下发数据单元
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ammeterAddress">电表地址</param>
|
||||||
|
/// <param name="ramDon"></param>
|
||||||
|
/// <param name="maco"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static List<string> BuildAmmeterIdentitySendDataUnit(string ammeterAddress, string ramDon, string maco)
|
||||||
|
{
|
||||||
|
var codeList = "070004FF".StringToPairs();
|
||||||
|
codeList.Reverse();
|
||||||
|
|
||||||
|
var ramDonList = ramDon.StringToPairs();
|
||||||
|
ramDonList.Reverse();
|
||||||
|
|
||||||
|
var macoList = maco.StringToPairs();
|
||||||
|
macoList.Reverse();
|
||||||
|
|
||||||
|
var dataUnit = new List<string>();
|
||||||
|
dataUnit.AddRange(codeList);
|
||||||
|
dataUnit.AddRange(ramDonList);
|
||||||
|
dataUnit.AddRange(macoList);
|
||||||
|
var dataList = Build645SendCommand(ammeterAddress, "03", dataUnit);
|
||||||
|
return dataList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 构建电表清零下发数据单元
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ammeterAddress">电表地址</param>
|
||||||
|
/// <param name="password"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static List<string> BuildAmmeterClearSendDataUnit(string ammeterAddress, string password)
|
||||||
|
{
|
||||||
|
var strP = password.StrAddSpan().StrReverseOrder();
|
||||||
|
var strSJY = " 02 " + strP + " 01 00 00 00 ";
|
||||||
|
var dataUnit = strSJY.Replace(" ", "").StringToPairs();
|
||||||
|
var dataList = Build645SendCommand(ammeterAddress, "1A", dataUnit);
|
||||||
|
return dataList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 透明转发 表计校时/广播校时 F10-104
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ammeterAddress"></param>
|
||||||
|
/// <param name="password"></param>
|
||||||
|
/// <param name="s_operator"></param>
|
||||||
|
/// <param name="dataMark"></param>
|
||||||
|
/// <param name="cmdType">类型 0:日期部分指令,1,时间部分指令</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
/// <exception cref="ArgumentNullException"></exception>
|
||||||
|
/// <exception cref="Exception"></exception>
|
||||||
|
public static List<string> BuildAmmeterCorrectionTimeSendDataUnit(string ammeterAddress,string password, string dataMark, int cmdType, string s_operator = "00000001")
|
||||||
|
{
|
||||||
|
List<string> dataUnit = new List<string>();
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(password))
|
||||||
|
password = "000000";
|
||||||
|
if (password?.Length != 6)
|
||||||
|
password = password.PadLeft(6, '0');
|
||||||
|
if (string.IsNullOrWhiteSpace(s_operator) || s_operator?.Length != 8)
|
||||||
|
throw new ArgumentNullException("电表操作人员格式不能为空或长度不等6位");
|
||||||
|
|
||||||
|
//数据标识 DIODI1DI2DI3+PAP0P1P2+C0C1C2C3+DATA
|
||||||
|
var dataMarks = dataMark.Split(' ').ToList();
|
||||||
|
dataMarks.Reverse();
|
||||||
|
dataUnit.AddRange(dataMarks);//数据标识
|
||||||
|
|
||||||
|
//密码权限 02明文 PAP0P1P2
|
||||||
|
var passsList = password.StringToPairs(true);
|
||||||
|
dataUnit.Add("02");//--密码权限 02明文
|
||||||
|
foreach (var item in passsList)
|
||||||
|
{
|
||||||
|
dataUnit.Add(item);
|
||||||
|
}
|
||||||
|
//操作人员 C0C1C2C3
|
||||||
|
var opers = s_operator.StringToPairs(true);
|
||||||
|
foreach (var item in opers)
|
||||||
|
{
|
||||||
|
dataUnit.Add(item);
|
||||||
|
}
|
||||||
|
//数据体 DATA
|
||||||
|
List<string> datas = null;
|
||||||
|
switch (cmdType)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
datas = Date_MeterTiming();
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
datas = Time_MeterTiming();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (datas == null)
|
||||||
|
throw new Exception($"透明转发 表计校时/广播校时生成的数据内容为空");
|
||||||
|
datas.Reverse();
|
||||||
|
dataUnit.AddRange(datas);
|
||||||
|
|
||||||
|
var dataList = Build645SendCommand(ammeterAddress, "14", dataUnit);
|
||||||
|
return dataList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 设置尖峰平谷时段 F10-103
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ammeterAddress"></param>
|
||||||
|
/// <param name="password"></param>
|
||||||
|
/// <param name="dataMark"></param>
|
||||||
|
/// <param name="data"></param>
|
||||||
|
/// <param name="s_operator"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
/// <exception cref="ArgumentNullException"></exception>
|
||||||
|
public static List<string> BuildAmmeterTimeSetSendDataUnit(string ammeterAddress,string password, string dataMark,string data, string s_operator= "00000001")
|
||||||
|
{
|
||||||
|
List<string> dataUnit = BuildAmmeterTimeSetDataUnit(password, dataMark, data);
|
||||||
|
|
||||||
|
var dataList = Build645SendCommand(ammeterAddress, "14", dataUnit);
|
||||||
|
return dataList;
|
||||||
|
}
|
||||||
|
//工具生成指令 F10 103
|
||||||
|
//internal override List<string> GenerateContent(SetJFPGToolCmdIssueEntity transpond)
|
||||||
|
//{
|
||||||
|
// //TODO:替换表计地址
|
||||||
|
// var meterAddress = string.Join("", transpond.MeterAddress.Split(2, true)).PadRight(12, '0').Split(2, false);
|
||||||
|
// var cmdArr = transpond.Cmd.Replace(" ", "").Split(2, false);
|
||||||
|
// cmdArr.RemoveRange(1, 6);
|
||||||
|
// cmdArr.InsertRange(1, meterAddress);
|
||||||
|
// //TODO:替换校验码
|
||||||
|
// var csSum = GetCheckSumsHexString(string.Join("", cmdArr.Take(cmdArr.Count - 2)).StringToHexByte());
|
||||||
|
// cmdArr.RemoveRange(cmdArr.Count - 2, 2);
|
||||||
|
// cmdArr.Add(csSum);
|
||||||
|
|
||||||
|
// cmdArr.Add("16");
|
||||||
|
|
||||||
|
// return cmdArr;
|
||||||
|
//}
|
||||||
|
|
||||||
|
public static List<string> BuildAmmeterGenerateBCCommand()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 构建电表读取下发数据单元
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ammeterAddress">电表地址</param>
|
||||||
|
/// <param name="cmdType">功率读取 余额读取</param>
|
||||||
|
/// <param name="dataId">数据标识</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static List<string> BuildAmmeterReadDataUnit(string ammeterAddress, CmdType cmdType, string dataId = "")
|
||||||
|
{
|
||||||
|
var dn = "";
|
||||||
|
if (string.IsNullOrWhiteSpace(dataId))
|
||||||
|
{
|
||||||
|
if (cmdType == CmdType.PowerRead) dn = "04090B01";
|
||||||
|
else if (cmdType == CmdType.BalanceRead) dn = "00900200";
|
||||||
|
else if (cmdType == CmdType.CurrentRead) dn = "04090801";
|
||||||
|
else if (cmdType == CmdType.WsPowerDown) dn = "0E300103";
|
||||||
|
else if (cmdType == CmdType.ReadMeterStatus) dn = "04000503";
|
||||||
|
else if (cmdType == CmdType.TimeSet) dn = "04010001";//主用第一套时段数据
|
||||||
|
else if (cmdType == CmdType.ReadTimeSetMonth) dn = "04010000";//主用时区数据
|
||||||
|
else if (cmdType == CmdType.ReadTimeSetNum) dn = "04000202";//日时段数
|
||||||
|
}
|
||||||
|
else
|
||||||
|
dn = dataId;
|
||||||
|
|
||||||
|
var dataUnit = dn.StringToPairs(true);
|
||||||
|
|
||||||
|
var dataList = Build645SendCommand(ammeterAddress, "11", dataUnit);
|
||||||
|
return dataList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 构建电表修正时间下发命令-PMAC9523
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ammeterAddress"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static List<string> BuildPMAC9523AmmeterCorrectionTimeSendDataUnit(string ammeterAddress)
|
||||||
|
{
|
||||||
|
var now = DateTime.Now;
|
||||||
|
var year = (now.Year - 2000).ToString("X2").PadLeft(4, '0');
|
||||||
|
var month = now.Month.ToString("X2").PadLeft(4, '0');
|
||||||
|
var day = now.Day.ToString("X2").PadLeft(4, '0');
|
||||||
|
var hour = now.Hour.ToString("X2").PadLeft(4, '0');
|
||||||
|
var minute = now.Minute.ToString("X2").PadLeft(4, '0');
|
||||||
|
var second = now.Second.ToString("X2").PadLeft(4, '0');
|
||||||
|
var adress = int.Parse(ammeterAddress.Substring(ammeterAddress.Length - 3)).DecToHex().PadLeft(2, '0');
|
||||||
|
var fm = new List<string>() { adress, "10", "23", "35", "00", "06", "0C" };
|
||||||
|
fm.AddRange($"{second}{minute}{hour}{day}{month}{year}".StringToPairs());
|
||||||
|
|
||||||
|
var bts = fm.Select(s => s.HexToDec()).Select(s => byte.Parse(s.ToString())).ToArray();
|
||||||
|
var getCrc = HexStringExtensions.GetCRC16(bts, true).Select(s => int.Parse(s.ToString()).DecToHex().PadLeft(2, '0'));//long.Parse ?
|
||||||
|
fm.AddRange(getCrc);
|
||||||
|
|
||||||
|
return fm;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 构建电表修正时间下发命令-DTSU193
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ammeterAddress"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static List<string> BuildDTSU193AmmeterCorrectionTimeSendDataUnit(string ammeterAddress)
|
||||||
|
{
|
||||||
|
var now = DateTime.Now;
|
||||||
|
var year = now.Year.ToString().Substring(2);
|
||||||
|
var month = now.Month.ToString().PadLeft(2, '0');
|
||||||
|
var day = now.Day.ToString().PadLeft(2, '0');
|
||||||
|
var week = ((int)now.DayOfWeek).ToString().PadLeft(2, '0');
|
||||||
|
var hour = now.Hour.ToString().PadLeft(2, '0');
|
||||||
|
var minute = now.Minute.ToString().PadLeft(2, '0');
|
||||||
|
var second = now.Second.ToString().PadLeft(2, '0');
|
||||||
|
var fm = GenerateCTCommand(ammeterAddress, $"{year}{month}{day}{week}{hour}{minute}{second}");
|
||||||
|
return fm;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 构建电表修正时间下发命令
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ammeterAddress"></param>
|
||||||
|
/// <param name="password"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static List<List<string>> BuildAmmeterCorrectionTimeSendDataUnit(string ammeterAddress,string password)
|
||||||
|
{
|
||||||
|
var listDataUnit = new List<List<string>>();
|
||||||
|
|
||||||
|
var now = DateTime.Now;
|
||||||
|
var year = now.Year.ToString().PadLeft(4, '0');
|
||||||
|
var month = now.Month.ToString().PadLeft(2, '0');
|
||||||
|
var day = now.Day.ToString().PadLeft(2, '0');
|
||||||
|
var week = ((int)now.DayOfWeek).ToString().PadLeft(2, '0');
|
||||||
|
var hour = now.Hour.ToString().PadLeft(2, '0');
|
||||||
|
var minute = now.Minute.ToString().PadLeft(2, '0');
|
||||||
|
var second = now.Second.ToString().PadLeft(2, '0');
|
||||||
|
|
||||||
|
//组装数据域
|
||||||
|
List<string> dataList = new List<string>();
|
||||||
|
var dataMarkList = "04000101".StringToPairs(true);
|
||||||
|
dataList.AddRange(dataMarkList);
|
||||||
|
dataList.Add("02");
|
||||||
|
if (string.IsNullOrEmpty(password))
|
||||||
|
password = "000000";
|
||||||
|
var passwordList = password.StringToPairs(true);
|
||||||
|
dataList.AddRange(passwordList);
|
||||||
|
dataList.AddRange("00000000".StringToPairs(true));
|
||||||
|
dataList.AddRange($"{year}{month}{day}{week}".StringToPairs(true));
|
||||||
|
|
||||||
|
var fm = Build645SendCommand(ammeterAddress, "14", dataList);
|
||||||
|
listDataUnit.Add(fm);
|
||||||
|
|
||||||
|
dataList = new List<string>();
|
||||||
|
dataMarkList = "04000102".StringToPairs(true);
|
||||||
|
dataList.AddRange(dataMarkList);
|
||||||
|
dataList.Add("02");
|
||||||
|
dataList.AddRange(passwordList);
|
||||||
|
dataList.AddRange("00000000".StringToPairs(true));
|
||||||
|
dataList.AddRange($"{hour}{minute}{second}".StringToPairs(true));
|
||||||
|
var fm2 = Build645SendCommand(ammeterAddress, "14", dataList);
|
||||||
|
listDataUnit.Add(fm2);
|
||||||
|
|
||||||
|
return listDataUnit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ammeterAddress"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static List<string> BuildPMAC9523ReadMeterTimeSetSendDataUnit(string ammeterAddress)
|
||||||
|
{
|
||||||
|
//LogHelper.LogStr("ReadMeterTimeSet", $"表编号[{meterInfo.meter_address}]进入PMAC9523时段设置");
|
||||||
|
var adress = int.Parse(ammeterAddress.Substring(ammeterAddress.Length - 3)).DecToHex().PadLeft(2, '0');
|
||||||
|
var fm = new List<string>() { adress, "03", "55", "F9", "00", "28" };
|
||||||
|
var bts = fm.Select(s => s.HexToDec()).Select(s => byte.Parse(s.ToString())).ToArray();
|
||||||
|
var getCrc = HexStringExtensions.GetCRC16(bts, true)
|
||||||
|
.Select(s => int.Parse(s.ToString()).DecToHex().PadLeft(2, '0'));
|
||||||
|
fm.AddRange(getCrc);
|
||||||
|
return fm;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 构建电表表号读取下发命令
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ammeterAddress">电表地址</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static List<string> BuildAmmeterReadNumSendCmd(string ammeterAddress)
|
||||||
|
{
|
||||||
|
var dataUnit = "04000402".StringToPairs(true);
|
||||||
|
return Build645SendCommand(ammeterAddress, "11", dataUnit);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<List<string>> BuildPMAC9523AmmeterSetTimeSetSendDataUnit(string ammeterAddress, List<TimeSetDetail> data)
|
||||||
|
{
|
||||||
|
List<List<string>> dataUnitList = new List<List<string>>();
|
||||||
|
var adress = int.Parse(ammeterAddress.Substring(ammeterAddress.Length - 3)).DecToHex().PadLeft(2, '0');
|
||||||
|
//第一步启用复费率编程:寄存器64503,写数据01启动编程
|
||||||
|
var fm = new List<string>() { adress, "10", "FB", "F6", "00", "01", "02", "00", "01" };
|
||||||
|
var bts = fm.Select(s => s.HexToDec()).Select(s => byte.Parse(s.ToString())).ToArray();
|
||||||
|
var getCrc = HexStringExtensions.GetCRC16(bts, true).Select(s => int.Parse(s.ToString()).DecToHex().PadLeft(2, '0'));
|
||||||
|
fm.AddRange(getCrc);
|
||||||
|
dataUnitList.Add(fm);
|
||||||
|
|
||||||
|
//第二步写复费率模式:寄存器22002,写数据01固定一套费率
|
||||||
|
var fm2 = new List<string>() { adress, "10", "55", "F1", "00", "01", "02", "00", "01" };
|
||||||
|
var bts2 = fm2.Select(s => s.HexToDec()).Select(s => byte.Parse(s.ToString())).ToArray();
|
||||||
|
var getCrc2 = HexStringExtensions.GetCRC16(bts2, true).Select(s => int.Parse(s.ToString()).DecToHex().PadLeft(2, '0'));
|
||||||
|
fm2.AddRange(getCrc2);
|
||||||
|
dataUnitList.Add(fm2);
|
||||||
|
|
||||||
|
//第三步写时段参数:寄存器22010开始,后续多少个寄存器根据时段内容来。
|
||||||
|
var timeSetDetailList = data.FirstOrDefault().Data;
|
||||||
|
var fm3 = new List<string>() { adress, "10", "55", "F9", "00" };
|
||||||
|
//寄存器个数
|
||||||
|
var timeNum = timeSetDetailList.Sum(o => o.Times.Count);
|
||||||
|
fm3.Add($"{timeNum * 2 + 1:X2}");
|
||||||
|
//数据长度
|
||||||
|
fm3.Add($"{(timeNum * 2 + 1) * 2:X2}");
|
||||||
|
|
||||||
|
//时段个数
|
||||||
|
fm3.Add("00");
|
||||||
|
fm3.Add($"{timeNum:X2}");
|
||||||
|
Dictionary<string, string> setDic = new Dictionary<string, string>();
|
||||||
|
int rate = 0;
|
||||||
|
foreach (var item in timeSetDetailList)
|
||||||
|
{
|
||||||
|
int.TryParse(item.Rate, out rate);
|
||||||
|
foreach (var itemItem in item.Times)
|
||||||
|
{
|
||||||
|
fm3.Add("00");
|
||||||
|
fm3.Add($"{rate - 1:X2}");
|
||||||
|
fm3.Add("00");
|
||||||
|
fm3.Add($"{itemItem.StartTime.TakeTimeToInt():X2}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var bts3 = fm3.Select(s => s.HexToDec()).Select(s => byte.Parse(s.ToString())).ToArray();
|
||||||
|
var getCrc3 = HexStringExtensions.GetCRC16(bts3, true).Select(s => int.Parse(s.ToString()).DecToHex().PadLeft(2, '0'));
|
||||||
|
fm3.AddRange(getCrc3);
|
||||||
|
dataUnitList.Add(fm3);
|
||||||
|
|
||||||
|
return dataUnitList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// F1:透明转发 读取通信地址 04 00 04 01 NNNNNNNNNNNN 6 通信地址
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ammeterAddress"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static List<string> BuildReadMeterAddressSendDataUnit(string ammeterAddress)
|
||||||
|
{
|
||||||
|
var dataMark = new List<string> { "04", "00", "04", "01" };
|
||||||
|
//content.AddRange(string.Join("", transpond.MeterAddress.Split(2, true)).PadRight(12, '0').Split(2, false));
|
||||||
|
dataMark.Reverse();
|
||||||
|
return Build645SendCommand(ammeterAddress, "11", dataMark);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 构建645协议下发命令
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ammeterAddress">电表地址</param>
|
||||||
|
/// <param name="controlCode">控制码</param>
|
||||||
|
/// <param name="dataUnit">数据域 发送方按字节进行加33处理,接收方按字节减33</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static List<string> Build645SendCommand(string ammeterAddress, string controlCode, List<string>? dataUnit)
|
||||||
|
{
|
||||||
|
var cmdStrList = new List<string>();
|
||||||
|
cmdStrList.Add(startStr);
|
||||||
|
|
||||||
|
ammeterAddress = ammeterAddress.PadLeft(12, '0');
|
||||||
|
var addressList = ammeterAddress.StringToPairs();
|
||||||
|
addressList.Reverse();
|
||||||
|
cmdStrList.AddRange(addressList);
|
||||||
|
|
||||||
|
cmdStrList.Add(startStr);
|
||||||
|
|
||||||
|
cmdStrList.Add(controlCode);
|
||||||
|
|
||||||
|
var len = dataUnit != null ? dataUnit.Count.DecToHex().PadLeft(2, '0') : "00";
|
||||||
|
cmdStrList.Add(len);
|
||||||
|
|
||||||
|
if (dataUnit != null)
|
||||||
|
{
|
||||||
|
cmdStrList.AddRange(dataUnit.AddHex33());
|
||||||
|
}
|
||||||
|
|
||||||
|
var strSum = cmdStrList.Select(i => Convert.ToInt32(i, 16)).Sum().ToString("X");
|
||||||
|
strSum = strSum.Substring(strSum.Length - 2);
|
||||||
|
cmdStrList.Add(strSum);
|
||||||
|
cmdStrList.Add(endStr);
|
||||||
|
|
||||||
|
return cmdStrList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 威胜表的超功率(第一路恶性负载超功率判断阀值)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ammeterAddress"></param>
|
||||||
|
/// <param name="password"></param>
|
||||||
|
/// <param name="dataMark"></param>
|
||||||
|
/// <param name="power"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static List<string>? AssembleWsSupperPower(string ammeterAddress, string password, string dataMark, decimal power)
|
||||||
|
{
|
||||||
|
power = Math.Round(power, 4);
|
||||||
|
if (power > (decimal)99.9999) return null;
|
||||||
|
var strPower = power < 10 ? $"0{power}" : power.ToString();
|
||||||
|
var pStr = strPower.Replace(".", "").PadRight(6, '0');
|
||||||
|
var data = new string[] { pStr[4] + "" + pStr[5], pStr[2] + "" + pStr[3], pStr[0] + "" + pStr[1] };
|
||||||
|
return AssembleWrite(ammeterAddress, password, dataMark, data);
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 威胜表的超功率(超功率开关)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ammeterAddress"></param>
|
||||||
|
/// <param name="password"></param>
|
||||||
|
/// <param name="isOn"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static List<string> AssembleWsOnSupperPower(string ammeterAddress, string password, bool isOn = true)
|
||||||
|
{
|
||||||
|
var data = new string[] { (isOn ? "01" : "00") };
|
||||||
|
return AssembleWrite(ammeterAddress, password, "0E400001", data);
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 威胜表的超功率(第一路恶性负载绝对功率判断阈值)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ammeterAddress"></param>
|
||||||
|
/// <param name="password"></param>
|
||||||
|
/// <param name="dataMark"></param>
|
||||||
|
/// <param name="power"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static List<string>? AssembleWsAbsolutePowerSetting(string ammeterAddress, string password, string dataMark, decimal power)
|
||||||
|
{
|
||||||
|
power = Math.Round(power, 4);
|
||||||
|
if (power > (decimal)99.9999) return null;
|
||||||
|
var strPower = power < 10 ? $"0{power}" : power.ToString();
|
||||||
|
var pStr = strPower.Replace(".", "").PadRight(6, '0');
|
||||||
|
var data = new string[] { pStr[4] + "" + pStr[5], pStr[2] + "" + pStr[3], pStr[0] + "" + pStr[1] };
|
||||||
|
return AssembleWrite(ammeterAddress, password, dataMark, data);
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 威胜表的超功率(第一路恶性负载功率因数判断阀值)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ammeterAddress"></param>
|
||||||
|
/// <param name="password"></param>
|
||||||
|
/// <param name="dataMark"></param>
|
||||||
|
/// <param name="factor"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static List<string>? AssembleWsPowerFactor(string ammeterAddress, string password, string dataMark, decimal factor)
|
||||||
|
{
|
||||||
|
factor = Math.Round(factor, 3);
|
||||||
|
if (factor >= (decimal)1.0 || factor <= 0) return null;
|
||||||
|
var strFactor = factor.ToString();
|
||||||
|
var pStr = strFactor.Replace(".", "").PadRight(4, '0');
|
||||||
|
var data = new string[] { pStr[2] + "" + pStr[3], pStr[0] + "" + pStr[1] };
|
||||||
|
return AssembleWrite(ammeterAddress, password, dataMark, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 构建写数据
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ammeterAddress"></param>
|
||||||
|
/// <param name="password"></param>
|
||||||
|
/// <param name="di0_3"></param>
|
||||||
|
/// <param name="data"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static List<string> AssembleWrite(string ammeterAddress, string password, string di0_3, string[] data)
|
||||||
|
{
|
||||||
|
var returnList = new List<string>();
|
||||||
|
returnList.Add(startStr);
|
||||||
|
|
||||||
|
var addressList = ammeterAddress.StringToPairs();
|
||||||
|
addressList.Reverse();
|
||||||
|
returnList.AddRange(addressList);
|
||||||
|
|
||||||
|
returnList.Add(startStr);
|
||||||
|
returnList.Add("14");
|
||||||
|
|
||||||
|
var len = (12 + data.Length).ToString("X2");
|
||||||
|
returnList.Add(len);
|
||||||
|
|
||||||
|
|
||||||
|
var di03List = di0_3.StringToPairs();
|
||||||
|
di03List.Reverse();
|
||||||
|
di03List.Add("02");
|
||||||
|
|
||||||
|
var pwdList = password.StringToPairs();
|
||||||
|
pwdList.Reverse();
|
||||||
|
di03List.AddRange(pwdList);
|
||||||
|
|
||||||
|
var mList = new List<string>() { "00", "11", "22", "33" };
|
||||||
|
di03List.AddRange(mList);
|
||||||
|
di03List.AddRange(data);
|
||||||
|
var listAdd33 = di03List.AddHex33();
|
||||||
|
|
||||||
|
returnList.AddRange(listAdd33);
|
||||||
|
|
||||||
|
var strSum = returnList.Select(i => Convert.ToInt32(i, 16)).Sum().ToString("X");
|
||||||
|
var cs = strSum.Substring(strSum.Length - 2);
|
||||||
|
returnList.Add(cs);
|
||||||
|
returnList.Add(endStr);
|
||||||
|
|
||||||
|
return returnList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 生成软编程指令
|
||||||
|
/// <param name="modelCode">型号编码</param>
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static List<string> SoftProgram(string ammeterAddress, string modelCode, string password)
|
||||||
|
{
|
||||||
|
string bccmd = string.Empty;
|
||||||
|
if (modelCode == "DDS71")
|
||||||
|
{
|
||||||
|
|
||||||
|
bccmd = "68 AA AA AA AA AA AA 68 04 07 4E F4 35 BB BB BB 32";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bccmd = "68 AA AA AA AA AA AA 68 14 10 41 35 33 41 37 33 33 33 34 33 33 33 77 66 55 44";
|
||||||
|
}
|
||||||
|
|
||||||
|
//替换密码
|
||||||
|
var passwordList = password.StringToPairs();
|
||||||
|
passwordList.Reverse();
|
||||||
|
passwordList = passwordList.AddHex33();
|
||||||
|
var passwordStr = string.Join(" ", passwordList);
|
||||||
|
bccmd = bccmd.Replace("BB BB BB", passwordStr);
|
||||||
|
//替换表地址
|
||||||
|
var addressList = ammeterAddress.StringToPairs();
|
||||||
|
addressList.Reverse();
|
||||||
|
var addressStr = string.Join(" ", addressList);
|
||||||
|
bccmd = bccmd.Replace("AA AA AA AA AA AA", addressStr);
|
||||||
|
var fm = bccmd.Split(' ').ToList();
|
||||||
|
//生成CRC
|
||||||
|
var cRC = HexStringExtensions.GetCRC(fm);
|
||||||
|
fm.Add(cRC);
|
||||||
|
fm.Add("16");
|
||||||
|
|
||||||
|
return fm;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static List<string> GenerateCTCommand(string ammeterAddress, string data)
|
||||||
|
{
|
||||||
|
List<string> fm = new List<string>();
|
||||||
|
fm.Add(startStr);
|
||||||
|
List<string> addressList = ammeterAddress.StringToPairs();
|
||||||
|
addressList.Reverse();
|
||||||
|
fm.AddRange(addressList);
|
||||||
|
fm.Add(startStr);
|
||||||
|
fm.Add("14");
|
||||||
|
fm.Add("13");
|
||||||
|
fm.Add("3F");
|
||||||
|
fm.Add("34");
|
||||||
|
fm.Add("33");
|
||||||
|
fm.Add("37");
|
||||||
|
fm.Add("35");
|
||||||
|
fm.Add("33");
|
||||||
|
fm.Add("33");
|
||||||
|
fm.Add("33");
|
||||||
|
fm.Add("44");
|
||||||
|
fm.Add("44");
|
||||||
|
fm.Add("44");
|
||||||
|
fm.Add("44");
|
||||||
|
//组装数据域
|
||||||
|
var dataList = data.StringToPairs();
|
||||||
|
dataList.Reverse();
|
||||||
|
|
||||||
|
fm.AddRange(dataList.AddHex33());
|
||||||
|
|
||||||
|
var cRC = HexStringExtensions.GetCRC(fm);
|
||||||
|
fm.Add(cRC);
|
||||||
|
fm.Add(endStr);
|
||||||
|
return fm;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<string> Time_MeterTiming()
|
||||||
|
{
|
||||||
|
return new List<string>
|
||||||
|
{
|
||||||
|
DateTime.Now.Hour.ToString().PadLeft(2, '0'),
|
||||||
|
DateTime.Now.Minute.ToString().PadLeft(2, '0'),
|
||||||
|
(DateTime.Now.Second + 2).ToString().PadLeft(2, '0')
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<string> Date_MeterTiming()
|
||||||
|
{
|
||||||
|
var week = (int)DateTime.Now.DayOfWeek;
|
||||||
|
var year = DateTime.Now.Year;
|
||||||
|
var month = DateTime.Now.Month;
|
||||||
|
var day = DateTime.Now.Day;
|
||||||
|
|
||||||
|
return new List<string>
|
||||||
|
{
|
||||||
|
year.ToString().Substring(2,2).PadLeft(2,'0'),
|
||||||
|
month.ToString().PadLeft(2,'0'),
|
||||||
|
day.ToString().PadLeft(2,'0'),
|
||||||
|
week.ToString().PadLeft(2,'0'),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 构建电表时段设置数据单元
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ammeterAddress"></param>
|
||||||
|
/// <param name="password"></param>
|
||||||
|
/// <param name="dataMark"></param>
|
||||||
|
/// <param name="data"></param>
|
||||||
|
/// <param name="s_operator"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
/// <exception cref="ArgumentNullException"></exception>
|
||||||
|
private static List<string> BuildAmmeterTimeSetDataUnit(string password, string dataMark, string data, string s_operator = "00000001")
|
||||||
|
{
|
||||||
|
List<string> dataUnit = new List<string>();
|
||||||
|
if (string.IsNullOrWhiteSpace(password))
|
||||||
|
password = "000000";
|
||||||
|
if (password?.Length != 6)
|
||||||
|
password = password.PadLeft(6, '0');
|
||||||
|
if (string.IsNullOrWhiteSpace(s_operator) || s_operator?.Length != 8)
|
||||||
|
throw new ArgumentNullException("电表操作人员格式不能为空或长度不等6位");
|
||||||
|
|
||||||
|
//数据标识 DIODI1DI2DI3+PAP0P1P2+C0C1C2C3+DATA
|
||||||
|
var dataMarks = dataMark.Split(' ').ToList();
|
||||||
|
dataMarks.Reverse();
|
||||||
|
dataUnit.AddRange(dataMarks);//数据标识
|
||||||
|
|
||||||
|
//密码权限 02明文 PAP0P1P2
|
||||||
|
var passs = password.StringToPairs(true);
|
||||||
|
dataUnit.Add("02");//--密码权限 02明文
|
||||||
|
foreach (var item in passs)
|
||||||
|
{
|
||||||
|
dataUnit.Add(item);
|
||||||
|
}
|
||||||
|
//操作人员 C0C1C2C3
|
||||||
|
var opers = s_operator.StringToPairs(true);
|
||||||
|
foreach (var item in opers)
|
||||||
|
{
|
||||||
|
dataUnit.Add(item);
|
||||||
|
}
|
||||||
|
//TODO:数据体 DATA
|
||||||
|
var datas = data.Split(' ').ToList();
|
||||||
|
datas.Reverse();
|
||||||
|
dataUnit.AddRange(datas);
|
||||||
|
return dataUnit;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@ -168,4 +168,17 @@ namespace JiShe.CollectBus.Common.Models
|
|||||||
public string StartTime { get; set; }
|
public string StartTime { get; set; }
|
||||||
public string EndTime { get; set; }
|
public string EndTime { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class PnFn
|
||||||
|
{
|
||||||
|
public int Pn { get; set; }
|
||||||
|
public int Fn { get; set; }
|
||||||
|
|
||||||
|
public PnFn(int pn, int fn)
|
||||||
|
{
|
||||||
|
Pn = pn;
|
||||||
|
Fn = fn;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
41
src/JiShe.CollectBus.Domain/Analyze3761Data.cs
Normal file
41
src/JiShe.CollectBus.Domain/Analyze3761Data.cs
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Volo.Abp.Domain.Entities;
|
||||||
|
|
||||||
|
namespace JiShe.CollectBus
|
||||||
|
{
|
||||||
|
public class Analyze3761Data:AggregateRoot<Guid>
|
||||||
|
{
|
||||||
|
public int MeterId { get; set; }
|
||||||
|
|
||||||
|
public int AFN { get; set; }
|
||||||
|
|
||||||
|
public int FN { get; set; }
|
||||||
|
|
||||||
|
public string Text { get; set; }
|
||||||
|
|
||||||
|
public List<Analyze3761DataUpChild> DataUpChilds { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Analyze3761DataUpChild
|
||||||
|
{
|
||||||
|
public Analyze3761DataUpChild(int id,string name,string value,int sort)
|
||||||
|
{
|
||||||
|
Id = id;
|
||||||
|
Name = name;
|
||||||
|
Value = value;
|
||||||
|
Sort = sort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int Id { get; set; }
|
||||||
|
|
||||||
|
public string Name { get; set; }
|
||||||
|
|
||||||
|
public string Value { get; set; }
|
||||||
|
|
||||||
|
public int Sort { get; set; }
|
||||||
|
|
||||||
|
public List<Analyze3761DataUpChild> DataUpChilds { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -13,6 +13,13 @@ using Volo.Abp.Domain.Repositories;
|
|||||||
using System;
|
using System;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
using MassTransit.Internals.GraphValidation;
|
using MassTransit.Internals.GraphValidation;
|
||||||
|
using JiShe.CollectBus.Devices;
|
||||||
|
using JiShe.CollectBus.Common.BuildSendDatas;
|
||||||
|
using JiShe.CollectBus.Protocol.Contracts.AnalysisData;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
using System.Diagnostics.Metrics;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using TouchSocket.Core;
|
||||||
|
|
||||||
namespace JiShe.CollectBus.Protocol.Contracts.Abstracts
|
namespace JiShe.CollectBus.Protocol.Contracts.Abstracts
|
||||||
{
|
{
|
||||||
@ -88,7 +95,7 @@ namespace JiShe.CollectBus.Protocol.Contracts.Abstracts
|
|||||||
Pn = 0,
|
Pn = 0,
|
||||||
Fn = 1
|
Fn = 1
|
||||||
};
|
};
|
||||||
var bytes = HexStringExtensions.BuildSendCommandBytes(reqParam);
|
var bytes = Build3761SendData.BuildSendCommandBytes(reqParam);
|
||||||
|
|
||||||
await _capBus.PublishAsync(ProtocolConst.SubscriberIssuedEventName, new IssuedEventMessage { ClientId = messageReceived.ClientId, DeviceNo = messageReceived.DeviceNo, Message = bytes, Type = IssuedEventType.Login, MessageId = messageReceived.MessageId });
|
await _capBus.PublishAsync(ProtocolConst.SubscriberIssuedEventName, new IssuedEventMessage { ClientId = messageReceived.ClientId, DeviceNo = messageReceived.DeviceNo, Message = bytes, Type = IssuedEventType.Login, MessageId = messageReceived.MessageId });
|
||||||
}
|
}
|
||||||
@ -127,7 +134,7 @@ namespace JiShe.CollectBus.Protocol.Contracts.Abstracts
|
|||||||
Pn = 0,
|
Pn = 0,
|
||||||
Fn = 1
|
Fn = 1
|
||||||
};
|
};
|
||||||
var bytes = HexStringExtensions.BuildSendCommandBytes(reqParam);
|
var bytes = Build3761SendData.BuildSendCommandBytes(reqParam);
|
||||||
await _capBus.PublishAsync(ProtocolConst.SubscriberIssuedEventName, new IssuedEventMessage { ClientId = messageReceived.ClientId, DeviceNo = messageReceived.DeviceNo, Message = bytes, Type = IssuedEventType.Heartbeat, MessageId = messageReceived.MessageId });
|
await _capBus.PublishAsync(ProtocolConst.SubscriberIssuedEventName, new IssuedEventMessage { ClientId = messageReceived.ClientId, DeviceNo = messageReceived.DeviceNo, Message = bytes, Type = IssuedEventType.Heartbeat, MessageId = messageReceived.MessageId });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -343,8 +350,8 @@ namespace JiShe.CollectBus.Protocol.Contracts.Abstracts
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="messageReceived"></param>
|
/// <param name="messageReceived"></param>
|
||||||
/// <param name="sendAction"></param>
|
/// <param name="sendAction"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>//F25ReadingAnalyze
|
||||||
public virtual F25ReadingAnalyze AnalyzeF25ReadingDataAsync(MessageReceivedHeartbeat messageReceived, Action<byte[]>? sendAction = null)
|
public virtual Analyze3761Data AnalyzeF25ReadingDataAsync(MessageReceivedHeartbeat messageReceived, Action<byte[]>? sendAction = null)
|
||||||
{
|
{
|
||||||
var hexDatas = GetHexDatas(messageReceived.MessageHexString);
|
var hexDatas = GetHexDatas(messageReceived.MessageHexString);
|
||||||
//A.15 分时日月年
|
//A.15 分时日月年
|
||||||
@ -425,35 +432,69 @@ namespace JiShe.CollectBus.Protocol.Contracts.Abstracts
|
|||||||
var crntApparentPowerOfCHexs = hexDatas.Skip((int)F25DataItemEnum.CrntApparentPowerOfC).Take(3).ToList();
|
var crntApparentPowerOfCHexs = hexDatas.Skip((int)F25DataItemEnum.CrntApparentPowerOfC).Take(3).ToList();
|
||||||
var crntApparentPowerOfC = AnalyzeDataAccordingToA09(crntApparentPowerOfCHexs[0], crntApparentPowerOfCHexs[1], crntApparentPowerOfCHexs[2]);
|
var crntApparentPowerOfC = AnalyzeDataAccordingToA09(crntApparentPowerOfCHexs[0], crntApparentPowerOfCHexs[1], crntApparentPowerOfCHexs[2]);
|
||||||
|
|
||||||
var f25ReadingAnalyze = new F25ReadingAnalyze()
|
return new Analyze3761Data()
|
||||||
{
|
{
|
||||||
ReadingTime = readingTime.ToLocalTime(),
|
AFN = 12,
|
||||||
CrntTotalActivePower = crntTotalActivePower,
|
FN = 25,
|
||||||
CrntActivePowerOfA = crntActivePowerOfA,
|
Text = "当前三相及总有/无功功率功率因数",
|
||||||
CrntActivePowerOfB = crntActivePowerOfB,
|
DataUpChilds = new List<Analyze3761DataUpChild>()
|
||||||
CrntActivePowerOfC = crntActivePowerOfC,
|
{
|
||||||
CrntTotalReactivePower = crntTotalReactivePower,
|
new Analyze3761DataUpChild(1,"终端抄表时间",readingTime.ToString(),1),
|
||||||
CrntReactivePowerOfA = crntReactivePowerOfA,
|
new Analyze3761DataUpChild(2,"当前总有功功率",crntTotalActivePower.ToString(),2),
|
||||||
CrntReactivePowerOfB = crntReactivePowerOfB,
|
new Analyze3761DataUpChild(3,"当前A相有功功率",crntActivePowerOfA.ToString(),3),
|
||||||
CrntReactivePowerOfC = crntReactivePowerOfC,
|
new Analyze3761DataUpChild(4,"当前B相有功功率",crntActivePowerOfB.ToString(),4),
|
||||||
CrntTotalPowerFactor = crntTotalPowerFactor,
|
new Analyze3761DataUpChild(5,"当前C相有功功率",crntActivePowerOfC.ToString(),5),
|
||||||
CrntPowerFactorOfA = crntPowerFactorOfA,
|
new Analyze3761DataUpChild(6,"当前总无功功率",crntTotalReactivePower.ToString(),6),
|
||||||
CrntPowerFactorOfB = crntPowerFactorOfB,
|
new Analyze3761DataUpChild(7,"当前A相无功功率",crntReactivePowerOfA.ToString(),7),
|
||||||
CrntPowerFactorOfC = crntPowerFactorOfC,
|
new Analyze3761DataUpChild(8,"当前B相无功功率",crntReactivePowerOfB.ToString(),8),
|
||||||
CrntVoltageOfA = crntVoltageOfA,
|
new Analyze3761DataUpChild(9,"当前C相无功功率",crntReactivePowerOfC.ToString(),9),
|
||||||
CrntVoltageOfB = crntVoltageOfB,
|
new Analyze3761DataUpChild(10,"当前总功率因数",crntTotalPowerFactor.ToString(),10),
|
||||||
CrntVoltageOfC = crntVoltageOfC,
|
new Analyze3761DataUpChild(11,"当前A相功率因数",crntPowerFactorOfA.ToString(),11),
|
||||||
CrntCurrentOfA = crntCurrentOfA,
|
new Analyze3761DataUpChild(12,"当前B相功率因数",crntPowerFactorOfB.ToString(),12),
|
||||||
CrntCurrentOfB = crntCurrentOfB,
|
new Analyze3761DataUpChild(13,"当前C相功率因数",crntPowerFactorOfC.ToString(),13),
|
||||||
CrntCurrentOfC = crntCurrentOfC,
|
new Analyze3761DataUpChild(14,"当前A相电压",crntVoltageOfA.ToString(),14),
|
||||||
CrntZeroSequenceCurrent = crntZeroSequenceCurrent,
|
new Analyze3761DataUpChild(15,"当前B相电压",crntVoltageOfB.ToString(),15),
|
||||||
CrntTotalApparentPower = crntTotalApparentPower,
|
new Analyze3761DataUpChild(16,"当前C相电压",crntVoltageOfC.ToString(),16),
|
||||||
CrntApparentPowerOfA = crntApparentPowerOfA,
|
new Analyze3761DataUpChild(17,"当前A相电流",crntCurrentOfA.ToString(),17),
|
||||||
CrntApparentPowerOfB = crntApparentPowerOfB,
|
new Analyze3761DataUpChild(18,"当前B相电流",crntCurrentOfB.ToString(),18),
|
||||||
CrntApparentPowerOfC = crntApparentPowerOfC
|
new Analyze3761DataUpChild(19,"当前C相电流",crntCurrentOfC.ToString(),19),
|
||||||
|
new Analyze3761DataUpChild(20,"当前零序电流",crntZeroSequenceCurrent.ToString(),20),
|
||||||
|
new Analyze3761DataUpChild(21,"当前总视在功率",crntTotalApparentPower.ToString(),21),
|
||||||
|
new Analyze3761DataUpChild(22,"当前A相视在功率",crntApparentPowerOfA.ToString(),22),
|
||||||
|
new Analyze3761DataUpChild(23,"当前B相视在功率",crntApparentPowerOfB.ToString(),23),
|
||||||
|
new Analyze3761DataUpChild(24,"当前C相视在功率",crntApparentPowerOfC.ToString(),24),
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return f25ReadingAnalyze;
|
//var f25ReadingAnalyze = new F25ReadingAnalyze()
|
||||||
|
//{
|
||||||
|
// ReadingTime = readingTime.ToLocalTime(),
|
||||||
|
// CrntTotalActivePower = crntTotalActivePower,
|
||||||
|
// CrntActivePowerOfA = crntActivePowerOfA,
|
||||||
|
// CrntActivePowerOfB = crntActivePowerOfB,
|
||||||
|
// CrntActivePowerOfC = crntActivePowerOfC,
|
||||||
|
// CrntTotalReactivePower = crntTotalReactivePower,
|
||||||
|
// CrntReactivePowerOfA = crntReactivePowerOfA,
|
||||||
|
// CrntReactivePowerOfB = crntReactivePowerOfB,
|
||||||
|
// CrntReactivePowerOfC = crntReactivePowerOfC,
|
||||||
|
// CrntTotalPowerFactor = crntTotalPowerFactor,
|
||||||
|
// CrntPowerFactorOfA = crntPowerFactorOfA,
|
||||||
|
// CrntPowerFactorOfB = crntPowerFactorOfB,
|
||||||
|
// CrntPowerFactorOfC = crntPowerFactorOfC,
|
||||||
|
// CrntVoltageOfA = crntVoltageOfA,
|
||||||
|
// CrntVoltageOfB = crntVoltageOfB,
|
||||||
|
// CrntVoltageOfC = crntVoltageOfC,
|
||||||
|
// CrntCurrentOfA = crntCurrentOfA,
|
||||||
|
// CrntCurrentOfB = crntCurrentOfB,
|
||||||
|
// CrntCurrentOfC = crntCurrentOfC,
|
||||||
|
// CrntZeroSequenceCurrent = crntZeroSequenceCurrent,
|
||||||
|
// CrntTotalApparentPower = crntTotalApparentPower,
|
||||||
|
// CrntApparentPowerOfA = crntApparentPowerOfA,
|
||||||
|
// CrntApparentPowerOfB = crntApparentPowerOfB,
|
||||||
|
// CrntApparentPowerOfC = crntApparentPowerOfC
|
||||||
|
//};
|
||||||
|
|
||||||
|
//return f25ReadingAnalyze;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -462,8 +503,8 @@ namespace JiShe.CollectBus.Protocol.Contracts.Abstracts
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="messageReceived"></param>
|
/// <param name="messageReceived"></param>
|
||||||
/// <param name="sendAction"></param>
|
/// <param name="sendAction"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>//TerminalVersionInfoAnalyze
|
||||||
public virtual TerminalVersionInfoAnalyze AnalyzeTerminalVersionInfoReadingDataAsync(MessageReceivedHeartbeat messageReceived, Action<byte[]>? sendAction = null)
|
public virtual Analyze3761Data AnalyzeTerminalVersionInfoReadingDataAsync(MessageReceivedHeartbeat messageReceived, Action<byte[]>? sendAction = null)
|
||||||
{
|
{
|
||||||
var hexDatas = GetHexDatas(messageReceived.MessageHexString);
|
var hexDatas = GetHexDatas(messageReceived.MessageHexString);
|
||||||
|
|
||||||
@ -473,22 +514,39 @@ namespace JiShe.CollectBus.Protocol.Contracts.Abstracts
|
|||||||
var softwareReleaseDateList = hexDatas.Skip((int)TerminalVersionInfoEnum.SoftwareReleaseDate).Take(3).ToList();
|
var softwareReleaseDateList = hexDatas.Skip((int)TerminalVersionInfoEnum.SoftwareReleaseDate).Take(3).ToList();
|
||||||
var softwareReleaseDate = $"20{AnalyzeDataAccordingToA20(softwareReleaseDateList[0], softwareReleaseDateList[1], softwareReleaseDateList[2])}";//软件发布日期
|
var softwareReleaseDate = $"20{AnalyzeDataAccordingToA20(softwareReleaseDateList[0], softwareReleaseDateList[1], softwareReleaseDateList[2])}";//软件发布日期
|
||||||
var capacityInformationCode = string.Join("", hexDatas.Skip((int)TerminalVersionInfoEnum.CapacityInformationCode).Take(11).Select(s => (char)s.HexToDec()));//容量信息码
|
var capacityInformationCode = string.Join("", hexDatas.Skip((int)TerminalVersionInfoEnum.CapacityInformationCode).Take(11).Select(s => (char)s.HexToDec()));//容量信息码
|
||||||
var protocolVersionNo = string.Join("", hexDatas.Skip((int)TerminalVersionInfoEnum.ProtocolVersionNo).Take(4).Select(s => (char)s.HexToDec()));//容量信息码
|
var protocolVersionNo = string.Join("", hexDatas.Skip((int)TerminalVersionInfoEnum.ProtocolVersionNo).Take(4).Select(s => (char)s.HexToDec()));//通信协议编号
|
||||||
var hardwareVersionNo = string.Join("", hexDatas.Skip((int)TerminalVersionInfoEnum.HardwareVersionNo).Take(4).Select(s => (char)s.HexToDec()));//硬件版本号
|
var hardwareVersionNo = string.Join("", hexDatas.Skip((int)TerminalVersionInfoEnum.HardwareVersionNo).Take(4).Select(s => (char)s.HexToDec()));//硬件版本号
|
||||||
var hardwareReleaseDateList = hexDatas.Skip((int)TerminalVersionInfoEnum.HardwareReleaseDate).Take(3).ToList();
|
var hardwareReleaseDateList = hexDatas.Skip((int)TerminalVersionInfoEnum.HardwareReleaseDate).Take(3).ToList();
|
||||||
var hardwareReleaseDate = $"20{AnalyzeDataAccordingToA20(hardwareReleaseDateList[0], hardwareReleaseDateList[1], hardwareReleaseDateList[2])}";//软件发布日期
|
var hardwareReleaseDate = $"20{AnalyzeDataAccordingToA20(hardwareReleaseDateList[0], hardwareReleaseDateList[1], hardwareReleaseDateList[2])}";//软件发布日期
|
||||||
|
|
||||||
return new TerminalVersionInfoAnalyze()
|
return new Analyze3761Data()
|
||||||
{
|
{
|
||||||
MakerNo = makerNo,
|
AFN = 09,
|
||||||
DeviceNo = deviceNo,
|
FN = 1,
|
||||||
SoftwareVersionNo = softwareVersionNo,
|
Text = "终端版本信息",
|
||||||
SoftwareReleaseDate = DateTime.Parse(softwareReleaseDate).ToLocalTime(),
|
DataUpChilds = new List<Analyze3761DataUpChild>()
|
||||||
CapacityInformationCode = capacityInformationCode,
|
{
|
||||||
ProtocolVersionNo = protocolVersionNo,
|
new Analyze3761DataUpChild(1,"厂商代码",makerNo.ToString(),1),
|
||||||
HardwareVersionNo = hardwareVersionNo,
|
new Analyze3761DataUpChild(2,"设备编号",deviceNo.ToString(),2),
|
||||||
HardwareReleaseDate = DateTime.Parse(hardwareReleaseDate).ToLocalTime()
|
new Analyze3761DataUpChild(3,"软件版本号",softwareVersionNo.ToString(),3),
|
||||||
|
new Analyze3761DataUpChild(4,"软件发布日期",softwareReleaseDate.ToString(),4),
|
||||||
|
new Analyze3761DataUpChild(5,"容量信息码",capacityInformationCode.ToString(),5),
|
||||||
|
new Analyze3761DataUpChild(6,"通信协议编号",protocolVersionNo.ToString(),6),
|
||||||
|
new Analyze3761DataUpChild(7,"硬件版本号",hardwareVersionNo.ToString(),7),
|
||||||
|
new Analyze3761DataUpChild(8,"软件发布日期",hardwareReleaseDate.ToString(),8),
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
//return new TerminalVersionInfoAnalyze()
|
||||||
|
//{
|
||||||
|
// MakerNo = makerNo,
|
||||||
|
// DeviceNo = deviceNo,
|
||||||
|
// SoftwareVersionNo = softwareVersionNo,
|
||||||
|
// SoftwareReleaseDate = DateTime.Parse(softwareReleaseDate).ToLocalTime(),
|
||||||
|
// CapacityInformationCode = capacityInformationCode,
|
||||||
|
// ProtocolVersionNo = protocolVersionNo,
|
||||||
|
// HardwareVersionNo = hardwareVersionNo,
|
||||||
|
// HardwareReleaseDate = DateTime.Parse(hardwareReleaseDate).ToLocalTime()
|
||||||
|
//};
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -497,7 +555,7 @@ namespace JiShe.CollectBus.Protocol.Contracts.Abstracts
|
|||||||
/// <param name="messageReceived"></param>
|
/// <param name="messageReceived"></param>
|
||||||
/// <param name="sendAction"></param>
|
/// <param name="sendAction"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public virtual async Task AnalyzeATypeOfDataItems49ReadingDataAsync(MessageReceivedHeartbeat messageReceived, Action<byte[]>? sendAction = null)
|
public virtual Analyze3761Data AnalyzeATypeOfDataItems49ReadingDataAsync(MessageReceivedHeartbeat messageReceived, Action<byte[]>? sendAction = null)
|
||||||
{
|
{
|
||||||
var hexDatas = GetHexDatas(messageReceived.MessageHexString);
|
var hexDatas = GetHexDatas(messageReceived.MessageHexString);
|
||||||
|
|
||||||
@ -518,6 +576,34 @@ namespace JiShe.CollectBus.Protocol.Contracts.Abstracts
|
|||||||
|
|
||||||
var icList = hexDatas.Skip((int)ATypeOfDataItems49.Ic).Take(2).ToList();
|
var icList = hexDatas.Skip((int)ATypeOfDataItems49.Ic).Take(2).ToList();
|
||||||
var ic = AnalyzeDataAccordingToA05(icList[0], icList[1]);
|
var ic = AnalyzeDataAccordingToA05(icList[0], icList[1]);
|
||||||
|
|
||||||
|
return new Analyze3761Data()
|
||||||
|
{
|
||||||
|
AFN = 12,
|
||||||
|
FN = 49,
|
||||||
|
Text = "相位角",
|
||||||
|
DataUpChilds = new List<Analyze3761DataUpChild>()
|
||||||
|
{
|
||||||
|
new Analyze3761DataUpChild(1,"UabUa相位角",uabUa.ToString(),1),
|
||||||
|
new Analyze3761DataUpChild(2,"Ub相位角",ub.ToString(),2),
|
||||||
|
new Analyze3761DataUpChild(3,"UcbUc相位角",ucbUc.ToString(),3),
|
||||||
|
new Analyze3761DataUpChild(4,"Ia相位角",ia.ToString(),4),
|
||||||
|
new Analyze3761DataUpChild(5,"Ib相位角",ib.ToString(),5),
|
||||||
|
new Analyze3761DataUpChild(6,"Ic相位角",ic.ToString(),6),
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 解析终端时间抄读
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="messageReceived"></param>
|
||||||
|
/// <param name="sendAction"></param>
|
||||||
|
|
||||||
|
public virtual void AnalyzeTerminalTimeReadingDataAsync(MessageReceivedHeartbeat messageReceived, Action<byte[]>? sendAction = null)
|
||||||
|
{
|
||||||
|
var hexDatas = GetHexDatas(messageReceived.MessageHexString);
|
||||||
|
var time = Appendix.Appendix_A1(hexDatas.Take(6).ToList());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -716,7 +802,6 @@ namespace JiShe.CollectBus.Protocol.Contracts.Abstracts
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 解析透明转发 应答
|
/// 解析透明转发 应答
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -986,13 +1071,61 @@ namespace JiShe.CollectBus.Protocol.Contracts.Abstracts
|
|||||||
var singleDigitNumber = bin2.Substring(0, 4).BinToDec();//个位
|
var singleDigitNumber = bin2.Substring(0, 4).BinToDec();//个位
|
||||||
var deciles = bin1.Substring(4).BinToDec();//十分位
|
var deciles = bin1.Substring(4).BinToDec();//十分位
|
||||||
|
|
||||||
|
|
||||||
var value = decimal.Parse($"{hundredDigitNumbers}{tenDigitNumber}{singleDigitNumber}.{deciles}{percentileAndThousandthPercentile}");
|
var value = decimal.Parse($"{hundredDigitNumbers}{tenDigitNumber}{singleDigitNumber}.{deciles}{percentileAndThousandthPercentile}");
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region 645
|
||||||
|
/// <summary>
|
||||||
|
/// 解析读取表地址
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="dataList"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public List<string> AnalyzeAmmeterReadMeterAddress_10_105(List<string> dataList)
|
||||||
|
{
|
||||||
|
var values = new List<string>();
|
||||||
|
//表地址
|
||||||
|
var addressList = dataList.GetRange(1, 6);
|
||||||
|
addressList.Reverse();
|
||||||
|
var address = string.Join("", addressList);
|
||||||
|
values.Add(address);
|
||||||
|
//控制码
|
||||||
|
var controlCode = dataList.GetRange(8, 1)[0];
|
||||||
|
values.Add(controlCode);
|
||||||
|
//长度
|
||||||
|
var len = dataList.GetRange(9, 1)[0].HexToDec();
|
||||||
|
//values.Add(len.ToString());
|
||||||
|
//数据域
|
||||||
|
var dataField = dataList.GetRange(10, len);
|
||||||
|
if (dataField.Count > 0)
|
||||||
|
{
|
||||||
|
string dataMark = string.Join("", dataField.GetRange(0, 4).AddHex33());
|
||||||
|
values.Add(dataMark);//数据标识
|
||||||
|
var readValue = dataField.GetRange(4, len - 4).ReduceHex33();//值
|
||||||
|
readValue.Reverse();
|
||||||
|
//var valueData = GetValue<List<string>>(readValue, (AppendixEnums)Enum.Parse(typeof(AppendixEnums), dataMark));
|
||||||
|
values.AddRange(readValue);
|
||||||
|
}
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void AnalyzeAmmeterReadMeterAddress_10_103(List<string> dataList)
|
||||||
|
{
|
||||||
|
var data = AnalyzeAmmeterReadMeterAddress_10_105(dataList);
|
||||||
|
var validData = data[2].Equals("94") ? true : false;
|
||||||
|
var remark = validData ? "成功" : "失败";
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AnalyzeAutoUpSwtichRead_0A_68(List<string> dataList)
|
||||||
|
{
|
||||||
|
var isOpen = dataList[4].Equals("55");
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
#region 188
|
#region 188
|
||||||
|
|
||||||
public void AnalyzeWaterMeter188Data(List<string> dataList)
|
public void AnalyzeWaterMeter188Data(List<string> dataList)
|
||||||
|
|||||||
@ -0,0 +1,33 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using JiShe.CollectBus.Common.Extensions;
|
||||||
|
|
||||||
|
namespace JiShe.CollectBus.Protocol.Contracts.AnalysisData
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 附录
|
||||||
|
/// </summary>
|
||||||
|
public static class Appendix
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 附录1 A1格式
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static string Appendix_A1(List<string> data)
|
||||||
|
{
|
||||||
|
var seconds = data[0];
|
||||||
|
var minutes = data[1];
|
||||||
|
var hours = data[2];
|
||||||
|
var day = data[3];
|
||||||
|
var binString = data[4].HexToBin();
|
||||||
|
var months = binString.Substring(3, 1).BinToDec() * 10 + Convert.ToInt32(binString.Substring(4, 4).BinToHex());
|
||||||
|
var week = binString.Substring(0, 3).BinToHex();
|
||||||
|
var year = $"{DateTime.Now.ToString("yyyy").Substring(0, 2)}{data[5]}";
|
||||||
|
return $"{year}-{months.ToString().PadLeft(2, '0')}-{day} {hours}:{minutes}:{seconds}_{week}";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user