From 375d6971cc0f5fa86f0158d3bbf4103a52dbfc36 Mon Sep 17 00:00:00 2001 From: hehaibing-1996 Date: Sat, 7 Dec 2024 17:52:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0MXL4=E6=A8=A1=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WCS.BLL/HardWare/IShelfBase.cs | 1 + WCS.BLL/HardWare/MXL4Shelf.cs | 389 ++++++++++++++ WCS.BLL/HardWare/MXL4ShelfModule.cs | 494 ++++++++++++++++++ WCS.BLL/Manager/ShelfManager.cs | 2 +- ...rningRequesr.cs => SolveWarningRequest.cs} | 0 5 files changed, 885 insertions(+), 1 deletion(-) create mode 100644 WCS.BLL/HardWare/MXL4Shelf.cs create mode 100644 WCS.BLL/HardWare/MXL4ShelfModule.cs rename WCS.Model/WebSocketModel/{SolveWarningRequesr.cs => SolveWarningRequest.cs} (100%) diff --git a/WCS.BLL/HardWare/IShelfBase.cs b/WCS.BLL/HardWare/IShelfBase.cs index af7a266..2b92858 100644 --- a/WCS.BLL/HardWare/IShelfBase.cs +++ b/WCS.BLL/HardWare/IShelfBase.cs @@ -42,6 +42,7 @@ namespace WCS.BLL.HardWare public LightColorEnum LightColor { get; set; } public List ModuleIds { get; set; } public List Modules { get; set; } + public List MXL4Modules { get; set; } public string ClientIp { get; set; } /// /// 货架当前模式 diff --git a/WCS.BLL/HardWare/MXL4Shelf.cs b/WCS.BLL/HardWare/MXL4Shelf.cs new file mode 100644 index 0000000..e0fa760 --- /dev/null +++ b/WCS.BLL/HardWare/MXL4Shelf.cs @@ -0,0 +1,389 @@ +using System; +using WCS.BLL.Config; +using WCS.BLL.DbModels; +using WCS.BLL.Manager; +using WCS.DAL.Db; +using WCS.DAL.DbModels; +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 +{ + /// + /// 智能货架 + /// + public class MXL4Shelf : IShelfBase + { + public MXL4Shelf(ShelfInfo shelfInfo) + { + ShelfId = shelfInfo.Id; + ShelfCode = shelfInfo.ShelfCode; + RowCounts = shelfInfo.Rowcounts; + ColumnCounts = shelfInfo.Columncounts; + SetCurrentMode(Mode.待机模式); + ClientIp = shelfInfo.ClientIp; + LightId = shelfInfo.LightId; + WarningLight = new WarningLight() { LightId = shelfInfo.LightId }; + + //初始化Module + Task.Run(() => + { + var modules = DbHelp.db.Queryable().Where(t => t.ShelfId == ShelfId).ToList(); + foreach (var module in modules) + { + MXL4Modules.Add(new MXL4ShelfModule() + { + ModuleId = module.Id, + ModuleCode = module.ModuleCode, + BoardId = module.BoardId, + IsEnable = module.IsEnable, + CurrentMode = module.CurrentMode + }); + } + ModulesStr = string.Join(";", MXL4Modules.Select(t => t.ModuleCode)); + + ModuleIds = MXL4Modules.Select(t => t.BoardId).ToList(); + }); + } + + + public int ShelfId { get; set; } + public string ShelfCode { get; set; } + 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 List MXL4Modules { 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() + { + if (this.CurrentMode == Mode.入库模式) + { + WarningLight.BlueLight(TcpCleint); + } + else if (this.CurrentMode == Mode.出库模式) + { + WarningLight.GreenLight(TcpCleint); + } + else if (this.CurrentMode == Mode.盘点模式) + { + WarningLight.GreenLight(TcpCleint); + } + else + { + WarningLight.CloseLight(TcpCleint); + } + } + /// + /// 自检异常、未响应对应模式的异常 + /// + public List ExceptionMessages { get; set; } = new List(); + /// + /// 过程中异常 入库过程中异常/出库过程中异常 + /// + public List ProcessingExceptions { get; set; } = new List(); + public string? CurrentCom { get; set; } = string.Empty; + + public MatInfoResponse InStoreData { get; set; } + + public List CurrentOutStoreMatSNs { get; set; } = new List(); + + public OutOrder CurrentOutOrder { get; set; } + + public string OrderNumber { get; set; } + + public StockTakingOrder CurrentStockTakingOrder { get; set; } + + public List ModuleIds { get; set; } + public string ClientIp { get; set; } + + //websocket通知的前端的IP地址 + public string WebSocketIpAddress { get; set; } = "127.0.0.2"; + + public string OutOperateUser { get; set; } = string.Empty; + #region 协议处理 + public void GoInInstore(string? IPAddress) + { + + } + + public void GoOutInstore() + { + + } + + /// + /// 由自检异常等错误导致的 手动操作处理后重新进入出库模式 + /// + /// + public void GoInOutstoreByWebSocket(int moduleId) + { + + } + public void GoInOutstore(List MatDetails, OutOrder outOrder, string OperateUser) + { + + } + public void GoOutOutstore() + { + + } + + public void GoInStocktaking(List MatDetails, StockTakingOrder stockTakingOrder) + { + + } + /// + /// 确认盘点 Pda进行触发 + /// + public bool ConfirmStocktakingSingle(int BoardId, int LightNumber) + { + return false; + } + public void GoOutStocktaking() + { + + } + + public void Reset() + { + + } + + public void QueryVoltage(int moduleId) + { + + } + + public void CalibrationSetOffset(int moduleId, int offSet) + { + + } + + public void SetCurrentMode(Mode mode) + { + 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() + { + + } + + public void ShelfCheck() + { + + } + #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) + { + //协议处理 判断功能位 + switch (data[TcpCleint.PreFixLength + 2]) + { + case 0x01://进入入库模式返回信号 + GoInInstoreProcess(data, boardId, lightNumber); + break; + case 0x02://退出入库模式返回信号 + GoOutInstoreProcess(data, boardId, lightNumber); + break; + case 0x03://正常入库信号 + InStoreReturnProcess(data); + break; + case 0x04://入库模式中异常信号 + InStoreExceptionReturnProcess(data, boardId, lightNumber); + break; + case 0x05://进入出库模式返回信号 + GoInOutstoreProcess(data, boardId, lightNumber); + break; + case 0x06://退出出库模式返回信号 + GoOutOutstoreProcess(data, boardId, lightNumber); + break; + case 0x07://正常出库返回信号 + OutstoreReturnProcess(data, boardId, lightNumber); + break; + case 0x08://出库模式中异常信号 + OutstoreExceptionReturnProcess(data, boardId, lightNumber); + break; + case 0x09://进入盘点模式返回信号 + GoInStockTakingReturnProcess(data, boardId, lightNumber); + break; + case 0x0A://退出盘点模式返回信号 + GoOutStockTakingReturnProcess(data, boardId, lightNumber); + break; + case 0x13://复位的返回信号 + ResetReturnProcess(data, boardId, lightNumber); + break; + case 0x17://电压值1 + QueryVoltageProcess(data, boardId, lightNumber); + break; + case 0x18://电压值2 + QueryVoltageProcess(data, boardId, lightNumber); + break; + case 0x19://电压值3 + QueryVoltageProcess(data, boardId, lightNumber); + break; + case 0x0B://自检结果反馈 + SelfCheckProcess(data, boardId, lightNumber); + break; + default: + ; + break; + + } + } + /// + /// 进入入库模式返回信号处理 + /// + /// + public void GoInInstoreProcess(byte[] data, int boardId, int lightNumber) + { + } + + /// + /// 退出入库模式返回信号处理 + /// + /// + public void GoOutInstoreProcess(byte[] data, int boardId, int lightNumber) + { + } + + /// + /// 正常入库信号 + /// + /// + public void InStoreReturnProcess(byte[] data) + { + } + + /// + /// 入库模式中异常处理 + /// + /// + /// + /// + public void InStoreExceptionReturnProcess(byte[] data, int boardId, int lightNumber) + { + } + + /// + /// 进入出库模式协议返回 + /// + /// + /// + /// + public void GoInOutstoreProcess(byte[] data, int boardId, int lightNumber) + { + + } + + public void OutstoreReturnProcess(byte[] data, int boardId, int lightNumber) + { + } + + /// + /// 退出出库模式返回信号处理 + /// + /// + public void GoOutOutstoreProcess(byte[] data, int boardId, int lightNumber) + { + } + + /// + /// 出库模式中异常处理 + /// + /// + /// + /// + public void OutstoreExceptionReturnProcess(byte[] data, int boardId, int lightNumber) + { + + } + + /// + /// 进入盘点模式返回信号 + /// + /// + /// + /// + public void GoInStockTakingReturnProcess(byte[] data, int boardId, int lightNumber) + { + + } + + public void GoOutStockTakingReturnProcess(byte[] data, int boardId, int lightNumber) + { + } + + public void ResetReturnProcess(byte[] data, int boardId, int lightNumber) + { + } + + public void QueryVoltageProcess(byte[] data, int boardId, int lightNumber) + { + } + + public void SelfCheckProcess(byte[] data, int boardId, int lightNumber) + { + } + #endregion + } +} diff --git a/WCS.BLL/HardWare/MXL4ShelfModule.cs b/WCS.BLL/HardWare/MXL4ShelfModule.cs new file mode 100644 index 0000000..1b9abfe --- /dev/null +++ b/WCS.BLL/HardWare/MXL4ShelfModule.cs @@ -0,0 +1,494 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; +using TouchSocket.Core; +using WCS.BLL.Config; +using WCS.DAL.Db; +using WCS.DAL.DbModels; + +namespace WCS.BLL.HardWare +{ + public class MXL4ShelfModule : IModuleBase + { + #region 协议 + /// + /// 进入入库模式 + /// + public byte[] GoInInstoreData = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + + /// + /// 确认入库 + /// + public byte[] ComfirmInstoreData = { 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + + public byte[] ComfirmErrInstoreData = { 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + + /// + /// 退出入库模式 + /// + public byte[] GoOutInstoreData = { 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + + /// + /// 自检模式 + /// + public byte[] CheckModeData = { 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + + /// + /// 进入出库模式 + /// + public byte[] GoInOutstoreModeData = { 0x05, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00 }; + + /// + /// 确认出库信号 + /// + public byte[] ComfirmOutstoreData = { 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + /// + /// 退出出库模式 + /// + public byte[] GoOutOutstoreModeData = { 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + + /// + /// 进入盘点模式 + /// 04代表颜色为蓝色色 + /// + public byte[] GoInStockTakingModeData = { 0x09, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00 }; + /// + /// 确认盘点 + /// 03代表颜色为黄色 + /// + public byte[] ConfirmStockTakingData = { 0x09, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00 }; + + /// + /// 退出盘点模式 + /// + public byte[] GoOutStockTakingModeData = { 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + + /// + /// 复位命令 + /// + public byte[] ResetData = { 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + /// + /// 查询当前电压值 + /// + public byte[] VoltageSingleData = { 0x17, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + /// + /// 查询电压偏移值 + /// + public byte[] OffsetSingleData = { 0x18, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + /// + /// 查询电压标准值 + /// + public byte[] StandardSingleData = { 0x19, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + + /// + /// 标定 + /// + public byte[] CalibrationData = { 0x0D, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + /// + /// 设置偏移量 01 F4 = 500 + /// + public byte[] SetOffsetData = { 0x0E, 0x0A, 0x01, 0xF4, 0x00, 0x00, 0x00, 0x00 }; + + #endregion + public int ModuleId { get; set; } + public string ModuleCode { get; set; } + public int BoardId { get; set; } + public bool IsEnable { get; set; } + public Mode CurrentMode { get; set; } + /// + /// 是否已发送自检命令 + /// + public bool IsSelfCheck { get; set; } = false; + public List CurrentOutSns { get; set; } + public List CurrentStockTakingSns { get; set; } + + public void SetCurrentMode() + { + + } + + public void GoInInstoreMode(TCPClient tcpClient) + { + if (CurrentMode != Mode.待机模式) + { + //TO DO 退出对应的模式 然后再发送进入入库模式 + } + var storeInfos = DbHelp.db.Queryable() + .Where(t => t.ModuleId == ModuleId) + .Where(t => t.BoardId == BoardId) + .OrderBy(t => t.LightNumber) + .ToList(); + char[] data = "0000000000000000".ToCharArray(); + + //禁用 + char[] dataBan = "0000000000000000".ToCharArray(); + + var boardStoreNumber = storeInfos.Count(); + foreach (var storeInfo in storeInfos) + { + if (!string.IsNullOrEmpty(storeInfo.CurrentMatSn) && storeInfo.LightNumber > 0 && storeInfo.LightNumber <= boardStoreNumber) + { + data[storeInfo.LightNumber - 1] = '1'; + + //禁用 + if (storeInfo.CurrentMatSn == "禁用") + { + dataBan[storeInfo.LightNumber - 1] = '1'; + } + } + } + var dataStr = string.Join("", data.Reverse()); + var data1 = dataStr.Substring(8, 8); + var data2 = dataStr.Substring(0, 8); + GoInInstoreData[1] = Convert.ToByte(data1, 2); + GoInInstoreData[2] = Convert.ToByte(data2, 2); + + //禁用 + var dataBanStr = string.Join("", dataBan.Reverse()); + var data1Ban = dataBanStr.Substring(8, 8); + var data2Ban = dataBanStr.Substring(0, 8); + GoInInstoreData[6] = Convert.ToByte(data1Ban, 2); + GoInInstoreData[7] = Convert.ToByte(data2Ban, 2); + + tcpClient.Send(tcpClient.GenerateMessage(BoardId, GoInInstoreData)); + } + + public void ComfirmInstore(TCPClient tcpClient) + { + tcpClient.Send(tcpClient.GenerateMessage(BoardId, ComfirmInstoreData)); + } + + public void ComfirmErrInstore(TCPClient tcpClient) + { + tcpClient.Send(tcpClient.GenerateMessage(BoardId, ComfirmErrInstoreData)); + } + + public void GoOutInstoreMode(TCPClient tcpClient) + { + if (CurrentMode == Mode.入库模式) + { + tcpClient.Send(tcpClient.GenerateMessage(BoardId, GoOutInstoreData)); + } + else + { + //这里应该是状态异常的 正常不会是这种状态 + Reset(tcpClient); + } + } + + /// + /// 复位 + /// + /// + public void Reset(TCPClient tcpClient) + { + tcpClient.Send(tcpClient.GenerateMessage(BoardId, ResetData)); + } + + /// + /// 自检 + /// + /// + public void ShelfCheck(TCPClient tcpClient) + { + if (CurrentMode != Mode.待机模式) + { + return; + } + var storeInfos = DbHelp.db.Queryable() + .Where(t => t.ModuleId == ModuleId) + .Where(t => t.BoardId == BoardId) + .OrderBy(t => t.LightNumber) + .ToList(); + char[] data = "0000000000000000".ToCharArray(); + //禁用功能 + char[] dataBan = "0000000000000000".ToCharArray(); + + var boardStoreNumber = storeInfos.Count(); + foreach (var storeInfo in storeInfos) + { + if (!string.IsNullOrEmpty(storeInfo.CurrentMatSn) && storeInfo.LightNumber > 0 && storeInfo.LightNumber <= boardStoreNumber) + { + data[storeInfo.LightNumber - 1] = '1'; + + //禁用功能 + if (storeInfo.CurrentMatSn == "禁用") + { + dataBan[storeInfo.LightNumber - 1] = '1'; + } + } + } + var dataStr = string.Join("", data.Reverse()); + var data1 = dataStr.Substring(8, 8); + var data2 = dataStr.Substring(0, 8); + CheckModeData[1] = Convert.ToByte(data1, 2); + CheckModeData[2] = Convert.ToByte(data2, 2); + + //禁用功能 + var dataBanStr = string.Join("", dataBan.Reverse()); + var data1Ban = dataBanStr.Substring(8, 8); + var data2Ban = dataBanStr.Substring(0, 8); + CheckModeData[6] = Convert.ToByte(data1Ban, 2); + CheckModeData[7] = Convert.ToByte(data2Ban, 2); + + tcpClient.Send(tcpClient.GenerateMessage(BoardId, CheckModeData)); + } + + /// + /// 进入出库模式、亮灯 + /// + /// + public void GoInOutStoreMode(TCPClient tcpClient, List outSns) + { + Logs.Write($"模组{ModuleCode},本次亮灯物料{string.Join(",", outSns)}", LogsType.Outstore); + CurrentOutSns = outSns; + var storeInfos = DbHelp.db.Queryable().Where(t => t.ModuleId == ModuleId) + .Where(t => t.BoardId == BoardId) + .OrderBy(t => t.LightNumber) + .ToList(); + //计算物料在库的库位 + char[] data = "0000000000000000".ToCharArray(); + + //计算禁用的库位 + char[] dataBan = "0000000000000000".ToCharArray(); + + var storeNumber = storeInfos.Count(); + foreach (var storeInfo in storeInfos) + { + if (!string.IsNullOrEmpty(storeInfo.CurrentMatSn) && storeInfo.LightNumber > 0 && storeInfo.LightNumber <= storeNumber) + { + data[storeInfo.LightNumber - 1] = '1'; + //禁用 + if (storeInfo.CurrentMatSn == "禁用") + { + dataBan[storeInfo.LightNumber - 1] = '1'; + } + } + } + var dataStr = string.Join("", data.Reverse()); + var data1 = dataStr.Substring(8, 8); + var data2 = dataStr.Substring(0, 8); + GoInOutstoreModeData[1] = Convert.ToByte(data1, 2); + GoInOutstoreModeData[2] = Convert.ToByte(data2, 2); + + //禁用 + var dataBanStr = string.Join("", dataBan.Reverse()); + var data1Ban = dataBanStr.Substring(8, 8); + var data2Ban = dataBanStr.Substring(0, 8); + GoInOutstoreModeData[6] = Convert.ToByte(data1Ban, 2); + GoInOutstoreModeData[7] = Convert.ToByte(data2Ban, 2); + + //出库位置亮灯 + if (outSns != null && outSns.Count > 0) + { + var outStoreInfos = storeInfos.Where(t => outSns.Contains(t.CurrentMatSn)) + .ToList(); + char[] outData = "0000000000000000".ToCharArray(); + foreach (var storeInfo in outStoreInfos) + { + if (!string.IsNullOrEmpty(storeInfo.CurrentMatSn) && storeInfo.LightNumber > 0 && storeInfo.LightNumber <= storeNumber) + { + outData[storeInfo.LightNumber - 1] = '1'; + } + } + var outDataStr = string.Join("", outData.Reverse()); + var data3 = outDataStr.Substring(8, 8); + var data4 = outDataStr.Substring(0, 8); + GoInOutstoreModeData[3] = Convert.ToByte(data3, 2); + GoInOutstoreModeData[4] = Convert.ToByte(data4, 2); + + if (LocalFile.Config.IsSameMatCodeOut) + { + GoInOutstoreModeData[5] = LocalStatic.CurrentOutStoreColor; + } + else + { + GoInOutstoreModeData[5] = 0x02; + } + } + tcpClient.Send(tcpClient.GenerateMessage(BoardId, GoInOutstoreModeData)); + } + public void ComfirmOutstore(TCPClient tcpClient, byte lightNumber) + { + ComfirmOutstoreData[1] = lightNumber; + tcpClient.Send(tcpClient.GenerateMessage(BoardId, ComfirmOutstoreData)); + } + /// + /// 退出出库模式 + /// + /// + public void GoOutOutStoreMode(TCPClient tcpClient) + { + tcpClient.Send(tcpClient.GenerateMessage(BoardId, GoOutOutstoreModeData)); + } + + /// + /// 未盘点的物料进入盘点模式、亮灯 + /// + /// + public void GoInStockTakingMode(TCPClient tcpClient, List stockTakingSns) + { + CurrentStockTakingSns = stockTakingSns; + + var storeInfos = DbHelp.db.Queryable().Where(t => t.ModuleId == ModuleId) + .Where(t => t.BoardId == BoardId) + .OrderBy(t => t.LightNumber) + .ToList(); + //计算物料在库的库位 + char[] data = "0000000000000000".ToCharArray(); + var storeNumber = storeInfos.Count(); + + char[] outData = "0000000000000000".ToCharArray(); + //盘点位置亮灯 + if (stockTakingSns != null && stockTakingSns.Count > 0) + { + var outStoreInfos = storeInfos.Where(t => stockTakingSns.Contains(t.CurrentMatSn)) + .ToList(); + foreach (var storeInfo in outStoreInfos) + { + if (!string.IsNullOrEmpty(storeInfo.CurrentMatSn) && storeInfo.LightNumber > 0 && storeInfo.LightNumber <= storeNumber) + { + outData[storeInfo.LightNumber - 1] = '1'; + } + } + } + var outDataStr = string.Join("", outData.Reverse()); + var data3 = outDataStr.Substring(8, 8); + var data4 = outDataStr.Substring(0, 8); + GoInStockTakingModeData[2] = Convert.ToByte(data3, 2); + GoInStockTakingModeData[3] = Convert.ToByte(data4, 2); + + tcpClient.Send(tcpClient.GenerateMessage(BoardId, GoInStockTakingModeData)); + } + + /// + /// 已确认过的物料 + /// + /// + public void ConfirmStockTaking(TCPClient tcpClient, List stockTakingSns) + { + CurrentStockTakingSns = stockTakingSns; + + var storeInfos = DbHelp.db.Queryable().Where(t => t.ModuleId == ModuleId) + .Where(t => t.BoardId == BoardId) + .OrderBy(t => t.LightNumber) + .ToList(); + //计算物料在库的库位 + char[] data = "0000000000000000".ToCharArray(); + var storeNumber = storeInfos.Count(); + + char[] outData = "0000000000000000".ToCharArray(); + //盘点位置亮灯 + if (stockTakingSns != null && stockTakingSns.Count > 0) + { + var outStoreInfos = storeInfos.Where(t => stockTakingSns.Contains(t.CurrentMatSn)) + .ToList(); + foreach (var storeInfo in outStoreInfos) + { + if (!string.IsNullOrEmpty(storeInfo.CurrentMatSn) && storeInfo.LightNumber > 0 && storeInfo.LightNumber <= storeNumber) + { + outData[storeInfo.LightNumber - 1] = '1'; + } + } + } + + var outDataStr = string.Join("", outData.Reverse()); + var data3 = outDataStr.Substring(8, 8); + var data4 = outDataStr.Substring(0, 8); + ConfirmStockTakingData[2] = Convert.ToByte(data3, 2); + ConfirmStockTakingData[3] = Convert.ToByte(data4, 2); + + tcpClient.Send(tcpClient.GenerateMessage(BoardId, ConfirmStockTakingData)); + } + + /// + /// 单个确认物料 + /// + /// + public void ConfirmStockTakingSingle(TCPClient tcpClient, int lightNumber) + { + var storeInfos = DbHelp.db.Queryable().Where(t => t.ModuleId == ModuleId) + .Where(t => t.BoardId == BoardId) + .OrderBy(t => t.LightNumber) + .ToList(); + //计算物料在库的库位 + char[] data = "0000000000000000".ToCharArray(); + var storeNumber = storeInfos.Count(); + + //盘点位置亮灯 + var outStoreInfos = storeInfos.Where(t => t.LightNumber == lightNumber) + .ToList(); + char[] outData = "0000000000000000".ToCharArray(); + foreach (var storeInfo in outStoreInfos) + { + if (!string.IsNullOrEmpty(storeInfo.CurrentMatSn) && storeInfo.LightNumber > 0 && storeInfo.LightNumber <= storeNumber) + { + outData[storeInfo.LightNumber - 1] = '1'; + } + } + var outDataStr = string.Join("", outData.Reverse()); + var data3 = outDataStr.Substring(8, 8); + var data4 = outDataStr.Substring(0, 8); + ConfirmStockTakingData[2] = Convert.ToByte(data3, 2); + ConfirmStockTakingData[3] = Convert.ToByte(data4, 2); + + tcpClient.Send(tcpClient.GenerateMessage(BoardId, ConfirmStockTakingData)); + } + + + /// + /// 退出盘点模式 + /// + /// + public void GoOutStockTakingMode(TCPClient tcpClient) + { + tcpClient.Send(tcpClient.GenerateMessage(BoardId, GoOutStockTakingModeData)); + } + + public void ComfirmStockTaking(TCPClient tcpClient, byte lightNumber) + { + ComfirmOutstoreData[1] = lightNumber; + tcpClient.Send(tcpClient.GenerateMessage(BoardId, ComfirmOutstoreData)); + } + + /// + /// 查询电压值 + /// + /// + public void QueryVoltage(TCPClient tcpClient) + { + Thread.Sleep(10); + Task.Run(() => + { + tcpClient.Send(tcpClient.GenerateMessage(BoardId, VoltageSingleData)); + Thread.Sleep(50); + tcpClient.Send(tcpClient.GenerateMessage(BoardId, StandardSingleData)); + Thread.Sleep(50); + tcpClient.Send(tcpClient.GenerateMessage(BoardId, OffsetSingleData)); + }); + } + + public void CalibrationSetOffset(int offSet, TCPClient tcpClient) + { + var offSetData = BitConverter.GetBytes(unchecked((short)offSet)); + // 检查是否需要交换字节 + if (BitConverter.IsLittleEndian) + { + // 如果是小端序系统,则交换字节 + byte temp = offSetData[0]; + offSetData[0] = offSetData[1]; + offSetData[1] = temp; + } + + SetOffsetData[2] = offSetData[0]; + SetOffsetData[3] = offSetData[1]; + + tcpClient.Send(tcpClient.GenerateMessage(BoardId, CalibrationData)); + Thread.Sleep(100); + tcpClient.Send(tcpClient.GenerateMessage(BoardId, SetOffsetData)); + } + } +} diff --git a/WCS.BLL/Manager/ShelfManager.cs b/WCS.BLL/Manager/ShelfManager.cs index 7d42a2b..8efc6da 100644 --- a/WCS.BLL/Manager/ShelfManager.cs +++ b/WCS.BLL/Manager/ShelfManager.cs @@ -54,7 +54,7 @@ namespace WCS.BLL.Manager GroupName = shelfInDb.GroupName, }; case 3: - return new SmartShelf(shelfInDb) + return new MXL4Shelf(shelfInDb) { ShelfId = shelfInDb.Id, ShelfCode = shelfInDb.ShelfCode, diff --git a/WCS.Model/WebSocketModel/SolveWarningRequesr.cs b/WCS.Model/WebSocketModel/SolveWarningRequest.cs similarity index 100% rename from WCS.Model/WebSocketModel/SolveWarningRequesr.cs rename to WCS.Model/WebSocketModel/SolveWarningRequest.cs