From c45080e27fcf7259639ada659cbb4ec2070a5fa4 Mon Sep 17 00:00:00 2001 From: liuwf Date: Tue, 20 May 2025 21:47:32 +0800 Subject: [PATCH] =?UTF-8?q?change-=E6=8F=90=E4=BA=A4520=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SlnMesnac.Business/base/BaseBusiness.cs | 30 ++ SlnMesnac.Rfid/Factory/RflyFactory.cs | 62 +++- SlnMesnac.Rfid/RfidAbsractFactory.cs | 2 + SlnMesnac.WCS/MainCentralControl.cs | 26 ++ SlnMesnac.WCS/WCS/BearAgv.cs | 27 +- SlnMesnac.WCS/WCS/CreateTaskByRecord.cs | 275 ++++++++++-------- .../ViewModel/MainWindowViewModel.cs | 1 + 7 files changed, 285 insertions(+), 138 deletions(-) diff --git a/SlnMesnac.Business/base/BaseBusiness.cs b/SlnMesnac.Business/base/BaseBusiness.cs index 610c6f4..7efc3b1 100644 --- a/SlnMesnac.Business/base/BaseBusiness.cs +++ b/SlnMesnac.Business/base/BaseBusiness.cs @@ -156,6 +156,36 @@ namespace SlnMesnac.Business.@base } } + /// + /// 使用---根据RFID Key读取RFID信息 + /// + /// + /// + /// + public string ReadEpcStrByRfidKey(string rfidKey) + { + try + { + string epcStr = string.Empty; + var rfidEquip = GetRfidByKey(rfidKey); + if (rfidEquip == null || rfidEquip.GetOnlineStatus() == false) + { + return ""; + } + + List tagInfoList = rfidEquip.GetRFID(); + if (tagInfoList == null || tagInfoList.Count == 0) return ""; + epcStr = tagInfoList.OrderByDescending(x => x.Count).First().EPCstring; + epcStr = epcStr.Replace(" ", "").Replace("\r\n", "").Replace("\0", "").Replace("\n", ""); + return epcStr; + } + catch (Exception ex) + { + // throw new InvalidOperationException($"根据RFID Key读取RFID信息异常:{ex.Message}"); + return ""; + } + } + /// /// 使用---根据RFID Key读取光电信号 /// 有物体返回true diff --git a/SlnMesnac.Rfid/Factory/RflyFactory.cs b/SlnMesnac.Rfid/Factory/RflyFactory.cs index 401cd97..30642ec 100644 --- a/SlnMesnac.Rfid/Factory/RflyFactory.cs +++ b/SlnMesnac.Rfid/Factory/RflyFactory.cs @@ -1,4 +1,5 @@ -using SlnMesnac.Common; +using Microsoft.IdentityModel.Logging; +using SlnMesnac.Common; using SlnMesnac.Model.dto; using SlnMesnac.Rfid.Dto; using SlnMesnac.Rfid.Enum; @@ -229,6 +230,65 @@ namespace SlnMesnac.Rfid.Factory } } + public override List GetRFID(int timeout = 3000) + { + byte[] u16byte = new byte[2]; + byte[] bCRC = new byte[4]; + try + { + #region 指令封装 + + MessagePack pMessagePack = new MessagePack(); + pMessagePack.m_pData = new byte[8]; + pMessagePack.m_pData[0] = 0xAA; + pMessagePack.m_pData[1] = 0x55; + pMessagePack.m_pData[2] = 0x02; + pMessagePack.m_pData[3] = 0x02; + //1s + pMessagePack.m_pData[4] = 0x03; + pMessagePack.m_pData[5] = 0xE8; + //2s + //pMessagePack.m_pData[4] = 0x07; + //pMessagePack.m_pData[5] = 0xD0; + //3s + //pMessagePack.m_pData[4] = 0x0B; + //pMessagePack.m_pData[5] = 0xA0; + + Array.Copy(pMessagePack.m_pData, 2, bCRC, 0, 4); + pMessagePack.m_pData[6] = _stringChange.CalculateVerify(bCRC, bCRC.Length); + pMessagePack.m_pData[7] = 0x0D; + + #endregion 指令封装 + + var waitClient = _tcpClient.CreateWaitingClient(new WaitingOptions() + { + FilterFunc = response => + { + // 检查响应数据是否符合预期 + if (response.Data != null && response.Data.Length > 0) + { + // 可以根据实际情况添加更多的检查逻辑 + return true; + } + return false; + } + }); + + // 使用同步方法发送数据并获取响应 + byte[] reciveBuffer = waitClient.SendThenReturn(pMessagePack.m_pData, timeout); + + byte[] resultBuffer = PareReceiveBufferData(reciveBuffer, reciveBuffer.Length); + + List tagInfoList = Device_DealTagInfoList(resultBuffer); + + return tagInfoList; + } + catch (Exception e) + { + throw new InvalidOperationException($"按时间段盘点异常:{e.Message}"); + } + } + /// /// 使用--异步获取光电状态 /// diff --git a/SlnMesnac.Rfid/RfidAbsractFactory.cs b/SlnMesnac.Rfid/RfidAbsractFactory.cs index a5d5d03..8f47017 100644 --- a/SlnMesnac.Rfid/RfidAbsractFactory.cs +++ b/SlnMesnac.Rfid/RfidAbsractFactory.cs @@ -79,6 +79,8 @@ namespace SlnMesnac.Rfid /// public abstract Task> GetRFIDAsync(int timeout = 5000); + public abstract List GetRFID(int timeout = 3000); + /// /// 使用--异步获取光电状态 /// diff --git a/SlnMesnac.WCS/MainCentralControl.cs b/SlnMesnac.WCS/MainCentralControl.cs index b6e0959..3423750 100644 --- a/SlnMesnac.WCS/MainCentralControl.cs +++ b/SlnMesnac.WCS/MainCentralControl.cs @@ -87,6 +87,7 @@ namespace SlnMesnac.WCS public void Start() { StartCheckStatus(); + GetAgvStatus(); DeleteTaskLogic(); //根据条件创建任务 @@ -164,6 +165,7 @@ namespace SlnMesnac.WCS //实时获取agv状态 MessageSynchronousLogic(agvEquipList); + //色粉库位有未取走色粉声光报警 ListeningTonerLocation(); } catch (Exception ex) @@ -175,6 +177,30 @@ namespace SlnMesnac.WCS }); } + /// + /// 获取agv状态 + /// + private void GetAgvStatus() + { + List agvEquipList = SqlSugarClient.Queryable().Where(it => it.EquipType == 1).ToList(); + Task.Run(async () => + { + while (true) + { + try + { + //实时获取agv状态 + MessageSynchronousLogic(agvEquipList); + } + catch (Exception ex) + { + _logger.Error($"获取agv状态异常:{ex.Message}"); + } + await Task.Delay(1000 * 30); + } + }); + } + #endregion /// diff --git a/SlnMesnac.WCS/WCS/BearAgv.cs b/SlnMesnac.WCS/WCS/BearAgv.cs index 44191aa..30f87c5 100644 --- a/SlnMesnac.WCS/WCS/BearAgv.cs +++ b/SlnMesnac.WCS/WCS/BearAgv.cs @@ -478,6 +478,7 @@ namespace SlnMesnac.WCS.WCS workShop3Plc.writeInt16ByAddress(StaticData.GetPlcAddress("3#接驳位到位信号"), 0); workShop3Plc.writeBoolByAddress(StaticData.GetPlcAddress("3#出接驳位信号"), false); workShop3Plc.writeBoolByAddress(StaticData.GetPlcAddress("3#小料箱agv已取走反馈"), true); + _logger.Agv($"agv取走料{task.PalletInfoCode},3#忙碌状态清0"); } } } @@ -489,8 +490,6 @@ namespace SlnMesnac.WCS.WCS return; } - //workShop3Plc.writeStringByAddress(StaticData.GetPlcAddress("3#小料箱下料点机台号"), "", 6); - //workShop3Plc.writeStringByAddress(StaticData.GetPlcAddress("3#小料箱下料点RFID号"), "", 12); //解锁起始库位忙碌状态 WcsBaseEquip? startEquip = sqlSugarClient.Queryable().First(it => it.AgvPositionCode == task.CurrPointNo); sqlSugarClient.AsTenant().BeginTran(); @@ -616,6 +615,7 @@ namespace SlnMesnac.WCS.WCS workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#取完成"), true); workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#接驳位到位信号"), false); workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#缓存空进AGV任务反馈"), false); + workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#出接驳位信号"), false); workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#出一个空托盘信号"), false); } } @@ -696,7 +696,15 @@ namespace SlnMesnac.WCS.WCS } else if (outFlag == 1) { //托盘已经离开,wcs通知agv离开 - await ContinueTaskHandle(task); + bool result = await ContinueTaskHandle(task); + if (result) + { + //从下料点直接取,清空RFID及机台号,条码等信息--ok + workShop3Plc.writeInt16ByAddress(StaticData.GetPlcAddress("3#线体忙碌状态"), 0); + workShop3Plc.writeInt16ByAddress(StaticData.GetPlcAddress("3#接驳位到位信号"), 0); + workShop3Plc.writeBoolByAddress(StaticData.GetPlcAddress("3#出接驳位信号"), false); + workShop3Plc.writeBoolByAddress(StaticData.GetPlcAddress("3#小料箱agv已取走反馈"), true); + } } } else if (task.TaskStatus == 10) //任务完成,wcs复位3#接驳位信号,删除任务 @@ -738,21 +746,16 @@ namespace SlnMesnac.WCS.WCS } else if (task.TaskStatus == 2) //取完料箱前往目的地 { - //解锁起始库位 - WcsBaseEquip? baseEquip = sqlSugarClient.Queryable().First(t => t.AgvPositionCode == task.CurrPointNo); if (baseEquip != null) { sqlSugarClient.AsTenant().BeginTran(); try { - baseEquip.EquipStatus = 0; - baseEquip.ContainerCode = null; task.TaskStatus = 3; if (wcsTaskLog != null) { wcsTaskLog.TaskStatus = task.TaskStatus; } - sqlSugarClient.Updateable(baseEquip).ExecuteCommand(); sqlSugarClient.Updateable(task).ExecuteCommand(); sqlSugarClient.Updateable(wcsTaskLog).ExecuteCommand(); sqlSugarClient.AsTenant().CommitTran(); @@ -782,6 +785,14 @@ namespace SlnMesnac.WCS.WCS busyFlag = workShop3Plc.readInt16ByAddress(StaticData.GetPlcAddress("3#线体忙碌状态")); if (busyFlag == 0) { + //解锁起始库位 + WcsBaseEquip? baseEquip = sqlSugarClient.Queryable().First(t => t.AgvPositionCode == task.CurrPointNo); + if (baseEquip != null) + { + baseEquip.EquipStatus = 0; + baseEquip.ContainerCode = null; + sqlSugarClient.Updateable(baseEquip).ExecuteCommand(); + } //抢占线体状态,agv进入接驳位 workShop3Plc.writeInt16ByAddress(StaticData.GetPlcAddress("3#线体忙碌状态"), 1); await ContinueTaskHandle(task); diff --git a/SlnMesnac.WCS/WCS/CreateTaskByRecord.cs b/SlnMesnac.WCS/WCS/CreateTaskByRecord.cs index 32c5c30..b69ab8c 100644 --- a/SlnMesnac.WCS/WCS/CreateTaskByRecord.cs +++ b/SlnMesnac.WCS/WCS/CreateTaskByRecord.cs @@ -44,7 +44,10 @@ namespace SlnMesnac.WCS.WCS CreateTaskByReadPlcSignal(); //监听2#计量室旋转移栽plc信号,处理相关流程 - ListeningWorkShop2TransplantingMachine(); + var CreateProductTaskByLocationCodeThread = new Thread(ListeningWorkShop2TransplantingMachine); + CreateProductTaskByLocationCodeThread.IsBackground = true; + CreateProductTaskByLocationCodeThread.Name = "监听1#2#计量室旋转移栽plc信号处理连廊箱体旋转相关流程"; + CreateProductTaskByLocationCodeThread.Start(); } /// @@ -136,39 +139,38 @@ namespace SlnMesnac.WCS.WCS /// private void ListeningWorkShop2TransplantingMachine() { - Task.Run(async () => + while (true) { - while (true) + try { - try + if (workShop2Plc == null || !workShop2Plc.IsConnected) { - if (workShop2Plc == null || !workShop2Plc.IsConnected) - { - continue; - } + continue; + } - #region 计量室料箱返回处理流程:空箱入缓存链条线,色粉派送至色粉存放点 + #region 计量室料箱返回处理流程:空箱入缓存链条线,色粉派送至色粉存放点 - //2#接驳位色粉派送至色粉存放点任务 - if (workShop2Plc != null && workShop2Plc.IsConnected) + //2#接驳位色粉派送至色粉存放点任务 + if (workShop2Plc != null && workShop2Plc.IsConnected) + { + bool returnJudgeSignal = workShop2Plc.readBoolByAddress(StaticData.GetPlcAddress("2#料箱运回RFID读取")); + int busy2Flag = workShop2Plc.readInt16ByAddress(StaticData.GetPlcAddress("2#线体忙碌状态")); + int Amount = workShop2Plc.readInt16ByAddress(StaticData.GetPlcAddress("2#缓存链条线库存数")); + //是否还有未在色粉库位的色粉箱体 + bool anyTonerPallet = HasAnyTonerInLine(); + if (returnJudgeSignal && busy2Flag == 0 && (Amount < 3 || anyTonerPallet)) { - _logger.Info("22222============="); - bool returnJudgeSignal = workShop2Plc.readBoolByAddress(StaticData.GetPlcAddress("2#料箱运回RFID读取")); - int busy2Flag = workShop2Plc.readInt16ByAddress(StaticData.GetPlcAddress("2#线体忙碌状态")); - int Amount = workShop2Plc.readInt16ByAddress(StaticData.GetPlcAddress("2#缓存链条线库存数")); - //是否还有未在色粉库位的色粉箱体 - bool anyTonerPallet = HasAnyTonerInLine(); - if (returnJudgeSignal && busy2Flag == 0 && (Amount < 3 || anyTonerPallet)) + string rfid = ReadEpcStrByRfidKey("2#Transplant"); + if (string.IsNullOrEmpty(rfid)) + {//二次读取 + rfid = ReadEpcStrByRfidKey("2#Transplant"); + } + if (!string.IsNullOrEmpty(rfid)) { - string rfid = await ReadEpcStrByRfidKeyAsync("2#Transplant"); - if (string.IsNullOrEmpty(rfid)) - {//二次读取 - rfid = await ReadEpcStrByRfidKeyAsync("2#Transplant"); - } //让其他线程 Thread.Sleep(4000); busy2Flag = workShop2Plc.readInt16ByAddress(StaticData.GetPlcAddress("2#线体忙碌状态")); - if (!string.IsNullOrEmpty(rfid) && busy2Flag == 0) + if (busy2Flag == 0) { // 判断有无色粉, 如果没有色粉,wcs给 旋转移栽方向信号 写2,plc将料箱运到 缓存皮带线。 WmsPalletInfo? wmsPalletInfo = sqlSugarClient.Queryable().First(it => it.PalletInfoCode == rfid); @@ -180,6 +182,7 @@ namespace SlnMesnac.WCS.WCS if (createResult) { //3色粉上提升机移栽等待 + _logger.Info($"2#移栽===={rfid}携带色粉去往色粉库位"); workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#线体忙碌状态"), 1); workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#移栽平台任务"), 3); workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#料箱运回RFID读取"), false); @@ -187,6 +190,7 @@ namespace SlnMesnac.WCS.WCS else { //色粉库位无空闲位置,空转一圈 //2空箱转运 + _logger.Info($"2#移栽===={rfid}携带色粉,色粉库位无空闲位置,空转一圈"); workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#线体忙碌状态"), 1); workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#移栽平台任务"), 2); workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#料箱运回RFID读取"), false); @@ -195,6 +199,7 @@ namespace SlnMesnac.WCS.WCS else if (wmsPalletInfo != null && wmsPalletInfo.Amount > 0 && wmsPalletInfo.TonerFlag == 0) //携带满料 { //2空箱转运 + _logger.Info($"2#移栽===={rfid}携带满料,空转一圈"); workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#线体忙碌状态"), 1); workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#移栽平台任务"), 2); workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#料箱运回RFID读取"), false); @@ -204,6 +209,7 @@ namespace SlnMesnac.WCS.WCS if (Amount < 3) { //1上提升机去缓存线 + _logger.Info($"2#移栽===={rfid}空箱,去缓存区"); workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#线体忙碌状态"), 1); workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#移栽平台任务"), 1); workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#料箱运回RFID读取"), false); @@ -211,125 +217,136 @@ namespace SlnMesnac.WCS.WCS else { //2空箱转运 + _logger.Info($"2#移栽===={rfid}空箱,空箱转运"); workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#线体忙碌状态"), 1); workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#移栽平台任务"), 2); workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#料箱运回RFID读取"), false); } } } - else - { - //没读到2空箱转运 - //workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#线体忙碌状态"), 1); - //workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#移栽平台任务"), 2); - //workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#料箱运回RFID读取"), false); - } } - } - - #endregion 计量室料箱返回处理流程:空箱入缓存链条线,色粉派送至色粉存放点 - - #region 连廊料箱在计量室连廊移栽处理流程:wcs读RFID判断是否空箱,空箱下plc信号旋转,非空箱通知plc上提升机计量室 - - if (workShop2Plc != null && workShop2Plc.IsConnected) - { - _logger.Info("11111============="); - bool returnJudgeSignal = workShop2Plc.readBoolByAddress(StaticData.GetPlcAddress("2#料箱运进计量室RFID读取")); - int busy1Flag = workShop2Plc.readInt16ByAddress(StaticData.GetPlcAddress("1#提升机忙碌状态")); - if (returnJudgeSignal && busy1Flag == 0) + else { - //test - - string rfid = await ReadEpcStrByRfidKeyAsync("1#MetrologyRoom"); - if (string.IsNullOrEmpty(rfid)) - { - rfid = await ReadEpcStrByRfidKeyAsync("1#MetrologyRoom"); - } - if (!string.IsNullOrEmpty(rfid)) - { - // 判断有无料, 如果没有料,wcs下发空箱旋转信号,有料,通知plc上提升机计量室 - WmsPalletInfo? wmsPalletInfo = sqlSugarClient.Queryable().First(it => it.PalletInfoCode == rfid); - if (wmsPalletInfo != null && wmsPalletInfo.Amount > 0 && wmsPalletInfo.TonerFlag == 0) //携带满料 - { - //1#移栽平台任务(1上提升机,2空箱转运) - workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("1#移栽平台任务"), 1); - workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#料箱运进计量室RFID读取"), false); - } - else if (wmsPalletInfo != null && wmsPalletInfo.Amount == 0) - { - //1#移栽平台任务(1上提升机,2空箱转运) - workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("1#移栽平台任务"), 2); - workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#料箱运进计量室RFID读取"), false); - } - } - else - { - //没读到,当成空箱子旋转一圈 - //1#移栽平台任务(1上提升机,2空箱转运) - //workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("1#移栽平台任务"), 2); - //workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#料箱运进计量室RFID读取"), false); - } + //没读到2空箱转运 + // _logger.Info($"1#移栽====没读到,空箱转运"); + //workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#线体忙碌状态"), 1); + //workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#移栽平台任务"), 2); + //workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#料箱运回RFID读取"), false); } } - - #endregion 连廊料箱在计量室连廊移栽处理流程:wcs读RFID判断是否空箱,空箱下plc信号旋转,非空箱通知plc上提升机计量室 - - #region 色粉存放点空托盘派送至2#接驳位-----暂时不使用 - - /////如果色粉存放点可用空库位小于等于2个,并且有空托盘在库位,判断2#缓存链条线库存(容量3)低于2个,并且无 从3#接驳位到2#接驳位的送料任务或 色粉存放点到2#缓存链条线任务, - /////2.生成色粉存放点到2#缓存链条线任务 - //int canUseAmount = sqlSugarClient.Queryable().Count(it => it.EquipType == 7 && it.EquipStatus == 0 && string.IsNullOrEmpty(it.ContainerCode)); - ////判断色粉存放处是否有空托盘 - //WcsBaseEquip? startEquip = sqlSugarClient.Queryable().InnerJoin( - // (wbe, wpi) => wbe.ContainerCode == wpi.PalletInfoCode && wpi.Amount == 0 && wbe.EquipStatus == 0) - // .Where(wbe => wbe.EquipType == 7 && !string.IsNullOrEmpty(wbe.ContainerCode)).First(); - //if (canUseAmount < 2 && startEquip != null) - //{ - // int cacheLineAmount = workShop2Plc.readInt16ByAddress(StaticData.GetPlcAddress("2#缓存链条线库存数")); - // bool hasTask = sqlSugarClient.Queryable().Any(it => it.TaskType == StaticTaskType.EmptyReturnFromTonerTask || it.TaskType == StaticTaskType.TransferMaterialMetrologyRoomBoxTask); - // if (cacheLineAmount < 2 && !hasTask) - // { - // try - // { - // sqlSugarClient.AsTenant().BeginTran(); - // WcsTask task = new WcsTask(); - // task.TaskType = StaticTaskType.EmptyReturnFromTonerTask; - // task.CurrPointNo = startEquip.AgvPositionCode; - // task.EndPointNo = "2DeliverMetrologyRoomPoint"; - // task.TaskStatus = 0; - // task.CreatedTime = DateTime.Now; - // task.CreatedBy = "wcs"; - // task.TaskName = "色粉存放点空托盘派送至2#接驳位"; - // task.PalletInfoCode = startEquip.ContainerCode; - // int id = sqlSugarClient.Insertable(task).ExecuteReturnIdentity(); - // WcsTaskLog wcsTaskLog = CoreMapper.Map(task); - // wcsTaskLog.Id = id; - // startEquip.EquipStatus = 1; - // sqlSugarClient.Updateable(startEquip).ExecuteCommand(); - // sqlSugarClient.Insertable(wcsTaskLog).ExecuteCommand(); - // sqlSugarClient.AsTenant().CommitTran(); - // _logger.Agv($"生成{task.TaskName},起点:{task.CurrPointNo},终点:{task.EndPointNo}"); - // } - // catch (Exception ex) - // { - // sqlSugarClient.AsTenant().RollbackTran(); - // _logger.Error($"色粉存放点空托盘派送至2#接驳位任务提交事务异常{ex.Message}"); - // } - // } - //} - - #endregion 色粉存放点空托盘派送至2#接驳位-----暂时不使用 } - catch (Exception ex) + + #endregion 计量室料箱返回处理流程:空箱入缓存链条线,色粉派送至色粉存放点 + + #region 连廊料箱在计量室连廊移栽处理流程:wcs读RFID判断是否空箱,空箱下plc信号旋转,非空箱通知plc上提升机计量室 + + if (workShop2Plc != null && workShop2Plc.IsConnected) { - _logger.Error($"ListeningWorkShop2TransplantingMachine方法异常:" + ex.StackTrace); - } - finally - { - await Task.Delay(1000 * 2); + bool returnJudgeSignal = workShop2Plc.readBoolByAddress(StaticData.GetPlcAddress("2#料箱运进计量室RFID读取")); + int busy1Flag = workShop2Plc.readInt16ByAddress(StaticData.GetPlcAddress("1#提升机忙碌状态")); + if (returnJudgeSignal && busy1Flag == 0) + { + //test + + string rfid = ReadEpcStrByRfidKey("1#MetrologyRoom"); + if (string.IsNullOrEmpty(rfid)) + { + rfid = ReadEpcStrByRfidKey("1#MetrologyRoom"); + } + if (!string.IsNullOrEmpty(rfid)) + { + // 判断有无料, 如果没有料,wcs下发空箱旋转信号,有料,通知plc上提升机计量室 + WmsPalletInfo? wmsPalletInfo = sqlSugarClient.Queryable().First(it => it.PalletInfoCode == rfid); + if (wmsPalletInfo != null && wmsPalletInfo.Amount > 0 && wmsPalletInfo.TonerFlag == 1) //携带色粉 + { + //2空箱转运 + _logger.Info($"1#移栽===={rfid}携带色粉,空箱转运"); + workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("1#移栽平台任务"), 2); + workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#料箱运进计量室RFID读取"), false); + } + if (wmsPalletInfo != null && wmsPalletInfo.Amount > 0 && wmsPalletInfo.TonerFlag == 0) //携带满料 + { + //1#移栽平台任务(1上提升机,2空箱转运) + _logger.Info($"1#移栽===={rfid}携带满料,去提升机计量室"); + workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("1#移栽平台任务"), 1); + workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#料箱运进计量室RFID读取"), false); + } + else if (wmsPalletInfo != null && wmsPalletInfo.Amount == 0) + { + //1#移栽平台任务(1上提升机,2空箱转运) + _logger.Info($"1#移栽===={rfid}空箱,空箱转运"); + workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("1#移栽平台任务"), 2); + workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#料箱运进计量室RFID读取"), false); + } + } + else + { + //没读到,当成空箱子旋转一圈 + //1#移栽平台任务(1上提升机,2空箱转运) + // _logger.Info($"1#移栽====没读到,空箱转运"); + //workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("1#移栽平台任务"), 2); + //workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#料箱运进计量室RFID读取"), false); + } + } } + + #endregion 连廊料箱在计量室连廊移栽处理流程:wcs读RFID判断是否空箱,空箱下plc信号旋转,非空箱通知plc上提升机计量室 + + #region 色粉存放点空托盘派送至2#接驳位-----暂时不使用 + + /////如果色粉存放点可用空库位小于等于2个,并且有空托盘在库位,判断2#缓存链条线库存(容量3)低于2个,并且无 从3#接驳位到2#接驳位的送料任务或 色粉存放点到2#缓存链条线任务, + /////2.生成色粉存放点到2#缓存链条线任务 + //int canUseAmount = sqlSugarClient.Queryable().Count(it => it.EquipType == 7 && it.EquipStatus == 0 && string.IsNullOrEmpty(it.ContainerCode)); + ////判断色粉存放处是否有空托盘 + //WcsBaseEquip? startEquip = sqlSugarClient.Queryable().InnerJoin( + // (wbe, wpi) => wbe.ContainerCode == wpi.PalletInfoCode && wpi.Amount == 0 && wbe.EquipStatus == 0) + // .Where(wbe => wbe.EquipType == 7 && !string.IsNullOrEmpty(wbe.ContainerCode)).First(); + //if (canUseAmount < 2 && startEquip != null) + //{ + // int cacheLineAmount = workShop2Plc.readInt16ByAddress(StaticData.GetPlcAddress("2#缓存链条线库存数")); + // bool hasTask = sqlSugarClient.Queryable().Any(it => it.TaskType == StaticTaskType.EmptyReturnFromTonerTask || it.TaskType == StaticTaskType.TransferMaterialMetrologyRoomBoxTask); + // if (cacheLineAmount < 2 && !hasTask) + // { + // try + // { + // sqlSugarClient.AsTenant().BeginTran(); + // WcsTask task = new WcsTask(); + // task.TaskType = StaticTaskType.EmptyReturnFromTonerTask; + // task.CurrPointNo = startEquip.AgvPositionCode; + // task.EndPointNo = "2DeliverMetrologyRoomPoint"; + // task.TaskStatus = 0; + // task.CreatedTime = DateTime.Now; + // task.CreatedBy = "wcs"; + // task.TaskName = "色粉存放点空托盘派送至2#接驳位"; + // task.PalletInfoCode = startEquip.ContainerCode; + // int id = sqlSugarClient.Insertable(task).ExecuteReturnIdentity(); + // WcsTaskLog wcsTaskLog = CoreMapper.Map(task); + // wcsTaskLog.Id = id; + // startEquip.EquipStatus = 1; + // sqlSugarClient.Updateable(startEquip).ExecuteCommand(); + // sqlSugarClient.Insertable(wcsTaskLog).ExecuteCommand(); + // sqlSugarClient.AsTenant().CommitTran(); + // _logger.Agv($"生成{task.TaskName},起点:{task.CurrPointNo},终点:{task.EndPointNo}"); + // } + // catch (Exception ex) + // { + // sqlSugarClient.AsTenant().RollbackTran(); + // _logger.Error($"色粉存放点空托盘派送至2#接驳位任务提交事务异常{ex.Message}"); + // } + // } + //} + + #endregion 色粉存放点空托盘派送至2#接驳位-----暂时不使用 } - }); + catch (Exception ex) + { + _logger.Error($"ListeningWorkShop2TransplantingMachine方法异常:" + ex.StackTrace); + } + finally + { + Thread.Sleep(1000 * 2); + } + } } #region 任务流程 diff --git a/SlnMesnac.WPF/ViewModel/MainWindowViewModel.cs b/SlnMesnac.WPF/ViewModel/MainWindowViewModel.cs index 988365c..0dbe168 100644 --- a/SlnMesnac.WPF/ViewModel/MainWindowViewModel.cs +++ b/SlnMesnac.WPF/ViewModel/MainWindowViewModel.cs @@ -121,6 +121,7 @@ namespace SlnMesnac.WPF.ViewModel private void Init() { StartCheckStatus(); + _timer = new DispatcherTimer(); _timer.Interval = TimeSpan.FromSeconds(1); _timer.Tick += Timer_Tick;