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 @@
-
+