diff --git a/WCS.BLL/DbModels/ShelfInfo.cs b/WCS.BLL/DbModels/ShelfInfo.cs index 66fcd40..8448f0b 100644 --- a/WCS.BLL/DbModels/ShelfInfo.cs +++ b/WCS.BLL/DbModels/ShelfInfo.cs @@ -42,6 +42,12 @@ namespace WCS.DAL.DbModels [SugarColumn(ColumnName = "current_mode", IsNullable = false, ColumnDescription = "货架当前状态")] public Mode CurrentMode { get; set; } + /// + /// 货架设置当前模式的时间 + /// + [SugarColumn(ColumnName = "set_current_mode_time", IsNullable = true, ColumnDescription = "设置货架当前模式的时间")] + public DateTime SetCurrentModeTime { get; set; } + /// /// 货架行数 /// diff --git a/WCS.BLL/HardWare/IShelfBase.cs b/WCS.BLL/HardWare/IShelfBase.cs index ec061b2..9738217 100644 --- a/WCS.BLL/HardWare/IShelfBase.cs +++ b/WCS.BLL/HardWare/IShelfBase.cs @@ -5,6 +5,7 @@ using System.Text; using System.Threading.Tasks; using WCS.BLL.DbModels; using WCS.Model; +using static WCS.BLL.HardWare.WarningLight; namespace WCS.BLL.HardWare { @@ -38,6 +39,7 @@ namespace WCS.BLL.HardWare public int ColumnCounts { get; set; } public int LightId { get; set; } + public LightColorEnum LightColor { get; set; } public List ModuleIds { get; set; } public List Modules { get; set; } public string ClientIp { get; set; } @@ -45,6 +47,10 @@ namespace WCS.BLL.HardWare /// 货架当前模式 /// public Mode CurrentMode { get; set; } + /// + /// 设置到当前模式的时间 + /// + public DateTime SetCurrentModeTime { get; set; } public MatInfoResponse InStoreData { get; set; } @@ -68,7 +74,7 @@ namespace WCS.BLL.HardWare /// /// 设置货架模式 /// - public void SetCurrentMode(); + public void SetCurrentMode(Mode mode); /// /// 货架进入入库模式 @@ -99,7 +105,7 @@ namespace WCS.BLL.HardWare /// /// 货架单个确认盘点 /// - public bool ConfirmStocktakingSingle(int BoardId,int LightNumber); + public bool ConfirmStocktakingSingle(int BoardId, int LightNumber); /// /// 货架退出盘点模式 diff --git a/WCS.BLL/HardWare/IWarningLightBase.cs b/WCS.BLL/HardWare/IWarningLightBase.cs index 0c3a291..b9e41d3 100644 --- a/WCS.BLL/HardWare/IWarningLightBase.cs +++ b/WCS.BLL/HardWare/IWarningLightBase.cs @@ -15,6 +15,8 @@ namespace WCS.BLL.HardWare 红色 = 0x01, 绿色 = 0x02, 蓝色 = 0x03, + //关闭仅用于后台暂存和判断使用 不用于协议 + 关闭 = 0x11, } public enum LightModeEnum { diff --git a/WCS.BLL/HardWare/SingleLightShelf.cs b/WCS.BLL/HardWare/SingleLightShelf.cs index 6a2ee8f..925297c 100644 --- a/WCS.BLL/HardWare/SingleLightShelf.cs +++ b/WCS.BLL/HardWare/SingleLightShelf.cs @@ -5,6 +5,7 @@ using System.Text; using System.Threading.Tasks; using WCS.BLL.DbModels; using WCS.Model; +using static WCS.BLL.HardWare.WarningLight; namespace WCS.BLL.HardWare { @@ -21,12 +22,14 @@ namespace WCS.BLL.HardWare public string OrderNumber { get; set; } public int LightId { get; set; } + public LightColorEnum LightColor { get; set; } public List ModuleIds { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public string ClientIp { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public List ExceptionMessages { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public bool IsWarning { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public string WebSocketIpAddress { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public List Modules { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public DateTime SetCurrentModeTime { get; set; } public bool ConfirmStocktakingSingle(int BoardId, int LightNumber) { @@ -36,38 +39,38 @@ namespace WCS.BLL.HardWare public void GoInInstore(string IPAdress) { //找到对应的灯 亮灯 - + } public void GoInOutstore(List MatDetails, OutOrder outOrder) { - throw new NotImplementedException(); + } public void GoInStocktaking() { - throw new NotImplementedException(); + } public void GoInStocktaking(List MatDetails, StockTakingOrder outOrder) { - throw new NotImplementedException(); + } public void GoOutInstore() { //找到已亮灯的 灭灯 - throw new NotImplementedException(); + } public void GoOutOutstore() { - throw new NotImplementedException(); + } public void GoOutStocktaking() { - throw new NotImplementedException(); + } public void Reset() @@ -75,19 +78,19 @@ namespace WCS.BLL.HardWare return; } - public void SetCurrentMode() + public void SetCurrentMode(Mode mode) { - throw new NotImplementedException(); + } public void ShelfCheck() { - throw new NotImplementedException(); + } public void Warning() { - throw new NotImplementedException(); + } } } diff --git a/WCS.BLL/HardWare/SmartShelf.cs b/WCS.BLL/HardWare/SmartShelf.cs index 68957a2..1fa7268 100644 --- a/WCS.BLL/HardWare/SmartShelf.cs +++ b/WCS.BLL/HardWare/SmartShelf.cs @@ -1,4 +1,5 @@ -using WCS.BLL.Config; +using System; +using WCS.BLL.Config; using WCS.BLL.DbModels; using WCS.BLL.Manager; using WCS.DAL.Db; @@ -7,6 +8,7 @@ using WCS.Model; using WCS.Model.ApiModel.InOutRecord; using WCS.Model.ApiModel.OutStore; using WCS.Model.WebSocketModel; +using static WCS.BLL.HardWare.WarningLight; namespace WCS.BLL.HardWare { @@ -21,7 +23,8 @@ namespace WCS.BLL.HardWare ShelfCode = shelfInfo.ShelfCode; RowCounts = shelfInfo.Rowcounts; ColumnCounts = shelfInfo.Columncounts; - CurrentMode = shelfInfo.CurrentMode; + //CurrentMode = shelfInfo.CurrentMode; + SetCurrentMode(Mode.待机模式); ClientIp = shelfInfo.ClientIp; LightId = shelfInfo.LightId; WarningLight = new WarningLight() { LightId = shelfInfo.LightId }; @@ -53,12 +56,15 @@ namespace WCS.BLL.HardWare public int RowCounts { get; set; } public int ColumnCounts { get; set; } public Mode CurrentMode { get; set; } + public DateTime SetCurrentModeTime { get; set; } public string ModulesStr { get; set; }//当前货架所有模组的Str public string GroupName { get; set; } public List Modules { get; set; } = new List(); public TCPClient TcpCleint { get { return TCPClientManager.GetTCPClientByIPHost(ClientIp); } } public int LightId { get; set; } + + public LightColorEnum LightColor { get; set; } public bool IsWarning { get; set; } = false; public WarningLight WarningLight { get; set; } public void ClearWarning() @@ -124,7 +130,8 @@ namespace WCS.BLL.HardWare } else { - this.CurrentMode = Mode.入库模式; + //this.CurrentMode = Mode.入库模式; + SetCurrentMode(Mode.入库模式); } //清空错误 ExceptionMessages.Clear(); @@ -221,7 +228,8 @@ namespace WCS.BLL.HardWare } else { - this.CurrentMode = Mode.待机模式; + //this.CurrentMode = Mode.待机模式; + SetCurrentMode(Mode.待机模式); } //清空错误 @@ -258,7 +266,8 @@ namespace WCS.BLL.HardWare .ToList(); if (list.Count > 0) { - CurrentMode = Mode.待机模式; + //CurrentMode = Mode.待机模式; + SetCurrentMode(Mode.待机模式); foreach (var item in list) { ExceptionMessages.Add($"模组{item.ModuleCode}未成功退出入库模式!"); @@ -295,7 +304,8 @@ namespace WCS.BLL.HardWare //复位需要点时间间隔才能响应指令 Thread.Sleep(1500); } - CurrentMode = Mode.出库模式; + //CurrentMode = Mode.出库模式; + SetCurrentMode(Mode.出库模式); //第二步:货架添加需要出的SN 出库的领料单号 //移除货架所有现有待出库的MatSN @@ -424,7 +434,8 @@ namespace WCS.BLL.HardWare CurrentOutStoreMatSNs.Clear(); WarningLight.CloseLight(TcpCleint); - this.CurrentMode = Mode.待机模式; + //this.CurrentMode = Mode.待机模式; + SetCurrentMode(Mode.待机模式); Logs.Write($"货架【{ShelfCode}】,结束退出出库", LogsType.Outstore); } catch (Exception ex) @@ -449,7 +460,8 @@ namespace WCS.BLL.HardWare Thread.Sleep(1500); } - CurrentMode = Mode.盘点模式; + //CurrentMode = Mode.盘点模式; + SetCurrentMode(Mode.盘点模式); //第二步:货架添加 盘点单号 记录当前盘点的发料单 CurrentStockTakingOrder = stockTakingOrder; @@ -609,7 +621,8 @@ namespace WCS.BLL.HardWare }); CurrentOutStoreMatSNs.Clear(); WarningLight.CloseLight(TcpCleint); - this.CurrentMode = Mode.待机模式; + //this.CurrentMode = Mode.待机模式; + SetCurrentMode(Mode.待机模式); } public void Reset() @@ -623,7 +636,8 @@ namespace WCS.BLL.HardWare }); } WarningLight.CloseLight(TcpCleint); - this.CurrentMode = Mode.待机模式; + //this.CurrentMode = Mode.待机模式; + SetCurrentMode(Mode.待机模式); } public void QueryVoltage(int moduleId) @@ -635,9 +649,20 @@ namespace WCS.BLL.HardWare } } - void IShelfBase.SetCurrentMode() + public void SetCurrentMode(Mode mode) { - throw new NotImplementedException(); + this.CurrentMode = mode; + this.SetCurrentModeTime = DateTime.Now; + Task.Run(() => + { + var shelf = DbHelp.db.Queryable().Where(t => t.Id == ShelfId).First(); + if (shelf != null) + { + shelf.CurrentMode = mode; + shelf.SetCurrentModeTime = SetCurrentModeTime; + DbHelp.db.Updateable(shelf).ExecuteCommand(); + } + }); } void IShelfBase.Warning() @@ -654,6 +679,39 @@ namespace WCS.BLL.HardWare } #endregion + #region 报警灯协议返回处理 + public void WarningLightProcess(byte[] data, int boardId, int lightNumber) + { + if (data[TcpCleint.PreFixLength + 2] == 0x20 && data[TcpCleint.PreFixLength + 3] == 0x01) + { + //常亮或关闭 0x00常亮 0x01关闭 + if (data[TcpCleint.PreFixLength + 5] == 0x00) + { + LightColor = LightColorEnum.关闭; + Logs.Write($"货架[{ShelfCode}],灯状态更新为:{LightColor}"); + } + else if (data[TcpCleint.PreFixLength + 5] == 0x01) + { + switch (data[7]) + { + case 0x01: + LightColor = LightColorEnum.红色; + break; + case 0x02: + LightColor = LightColorEnum.绿色; + break; + case 0x03: + LightColor = LightColorEnum.蓝色; + break; + default: + break; + } + Logs.Write($"货架[{ShelfCode}],灯状态更新为:{LightColor}"); + } + } + } + #endregion + #region 协议返回处理 public void ProtocolProcess(byte[] data, int boardId, int lightNumber) { @@ -1432,6 +1490,15 @@ namespace WCS.BLL.HardWare //确认本次出库 module.ComfirmOutstore(TcpCleint, data[TcpCleint.PreFixLength + 3]); + //更新时间 避免被自动退出 + Task.Run(() => + { + var shelves = ShelfManager.Shelves.Where(t => t.CurrentMode == Mode.出库模式 && t.OrderNumber == OrderNumber).ToList(); + foreach (var shelf in shelves) + { + shelf.SetCurrentModeTime = DateTime.Now; + } + }); //当前柜子是否还存在未出库的 diff --git a/WCS.BLL/Manager/MXBackgroundThread.cs b/WCS.BLL/Manager/MXBackgroundThread.cs index 1b6de7f..559dfed 100644 --- a/WCS.BLL/Manager/MXBackgroundThread.cs +++ b/WCS.BLL/Manager/MXBackgroundThread.cs @@ -1,10 +1,12 @@ using SqlSugar; using WCS.BLL.Config; using WCS.BLL.DbModels; +using WCS.BLL.HardWare; using WCS.BLL.Tool; using WCS.DAL; using WCS.DAL.Db; using WCS.DAL.Db.AuthDb; +using WCS.DAL.DbModels; using WCS.Model; using WCS.Model.ApiModel.InOutRecord; using WCS.Model.ApiModel.MXBackgroundThread; @@ -117,7 +119,54 @@ namespace WCS.BLL.Manager #endregion #region 定时任务:超时退出 出库、入库、盘点模式 + Task.Run(() => + { + while (true) + { + //每10s一次 + Thread.Sleep(10000); + try + { + #region 入库模式 + var inStoreShelf = ShelfManager.Shelves.Where(t => t.CurrentMode == Mode.入库模式) + .Where(t => DateTime.Now - t.SetCurrentModeTime >= TimeSpan.FromMinutes(3)) + .ToList(); + foreach (var shelf in inStoreShelf) + { + shelf.GoOutInstore(); + Logs.Write($"【定时任务:定时退出模式】货架【{shelf.ShelfCode}】超时(3min)未退出入库模式,系统后台自动退出!"); + } + #endregion + #region 出库模式 + //出库超过n分钟自动进入待机模式 + var outStoreShelf = ShelfManager.Shelves.Where(t => t.CurrentMode == Mode.出库模式) + .Where(t => DateTime.Now - t.SetCurrentModeTime >= TimeSpan.FromMinutes(5)) + .ToList(); + foreach (var shelf in outStoreShelf) + { + shelf.GoOutOutstore(); + Logs.Write($"【定时任务:定时退出模式】货架【{shelf.ShelfCode}】超时(5min)未退出出库模式,系统后台自动退出!"); + } + #endregion + + #region 盘点模式 + var stockTakingShelf = ShelfManager.Shelves.Where(t => t.CurrentMode == Mode.盘点模式) + .Where(t => DateTime.Now - t.SetCurrentModeTime >= TimeSpan.FromMinutes(5)) + .ToList(); + foreach (var shelf in stockTakingShelf) + { + shelf.GoOutStocktaking(); + Logs.Write($"【定时任务:定时退出模式】货架【{shelf.ShelfCode}】超时(5min)未退出盘点模式,系统后台自动退出!"); + } + #endregion + } + catch (Exception e) + { + Logs.Write("【定时任务:定时退出模式】" + e.Message,LogsType.Info); + } + } + }); #endregion #region 定时任务:海康未扫物料码的物料更新数据 @@ -212,7 +261,64 @@ namespace WCS.BLL.Manager }); #endregion - #region 定时任务:紧机复原和监测警示灯关灯机制 + #region 定时任务:监测警示灯关灯机制 + //判断灯颜色和模式是否对应 + Task.Run(() => + { + while (true) + { + //间隔5秒查询一次 + Thread.Sleep(5000); + try + { + //待机模式未关灯 + var shelves = ShelfManager.Shelves.Where(t => t.CurrentMode == Mode.待机模式 && t.LightColor != WarningLight.LightColorEnum.关闭) + .Where(t => t.SetCurrentModeTime < DateTime.Now.AddSeconds(-5)) + .ToList(); + foreach (var shelf in shelves) + { + try + { + if (shelf is SmartShelf) + { + var smartShelf = (SmartShelf)shelf; + smartShelf?.WarningLight.CloseLight(smartShelf.TcpCleint); + Logs.Write($"【定时任务】:监测警示灯关灯机制,关【{shelf.ShelfCode}】灯发送指令成功!"); + } + } + catch (Exception ex) + { + Logs.Write($"【定时任务】:监测警示灯关灯机制,关【{shelf.ShelfCode}】灯发生异常" + ex.Message); + } + } + + //出库模式未亮灯 + var outShelves = ShelfManager.Shelves.Where(t => t.CurrentMode == Mode.出库模式 && t.LightColor == WarningLight.LightColorEnum.关闭) + .Where(t => t.SetCurrentModeTime < DateTime.Now.AddSeconds(-5)) + .ToList(); + foreach (var shelf in outShelves) + { + try + { + if (shelf is SmartShelf) + { + var smartShelf = (SmartShelf)shelf; + smartShelf?.WarningLight.GreenLight(smartShelf.TcpCleint); + Logs.Write($"【定时任务】:监测警示灯关灯机制,出库开灯【{shelf.ShelfCode}】发送指令成功!"); + } + } + catch (Exception ex) + { + Logs.Write($"【定时任务】:监测警示灯关灯机制,出库开灯【{shelf.ShelfCode}】发生异常" + ex.Message); + } + } + } + catch (Exception ex) + { + Logs.Write("【定时任务】:监测警示灯关灯机制发生异常" + ex.Message); + } + } + }); #endregion } diff --git a/WCS.BLL/Manager/TCPClientManager.cs b/WCS.BLL/Manager/TCPClientManager.cs index 4c016f1..91ceedc 100644 --- a/WCS.BLL/Manager/TCPClientManager.cs +++ b/WCS.BLL/Manager/TCPClientManager.cs @@ -65,14 +65,14 @@ namespace WCS.BLL.Manager //获取板子ID var boardId = (dataTemp[TcpCleint.PreFixLength + 0] << 8) + dataTemp[TcpCleint.PreFixLength + 1]; var lightNumber = Convert.ToInt32(dataTemp[TcpCleint.PreFixLength + 3]); - //报警灯 + //报警灯 返回来就修改对应的灯的颜色 if (dataTemp[TcpCleint.PreFixLength + 2] == 0x20) { var shelf = ShelfManager.Shelves.Where(t => t.ClientIp == clientIpHost) .Where(t => t.LightId == boardId) .FirstOrDefault(); var smartShelf = shelf as SmartShelf; - smartShelf?.ProtocolProcess(dataTemp, boardId, lightNumber); + smartShelf?.WarningLightProcess(dataTemp, boardId, lightNumber); } //!= 0x20 货架类型协议返回 else diff --git a/WCS.BLL/Services/Service/InstoreService.cs b/WCS.BLL/Services/Service/InstoreService.cs index ece52b1..4937048 100644 --- a/WCS.BLL/Services/Service/InstoreService.cs +++ b/WCS.BLL/Services/Service/InstoreService.cs @@ -152,6 +152,8 @@ namespace WCS.BLL.Services.Service Message = $"操作失败:货架[{request.ShelfCode}]不在入库模式!\r\n当前为{shelf.CurrentMode}", }; } + //物料在入库模式,更新时间 避免被后台线程关闭 + shelf.SetCurrentModeTime = DateTime.Now; } #region 获取物料数据 //调用接口或者直接查询数据库 diff --git a/WCS.BLL/Services/Service/StockTakingService.cs b/WCS.BLL/Services/Service/StockTakingService.cs index e5195e3..b9821db 100644 --- a/WCS.BLL/Services/Service/StockTakingService.cs +++ b/WCS.BLL/Services/Service/StockTakingService.cs @@ -788,10 +788,21 @@ namespace WCS.BLL.Services.Service }; } shelf.ConfirmStocktakingSingle(stockTakingMatDetail.StoreInfo.BoardId, stockTakingMatDetail.StoreInfo.LightNumber); + + #endregion DbHelp.db.CommitTran(); - + //更新时间 避免被自动退出 + Task.Run(() => + { + var shelves = ShelfManager.Shelves.Where(t => t.CurrentMode == HardWare.Mode.盘点模式 && t.OrderNumber == request.StocktakingOrderNumber) + .ToList(); + foreach (var shelf in shelves) + { + shelf.SetCurrentModeTime = DateTime.Now; + } + }); #region 更新Order状态 Task.Run(() => { diff --git a/货架标准上位机/Views/OutInventoryView.xaml b/货架标准上位机/Views/OutInventoryView.xaml index b9c2092..d717323 100644 --- a/货架标准上位机/Views/OutInventoryView.xaml +++ b/货架标准上位机/Views/OutInventoryView.xaml @@ -132,7 +132,7 @@ - +