From 3b75448b040472855f0e8398d305cc11e64ac73e Mon Sep 17 00:00:00 2001 From: tq <1916474859@qq,com> Date: Tue, 23 Jul 2024 15:14:33 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AB=99=E5=A4=96=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Common/Const/ChargerModeConst.cs | 8 + Service/Charger/ChargerService.cs | 8 +- Service/Charger/Client/ChargerClient.cs | 111 ++------ .../OutCharger/PileAdjustPowerHandler.cs | 22 -- .../OutCharger/PileChargeCompleteHandler.cs | 47 ---- .../PileStartChargeCompleteHandler.cs | 40 --- .../OutCharger/PileStartChargeResHandler.cs | 64 ----- .../OutCharger/PileStopChargeResHandler.cs | 45 ---- .../PileUploadChargeRecordHandler.cs | 254 ------------------ .../PileUploadRemoteSignalHandler.cs | 36 --- .../OutCharger/PileUploadTelemetryHandler.cs | 30 --- .../Msg/Charger/Resp/AdjustChargeRateRes.cs | 2 +- .../Msg/Host/Req/OutSideAllowChargingSoc.cs | 21 +- Service/Charger/MyTask/AutoChargeTask.cs | 2 +- .../Charger/MyTask/PileChargeRealtimeTask.cs | 54 ++-- Service/Charger/MyTask/PileRealtimeTask.cs | 32 +-- WebStarter/Controllers/ChargeController.cs | 3 +- .../Controllers/OutChargerController.cs | 72 ++--- WinFormStarter/Form2.cs | 2 +- 19 files changed, 121 insertions(+), 732 deletions(-) create mode 100644 Common/Const/ChargerModeConst.cs delete mode 100644 Service/Charger/Handler/OutCharger/PileAdjustPowerHandler.cs delete mode 100644 Service/Charger/Handler/OutCharger/PileChargeCompleteHandler.cs delete mode 100644 Service/Charger/Handler/OutCharger/PileStartChargeCompleteHandler.cs delete mode 100644 Service/Charger/Handler/OutCharger/PileStartChargeResHandler.cs delete mode 100644 Service/Charger/Handler/OutCharger/PileStopChargeResHandler.cs delete mode 100644 Service/Charger/Handler/OutCharger/PileUploadChargeRecordHandler.cs delete mode 100644 Service/Charger/Handler/OutCharger/PileUploadRemoteSignalHandler.cs delete mode 100644 Service/Charger/Handler/OutCharger/PileUploadTelemetryHandler.cs diff --git a/Common/Const/ChargerModeConst.cs b/Common/Const/ChargerModeConst.cs new file mode 100644 index 0000000..add9d86 --- /dev/null +++ b/Common/Const/ChargerModeConst.cs @@ -0,0 +1,8 @@ +namespace Common.Const; + +public enum ChargerModeConst +{ + InVain, + OnSite, + OutsideTheStation +} \ No newline at end of file diff --git a/Service/Charger/ChargerService.cs b/Service/Charger/ChargerService.cs index 256f4f6..a27287f 100644 --- a/Service/Charger/ChargerService.cs +++ b/Service/Charger/ChargerService.cs @@ -1,4 +1,5 @@ using System.Collections.Concurrent; +using Common.Const; using Entity.DbModel.Station; using Entity.Dto.Resp; using HybirdFrameworkCore.Autofac.Attribute; @@ -25,9 +26,10 @@ public class ChargerService /// /// 启动充电 /// + /// /// /// - public Result StartChargeByBinNo(string binNo) + public Result StartChargeByBinNo(byte mode,string binNo) { BinInfo? binInfo = BinInfoRepository.QueryByBinNo(binNo); if (binInfo == null) @@ -45,12 +47,12 @@ public class ChargerService { return Result.Fail(@"充电机未连接"); } - + byte chargeSoc = StaticStationInfo.ChargeSoc; float? chargePower = EquipInfoRepository.QueryPowerByCode(binInfo.ChargerNo); float? power = chargePower == null ? StaticStationInfo.ChargePower : chargePower; - return chargerClient.StartCharge(chargeSoc,(float)power, 1); + return chargerClient.StartCharge(mode,chargeSoc,(float)power, 1); } /// diff --git a/Service/Charger/Client/ChargerClient.cs b/Service/Charger/Client/ChargerClient.cs index 58fd2d2..f6fe2dd 100644 --- a/Service/Charger/Client/ChargerClient.cs +++ b/Service/Charger/Client/ChargerClient.cs @@ -1,6 +1,7 @@ using System.Collections.Concurrent; using System.Reflection; using Autofac; +using Common.Const; using Entity.DbModel.Station; using HybirdFrameworkCore.Autofac; using HybirdFrameworkCore.Autofac.Attribute; @@ -41,6 +42,10 @@ public class ChargerClient : TcpClient public ushort AuthTimes { get; set; } = 0; public bool IsAuthed { get; set; } = false; + /// + /// 充电模式 00无效 01站内 02站外 + /// + public byte ChargerMode{ get; set; } = 1; /// /// 参考 Service.Charger.Common.ChargingStatus @@ -51,26 +56,8 @@ public class ChargerClient : TcpClient /// 是否已经开始充电 /// public bool IsCharged { get; set; } = false; - - - /// - /// 站外两枪时是否在充电 - /// - public ConcurrentDictionary GunCharged = new ConcurrentDictionary - { - [1] = false, - [2] = false - }; - - /// - /// 充电桩连接状态 - /// - public ConcurrentDictionary ChargedPile = new ConcurrentDictionary - { - [1] = false, - [2] = false - }; - + + public bool IsStopped { get; set; } = false; public bool IsCanSendStopCmd { get; set; } = true; @@ -157,11 +144,7 @@ public class ChargerClient : TcpClient /// 充放电机上传单体动力蓄电池电压极值统计 /// public VoltageExtremumStatistics? VoltageExtremumStatistics = new VoltageExtremumStatistics(); - - /// - /// 充电桩的遥测 - /// - public ConcurrentDictionary PileUploadTelemetry = new(); + /// /// 充电桩的遥信 @@ -171,12 +154,8 @@ public class ChargerClient : TcpClient /// /// 充电桩状态信息 /// - public ConcurrentDictionary ChargerPile = new(); - - /// - /// 充电桩功率 - /// - public ConcurrentDictionary ChargePilePower = new(); + public ChargerPile ChargerPile { get; set; } + /// ///充电机实时充电功率 @@ -321,11 +300,12 @@ public class ChargerClient : TcpClient /// /// 监控平台发送远程开始充电指令 /// + /// 充电模式 /// SOC限制.百分比 /// 功率调节指令类型.默认1 绝对功率值 /// 1kw/位,默认3600 /// 充电流水号 - public Result SendRemoteStartCharging(byte socLimit, float changePower = 360, byte changePowerCmdType = 1, + public Result SendRemoteStartCharging(byte mode,byte socLimit, float changePower = 360, byte changePowerCmdType = 1, string? chargeOrderNo = null) { if (!Connected) @@ -333,6 +313,13 @@ public class ChargerClient : TcpClient return Result.Fail($"充电机{BinNo}未连接"); } + if (ChargerMode != mode) + { + SendChangeChargeMode(mode); + ChargerMode = mode; + Thread.Sleep(3000); + } + if (string.IsNullOrWhiteSpace(chargeOrderNo)) { chargeOrderNo = ChargerUtils.GenChargeOrderSn(); @@ -538,61 +525,7 @@ public class ChargerClient : TcpClient this.Channel.WriteAndFlushAsync(req); return Result.Success(); } - - /// - /// 3.7.1 监控平台远程启动充电桩充电 - /// - /// 充电枪ID号 - /// SOC 限制 - /// 功率调节指令类型 - /// 功率调节参数 - /// - /// 充电流水号 - public Result SendStartOutCharger(byte pn, byte socValue, short changePower = 360, - byte changePowerCmdType = 1, - string? chargeOrderNo = null) - { - if (!Connected) - { - return Result.Fail($"充电机{BinNo}未连接"); - } - - if (string.IsNullOrWhiteSpace(chargeOrderNo)) - { - chargeOrderNo = ChargerUtils.GenChargeOrderSn(); - } - - Log().Info( - $"SendStartOutCharger pn={pn}, socValue={socValue}, changePower={changePower}, changePowerCmdType={changePowerCmdType}, chargeOrderNo={chargeOrderNo}"); - - PileStartCharge pileStartCharge = - new PileStartCharge(pn, socValue, changePowerCmdType, changePower, chargeOrderNo); - - this.Channel.WriteAndFlushAsync(pileStartCharge); - - return Result.Success(chargeOrderNo); - } - - /// - /// 3.7.3 监控平台远程停止充电桩充电 - /// - /// - /// - /// - public Result SendStopOutCharger(byte pn, byte stopReason) - { - if (!Connected) - { - return Result.Fail($"充电机{BinNo}未连接"); - } - - Log().Info( - $"SendStartOutCharger pn={pn}, stopReason={stopReason}"); - PileStopCharge pileStopCharge = new PileStopCharge(pn, stopReason); - this.Channel.WriteAndFlushAsync(pileStopCharge); - - return Result.Success(); - } + /// /// 3.7.9 监控平台发送充电桩功率调节指令 @@ -637,7 +570,7 @@ public class ChargerClient : TcpClient /// /// /// - public Result StartCharge(byte chargeSoc, float chargePower, int startType) + public Result StartCharge(byte mode,byte chargeSoc, float chargePower, int startType) { if (string.IsNullOrWhiteSpace(BinNo)) { @@ -681,7 +614,7 @@ public class ChargerClient : TcpClient redisHelper.SetKeyValueStr($"chargeNo{BinNo}Start", DateTime.Now.ToString("f"), TimeSpan.FromMinutes(1)); - Result chargeOrderNo = SendRemoteStartCharging(chargeSoc, chargePower); + Result chargeOrderNo = SendRemoteStartCharging(mode,chargeSoc, chargePower); if (!chargeOrderNo.IsSuccess) { return Result.Fail(chargeOrderNo.Msg); diff --git a/Service/Charger/Handler/OutCharger/PileAdjustPowerHandler.cs b/Service/Charger/Handler/OutCharger/PileAdjustPowerHandler.cs deleted file mode 100644 index ca2a1c7..0000000 --- a/Service/Charger/Handler/OutCharger/PileAdjustPowerHandler.cs +++ /dev/null @@ -1,22 +0,0 @@ -using DotNetty.Transport.Channels; -using log4net; -using Service.Charger.Client; -using Service.Charger.Msg.Charger.OutCharger.Resp; - -namespace Service.Charger.Handler.OutCharger; -/// -/// 3.7.10 充电桩应答功率调节指令 -/// -public class PileAdjustPowerHandler : SimpleChannelInboundHandler, IBaseHandler -{ - private static readonly ILog Log = LogManager.GetLogger(typeof(PileAdjustPowerHandler)); - - - protected override void ChannelRead0(IChannelHandlerContext ctx, PileAdjustPowerRes msg) - { - if (ClientMgr.TryGetClient(ctx.Channel, out var sn, out var client)) - { - Log.Info($"receive {msg} from {sn}"); - } - } -} \ No newline at end of file diff --git a/Service/Charger/Handler/OutCharger/PileChargeCompleteHandler.cs b/Service/Charger/Handler/OutCharger/PileChargeCompleteHandler.cs deleted file mode 100644 index 5e72ddf..0000000 --- a/Service/Charger/Handler/OutCharger/PileChargeCompleteHandler.cs +++ /dev/null @@ -1,47 +0,0 @@ -using DotNetty.Transport.Channels; -using Entity.DbModel.Station; -using HybirdFrameworkCore.Autofac.Attribute; -using log4net; -using Repository.Station; -using Service.Charger.Client; -using Service.Charger.Msg.Charger.OutCharger.Req; -using Service.Charger.Msg.Host.Resp.OutCharger; - -namespace Service.Charger.Handler.OutCharger; - -/// -/// 3.7.7 充电桩上送停止完成帧 -/// -[Order(8)] -[Scope("InstancePerDependency")] -public class PileChargeCompleteHandler : SimpleChannelInboundHandler, IBaseHandler -{ - private static readonly ILog Log = LogManager.GetLogger(typeof(PileChargeCompleteHandler)); - - public ChargeOrderRepository ChargeOrderRepository { get; set; } - - protected override void ChannelRead0(IChannelHandlerContext ctx, PileChargeCompleteReq msg) - { - if (ClientMgr.TryGetClient(ctx.Channel, out var sn, out var client)) - { - Log.Info($"receive {msg} from {sn}"); - if (msg.Result == 0) - { - ChargeOrder? chargeOrder = ChargeOrderRepository.GetLatestChargeGunOrder(msg.Pn.ToString(), sn); - if (chargeOrder == null) - { - return; - } - - chargeOrder.StopReason = 0; - - client.GunCharged[msg.Pn] = false; - - ChargeOrderRepository.Update(chargeOrder); - } - - PileChargeCompleteRes res = new PileChargeCompleteRes(msg.Pn,0); - ctx.Channel.WriteAndFlushAsync(res); - } - } -} \ No newline at end of file diff --git a/Service/Charger/Handler/OutCharger/PileStartChargeCompleteHandler.cs b/Service/Charger/Handler/OutCharger/PileStartChargeCompleteHandler.cs deleted file mode 100644 index d18107e..0000000 --- a/Service/Charger/Handler/OutCharger/PileStartChargeCompleteHandler.cs +++ /dev/null @@ -1,40 +0,0 @@ -using DotNetty.Transport.Channels; -using HybirdFrameworkCore.Autofac.Attribute; -using log4net; -using Service.Charger.Client; -using Service.Charger.Msg.Charger.OutCharger.Req; -using Service.Charger.Msg.Host.Resp.OutCharger; - -namespace Service.Charger.Handler.OutCharger; -/// -/// 3.7.5 充电桩上送充电启动完成帧 -/// -[Order(8)] -[Scope("InstancePerDependency")] -public class PileStartChargeCompleteHandler : SimpleChannelInboundHandler, IBaseHandler -{ - private static readonly ILog Log = LogManager.GetLogger(typeof(PileStartChargeCompleteHandler)); - - protected override void ChannelRead0(IChannelHandlerContext ctx, PileStartChargeCompleteReq msg) - { - if (ClientMgr.TryGetClient(ctx.Channel, out var sn, out var client)) - { - Log.Info($"receive {msg} from {sn}"); - - if (client == null) - { - return; - } - - if (msg.Result == 0) - { - client.GunCharged[msg.Pn] = true; - client.ChargerPile[msg.Pn].Vin = msg.Vin; - } - // 响应启动完成帧 - PileStartChargeCompleteRes res=new PileStartChargeCompleteRes(msg.Pn,0,0); - - ctx.Channel.WriteAndFlushAsync(res); - } - } -} \ No newline at end of file diff --git a/Service/Charger/Handler/OutCharger/PileStartChargeResHandler.cs b/Service/Charger/Handler/OutCharger/PileStartChargeResHandler.cs deleted file mode 100644 index 33c92d2..0000000 --- a/Service/Charger/Handler/OutCharger/PileStartChargeResHandler.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System.Text; -using Common.Util; -using DotNetty.Transport.Channels; -using Entity.DbModel.Station; -using HybirdFrameworkCore.Autofac.Attribute; -using log4net; -using Newtonsoft.Json; -using Repository.Station; -using Service.Charger.Client; -using Service.Charger.Msg.Charger.OutCharger.Resp; -using Service.Charger.Msg.Http.Resp; - -namespace Service.Charger.Handler.OutCharger; - -/// -/// 3.7.2 充电桩响应远程启动充电 -/// -[Order(8)] -[Scope("InstancePerDependency")] -public class PileStartChargeResHandler : SimpleChannelInboundHandler, IBaseHandler -{ - private static readonly ILog Log = LogManager.GetLogger(typeof(PileStartChargeResHandler)); - public ChargeOrderRepository ChargeOrderRepository { get; set; } - - - protected override void ChannelRead0(IChannelHandlerContext ctx, PileStartChargeRes msg) - { - if (ClientMgr.TryGetClient(ctx.Channel, out var sn, out var client)) - { - Log.Info($"receive {msg} from {sn}"); - - - ChargeOrder? chargeOrder = ChargeOrderRepository.GetLatestChargeGunOrder(msg.Pn.ToString(), sn); - if (chargeOrder == null) - { - return; - } - - PileStartChargeHttpRes chargeRes = new PileStartChargeHttpRes(); - - chargeRes.con = chargeOrder.Sn; - chargeRes.pn = chargeOrder.ChargerGunNo; - - if (msg.Result == 0) - { - chargeOrder.StartTime = DateTime.Now; - chargeOrder.CmdStatus = 1; - ChargeOrderRepository.Update(chargeOrder); - - - chargeRes.rs = "1"; - chargeRes.ec = "0"; - // 9.2.1.2 站控应答开始充电操作 - HttpUtil.SendPostRequest(chargeRes, "http://127.0.0.1:5034/api/OutCharger/ResStartOutCharger"); - } - else - { - chargeRes.rs = "2"; - chargeRes.ec = msg.FailReason.ToString(); - HttpUtil.SendPostRequest(chargeRes, "http://127.0.0.1:5034/api/OutCharger/ResStartOutCharger"); - } - } - } -} \ No newline at end of file diff --git a/Service/Charger/Handler/OutCharger/PileStopChargeResHandler.cs b/Service/Charger/Handler/OutCharger/PileStopChargeResHandler.cs deleted file mode 100644 index 40a50f4..0000000 --- a/Service/Charger/Handler/OutCharger/PileStopChargeResHandler.cs +++ /dev/null @@ -1,45 +0,0 @@ -using Common.Util; -using DotNetty.Transport.Channels; -using Entity.DbModel.Station; -using HybirdFrameworkCore.Autofac.Attribute; -using log4net; -using Repository.Station; -using Service.Charger.Client; -using Service.Charger.Msg.Charger.OutCharger.Resp; -using Service.Charger.Msg.Http.Resp; - -namespace Service.Charger.Handler.OutCharger; -/// -/// 3.7.4 充电桩响应远程停止充电 -/// -[Order(8)] -[Scope("InstancePerDependency")] -public class PileStopChargeResHandler : SimpleChannelInboundHandler, IBaseHandler -{ - private static readonly ILog Log = LogManager.GetLogger(typeof(PileStopChargeResHandler)); - - public ChargeOrderRepository ChargeOrderRepository { get; set; } - - - protected override void ChannelRead0(IChannelHandlerContext ctx, PileStopChargeRes msg) - { - if (ClientMgr.TryGetClient(ctx.Channel, out var sn, out var client)) - { - Log.Info($"receive {msg} from {sn}"); - ChargeOrder? chargeOrder = ChargeOrderRepository.GetLatestChargeGunOrder(msg.pn.ToString(), sn); - - if (chargeOrder == null) - { - return; - } - - if (msg.rs == 0 || msg.rs == 1) - { - PileStopChargeHttpRes res = new PileStopChargeHttpRes(); - res.pn = chargeOrder.ChargerGunNo; - res.rs = msg.rs.ToString(); - HttpUtil.SendPostRequest(res, "http://127.0.0.1:5034/api/OutCharger/ResStopOutCharger"); - } - } - } -} \ No newline at end of file diff --git a/Service/Charger/Handler/OutCharger/PileUploadChargeRecordHandler.cs b/Service/Charger/Handler/OutCharger/PileUploadChargeRecordHandler.cs deleted file mode 100644 index 5996455..0000000 --- a/Service/Charger/Handler/OutCharger/PileUploadChargeRecordHandler.cs +++ /dev/null @@ -1,254 +0,0 @@ -using Common.Util; -using DotNetty.Transport.Channels; -using Entity.DbModel.Station; -using HybirdFrameworkCore.Autofac.Attribute; -using log4net; -using Repository.Station; -using Service.Charger.Client; -using Service.Charger.Common; -using Service.Charger.Msg.Charger.OutCharger.Req; -using Service.Charger.Msg.Host.Resp.OutCharger; -using Service.Charger.Msg.Http.Req; -using Service.Init; - -namespace Service.Charger.Handler.OutCharger; - -/// -/// 3.7.13 充电桩上送充电记录 -/// -[Order(8)] -[Scope("InstancePerDependency")] -public class PileUploadChargeRecordHandler : SimpleChannelInboundHandler, IBaseHandler -{ - private static readonly ILog Log = LogManager.GetLogger(typeof(PileUploadChargeRecordHandler)); - - public ChargeOrderRepository ChargeOrderRepository { get; set; } - - - protected override void ChannelRead0(IChannelHandlerContext ctx, PileUploadChargeRecord msg) - { - if (ClientMgr.TryGetClient(ctx.Channel, out var sn, out var client)) - { - if (client == null) - { - return; - } - - float[] powersPeriods = new float[4] { 0, 0, 0, 0 }; //元素索引顺序代表值;1:尖;2:峰;3:平;4:谷 - var acPowersPeriods = PeaksAndValleys(msg, powersPeriods); - - Log.Info($"receive {msg} from {sn}"); - ChargeOrder chargeOrder = ChargeOrderRepository.QueryByClause(it => it.Sn == msg.ChargeOrderNo); - - var startTime = new DateTime(msg.StartYear + 2000, msg.StartMonth, msg.StartDay, msg.StartHour, - msg.StartMinute, msg.StartSecond); - var endTime = new DateTime(msg.EndYear + 2000, msg.EndMonth, msg.EndDay, msg.EndHour, msg.EndMinute, - msg.EndSecond); - - - float chargingPower = msg.ChargingPower; - var socBefore = msg.SocBefore; - byte socAfter = msg.SocAfter; - - void UpdateChargeOrder(ChargeOrder order) - { - order.StartTime = startTime; - order.EndTime = endTime; - order.StartSoc = socBefore; - order.StopSoc = socAfter; - order.ChargeTimeCount = (int)(endTime - startTime).TotalMinutes; - order.ElecCount = Convert.ToDecimal(chargingPower); - order.AcElecCount = Convert.ToDecimal(msg.AcMeterElecCount); - order.StartAcElec = Convert.ToDecimal(msg.AcMeterDataBefore); - order.StopAcElec = Convert.ToDecimal(msg.AcMeterDataAfter); - order.StartDcElec = Convert.ToDecimal(msg.DcMeterDataBefore); - order.StopDcElec = Convert.ToDecimal(msg.DcMeterDataAfter); - order.SharpElecCount = Convert.ToDecimal(powersPeriods[0]); - order.PeakElecCount = Convert.ToDecimal(powersPeriods[1]); - order.FlatElecCount = Convert.ToDecimal(powersPeriods[2]); - order.ValleyElecCount = Convert.ToDecimal(powersPeriods[3]); - order.AcSharpElecCount = Convert.ToDecimal(acPowersPeriods[0]); - order.AcPeakElecCount = Convert.ToDecimal(acPowersPeriods[1]); - order.AcFlatElecCount = Convert.ToDecimal(acPowersPeriods[2]); - order.AcValleyElecCount = Convert.ToDecimal(acPowersPeriods[3]); - order.ChargeMode = msg.ChargeMode; - order.StartMode = msg.StartMode; - } - - if (chargeOrder == null) - { - ChargeOrder newOrder = new ChargeOrder() - { - Sn = msg.ChargeOrderNo - }; - UpdateChargeOrder(newOrder); - ChargeOrderRepository.Insert(newOrder); - - PileEndChargeReq req = new PileEndChargeReq(); - - - req.sn = StaticStationInfo.StationNo; - - req.con = msg.ChargeOrderNo; - req.cosn = msg.ChargeOrderNo; - - - UploadChargeRecord(msg, client, req, sn, startTime, endTime, chargingPower, socBefore, socAfter); - } - else - { - UpdateChargeOrder(chargeOrder); - // 充电完成入库 - ChargeOrderRepository.Update(chargeOrder); - - PileEndChargeReq req = new PileEndChargeReq(); - - req.sn = StaticStationInfo.StationNo; - req.con = chargeOrder.CloudChargeOrder; - req.cosn = chargeOrder.Sn; - - // 充电完成上报云平台 - UploadChargeRecord(msg, client, req, sn, startTime, endTime, chargingPower, socBefore, socAfter); - } - } - - ctx.Channel.WriteAndFlushAsync(new PileUploadChargeRecordRes(msg.Pn)); - } - - private static void UploadChargeRecord(PileUploadChargeRecord msg, ChargerClient client, PileEndChargeReq req, - string sn, DateTime startTime, DateTime endTime, float chargingPower, byte socBefore, byte socAfter) - { - ChargerPile chargerPile = client.ChargerPile[msg.Pn]; - req.pn = ChargerUtils.ReverseCalculateChargerGun(msg.Pn, sn); - req.ct = chargerPile.ct; - req.cp = chargerPile.cp; - req.st = chargerPile.st; - req.cst = startTime; - req.cet = endTime; - req.ceq = chargingPower; - req.cssoc = socBefore; - req.cesoc = socAfter; - - req.ctn = msg.ChargingTimeCount; - - List periodList = new List(); - // 利用反射组装充电时间段数据 - for (int i = 1; i <= msg.ChargingTimeCount; i++) - { - PeriodReq periodReq = new PeriodReq(); - // 获取属性 - var startTimeHourProperty = typeof(PileUploadChargeRecord).GetProperty($"StartTime{i}"); - var startTimeMinuteProperty = typeof(PileUploadChargeRecord).GetProperty($"StartTimeMinute{i}"); - - if (startTimeHourProperty != null && startTimeMinuteProperty != null) - { - // 获取值 - byte startTimeHour = (byte)startTimeHourProperty.GetValue(msg); - byte startTimeMinute = (byte)startTimeMinuteProperty.GetValue(msg); - periodReq.StartTimeMinute = DateUtils.GetFormattedTime(startTimeHour, startTimeMinute); - } - - var chargingPowerProperty = typeof(PileUploadChargeRecord).GetProperty($"ChargingPowerOfTime{i}"); - var flagOfTimeProperty = typeof(PileUploadChargeRecord).GetProperty($"FlagOfTime{i}"); - if (chargingPowerProperty != null && flagOfTimeProperty != null) - { - periodReq.ChargingPowerOfTime = (float)chargingPowerProperty.GetValue(msg); - periodReq.FlagOfTime = (byte)flagOfTimeProperty.GetValue(msg); - } - - periodList.Add(periodReq); - } - - req.ctl = periodList; - - req.cvin = chargerPile.Vin; - - HttpUtil.SendPostRequest(req, "http://127.0.0.1:5034/api/OutCharger/SendPileEndCharge"); - } - - private static float[] PeaksAndValleys(PileUploadChargeRecord msg, float[] powersPeriods) - { - if (msg.FlagOfTime1 >= 1 && msg.FlagOfTime1 <= 4) - { - powersPeriods[msg.FlagOfTime1 - 1] += msg.ChargingPowerOfTime1; - } - - if (msg.FlagOfTime2 >= 1 && msg.FlagOfTime2 <= 4) - { - powersPeriods[msg.FlagOfTime2 - 1] += msg.ChargingPowerOfTime2; - } - - if (msg.FlagOfTime3 >= 1 && msg.FlagOfTime3 <= 4) - { - powersPeriods[msg.FlagOfTime3 - 1] += msg.ChargingPowerOfTime3; - } - - if (msg.FlagOfTime4 >= 1 && msg.FlagOfTime4 <= 4) - { - powersPeriods[msg.FlagOfTime4 - 1] += msg.ChargingPowerOfTime4; - } - - if (msg.FlagOfTime5 >= 1 && msg.FlagOfTime5 <= 4) - { - powersPeriods[msg.FlagOfTime5 - 1] += msg.ChargingPowerOfTime5; - } - - if (msg.FlagOfTime6 >= 1 && msg.FlagOfTime6 <= 4) - { - powersPeriods[msg.FlagOfTime6 - 1] += msg.ChargingPowerOfTime6; - } - - if (msg.FlagOfTime7 >= 1 && msg.FlagOfTime7 <= 4) - { - powersPeriods[msg.FlagOfTime7 - 1] += msg.ChargingPowerOfTime7; - } - - if (msg.FlagOfTime8 >= 1 && msg.FlagOfTime8 <= 4) - { - powersPeriods[msg.FlagOfTime8 - 1] += msg.ChargingPowerOfTime8; - } - - float[] acPowersPeriods = new float[4] { 0, 0, 0, 0 }; //元素索引顺序代表值;1:尖;2:峰;3:平;4:谷 - if (msg.AcFlagOfTime1 >= 1 && msg.AcFlagOfTime1 <= 4) - { - acPowersPeriods[msg.AcFlagOfTime1 - 1] += msg.AcChargingPowerOfTime1; - } - - if (msg.AcFlagOfTime2 >= 1 && msg.AcFlagOfTime2 <= 4) - { - acPowersPeriods[msg.AcFlagOfTime2 - 1] += msg.AcChargingPowerOfTime2; - } - - if (msg.AcFlagOfTime3 >= 1 && msg.AcFlagOfTime3 <= 4) - { - acPowersPeriods[msg.AcFlagOfTime3 - 1] += msg.AcChargingPowerOfTime3; - } - - if (msg.AcFlagOfTime4 >= 1 && msg.AcFlagOfTime4 <= 4) - { - acPowersPeriods[msg.AcFlagOfTime4 - 1] += msg.AcChargingPowerOfTime4; - } - - if (msg.AcFlagOfTime5 >= 1 && msg.AcFlagOfTime5 <= 4) - { - acPowersPeriods[msg.AcFlagOfTime5 - 1] += msg.AcChargingPowerOfTime5; - } - - if (msg.AcFlagOfTime6 >= 1 && msg.AcFlagOfTime6 <= 4) - { - acPowersPeriods[msg.AcFlagOfTime6 - 1] += msg.AcChargingPowerOfTime6; - } - - if (msg.AcFlagOfTime7 >= 1 && msg.AcFlagOfTime7 <= 4) - { - acPowersPeriods[msg.AcFlagOfTime7 - 1] += msg.AcChargingPowerOfTime7; - } - - if (msg.AcFlagOfTime8 >= 1 && msg.AcFlagOfTime8 <= 4) - { - acPowersPeriods[msg.AcFlagOfTime8 - 1] += msg.AcChargingPowerOfTime8; - } - - return acPowersPeriods; - } -} \ No newline at end of file diff --git a/Service/Charger/Handler/OutCharger/PileUploadRemoteSignalHandler.cs b/Service/Charger/Handler/OutCharger/PileUploadRemoteSignalHandler.cs deleted file mode 100644 index f7a678b..0000000 --- a/Service/Charger/Handler/OutCharger/PileUploadRemoteSignalHandler.cs +++ /dev/null @@ -1,36 +0,0 @@ -using DotNetty.Transport.Channels; -using log4net; -using Service.Charger.Client; -using Service.Charger.Handler; -using Service.Charger.Msg.Charger.OutCharger.Req; - -namespace Service.Charger.Handler.OutCharger; -/// -/// 3.7.11 充电桩遥信数据上报 -/// -public class PileUploadRemoteSignalHandler: SimpleChannelInboundHandler, IBaseHandler -{ - private static readonly ILog Log = LogManager.GetLogger(typeof(PileUploadRemoteSignalHandler)); - - - protected override void ChannelRead0(IChannelHandlerContext ctx, PileUploadRemoteSignal msg) - { - if (ClientMgr.TryGetClient(ctx.Channel, out var sn, out var client)) - { - //存储日志 - Log.Info($"receive {msg} from {sn}"); - - client.PileUploadRemoteSignal[msg.Pn] = msg; - - client.Workstate = msg.WorkStatus; - - client.GunCharged[msg.Pn] = msg.WorkStatus == 1 ? true : false; - - client.ChargedPile[msg.Pn] = !msg.ChargeStationGunHolderStatus; - client.ChargerPile[msg.Pn].WorkStatus = msg.WorkStatus; - - - - } - } -} \ No newline at end of file diff --git a/Service/Charger/Handler/OutCharger/PileUploadTelemetryHandler.cs b/Service/Charger/Handler/OutCharger/PileUploadTelemetryHandler.cs deleted file mode 100644 index 970fe63..0000000 --- a/Service/Charger/Handler/OutCharger/PileUploadTelemetryHandler.cs +++ /dev/null @@ -1,30 +0,0 @@ -using DotNetty.Transport.Channels; -using HybirdFrameworkCore.Autofac.Attribute; -using log4net; -using Service.Charger.Client; -using Service.Charger.Msg.Charger.OutCharger.Req; - -namespace Service.Charger.Handler.OutCharger; - -/// -/// 3.7.12 充电桩遥测数据上报 -/// -[Order(8)] -[Scope("InstancePerDependency")] -public class PileUploadTelemetryHandler : SimpleChannelInboundHandler, IBaseHandler -{ - private static readonly ILog Log = LogManager.GetLogger(typeof(PileUploadTelemetryHandler)); - - protected override void ChannelRead0(IChannelHandlerContext ctx, PileUploadTelemetry msg) - { - if (ClientMgr.TryGetClient(ctx.Channel, out var sn, out var client)) - { - Log.Info($"receive {msg} from {sn}"); - - client.PileUploadTelemetry[msg.Pn] = msg; - - client.ChargePilePower[msg.Pn] = msg.HighVoltageAcquisitionCurrent * msg.HighVoltageAcquisitionVoltage; - - } - } -} \ No newline at end of file diff --git a/Service/Charger/Msg/Charger/Resp/AdjustChargeRateRes.cs b/Service/Charger/Msg/Charger/Resp/AdjustChargeRateRes.cs index 6baaa59..463258e 100644 --- a/Service/Charger/Msg/Charger/Resp/AdjustChargeRateRes.cs +++ b/Service/Charger/Msg/Charger/Resp/AdjustChargeRateRes.cs @@ -3,7 +3,7 @@ namespace Service.Charger.Msg.Charger.Resp { /// - /// 3.4.4 充放电机应答辅助控制 + /// 3.4.6 充放电设备应答充电速率设置 /// public class AdjustChargeRateRes : ASDU { diff --git a/Service/Charger/Msg/Host/Req/OutSideAllowChargingSoc.cs b/Service/Charger/Msg/Host/Req/OutSideAllowChargingSoc.cs index 5ff0da9..5324721 100644 --- a/Service/Charger/Msg/Host/Req/OutSideAllowChargingSoc.cs +++ b/Service/Charger/Msg/Host/Req/OutSideAllowChargingSoc.cs @@ -7,11 +7,30 @@ namespace Service.Charger.Msg.Host.Req /// public class OutSideAllowChargingSoc : ASDU { + /// - /// SOC 限制值 + /// 记录类型 /// [Property(0, 8)] + public byte RecordType { get; set; } + + /// + /// SOC 限制值 + /// + [Property(8, 8)] public byte SocValue { get; set; } + + public OutSideAllowChargingSoc(byte socValue) + { + FrameTypeNo = 45; + MsgBodyCount = 1; + TransReason = 4; + PublicAddr = 0; + MsgBodyAddr = new byte[] { 0, 0, 0 }; + + RecordType = 45; + SocValue = socValue; + } } } \ No newline at end of file diff --git a/Service/Charger/MyTask/AutoChargeTask.cs b/Service/Charger/MyTask/AutoChargeTask.cs index 1afc403..7558eef 100644 --- a/Service/Charger/MyTask/AutoChargeTask.cs +++ b/Service/Charger/MyTask/AutoChargeTask.cs @@ -176,7 +176,7 @@ public class AutoChargeTask : ITask { //没有充电时候在充电 Result? result = ClientMgr.GetBySn(binInfo.ChargerNo) - ?.StartCharge(chargeSoc, (float)power, 0); + ?.StartCharge((byte)ChargerModeConst.OnSite,chargeSoc, (float)power, 0); if (result is { IsSuccess: true }) { Log.Info($"auto start charge {binInfo.ChargerNo}"); diff --git a/Service/Charger/MyTask/PileChargeRealtimeTask.cs b/Service/Charger/MyTask/PileChargeRealtimeTask.cs index d2cb561..abcb0ab 100644 --- a/Service/Charger/MyTask/PileChargeRealtimeTask.cs +++ b/Service/Charger/MyTask/PileChargeRealtimeTask.cs @@ -1,4 +1,5 @@ using System.Collections.Concurrent; +using Common.Const; using Common.Util; using HybirdFrameworkCore.Autofac.Attribute; using HybirdFrameworkCore.AutoTask; @@ -10,6 +11,7 @@ using Service.Charger.Msg.Http.Req; using Service.Init; namespace Service.Charger.MyTask; + /// /// 9.2.1.7 站控上报充电枪充电遥测数据 /// @@ -32,7 +34,6 @@ public class PileChargeRealtimeTask : ITask public void Handle() { - ConcurrentDictionary chargerClients = ClientMgr.Dictionary; if (chargerClients.Values.Count <= 0) @@ -43,43 +44,42 @@ public class PileChargeRealtimeTask : ITask foreach (var clientPair in chargerClients) { ChargerClient client = clientPair.Value; - - ProcessClient(client, 1); - ProcessClient(client, 2); + byte mode = (byte)ChargerModeConst.OutsideTheStation; + ProcessClient(client, mode); } } - private void ProcessClient(ChargerClient client, byte gunNumber) + private void ProcessClient(ChargerClient client, byte mode) { - if (client.GunCharged[gunNumber]) + if (client.IsCharged && client.ChargerMode == mode) { - ChargerPile chargerPile = client.ChargerPile[gunNumber]; - PileUploadTelemetry telemetry = client.PileUploadTelemetry[gunNumber]; - PileUploadRemoteSignal pileUploadRemoteSignal = client.PileUploadRemoteSignal[gunNumber]; - + ChargerPile chargerPile = client.ChargerPile; + + UploadTelemetryData uploadTelemetryData = client.UploadTelemetryData; + UploadRemoteSignalData uploadRemoteSignalData = client.UploadRemoteSignalData; PileChargeRealtimeReq req = new PileChargeRealtimeReq { sn = StaticStationInfo.StationNo, con = chargerPile.con, cosn = chargerPile.cosn, pn = chargerPile.pn, - rv = telemetry.BmsNeedVoltage, - re = telemetry.BmsNeedCurrent, - cm = telemetry.ChargeMode, - cdv = telemetry.BmsChargingVoltage, - cde = telemetry.BmsChargingCurrent, - soc = telemetry.CurrentSoc, - tr = telemetry.EstimatedRemainingTime, - pov = telemetry.DcMeterVoltage, - poe = telemetry.DcMeterCurrent, - tct = telemetry.ChargingTime, - lbtn = telemetry.MinTempDetectionPointNo, - lbt = telemetry.MinBatteryTemp, - hbtn = telemetry.MaxTempDetectionPointNo, - hbt = telemetry.MaxBatteryTemp, - hlbva = pileUploadRemoteSignal.ChargerInputOverVoltageError ? 1 : - pileUploadRemoteSignal.ChargerInputUnderVoltageError ? 2 : 0, - bia = pileUploadRemoteSignal.InsulationDetectionAlarm ? 1 : 0 + rv = uploadTelemetryData.BmsNeedVoltage, + re = uploadTelemetryData.BmsNeedCurrent, + cm = uploadTelemetryData.ChargeMode, + cdv = uploadTelemetryData.BmsChargingVoltage, + cde = uploadTelemetryData.BmsChargingCurrent, + soc = uploadTelemetryData.CurrentSoc, + tr = uploadTelemetryData.EstimatedRemainingTime, + pov = uploadTelemetryData.DcMeterVoltage, + poe = uploadTelemetryData.DcMeterCurrent, + tct = uploadTelemetryData.ChargingTime, + lbtn = uploadTelemetryData.MinTempDetectionPointNo, + lbt = uploadTelemetryData.MinBatteryTemp, + hbtn = uploadTelemetryData.MaxTempDetectionPointNo, + hbt = uploadTelemetryData.MaxBatteryTemp, + hlbva = uploadRemoteSignalData.ChargerInputOverVoltageError ? 1 : + uploadRemoteSignalData.ChargerInputUnderVoltageError ? 2 : 0, + bia = uploadRemoteSignalData.InsulationDetectionAlarm ? 1 : 0 }; HttpUtil.SendPostRequest(req, "http://127.0.0.1:5034/api/OutCharger/SendPileChargeRealtime"); diff --git a/Service/Charger/MyTask/PileRealtimeTask.cs b/Service/Charger/MyTask/PileRealtimeTask.cs index 3b6bf4c..3a1c83d 100644 --- a/Service/Charger/MyTask/PileRealtimeTask.cs +++ b/Service/Charger/MyTask/PileRealtimeTask.cs @@ -1,14 +1,17 @@ using System.Collections.Concurrent; +using Common.Const; using Common.Util; using HybirdFrameworkCore.Autofac.Attribute; using HybirdFrameworkCore.AutoTask; using log4net; using Service.Charger.Client; using Service.Charger.Msg.Charger.OutCharger.Req; +using Service.Charger.Msg.Charger.Req; using Service.Charger.Msg.Http.Req; using Service.Init; namespace Service.Charger.MyTask; + /// /// 9.2.1.5 站控上报充电枪实时数据上报 /// @@ -40,13 +43,12 @@ public class PileRealtimeTask : ITask foreach (var kvp in chargerClients) { ChargerClient client = kvp.Value; + byte mode = (byte)ChargerModeConst.OutsideTheStation; - HandleChargerPile(client, 1); - HandleChargerPile(client, 2); + HandleChargerPile(client, mode); } } - - + public bool Stoped() { @@ -62,21 +64,23 @@ public class PileRealtimeTask : ITask { _stop = false; } - - private void HandleChargerPile(ChargerClient client, byte pileIndex) + + private void HandleChargerPile(ChargerClient client, byte mode) { - if (client.ChargedPile[pileIndex]) + if (client.Connected && client.ChargerMode == mode) { - ChargerPile chargerPile = client.ChargerPile[pileIndex]; - PileUploadTelemetry pileUploadTelemetry = client.PileUploadTelemetry[pileIndex]; + ChargerPile chargerPile = client.ChargerPile; + + UploadTelemetryData uploadTelemetryData = client.UploadTelemetryData; + UploadRemoteSignalData uploadRemoteSignalData = client.UploadRemoteSignalData; PileRealtimeReq req = new PileRealtimeReq { sn = StaticStationInfo.StationNo, pn = chargerPile.pn, - ps = GetPileStatus(chargerPile.WorkStatus), - pov = pileUploadTelemetry.BmsChargingVoltage, - poe = pileUploadTelemetry.BmsChargingCurrent, + ps = GetPileStatus(uploadRemoteSignalData.WorkStatus), + pov = uploadTelemetryData.DcMeterVoltage, + poe = uploadTelemetryData.DcMeterCurrent, ec = 0 }; @@ -91,10 +95,8 @@ public class PileRealtimeTask : ITask 0 => 1, 1 => 3, 2 => 4, - 3 => 5, + 3 => 6, _ => 1 }; } - - } \ No newline at end of file diff --git a/WebStarter/Controllers/ChargeController.cs b/WebStarter/Controllers/ChargeController.cs index 3ca32ea..7155775 100644 --- a/WebStarter/Controllers/ChargeController.cs +++ b/WebStarter/Controllers/ChargeController.cs @@ -1,4 +1,5 @@ using AutoMapper; +using Common.Const; using Entity.DbModel.Station; using Entity.Dto.Req; using Entity.Dto.Resp; @@ -137,7 +138,7 @@ public class ChargeController : ControllerBase [Route("StartChargeByBinNo/{binNo}")] public Result StartChargeByBinNo(string binNo) { - return _chargerService.StartChargeByBinNo(binNo); + return _chargerService.StartChargeByBinNo((byte)ChargerModeConst.OnSite,binNo); } /// diff --git a/WebStarter/Controllers/OutChargerController.cs b/WebStarter/Controllers/OutChargerController.cs index e00413e..994be48 100644 --- a/WebStarter/Controllers/OutChargerController.cs +++ b/WebStarter/Controllers/OutChargerController.cs @@ -1,4 +1,5 @@ -using Entity.Dto.Resp; +using Common.Const; +using Entity.Dto.Resp; using HybirdFrameworkCore.Entity; using Microsoft.AspNetCore.Mvc; using Repository.Station; @@ -34,37 +35,33 @@ public class OutChargerController public Result SendStartOutCharger([FromBody] PileStartChargeHttpReq httpReq) { - string chargerCode = ChargerUtils.GetOutChargerCode(httpReq.pn); - - byte chargerGunCode = ChargerUtils.GetTheGun(httpReq.pn); - + var chargerCode = httpReq.pn; ChargerClient? chargerClient = ClientMgr.GetBySn(chargerCode); if (chargerClient == null) { return Result.Fail("充电机未连接"); } - - + string chargeGunOrder = ChargerUtils.GenChargeOrderSn(); if (string.IsNullOrWhiteSpace(httpReq.con)) { httpReq.con = chargeGunOrder; } - chargerClient.ChargerPile[chargerGunCode].ct = httpReq.ct; - chargerClient.ChargerPile[chargerGunCode].cp = httpReq.cp; - chargerClient.ChargerPile[chargerGunCode].st = httpReq.st; - chargerClient.ChargerPile[chargerGunCode].con = httpReq.con; - chargerClient.ChargerPile[chargerGunCode].cosn = chargeGunOrder; - chargerClient.ChargerPile[chargerGunCode].pn = httpReq.pn; + chargerClient.ChargerPile.ct = httpReq.ct; + chargerClient.ChargerPile.cp = httpReq.cp; + chargerClient.ChargerPile.st = httpReq.st; + chargerClient.ChargerPile.con = httpReq.con; + chargerClient.ChargerPile.cosn = chargeGunOrder; + chargerClient.ChargerPile.pn = httpReq.pn; byte chargeSoc = StaticStationInfo.ChargeSoc; // 下发充电枪充电 - chargerClient.SendStartOutCharger(chargerGunCode, chargeSoc, 360, 1, chargeGunOrder); + chargerClient.SendRemoteStartCharging((byte)ChargerModeConst.OutsideTheStation, chargeSoc, 360, 1, chargeGunOrder); // 初始化订单 _chargeOrderRepository.SaveChargeGunOrder(chargeGunOrder, httpReq.con, chargerCode, httpReq.pn, - chargerGunCode.ToString()); + chargerCode); return Result.Success(true); } @@ -78,11 +75,8 @@ public class OutChargerController [Route("SendStopOutCharger")] public Result SendStopOutCharger([FromBody] PileStopChargeHttpReq httpReq) { - string chargerCode = ChargerUtils.GetOutChargerCode(httpReq.pn); - - byte chargerGunCode = ChargerUtils.GetTheGun(httpReq.pn); - - ChargerClient? chargerClient = ClientMgr.GetBySn(chargerCode); + + ChargerClient? chargerClient = ClientMgr.GetBySn(httpReq.pn); if (chargerClient == null) { @@ -90,7 +84,7 @@ public class OutChargerController } // 下发充电枪停止充电 - chargerClient.SendStopOutCharger(chargerGunCode, 0); + chargerClient.SendRemoteStopCharging(); return Result.Success(true); } @@ -106,52 +100,20 @@ public class OutChargerController [Route("SendPowerRegulation/{code}/{pn}/{power}")] public Result SendPowerRegulation(string code,byte pn, float power) { - if (power <=0 || power > 280) + if (power <=0 || power > 360) { return Result.Fail("功率值范围1到360"); } - if (pn != 1 && pn != 2) - { - return Result.Fail("请选择1枪或者2枪"); - } - ChargerClient? chargerClient = ClientMgr.GetBySn(code); if (chargerClient != null) { - chargerClient.SendPileAdjustPower(pn,power); + chargerClient.SendPowerRegulation(power); return Result.Success(true); } return Result.Fail("充电机未连接"); } - /// - /// 获取充电桩信息 - /// - /// - [HttpGet] - [Route("GetChargerPile")] - public Result> GetChargerPile() - { - var chargerClients = ClientMgr.Dictionary; - if (chargerClients.IsEmpty) - { - return Result>.Fail("没有充电机连接"); - } - - var list = chargerClients.Values.Select(client => new ChargerPileResp - { - Sn = client.Sn, - GunChargedOne = client.GunCharged[1], - GunChargedTwo = client.GunCharged[2], - ChargedPileOne = client.ChargedPile[1], - ChargedPileTwo = client.ChargedPile[2], - ChargePilePowerOne = client.ChargePilePower[1], - ChargePilePowerTwo = client.ChargePilePower[2] - }).ToList(); - - return Result>.Success(list); - } } \ No newline at end of file diff --git a/WinFormStarter/Form2.cs b/WinFormStarter/Form2.cs index cc9cc76..07f103b 100644 --- a/WinFormStarter/Form2.cs +++ b/WinFormStarter/Form2.cs @@ -175,7 +175,7 @@ public partial class Form2 : Form private void btnStartCharge_Click(object sender, EventArgs e) { - Result chargeOrderNo = _chargerClient.SendRemoteStartCharging(100); + Result chargeOrderNo = _chargerClient.SendRemoteStartCharging(1,100); _chargerClient.ChargeOrderNo = chargeOrderNo.Data; MessageBox.Show(@"发送成功"); DisplayData();