diff --git a/.vs/HighWayIot/FileContentIndex/4d356083-a032-4659-9a68-eace8a9c9f6a.vsidx b/.vs/HighWayIot/FileContentIndex/4d356083-a032-4659-9a68-eace8a9c9f6a.vsidx new file mode 100644 index 00000000..3808fcc3 Binary files /dev/null and b/.vs/HighWayIot/FileContentIndex/4d356083-a032-4659-9a68-eace8a9c9f6a.vsidx differ diff --git a/.vs/HighWayIot/FileContentIndex/e3284d0f-3199-485f-b814-25228ce4cb26.vsidx b/.vs/HighWayIot/FileContentIndex/e3284d0f-3199-485f-b814-25228ce4cb26.vsidx deleted file mode 100644 index 6d6819f9..00000000 Binary files a/.vs/HighWayIot/FileContentIndex/e3284d0f-3199-485f-b814-25228ce4cb26.vsidx and /dev/null differ diff --git a/.vs/HighWayIot/v17/.suo b/.vs/HighWayIot/v17/.suo index d37db6ec..45755741 100644 Binary files a/.vs/HighWayIot/v17/.suo and b/.vs/HighWayIot/v17/.suo differ diff --git a/Aucma.Scada.Business/InStoreBusiness.cs b/Aucma.Scada.Business/InStoreBusiness.cs index 125a8799..c9b77a47 100644 --- a/Aucma.Scada.Business/InStoreBusiness.cs +++ b/Aucma.Scada.Business/InStoreBusiness.cs @@ -10,6 +10,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using static Aucma.Scada.Business.InStoreTaskHandle; namespace Aucma.Scada.Business { @@ -95,7 +96,11 @@ namespace Aucma.Scada.Business _baseBomInfoService = registerServices.GetService(); _recordInStoreService = registerServices.GetService(); - taskHandle.InStoreFinsihEvent += FoamTaskFeedback; + //taskHandle.InStoreFinsihEvent += FoamTaskFeedback; + + taskHandle.InStoreFinsihEvent += InStoreFinish; + taskHandle.InStoreAnswerEvent += InStoreAnswer; + grabImage.RefreshMaterialCodeStrEvent += InStore; grabImage.RefreshLogMessageEvent += PrintLogInfoMessage; StartPassDown(); @@ -122,12 +127,13 @@ namespace Aucma.Scada.Business PrintLogInfoMessage($"扫码成功,物料码:{materialCode}"); string materialType = SubStringMaterialCode(materialCode); #region Delete By wenjy 2023-10-30 11:41:00 取消通过数据库获取货道数量、在途量,改为通过PLC获取货道信息 - var spaceInfo = _spaceInfoService.InStoreGetSpaceInfoByMaterialType(appConfig.foamStoreCode, materialType); + //var spaceInfo = _spaceInfoService.InStoreGetSpaceInfoByMaterialType(appConfig.foamStoreCode, materialType); #endregion - //var spaceInfo = GetSpaceInfoByMaterialType(appConfig.foamStoreCode, materialType); + var spaceInfo = GetSpaceInfoByMaterialType(appConfig.foamStoreCode, materialType); if (spaceInfo != null) { PrintLogInfoMessage($"匹配货道:{spaceInfo.spaceName}"); + spaceInfo.materialType = materialType; RefreshScanMateriaCodeEvent?.Invoke(materialCode, GetMaterialName(materialType), spaceInfo.spaceName, appConfig.foamStoreCode); //刷新界面扫码信息 var result = CreateInStoreTask(spaceInfo, materialCode); //创建入库任务 if (result) @@ -232,28 +238,17 @@ namespace Aucma.Scada.Business if (taskHandle.SendFoamTask_InStore(taskInfo)) { PrintLogInfoMessage($"泡后入库任务:{taskInfo.taskCode};下发成功,等待PLC执行反馈"); + + semaphore.Wait(); //一直堵塞直到信号量释放 + + PrintLogInfoMessage($"泡后入库任务:{taskInfo.taskCode};开始执行"); + taskInfo.taskStatus = 2; _taskInfoService.UpdateTaskInfo(taskInfo); RefreshInStoreTaskEvent?.Invoke(taskInfo); - //if (semaphore.Wait(TimeSpan.FromSeconds(20))) - //{ - // // 收到反馈 - // PrintLogInfoMessage("收到反馈,继续执行"); - //} - //else - //{ - // PrintLogInfoMessage("超时未反馈"); - //} - - semaphore.Wait(); //一直堵塞直到信号量释放 - - PrintLogInfoMessage($"泡后入库任务:{taskInfo.taskCode};执行完成"); - - RefreshInStoreTaskEvent?.Invoke(taskInfo,true); - } else { @@ -265,7 +260,6 @@ namespace Aucma.Scada.Business { PrintLogInfoMessage("未获取到需要下发的泡后入库任务"); } - Thread.Sleep(3000); } /// @@ -311,17 +305,27 @@ namespace Aucma.Scada.Business } /// - /// 泡后执行反馈 + /// 入库应答,PLC收到入库任务后进行应答 /// - private void FoamTaskFeedback(string taskCode) + /// + /// + private void InStoreAnswer(string storeCode, string taskCode) { - - PrintLogInfoMessage("泡后执行完成,自动释放信号量"); - - InStoreFinish(taskCode); + PrintLogInfoMessage("PLC应答成功,自动释放信号量,进行下发新任务"); semaphore.Release(); + } + + /// + /// 入库完成 + /// + /// + /// + private void InStoreFinish(string storeCode, string taskCode) + { + PrintLogInfoMessage($"出库任务:{taskCode};执行完成"); + InStoreFinish(taskCode); } #endregion @@ -343,7 +347,8 @@ namespace Aucma.Scada.Business if (spaceInfo != null) { - spaceInfo.materialType = taskInfo.materialType; + taskHandle.WritePlc(spaceInfo.storeCode, spaceInfo.spaceCode, true); + //spaceInfo.materialType = taskInfo.materialType; spaceInfo.spaceStock = spaceInfo.spaceStock + 1; spaceInfo.onRouteAmount -= 1; @@ -367,7 +372,7 @@ namespace Aucma.Scada.Business _baseSpaceDetailService.InsertSpaceDetail(spaceDetail); #endregion - #region 添加入库任务 + #region 添加入库记录 RecordInstore recordInstore = new RecordInstore(); recordInstore.storeCode = taskInfo.storeCode; recordInstore.spaceCode = taskInfo.spaceCode; @@ -384,7 +389,7 @@ namespace Aucma.Scada.Business //清除任务信息 _taskInfoService.DeleteTaskInfo(taskCode, appConfig.foamStoreCode); } - + RefreshInStoreTaskEvent?.Invoke(taskInfo, true); } catch (Exception ex) { @@ -474,6 +479,8 @@ namespace Aucma.Scada.Business return groups; } + #region 通过PLC读取货道信息:在库、在途、货道状态 + /// /// 通过PLC读取货道信息(在途数量、在库数量、货道状态) /// /// @@ -491,15 +498,14 @@ namespace Aucma.Scada.Business { if (info.Count > 0) { - foreach (BaseSpaceInfo item in info) + result = GetSpaceInfosByPlc(info); + + if (result == null) { - var spaceInfo = taskHandle.ReadSpaceInfoByPlc(item); - item.spaceStock = spaceInfo.spaceStock; - item.onRouteAmount = spaceInfo.onRouteAmount; - item.spaceStatus = spaceInfo.spaceStatus; - } + var list = _spaceInfoService.GetEmptySpaceInfo(storeCode); - result = info.Where(x => x.spaceStatus == 1 && x.spaceStock > 0 ? x.spaceCapacity > (x.spaceStock + x.onRouteAmount) : 1 == 1).OrderByDescending(x => x.spaceStock).OrderBy(x => x.spaceCode).First(); + result = GetSpaceInfosByPlc(list); + } } } @@ -511,5 +517,41 @@ namespace Aucma.Scada.Business return result; } + + /// + /// 读取PLC货道信息 + /// + /// + /// + private BaseSpaceInfo GetSpaceInfosByPlc(List info) + { + BaseSpaceInfo result = null; + if (info != null) + { + if (info.Count > 0) + { + foreach (BaseSpaceInfo item in info) + { + var spaceInfo = taskHandle.ReadSpaceInfoByPlc(item); + + item.spaceStock = spaceInfo.spaceStock; + item.onRouteAmount = spaceInfo.onRouteAmount; + item.spaceStatus = spaceInfo.spaceStatus; + + PrintLogInfoMessage($"通过PLC读取货道信息,货道:{spaceInfo.spaceName};在库数量:{item.spaceStock};在途数量:{item.onRouteAmount};货道状态:{item.spaceStatus}"); + } + + var list = info.Where(x => x.spaceStock > 0 ? x.spaceCapacity > (x.spaceStock + x.onRouteAmount) : 1 == 1 && x.spaceStatus == 1).ToList(); + + if (list.Count > 0) + { + result = list.OrderByDescending(x => x.spaceStock).OrderBy(x => x.spaceCode).First(); + } + + } + } + return result; + } + #endregion } } diff --git a/Aucma.Scada.Business/InStoreTaskHandle.cs b/Aucma.Scada.Business/InStoreTaskHandle.cs index ada84b6a..02e22ea7 100644 --- a/Aucma.Scada.Business/InStoreTaskHandle.cs +++ b/Aucma.Scada.Business/InStoreTaskHandle.cs @@ -4,6 +4,7 @@ using HighWayIot.Log4net; using HighWayIot.Plc; using System; using System.Collections.Generic; +using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -39,26 +40,43 @@ namespace Aucma.Scada.Business #region 私有变量 private Dictionary _plcDictionary = new Dictionary(); + private Dictionary foamRearKeyValuePairs = new Dictionary(); /// /// 泡后任务编号,PLC反馈后进行赋值 /// private string foamTaskCode = string.Empty; + /// + /// 已下传的任务信息 + /// + private List foamRearTaskInfos = new List(); + #endregion #region 委托事件 /// /// 入库完成 /// + /// /// - public delegate void InStoreFinsih( string taskCode); + public delegate void InStoreFinsih(string storeCode, string taskCode); public event InStoreFinsih InStoreFinsihEvent; + + /// + /// 入库应答,PLC收到下发的入库任务后进行应答 + /// + /// + /// + public delegate void InStoreAnswer(string storeCode, string taskCode); + public event InStoreAnswer InStoreAnswerEvent; #endregion private InStoreTaskHandle() { _plcDictionary = _pool.GetAll(); + + RealReadPlcSpace(); } #region 泡后入库任务下发处理 @@ -81,7 +99,7 @@ namespace Aucma.Scada.Business _plc.writeStringByAddress(plcConfig.in_foam_task, taskInfo.taskCode); //写入完成后读取应答字进行复位 - ReadShellAnswer_InStore(taskInfo.taskCode); + ReadShellAnswer_InStore(taskInfo); result = true; } @@ -106,7 +124,7 @@ namespace Aucma.Scada.Business /// /// 读取泡后入库应答 /// - private void ReadShellAnswer_InStore(string taskCode) + private void ReadShellAnswer_InStore(RealTaskInfo taskInfo) { lock (string.Empty) { @@ -133,7 +151,12 @@ namespace Aucma.Scada.Business _plc.writeStringByAddress(plcConfig.in_foam_task, string.Empty); isFlag = false; - ReadShellFinish_InStore(taskCode); + WritePlc(taskInfo.storeCode, taskInfo.spaceCode, false); + + //ReadShellFinish_InStore(taskCode); + InStoreAnswerEvent?.Invoke(appConfig.shellStoreCode, taskInfo.taskCode); + + foamRearTaskInfos.Add(taskInfo); } Thread.Sleep(1000); @@ -157,60 +180,136 @@ namespace Aucma.Scada.Business } } + #endregion + + + #region 读取PLC入库完成 Delete By Wenjy 2023-11-08 15:05:00,经讨论入库完成改为监测在途数量变化 /// /// 读取泡后入库完成 /// - private void ReadShellFinish_InStore(string taskCode) + //private void ReadShellFinish_InStore(string taskCode) + //{ + // lock (string.Empty) + // { + // bool isFlag = true; + // IPlc _plc = _plcDictionary[appConfig.foamStoreCode]; + // foamTaskCode = taskCode; + // try + // { + // Task.Run(() => + // { + // if (_plc != null) + // { + // if (_plc.IsConnected) + // { + // do + // { + // //读取PLC入库任务完成 + // if (_plc.readInt32ByAddress(plcConfig.in_foam_finish) == 1) + // { + // _plc.writeInt32ByAddress(plcConfig.in_foam_finish, 0); + + // //string taskCode = _plc.readStringByAddress(plcConfig.out_foam_task, 10); + + // InStoreFinsihEvent?.Invoke(taskCode); + + // isFlag = false; + // } + + // Thread.Sleep(1000); + // } while (isFlag); + // } + // else + // { + // logHelper.Info($"仓库{appConfig.foamStoreCode};PLC未连接"); + // } + // } + // else + // { + // logHelper.Info($"PLC信息为空,通过{appConfig.foamStoreCode}未获取到该仓库对应的PLC信息"); + // } + // }); + // } + // catch (Exception ex) + // { + // logHelper.Error("读取泡后入库完成异常", ex); + // } + // } + //} + #endregion + + + #region 监测PLC在途数量变化,完成入库任务 + + private void RealReadPlcSpace() { - lock (string.Empty) + Thread.Sleep(5000); + Task.Run(() => { - bool isFlag = true; - IPlc _plc = _plcDictionary[appConfig.foamStoreCode]; - foamTaskCode = taskCode; - try + while (true) { - Task.Run(() => - { - if (_plc != null) - { - if (_plc.IsConnected) - { - do - { - //读取PLC入库任务完成 - if (_plc.readInt32ByAddress(plcConfig.in_foam_finish) == 1) - { - _plc.writeInt32ByAddress(plcConfig.in_foam_finish, 0); + RealReadShellPlcSpace(); - //string taskCode = _plc.readStringByAddress(plcConfig.out_foam_task, 10); + Thread.Sleep(500); + } + }); - InStoreFinsihEvent?.Invoke(taskCode); + } - isFlag = false; - } + /// + /// 读取箱壳已下发任务的货道信息,读取后将货道编号及在途数量写入Dictionary进行比较,在途数减少则入库完成 + /// + private void RealReadShellPlcSpace() + { + if (foamRearTaskInfos != null) + { + List spaceCodes = foamRearTaskInfos.Select(x => x.spaceCode).Distinct().ToList(); - Thread.Sleep(1000); - } while (isFlag); - } - else + for (int i = 0; i < spaceCodes.Count; i++) + { + + string spaceCode = spaceCodes[i]; + + BaseSpaceInfo spaceInfo = new BaseSpaceInfo() { storeCode = appConfig.shellStoreCode, spaceCode = spaceCode }; + + spaceInfo = ReadSpaceInfoByPlc(spaceInfo); + + if (foamRearKeyValuePairs.ContainsKey(spaceInfo.spaceCode)) + { + foamRearKeyValuePairs.TryGetValue(spaceInfo.spaceCode, out int value); + //判断前次读取的数据和当前数据,如果前次数据大于当前数据则代表入库完成,然后筛选任务中对应货道的首个任务进行完成 + //如果前次数据不大于当前数据则更新字典中存放的数据 + if (value > spaceInfo.onRouteAmount) + { + //筛选任务 + var list = foamRearTaskInfos.Where(x => x.spaceCode == spaceInfo.spaceCode).ToList(); + if (list.Count > 0) { - logHelper.Info($"仓库{appConfig.foamStoreCode};PLC未连接"); + RealTaskInfo taskInfo = list.OrderBy(x => x.createTime).First(); + + InStoreFinsihEvent?.Invoke(taskInfo.storeCode, taskInfo.taskCode); + + foamRearTaskInfos.Remove(taskInfo); } + foamRearKeyValuePairs.Remove(spaceInfo.spaceCode); } else { - logHelper.Info($"PLC信息为空,通过{appConfig.foamStoreCode}未获取到该仓库对应的PLC信息"); + foamRearKeyValuePairs[spaceInfo.spaceCode] = spaceInfo.onRouteAmount; } - }); - } - catch (Exception ex) - { - logHelper.Error("读取泡后入库完成异常", ex); + + } + else + { + foamRearKeyValuePairs.Add(spaceInfo.spaceCode, spaceInfo.onRouteAmount); + } } + } } #endregion + /// /// 通过PLC获取货道信息 /// @@ -233,5 +332,38 @@ namespace Aucma.Scada.Business return spaceInfo; } + + /// + /// 测试方法,联调时不用 + /// + /// + /// + /// + public void WritePlc(string storeCode, string spaceCode, bool flag) + { + var spaceAddress = spaceConfig.GetSpaceAddress(storeCode, spaceCode); + IPlc _plc = _plcDictionary[storeCode]; + + if (_plc != null) + { + if (_plc.IsConnected) + { + var spaceStock = _plc.readInt32ByAddress(spaceAddress.onStore); + var onRouteAmount = _plc.readInt32ByAddress(spaceAddress.onRoute); + + if (flag) + { + _plc.writeInt32ByAddress(spaceAddress.onStore, spaceStock + 1); + //_plc.writeInt32ByAddress(spaceAddress.onRoute, onRouteAmount - 1); + } + else + { + _plc.writeInt32ByAddress(spaceAddress.onRoute, onRouteAmount + 1); + } + + } + } + + } } } diff --git a/Aucma.Scada.Business/OutStoreBusiness.cs b/Aucma.Scada.Business/OutStoreBusiness.cs index 66f67397..08823bf2 100644 --- a/Aucma.Scada.Business/OutStoreBusiness.cs +++ b/Aucma.Scada.Business/OutStoreBusiness.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using static Aucma.Scada.Business.OutStoreTaskHandle; namespace Aucma.Scada.Business { @@ -113,7 +114,11 @@ namespace Aucma.Scada.Business _recordOutStoreService = registerServices.GetService(); _recordProductfinishService = registerServices.GetService(); assemblyPlanBusiness.NextPassExecutePlanInfoEvent += PlanHandle; - taskHandleBusiness.OutStoreFinsihEvent += TaskFeedback; + + //taskHandleBusiness.OutStoreFinsihEvent += TaskFeedback; + + taskHandleBusiness.OutStoreAnswerEvent += OutStoreAnswer; + taskHandleBusiness.OutStoreFinsihEvent += OutStoreFinish; StartPassDown(); } @@ -161,7 +166,15 @@ namespace Aucma.Scada.Business { PrintLogInfoMessage($"匹配货道:{spaceInfo.spaceName}"); // RefreshScanMateriaCodeEvent?.Invoke(materiaclCode, materialType, spaceInfo.spaceName, storeCode); //刷新界面扫码信息 - CreateOutStoreTask(spaceInfo, planCode, taskCode); //创建出库任务 + bool result = CreateOutStoreTask(spaceInfo, planCode, taskCode); //创建出库任务 + if (result) + { + PrintLogInfoMessage("出库任务创建成功"); + } + else + { + PrintLogInfoMessage("出库任务创建失败"); + } } else { @@ -304,134 +317,183 @@ namespace Aucma.Scada.Business /// /// 依次获取任务队列进行下发 /// - /// - /// private void PassDownTaskInfo() { - string taskCode = string.Empty; - string executePlanCode = string.Empty; - int iFlag = 0; - completedTasks = 0; - - //获取待执行的出库任务下发至PLC,并将任务状态改为执行中 - var taskInfoList = GetAwaitSendTask(); - - if (taskInfoList.Count > 0) + try { - taskAmount = taskInfoList.Count; //下发的任务数量,默认2(泡后、内胆),泡后、内胆均执行完成后才会释放信号量 - - foreach (var item in taskInfoList) - { - taskCode = item.taskCode; - executePlanCode = item.planCode; - if (taskHandleBusiness.SendFoamTask_OutStore(item)) - { - PrintLogInfoMessage($"下发泡后出库任务:{item.taskCode};仓库{item.storeCode};货道:{item.spaceCode};等待PLC执行反馈"); - item.taskStatus = 2; - iFlag++; - } - else - { - PrintLogInfoMessage($"泡后出库任务:{item.taskCode};下发失败,请排除PLC连接"); - continue; - } - _taskInfoService.UpdateTaskInfo(item); - RefreshScanMateriaCodeEvent?.Invoke(item.materialCode, item.materialType, item.spaceName, item.storeCode); - } - - - - if (iFlag == taskInfoList.Count) + RealTaskInfo taskInfo = _taskInfoService.GetTaskInfoByStoreCode(appConfig.foamStoreCode, appConfig.outstoreTaskType); + if (taskInfo != null) { - inStoreBusiness.IssueOutTask(); - - semaphore.Wait(); //一直堵塞直到信号量释放 - - inStoreBusiness.IssueInTask(); + PrintLogInfoMessage($"下发出库任务:{taskInfo.taskCode};仓库{taskInfo.storeCode};货道:{taskInfo.spaceCode}"); - PrintLogInfoMessage($"出库任务:{taskCode};执行完成"); - - UpdatePlanInfo(executePlanCode); + if (taskHandleBusiness.SendFoamTask_OutStore(taskInfo)) + { + PrintLogInfoMessage($"出库任务:{taskInfo.taskCode};下发成功,等待PLC执行反馈"); - RefreshStoreStockEvent?.Invoke(); - } - } - else - { - PrintLogInfoMessage("未获取到需要下发的出库任务"); + semaphore.Wait(); //一直堵塞直到信号量释放 - } + PrintLogInfoMessage($"出库任务:{taskInfo.taskCode};开始执行"); - Thread.Sleep(3000); - } + taskInfo.taskStatus = 2; + _taskInfoService.UpdateTaskInfo(taskInfo); - /// - /// 获取待执行的出库任务 - /// - /// - private List GetAwaitSendTask() - { - List taskInfos = new List(); - try - { - RealTaskInfo foamTaskInfo = _taskInfoService.GetTaskInfoByStoreCode(appConfig.foamStoreCode, 2); + RefreshScanMateriaCodeEvent?.Invoke(taskInfo.materialCode, taskInfo.materialType, taskInfo.spaceName, taskInfo.storeCode); - if (foamTaskInfo != null) - { - taskInfos.Add(foamTaskInfo); - //获取与泡后任务匹配的内胆任务 - RealTaskInfo linerTaskInfo = _taskInfoService.GetTaskInfoByTaskCode(foamTaskInfo.taskCode, appConfig.linerStoreCode); - if (linerTaskInfo != null) taskInfos.Add(linerTaskInfo); + } + else + { + PrintLogInfoMessage($"出库任务:{taskInfo.taskCode};下发失败,请排除PLC连接"); + } } else { - RealTaskInfo linerInfo = _taskInfoService.GetTaskInfoByStoreCode(appConfig.linerStoreCode, 2); - if (linerInfo != null) taskInfos.Add(linerInfo); + PrintLogInfoMessage("未获取到需要下发的内胆出库任务"); } } catch (Exception ex) { - PrintLogErrorMessage("获取待执行的出库任务异常", ex); + PrintLogErrorMessage("下传出库任务逻辑处理异常", ex); } - return taskInfos; } + #region 原下发逻辑 Delete By wenjy 2023-11-15 15:54:00 /// - /// PLC任务执行反馈 + /// 依次获取任务队列进行下发 /// - /// - /// - private void TaskFeedback(string storeCode, string taskCode) - { - FoamTaskFeedback(taskCode); - } + /// + /// + //private void PassDownTaskInfo() + //{ + // try + // { + // string taskCode = string.Empty; + // string executePlanCode = string.Empty; + // int iFlag = 0; + // completedTasks = 0; + + // //获取待执行的出库任务下发至PLC,并将任务状态改为执行中 + // var taskInfoList = GetAwaitSendTask(); + + // if (taskInfoList.Count > 0) + // { + // taskAmount = taskInfoList.Count; //下发的任务数量,默认2(泡后、内胆),泡后、内胆均执行完成后才会释放信号量 + + // foreach (var item in taskInfoList) + // { + // taskCode = item.taskCode; + // executePlanCode = item.planCode; + // if (taskHandleBusiness.SendFoamTask_OutStore(item)) + // { + // PrintLogInfoMessage($"下发泡后出库任务:{item.taskCode};仓库{item.storeCode};货道:{item.spaceCode};等待PLC执行反馈"); + + // iFlag++; + + // item.taskStatus = 2; + // } + // else + // { + // PrintLogInfoMessage($"泡后出库任务:{item.taskCode};下发失败,请排除PLC连接"); + // continue; + // } + + + // _taskInfoService.UpdateTaskInfo(item); + + // RefreshScanMateriaCodeEvent?.Invoke(item.materialCode, item.materialType, item.spaceName, item.storeCode); + // } + + // if (iFlag == taskInfoList.Count) + // { + // inStoreBusiness.IssueOutTask(); + + // semaphore.Wait(); //一直堵塞直到信号量释放 + + // inStoreBusiness.IssueInTask(); + + // PrintLogInfoMessage($"出库任务:{taskCode};执行完成"); + + // UpdatePlanInfo(executePlanCode); + + // RefreshStoreStockEvent?.Invoke(); + // } + // } + // else + // { + // PrintLogInfoMessage("未获取到需要下发的出库任务"); + + // } + // }catch(Exception ex) + // { + // PrintLogErrorMessage("下传出库任务逻辑处理异常", ex); + // } + + // Thread.Sleep(3000); + //} + + + ///// + ///// 获取待执行的出库任务 + ///// + ///// + //private List GetAwaitSendTask() + //{ + // List taskInfos = new List(); + // try + // { + // RealTaskInfo foamTaskInfo = _taskInfoService.GetTaskInfoByStoreCode(appConfig.foamStoreCode, 2); + + // if (foamTaskInfo != null) + // { + // taskInfos.Add(foamTaskInfo); + // //获取与泡后任务匹配的内胆任务 + // RealTaskInfo linerTaskInfo = _taskInfoService.GetTaskInfoByTaskCode(foamTaskInfo.taskCode, appConfig.linerStoreCode); + // if (linerTaskInfo != null) taskInfos.Add(linerTaskInfo); + // } + // else + // { + // RealTaskInfo linerInfo = _taskInfoService.GetTaskInfoByStoreCode(appConfig.linerStoreCode, 2); + // if (linerInfo != null) taskInfos.Add(linerInfo); + // } + // } + // catch (Exception ex) + // { + // PrintLogErrorMessage("获取待执行的出库任务异常", ex); + // } + // return taskInfos; + //} + #endregion + #region PLC应答反馈 /// - /// 泡后执行反馈 + /// 出库应答 /// - private void FoamTaskFeedback(string taskCode) + /// + /// + private void OutStoreAnswer(string storeCode, string taskCode) { - Interlocked.Increment(ref completedTasks); - - CheckCompletedTasks(); + PrintLogInfoMessage("PLC应答成功,自动释放信号量,进行下发新任务"); - PrintLogInfoMessage("泡后执行完成,自动释放信号量"); + semaphore.Release(); - OutStoreFinish(taskCode, appConfig.foamStoreCode); + inStoreBusiness.IssueOutTask();//阻塞入库 } /// - /// 信号量释放,根据任务完成数量,执行完成后进行释放 + /// 出库完成 /// - private void CheckCompletedTasks() + /// + /// + private void OutStoreFinish(string storeCode, string taskCode) { - if (completedTasks == taskAmount) - { - // 释放信号量 - semaphore.Release(); - } + PrintLogInfoMessage($"出库任务:{taskCode};执行完成"); + OutStoreFinishHandle(taskCode, appConfig.linerStoreCode); + + inStoreBusiness.IssueInTask(); //释放入库 } + + #endregion + #endregion @@ -442,7 +504,7 @@ namespace Aucma.Scada.Business /// /// /// - private void OutStoreFinish(string taskCode, string storeCode) + private void OutStoreFinishHandle(string taskCode, string storeCode) { try { @@ -453,6 +515,7 @@ namespace Aucma.Scada.Business if (spaceInfo != null) { + taskHandleBusiness.WritePlc(spaceInfo.storeCode, spaceInfo.spaceCode); //读取PLC获取货道信息:存放数量、在途数量 spaceInfo.spaceStock -= 1; spaceInfo.outRouteAmount -= 1; @@ -470,8 +533,6 @@ namespace Aucma.Scada.Business } _spaceInfoService.UpdateSpaceInfo(spaceInfo); - //读取PLC获取物料类型进行绑定 - #region 添加出库记录 RecordOutstore recordOutstore = new RecordOutstore(); recordOutstore.storeCode = taskInfo.storeCode; @@ -484,6 +545,12 @@ namespace Aucma.Scada.Business _recordOutStoreService.InsertReocrdOutStoreService(recordOutstore); #endregion } + + //更新计划信息 + UpdatePlanInfo(taskInfo.planCode); + + RefreshStoreStockEvent?.Invoke(); + //清除任务信息 _taskInfoService.DeleteTaskInfo(taskCode, storeCode); @@ -679,6 +746,8 @@ namespace Aucma.Scada.Business return materialName; } + #region 通过PLC读取货道信息 + /// /// 通过PLC读取货道信息(在库数量、货道状态) /// /// @@ -690,7 +759,7 @@ namespace Aucma.Scada.Business try { - List info = _spaceInfoService.GetBaseSpaceInfosByMaterialType(storeCode, materialType); + List info = _spaceInfoService.OutStoreGetSpaceInfoByMaterialCode(storeCode, materialType); if (info != null) { @@ -702,9 +771,21 @@ namespace Aucma.Scada.Business item.spaceStock = spaceInfo.spaceStock; item.onRouteAmount = spaceInfo.onRouteAmount; item.spaceStatus = spaceInfo.spaceStatus; + PrintLogInfoMessage($"通过PLC读取货道信息,货道:{spaceInfo.spaceName};在库数量:{item.spaceStock};货道状态:{item.spaceStatus}"); } - result = info.Where(x => x.spaceStatus == 1 && x.spaceStock > 0).OrderBy(x => x.spaceStock).OrderBy(x => x.spaceCode).First(); + //result = info.Where(x => x.spaceStatus == 1 && x.spaceStock > 0).OrderBy(x => x.spaceStock).OrderBy(x => x.spaceCode).First(); + + var list = info.Where(x => x.spaceStatus == 1 && x.spaceStock > 0).ToList(); + + if (list.Count > 0) + { + result = info.OrderBy(x => x.spaceStock).OrderBy(x => x.spaceCode).First(); + } + else + { + PrintLogInfoMessage("未获取到匹配的货道,请排查货道库存及货道状态是否可用"); + } } } @@ -716,5 +797,6 @@ namespace Aucma.Scada.Business return result; } + #endregion } } diff --git a/Aucma.Scada.Business/OutStoreTaskHandle.cs b/Aucma.Scada.Business/OutStoreTaskHandle.cs index e2e46a50..77e0e665 100644 --- a/Aucma.Scada.Business/OutStoreTaskHandle.cs +++ b/Aucma.Scada.Business/OutStoreTaskHandle.cs @@ -4,6 +4,7 @@ using HighWayIot.Log4net; using HighWayIot.Plc; using System; using System.Collections.Generic; +using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -47,12 +48,12 @@ namespace Aucma.Scada.Business /// /// 泡后任务编号,PLC反馈后进行赋值 /// - private string shellTaskCode = string.Empty; + private string foamRearTaskCode = string.Empty; /// - /// 内胆任务编号,PLC反馈后进行赋值 + /// 已下传的任务信息 /// - private string linerTaskCode = string.Empty; + private List foamRearTaskInfos = new List(); #endregion #region 委托事件 @@ -63,12 +64,21 @@ namespace Aucma.Scada.Business /// public delegate void OutStoreFinsih(string storeCode, string taskCode); public event OutStoreFinsih OutStoreFinsihEvent; + + /// + /// PLC应答 + /// + /// + /// + public delegate void OutStoreAnswer(string storeCode, string taskCode); + public event OutStoreAnswer OutStoreAnswerEvent; #endregion private OutStoreTaskHandle() { _plcDictionary = _pool.GetAll(); + RealReadShellFinish(); } #region 泡后出库任务下发处理 @@ -97,7 +107,7 @@ namespace Aucma.Scada.Business _plc.writeStringByAddress(plcConfig.out_foam_task, taskInfo.taskCode); //写入完成后读取应答字进行复位 - ReadShellAnswer_OutStore(taskInfo.taskCode); + ReadShellAnswer_OutStore(taskInfo); result = true; } @@ -122,7 +132,7 @@ namespace Aucma.Scada.Business /// /// 读取泡后出库应答 /// - private void ReadShellAnswer_OutStore(string taskCode) + private void ReadShellAnswer_OutStore(RealTaskInfo taskInfo) { lock (string.Empty) { @@ -151,7 +161,11 @@ namespace Aucma.Scada.Business _plc.writeStringByAddress(plcConfig.out_foam_task, string.Empty); isFlag = false; - ReadShellFinish_OutStore(taskCode); + //ReadShellFinish_OutStore(taskInfo.taskCode); + + OutStoreAnswerEvent?.Invoke(appConfig.shellStoreCode, taskInfo.taskCode); + + foamRearTaskInfos.Add(taskInfo); } Thread.Sleep(1000); @@ -178,13 +192,13 @@ namespace Aucma.Scada.Business /// /// 读取泡后出库完成 /// - private void ReadShellFinish_OutStore(string taskCode) + private void ReadShellFinish_OutStore(RealTaskInfo taskInfo) { lock (string.Empty) { bool isFlag = true; IPlc _plc = _plcDictionary[appConfig.foamStoreCode]; - shellTaskCode = taskCode; + foamRearTaskCode = taskInfo.taskCode; try { Task.Run(() => @@ -202,7 +216,7 @@ namespace Aucma.Scada.Business //string taskCode = _plc.readStringByAddress(plcConfig.out_foam_task, 10); - OutStoreFinsihEvent?.Invoke(appConfig.foamStoreCode, taskCode); + OutStoreFinsihEvent?.Invoke(appConfig.shellStoreCode, taskInfo.taskCode); isFlag = false; } @@ -229,6 +243,34 @@ namespace Aucma.Scada.Business } #endregion + #region 出库完成 + /// + /// 实时读取箱壳出库完成 + /// + private void RealReadShellFinish() + { + Task.Run(() => + { + while (true) + { + var info = foamRearTaskInfos.Where(x => x.taskStatus != 3).ToList(); + for (int i = 0; i < info.Count; i++) + { + var item = info[i]; + ReadShellFinish_OutStore(item); + Console.WriteLine($"泡后库任务:{item.taskCode};物料:{item.materialCode};出库完成"); + item.taskStatus = 3; + foamRearTaskInfos.Remove(item); + } + + Thread.Sleep(1000); + }; + }); + } + + #endregion + + /// /// 通过PLC获取货道信息 /// @@ -251,5 +293,29 @@ namespace Aucma.Scada.Business return spaceInfo; } + + /// + /// 测试方法,联调时不用 + /// + /// + /// + /// + public void WritePlc(string storeCode, string spaceCode) + { + var spaceAddress = spaceConfig.GetSpaceAddress(storeCode, spaceCode); + IPlc _plc = _plcDictionary[storeCode]; + + if (_plc != null) + { + if (_plc.IsConnected) + { + var spaceStock = _plc.readInt32ByAddress(spaceAddress.onStore); + //var onRouteAmount = _plc.readInt32ByAddress(spaceAddress.onRoute); + + _plc.writeInt32ByAddress(spaceAddress.onStore, spaceStock - 1); + + } + } + } } } diff --git a/Aucma.Scada.Business/bin/Debug/Aucma.Scada.Business.dll b/Aucma.Scada.Business/bin/Debug/Aucma.Scada.Business.dll index d93e5666..c0ea1c6d 100644 Binary files a/Aucma.Scada.Business/bin/Debug/Aucma.Scada.Business.dll and b/Aucma.Scada.Business/bin/Debug/Aucma.Scada.Business.dll differ diff --git a/Aucma.Scada.Business/bin/Debug/Aucma.Scada.Business.pdb b/Aucma.Scada.Business/bin/Debug/Aucma.Scada.Business.pdb index 35d4a1f1..48b128ba 100644 Binary files a/Aucma.Scada.Business/bin/Debug/Aucma.Scada.Business.pdb and b/Aucma.Scada.Business/bin/Debug/Aucma.Scada.Business.pdb differ diff --git a/Aucma.Scada.Business/bin/Debug/HighWayIot.Repository.dll b/Aucma.Scada.Business/bin/Debug/HighWayIot.Repository.dll index 8c42f466..2a89a0db 100644 Binary files a/Aucma.Scada.Business/bin/Debug/HighWayIot.Repository.dll and b/Aucma.Scada.Business/bin/Debug/HighWayIot.Repository.dll differ diff --git a/Aucma.Scada.Business/bin/Debug/HighWayIot.Repository.pdb b/Aucma.Scada.Business/bin/Debug/HighWayIot.Repository.pdb index 2b775bae..adca5614 100644 Binary files a/Aucma.Scada.Business/bin/Debug/HighWayIot.Repository.pdb and b/Aucma.Scada.Business/bin/Debug/HighWayIot.Repository.pdb differ diff --git a/Aucma.Scada.Business/obj/Debug/Aucma.Scada.Business.csproj.AssemblyReference.cache b/Aucma.Scada.Business/obj/Debug/Aucma.Scada.Business.csproj.AssemblyReference.cache index 514c1562..4f13f5c9 100644 Binary files a/Aucma.Scada.Business/obj/Debug/Aucma.Scada.Business.csproj.AssemblyReference.cache and b/Aucma.Scada.Business/obj/Debug/Aucma.Scada.Business.csproj.AssemblyReference.cache differ diff --git a/Aucma.Scada.Business/obj/Debug/Aucma.Scada.Business.dll b/Aucma.Scada.Business/obj/Debug/Aucma.Scada.Business.dll index d93e5666..c0ea1c6d 100644 Binary files a/Aucma.Scada.Business/obj/Debug/Aucma.Scada.Business.dll and b/Aucma.Scada.Business/obj/Debug/Aucma.Scada.Business.dll differ diff --git a/Aucma.Scada.Business/obj/Debug/Aucma.Scada.Business.pdb b/Aucma.Scada.Business/obj/Debug/Aucma.Scada.Business.pdb index 35d4a1f1..48b128ba 100644 Binary files a/Aucma.Scada.Business/obj/Debug/Aucma.Scada.Business.pdb and b/Aucma.Scada.Business/obj/Debug/Aucma.Scada.Business.pdb differ diff --git a/Aucma.Scada.HikRobot/obj/Debug/Aucma.Scada.HikRobot.csproj.AssemblyReference.cache b/Aucma.Scada.HikRobot/obj/Debug/Aucma.Scada.HikRobot.csproj.AssemblyReference.cache index e1d25412..1f1f48c7 100644 Binary files a/Aucma.Scada.HikRobot/obj/Debug/Aucma.Scada.HikRobot.csproj.AssemblyReference.cache and b/Aucma.Scada.HikRobot/obj/Debug/Aucma.Scada.HikRobot.csproj.AssemblyReference.cache differ diff --git a/Aucma.Scada.Model/obj/Debug/Aucma.Scada.Model.csproj.AssemblyReference.cache b/Aucma.Scada.Model/obj/Debug/Aucma.Scada.Model.csproj.AssemblyReference.cache index 3df133e3..561fa9ab 100644 Binary files a/Aucma.Scada.Model/obj/Debug/Aucma.Scada.Model.csproj.AssemblyReference.cache and b/Aucma.Scada.Model/obj/Debug/Aucma.Scada.Model.csproj.AssemblyReference.cache differ diff --git a/Aucma.Scada.UI/bin/Debug/Aucma.Scada.Business.dll b/Aucma.Scada.UI/bin/Debug/Aucma.Scada.Business.dll index d93e5666..c0ea1c6d 100644 Binary files a/Aucma.Scada.UI/bin/Debug/Aucma.Scada.Business.dll and b/Aucma.Scada.UI/bin/Debug/Aucma.Scada.Business.dll differ diff --git a/Aucma.Scada.UI/bin/Debug/Aucma.Scada.Business.pdb b/Aucma.Scada.UI/bin/Debug/Aucma.Scada.Business.pdb index 35d4a1f1..48b128ba 100644 Binary files a/Aucma.Scada.UI/bin/Debug/Aucma.Scada.Business.pdb and b/Aucma.Scada.UI/bin/Debug/Aucma.Scada.Business.pdb differ diff --git a/Aucma.Scada.UI/bin/Debug/HighWayIot.Repository.dll b/Aucma.Scada.UI/bin/Debug/HighWayIot.Repository.dll index 8c42f466..2a89a0db 100644 Binary files a/Aucma.Scada.UI/bin/Debug/HighWayIot.Repository.dll and b/Aucma.Scada.UI/bin/Debug/HighWayIot.Repository.dll differ diff --git a/Aucma.Scada.UI/bin/Debug/HighWayIot.Repository.pdb b/Aucma.Scada.UI/bin/Debug/HighWayIot.Repository.pdb index 2b775bae..adca5614 100644 Binary files a/Aucma.Scada.UI/bin/Debug/HighWayIot.Repository.pdb and b/Aucma.Scada.UI/bin/Debug/HighWayIot.Repository.pdb differ diff --git a/Aucma.Scada.UI/obj/Debug/Aucma.Scada.UI.csproj.AssemblyReference.cache b/Aucma.Scada.UI/obj/Debug/Aucma.Scada.UI.csproj.AssemblyReference.cache index 1d16c7a4..417bc591 100644 Binary files a/Aucma.Scada.UI/obj/Debug/Aucma.Scada.UI.csproj.AssemblyReference.cache and b/Aucma.Scada.UI/obj/Debug/Aucma.Scada.UI.csproj.AssemblyReference.cache differ diff --git a/HighWayIot.Common/obj/Debug/HighWayIot.Common.csproj.AssemblyReference.cache b/HighWayIot.Common/obj/Debug/HighWayIot.Common.csproj.AssemblyReference.cache index 114047c8..a19aa128 100644 Binary files a/HighWayIot.Common/obj/Debug/HighWayIot.Common.csproj.AssemblyReference.cache and b/HighWayIot.Common/obj/Debug/HighWayIot.Common.csproj.AssemblyReference.cache differ diff --git a/HighWayIot.Config/obj/Debug/HighWayIot.Config.csproj.AssemblyReference.cache b/HighWayIot.Config/obj/Debug/HighWayIot.Config.csproj.AssemblyReference.cache index f4d4d110..a2157e22 100644 Binary files a/HighWayIot.Config/obj/Debug/HighWayIot.Config.csproj.AssemblyReference.cache and b/HighWayIot.Config/obj/Debug/HighWayIot.Config.csproj.AssemblyReference.cache differ diff --git a/HighWayIot.Plc/obj/Debug/HighWayIot.Plc.csproj.AssemblyReference.cache b/HighWayIot.Plc/obj/Debug/HighWayIot.Plc.csproj.AssemblyReference.cache index c896892e..b6a623b5 100644 Binary files a/HighWayIot.Plc/obj/Debug/HighWayIot.Plc.csproj.AssemblyReference.cache and b/HighWayIot.Plc/obj/Debug/HighWayIot.Plc.csproj.AssemblyReference.cache differ diff --git a/HighWayIot.Repository/bin/Debug/HighWayIot.Repository.dll b/HighWayIot.Repository/bin/Debug/HighWayIot.Repository.dll index 8c42f466..2a89a0db 100644 Binary files a/HighWayIot.Repository/bin/Debug/HighWayIot.Repository.dll and b/HighWayIot.Repository/bin/Debug/HighWayIot.Repository.dll differ diff --git a/HighWayIot.Repository/bin/Debug/HighWayIot.Repository.pdb b/HighWayIot.Repository/bin/Debug/HighWayIot.Repository.pdb index 2b775bae..adca5614 100644 Binary files a/HighWayIot.Repository/bin/Debug/HighWayIot.Repository.pdb and b/HighWayIot.Repository/bin/Debug/HighWayIot.Repository.pdb differ diff --git a/HighWayIot.Repository/obj/Debug/HighWayIot.Repository.csproj.AssemblyReference.cache b/HighWayIot.Repository/obj/Debug/HighWayIot.Repository.csproj.AssemblyReference.cache index a1b3903b..d5264b11 100644 Binary files a/HighWayIot.Repository/obj/Debug/HighWayIot.Repository.csproj.AssemblyReference.cache and b/HighWayIot.Repository/obj/Debug/HighWayIot.Repository.csproj.AssemblyReference.cache differ diff --git a/HighWayIot.Repository/obj/Debug/HighWayIot.Repository.dll b/HighWayIot.Repository/obj/Debug/HighWayIot.Repository.dll index 8c42f466..2a89a0db 100644 Binary files a/HighWayIot.Repository/obj/Debug/HighWayIot.Repository.dll and b/HighWayIot.Repository/obj/Debug/HighWayIot.Repository.dll differ diff --git a/HighWayIot.Repository/obj/Debug/HighWayIot.Repository.pdb b/HighWayIot.Repository/obj/Debug/HighWayIot.Repository.pdb index 2b775bae..adca5614 100644 Binary files a/HighWayIot.Repository/obj/Debug/HighWayIot.Repository.pdb and b/HighWayIot.Repository/obj/Debug/HighWayIot.Repository.pdb differ diff --git a/HighWayIot.Repository/service/IBaseSpaceInfoService.cs b/HighWayIot.Repository/service/IBaseSpaceInfoService.cs index 98d2eaf3..cece8192 100644 --- a/HighWayIot.Repository/service/IBaseSpaceInfoService.cs +++ b/HighWayIot.Repository/service/IBaseSpaceInfoService.cs @@ -22,7 +22,7 @@ namespace HighWayIot.Repository.service /// /// /// - BaseSpaceInfo OutStoreGetSpaceInfoByMaterialCode(string store, string materialCode); + List OutStoreGetSpaceInfoByMaterialCode(string store, string materialCode); /// /// 通过货道编号获取货道信息 @@ -53,5 +53,11 @@ namespace HighWayIot.Repository.service /// /// bool UpdateSpaceInfo(BaseSpaceInfo spaceInfo); + + /// + /// 获取空货道:未分配物料型号的空白货道 + /// + /// + List GetEmptySpaceInfo(string store); } } diff --git a/HighWayIot.Repository/service/Impl/BaseSpaceInfoServiceImpl.cs b/HighWayIot.Repository/service/Impl/BaseSpaceInfoServiceImpl.cs index d7d2e8c3..ee0067ff 100644 --- a/HighWayIot.Repository/service/Impl/BaseSpaceInfoServiceImpl.cs +++ b/HighWayIot.Repository/service/Impl/BaseSpaceInfoServiceImpl.cs @@ -81,7 +81,7 @@ namespace HighWayIot.Repository.service.Impl /// 获取空货道:未分配物料型号的空白货道 /// /// - private List GetEmptySpaceInfo(string store) + public List GetEmptySpaceInfo(string store) { List spaceInfos = null; try @@ -103,26 +103,25 @@ namespace HighWayIot.Repository.service.Impl /// /// /// - public BaseSpaceInfo OutStoreGetSpaceInfoByMaterialCode(string store, string materialType) + public List OutStoreGetSpaceInfoByMaterialCode(string store, string materialType) { - BaseSpaceInfo spaceInfo = null; - List spaceInfos; + List spaceInfos = null; try { Expression> exp = s1 => true; - exp = exp.And(x => x.storeCode == store && x.materialType == materialType && x.spaceStatus == 1 && x.spaceStock - x.outRouteAmount > 0); //相同型号、启用状态、库存不为空的货道信息 + exp = exp.And(x => x.storeCode == store && x.materialType == materialType && x.spaceStatus == 1); //相同型号、启用状态、库存不为空的货道信息 spaceInfos = _mesRepository.GetList(exp); logHelper.Info($"根据仓库{store};物料:{materialType};获取到的货道信息:{jsonChange.ModeToJson(spaceInfos)}"); - spaceInfo = outStoreFilter(spaceInfos); - logHelper.Info($"仓库{store};物料:{materialType};匹配的入库货道信息:{jsonChange.ModeToJson(spaceInfo)}"); + //spaceInfo = outStoreFilter(spaceInfos); + //logHelper.Info($"仓库{store};物料:{materialType};匹配的入库货道信息:{jsonChange.ModeToJson(spaceInfo)}"); } catch (Exception ex) { logHelper.Error("出库通过物料类型获取货道信息异常", ex); } - return spaceInfo; + return spaceInfos; } /// diff --git a/HighWayIot.Rfid/obj/Debug/HighWayIot.Rfid.csproj.AssemblyReference.cache b/HighWayIot.Rfid/obj/Debug/HighWayIot.Rfid.csproj.AssemblyReference.cache index ced96fc9..16a78c4b 100644 Binary files a/HighWayIot.Rfid/obj/Debug/HighWayIot.Rfid.csproj.AssemblyReference.cache and b/HighWayIot.Rfid/obj/Debug/HighWayIot.Rfid.csproj.AssemblyReference.cache differ diff --git a/HighWayIot.TouchSocket/obj/Debug/HighWayIot.TouchSocket.csproj.AssemblyReference.cache b/HighWayIot.TouchSocket/obj/Debug/HighWayIot.TouchSocket.csproj.AssemblyReference.cache index a597074f..7b7a3524 100644 Binary files a/HighWayIot.TouchSocket/obj/Debug/HighWayIot.TouchSocket.csproj.AssemblyReference.cache and b/HighWayIot.TouchSocket/obj/Debug/HighWayIot.TouchSocket.csproj.AssemblyReference.cache differ diff --git a/HighWayIot/bin/Debug/HighWayIot.Repository.dll b/HighWayIot/bin/Debug/HighWayIot.Repository.dll index 8c42f466..2a89a0db 100644 Binary files a/HighWayIot/bin/Debug/HighWayIot.Repository.dll and b/HighWayIot/bin/Debug/HighWayIot.Repository.dll differ diff --git a/HighWayIot/bin/Debug/HighWayIot.Repository.pdb b/HighWayIot/bin/Debug/HighWayIot.Repository.pdb index 2b775bae..adca5614 100644 Binary files a/HighWayIot/bin/Debug/HighWayIot.Repository.pdb and b/HighWayIot/bin/Debug/HighWayIot.Repository.pdb differ diff --git a/HighWayIot/obj/Debug/HighWayIot.csproj.AssemblyReference.cache b/HighWayIot/obj/Debug/HighWayIot.csproj.AssemblyReference.cache index 65bfe565..00fa5930 100644 Binary files a/HighWayIot/obj/Debug/HighWayIot.csproj.AssemblyReference.cache and b/HighWayIot/obj/Debug/HighWayIot.csproj.AssemblyReference.cache differ