using Khd.Core.Domain.Dto.webapi; using Khd.Core.Domain.Models; using Khd.Core.EntityFramework; using Khd.Core.Library.Mapper; using Khd.Core.Plc.S7; using Khd.Core.Wcs.Global; using Masuit.Tools; using Masuit.Tools.Logging; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Newtonsoft.Json; using Z.EntityFramework.Plus; namespace Khd.Core.Wcs.Wcs { /// /// 五楼CTU调度 /// public class FiveFloorCTU { List ScanPoint { get; set; }//点位信息 private readonly IHost _host; private readonly BasePlcpoint LineRFID; private readonly BasePlcpoint isarrive; private readonly BasePlcpoint isput; private readonly BasePlcpoint canReceive; private readonly BasePlcpoint ReceiveMaterial; private readonly BasePlcpoint CtuLineWaring; int FloorNo { get; set; } int CTUID = 11; public FiveFloorCTU(IHost host, Plc.S7.Plc plc, int floor) { this._host = host; FloorNo = floor; this.LineRFID = StaticData.BasePlcpointList.First(t => t.plcpointNo == "RFID5001"); this.isarrive = StaticData.BasePlcpointList.First(t => t.plcpointNo == "isarrive"); this.isput = StaticData.BasePlcpointList.First(t => t.plcpointNo == "isput"); this.canReceive = StaticData.BasePlcpointList.First(t => t.plcpointNo == "canReceive"); this.ReceiveMaterial = StaticData.BasePlcpointList.First(t => t.plcpointNo == "ReceiveMaterial"); this.CtuLineWaring = StaticData.BasePlcpointList.First(t => t.plcpointNo == "CTULineWaring"); } /// /// 启动上件扫描监听 /// public void StartPoint() { Thread FlowPointThread = new Thread(MonitorInLocatorPoint); FlowPointThread.Start(); Thread FlowCTUInWareThread = new Thread(MonitorInWare); FlowCTUInWareThread.Start(); Thread HeartThread = new Thread(HeartLogic); HeartThread.Start(); Console.WriteLine(DateTime.Now + ":五楼CTU上件扫描监听启动"); LogManager.Info("五楼CTU上件扫描监听启动"); } private void HeartLogic(object? obj) { BasePlcpoint heartPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "CTUHeart"); bool flag = true; while (true) { try { flag = !flag; StaticData.PlcDic[1].WriteToPoint(heartPoint.plcpointAddress, flag.ToString(), heartPoint.plcpointLength.ToString()); } catch { try { StaticData.PlcDic[1] = new Plc.S7.Plc(StaticData.PlcDic[1].CPU, StaticData.PlcDic[1].IP, StaticData.PlcDic[1].Port, StaticData.PlcDic[1].Rack, StaticData.PlcDic[1].Slot); StaticData.PlcDic[1].Open(); } catch { } } Thread.Sleep(1000); } } private void MonitorInWare(object? obj) { using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); //bool IsStart = false; while (true) { try { dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); var rfid = StaticData.PlcDic[1].ReadRFID(LineRFID.plcpointAddress); var isArrive = StaticData.PlcDic[1].Read(isarrive.plcpointAddress); var receiveMaterial = StaticData.PlcDic[1].Read(ReceiveMaterial.plcpointAddress); var waring = StaticData.PlcDic[1].Read(CtuLineWaring.plcpointAddress); if (rfid != null && isArrive != null && receiveMaterial != null && Convert.ToInt32(receiveMaterial) == 1 && Convert.ToInt32(isArrive) == 1) { if (Convert.ToBoolean(waring)) { StaticData.PlcDic[1].WriteToPoint(CtuLineWaring.plcpointAddress, "false", CtuLineWaring.plcpointLength.ToString()); } rfid = rfid[rfid.IndexOf('C')..]; WcsTask? task = dbContext.WcsTask.FirstOrDefault(t => t.containerNo == rfid); if (task == null) { //根据rfid找到库位 //生成入库任务 var wmsBaseLocation = dbContext.WmsBaseLocation.FirstOrDefault(t => t.containerCode == rfid); if (wmsBaseLocation != null) { BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.equipNo == "FL051"); BaseEquip ctuEquip = StaticData.BaseEquip.First(t => t.objid == 11); if (wmsBaseLocation != null) { var wcsTask = new WcsTask() { objid = StaticData.SnowId.NextId(), currPointId = baseEquip.objid, currPointNo = baseEquip.agvPositionCode, nextPointId = ctuEquip.objid, nextPointNo = ctuEquip.equipNo, endPointId = wmsBaseLocation.locationId, endPointNo = wmsBaseLocation.agvPositionCode, taskType = 29, taskStatus = 0, useFlag = 1, floorNo = 5, containerNo = rfid.ToString(), equipmentNo = baseEquip.equipNo, createBy = FloorNo + "楼CTU", createTime = DateTime.Now, }; wmsBaseLocation.instockFlag = "1"; wmsBaseLocation.locationStatus = "2"; wmsBaseLocation.updateTime = DateTime.Now; dbContext.Update(wmsBaseLocation); dbContext.Add(wcsTask); WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); dbContext.Add(wcsTaskLog); dbContext.SaveChanges(); } } } else { if (task.taskType == 30) { dbContext.WcsTask.Where(t => t.objid == task.objid).Delete(); //根据rfid找到库位 //生成入库任务 var wmsBaseLocation = dbContext.WmsBaseLocation.FirstOrDefault(t => t.containerCode == rfid); if (wmsBaseLocation != null) { BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.equipNo == "FL051"); BaseEquip ctuEquip = StaticData.BaseEquip.First(t => t.objid == 11); if (wmsBaseLocation != null) { var wcsTask = new WcsTask() { objid = StaticData.SnowId.NextId(), currPointId = baseEquip.objid, currPointNo = baseEquip.agvPositionCode, nextPointId = ctuEquip.objid, useFlag = 1, endPointId = wmsBaseLocation.locationId, endPointNo = wmsBaseLocation.agvPositionCode, taskType = 29, taskStatus = 0, floorNo = 5, containerNo = rfid.ToString(), equipmentNo = baseEquip.equipNo, createBy = FloorNo + "楼CTU", createTime = DateTime.Now, }; wmsBaseLocation.instockFlag = "1"; wmsBaseLocation.locationStatus = "2"; wmsBaseLocation.updateTime = DateTime.Now; dbContext.Update(wmsBaseLocation); dbContext.Add(wcsTask); WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); dbContext.Add(wcsTaskLog); dbContext.SaveChanges(); } } } else if (task.taskType == 100) { dbContext.WcsTask.Where(t => t.objid == task.objid).Delete(); //根据rfid找到库位 //生成入库任务 var wmsBaseLocation = dbContext.WmsBaseLocation.FirstOrDefault(t => t.containerCode == rfid); if (wmsBaseLocation != null) { BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.equipNo == "FL051"); BaseEquip ctuEquip = StaticData.BaseEquip.First(t => t.objid == 11); if (wmsBaseLocation != null) { var wcsTask = new WcsTask() { objid = StaticData.SnowId.NextId(), currPointId = baseEquip.objid, currPointNo = baseEquip.agvPositionCode, nextPointId = ctuEquip.objid, useFlag = 1, endPointId = wmsBaseLocation.locationId, endPointNo = wmsBaseLocation.agvPositionCode, taskType = 29, taskStatus = 0, floorNo = 5, containerNo = rfid.ToString(), equipmentNo = baseEquip.equipNo, createBy = FloorNo + "楼CTU", createTime = DateTime.Now, }; wmsBaseLocation.instockFlag = "1"; wmsBaseLocation.locationStatus = "2"; wmsBaseLocation.updateTime = DateTime.Now; dbContext.Update(wmsBaseLocation); dbContext.Add(wcsTask); WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); dbContext.Add(wcsTaskLog); dbContext.SaveChanges(); } } } } } else if (Convert.ToInt32(receiveMaterial) == 1 && Convert.ToInt32(isArrive) == 1 && string.IsNullOrEmpty(rfid)) { if (!Convert.ToBoolean(waring)) { StaticData.PlcDic[1].WriteToPoint(CtuLineWaring.plcpointAddress, "true", CtuLineWaring.plcpointLength.ToString()); } } else if (receiveMaterial != null && Convert.ToInt32(receiveMaterial) == 1) { //Task.Run(() => //{ // var receiveMaterial2 = StaticData.PlcDic[1].Read(ReceiveMaterial.plcpointAddress); // while (receiveMaterial2 != null && Convert.ToInt32(receiveMaterial2) == 1) // { // receiveMaterial2 = StaticData.PlcDic[1].Read(ReceiveMaterial.plcpointAddress); // lock (SystemData.outStockLock) // { // WcsOutstockLock wcsOutstockLock = dbContext.WcsOutstockLock.Where(t => t.warehouseId == 512).First(); // bool haveTask = dbContext.WcsTask.Where(t => t.nextPointId == 11).Any(); // if (!haveTask && wcsOutstockLock.boxStatus == 1) // { // wcsOutstockLock.boxStatus = 0; // wcsOutstockLock.qty = 0; // dbContext.Update(wcsOutstockLock); // dbContext.SaveChanges(); // } // } // Thread.Sleep(3000); // } //}); } } catch (Exception ex) { if (ex is PlcException) { try { foreach (var item in StaticData.PlcDic) { if (item.Value.IP == ex.Message) { StaticData.PlcDic[item.Key] = new Plc.S7.Plc(item.Value.CPU, item.Value.IP, item.Value.Port, item.Value.Rack, item.Value.Slot); StaticData.PlcDic[item.Key].Open(); } } } catch { } } LogManager.Error(ex); } Thread.Sleep(1000); } } /// /// 预执行任务下发 /// //private void CtuWaitLogic() //{ // BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.objid == CTUID); // BaseEquip Fl051 = StaticData.BaseEquip.First(t => t.objid == 19);//入库输送线 // while (true) // { // try // { // while (isWait) // { // var waitTask = new // { // reqCode = StaticData.SnowId.NextId().ToString(), // positionCode = "CTU_IN", // nextTask = 1200 // }; // string waitMessage = JsonConvert.SerializeObject(waitTask); // string waitResult = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/genPreScheduleTask", waitMessage); // var waitReponse = JsonConvert.DeserializeObject(waitResult); // if (waitReponse != null && waitReponse.code == "0") // { // isSendWait = true; // } // else // { // LogManager.Info("CTU下发预执行任务失败:\nwaitTask:" + waitMessage + "\nwaitResult:" + waitResult); // } // Thread.Sleep(1000 * 60 * 10);//每10分钟重新下发预执行任务 // } // isSendWait = false; // } // catch (Exception ex) // { // LogManager.Error(ex); // } // Thread.Sleep(3000); // } //} private bool CtuWaitLogic() { BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.objid == CTUID); BaseEquip Fl051 = StaticData.BaseEquip.First(t => t.objid == 19);//入库输送线 try { var waitTask = new { reqCode = StaticData.SnowId.NextId().ToString(), positionCode = "CTU_IN", nextTask = 120 }; string waitMessage = JsonConvert.SerializeObject(waitTask); string waitResult = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/genPreScheduleTask", waitMessage); var waitReponse = JsonConvert.DeserializeObject(waitResult); if (waitReponse != null && waitReponse.code == "0") { return true; } else { LogManager.Info("CTU下发预执行任务失败:\nwaitTask:" + waitMessage + "\nwaitResult:" + waitResult); } } catch (Exception ex) { LogManager.Error(ex); return false; } return false; } /// /// 监控上件扫描点位 /// public void MonitorInLocatorPoint() { List taskType = new() { 1, 3, 5, 7 }; using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.objid == CTUID); while (true) { try { dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); var taskList = dbContext.WcsTask .Where(t => t.useFlag == 1) .Where(t => t.nextPointId == CTUID).OrderByDescending(t => t.ud1).ToList(); if (taskList.Count == 0) { LogManager.Info(FloorNo + "楼CTU无任务"); } foreach (var item in taskList) { if (item.taskStatus == 0)//CTU会同时生成多个任务,生成就下发? { if (item.taskType == 30)//出库任务 { BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == item.endPointId); WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.currPointId); var wcsCmd = new WcsCmd() { objid = StaticData.SnowId.NextId(), cmdStatus = 0, taskId = item.objid, useFlag = 1, cmdType = item.taskType, containerNo = item.containerNo, createTime = DateTime.Now, createBy = FloorNo + "楼CTU", currPointId = wmsBaseLocation.locationId, currPointNo = wmsBaseLocation.agvPositionCode, nextPointId = endEquip.objid, nextPointNo = endEquip.agvPositionCode, taskCode = null }; var agvTask = new RequestAGVTaskDto { reqCode = StaticData.SnowId.NextId().ToString(), positionCodePath = new List { new() { positionCode = wcsCmd.currPointNo, type = "05"//05库位 }, new() { positionCode = wcsCmd.nextPointNo, type = "00"//设备 }, }, ctnrTyp = "1", taskTyp = "F504" }; string message = JsonConvert.SerializeObject(agvTask); string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/genAgvSchedulingTask", message); var reponseMessage = JsonConvert.DeserializeObject(result); if (reponseMessage != null && reponseMessage.code == "0") { wcsCmd.taskCode = reponseMessage.data; wcsCmd.cmdStatus = 1; item.taskStatus = 1; dbContext.Update(item); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 1 }); WcsCmdLog wcsCmdLog = CoreMapper.Map(wcsCmd); dbContext.Add(wcsCmdLog); dbContext.WcsCmd.Add(wcsCmd); dbContext.SaveChanges(); } else { LogManager.Info("CTU下发出库任务失败:" + reponseMessage?.message); } } else if (item.taskType == 29)//入库任务 { bool haveOut = taskList.Where(t => t.taskType == 30).Where(t => t.taskStatus != 6).Any(); if (!haveOut && CtuWaitLogic()) { BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == item.currPointId); WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.endPointId); var wcsCmd = new WcsCmd() { objid = StaticData.SnowId.NextId(), cmdStatus = 0, taskId = item.objid, useFlag = 1, cmdType = item.taskType, containerNo = item.containerNo, createTime = DateTime.Now, createBy = FloorNo + "楼CTU", nextPointId = wmsBaseLocation.locationId, nextPointNo = wmsBaseLocation.agvPositionCode, currPointId = startEquip.objid, currPointNo = startEquip.agvPositionCode, }; var agvTask = new { reqCode = StaticData.SnowId.NextId().ToString(), positionCodePath = new List { new() { positionCode = wcsCmd.currPointNo, type = "05"//设备 }, new() { positionCode = wcsCmd.nextPointNo, type = "05"//库位 }, }, ctnrTyp = "1", taskTyp = "F503" }; string message = JsonConvert.SerializeObject(agvTask); string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/genAgvSchedulingTask", message); var reponseMessage = JsonConvert.DeserializeObject(result); if (reponseMessage != null && reponseMessage.code == "0") { wcsCmd.taskCode = reponseMessage.data; wcsCmd.cmdStatus = 1; item.taskStatus = 1; dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 1 }); WcsCmdLog wcsCmdLog = CoreMapper.Map(wcsCmd); dbContext.Add(wcsCmdLog); dbContext.Update(item); dbContext.Add(wcsCmd); int ctuTaskCount = dbContext.WcsTask.Where(t => t.taskType == 29).Count(); lock (SystemData.outStockLock) { WcsOutstockLock wcsOutstockLock = dbContext.WcsOutstockLock.Where(t => t.warehouseId == 512).First(); if (ctuTaskCount >= 6 || wcsOutstockLock.qty == ctuTaskCount)//如果CTU当前任务数量很多,取消预执行任务 { ExecuteInTask(baseEquip); wcsOutstockLock.qty = 0; wcsOutstockLock.boxStatus = 0; dbContext.Update(wcsOutstockLock); //isWait = false; } } dbContext.SaveChanges(); } else { LogManager.Info("CTU下发入库任务失败:" + reponseMessage?.message); } } } else if (item.taskType == 100)//盘库 { BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == item.endPointId); WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.currPointId); var wcsCmd = new WcsCmd() { objid = StaticData.SnowId.NextId(), cmdStatus = 0, taskId = item.objid, useFlag = 1, cmdType = item.taskType, containerNo = item.containerNo, createTime = DateTime.Now, createBy = FloorNo + "楼CTU", currPointId = wmsBaseLocation.locationId, currPointNo = wmsBaseLocation.agvPositionCode, nextPointId = endEquip.objid, nextPointNo = endEquip.agvPositionCode, taskCode = null }; var agvTask = new RequestAGVTaskDto { reqCode = StaticData.SnowId.NextId().ToString(), positionCodePath = new List { new() { positionCode = wcsCmd.currPointNo, type = "05" }, new() { positionCode = wcsCmd.nextPointNo, type = "00" }, }, ctnrTyp = "1", taskTyp = "F504" }; string message = JsonConvert.SerializeObject(agvTask); string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/genAgvSchedulingTask", message); var reponseMessage = JsonConvert.DeserializeObject(result); if (reponseMessage != null && reponseMessage.code == "0") { wcsCmd.taskCode = reponseMessage.data; wcsCmd.cmdStatus = 1; item.taskStatus = 1; dbContext.Update(item); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 1 }); WcsCmdLog wcsCmdLog = CoreMapper.Map(wcsCmd); dbContext.Add(wcsCmdLog); dbContext.WcsCmd.Add(wcsCmd); dbContext.SaveChanges(); } else { LogManager.Info("CTU下发出库任务失败:" + reponseMessage?.message); } } } else { WcsCmd? wcsCmd = dbContext.WcsCmd.FirstOrDefault(t => t.taskId == item.objid); if (wcsCmd != null) { if (wcsCmd.cmdStatus == 3) { if (item.taskType == 30 || item.taskType == 100) { var canOut = StaticData.PlcDic[1].Read(isput.plcpointAddress); if (canOut != null && Convert.ToInt64(canOut) == 0) { var agvTask = new { reqCode = StaticData.SnowId.NextId().ToString(), taskCode = wcsCmd.taskCode, type = 2 }; string message = JsonConvert.SerializeObject(agvTask); string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/boxApplyPass", message); ReponseMessage? reponseMessage = JsonConvert.DeserializeObject(result); if (reponseMessage != null && reponseMessage.code == "0") { LogManager.Info("五楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message); Console.WriteLine(DateTime.Now + ":五楼CTU线程继续任务" + item.currPointId + "," + item.endPointNo); dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmd() { cmdStatus = 4 }); dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog() { cmdStatus = 4 }); dbContext.WcsTask.Where(t => t.objid == item.objid).Update(t => new WcsTask() { taskStatus = 4 }); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 4 }); dbContext.SaveChanges(); } else { LogManager.Info("CTU第一次下发继续任务失败:" + reponseMessage?.message); } } } if (item.taskType == 29) { var agvTask = new { reqCode = StaticData.SnowId.NextId().ToString(), taskCode = wcsCmd.taskCode, type = 1 }; string message = JsonConvert.SerializeObject(agvTask); string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/boxApplyPass", message); ReponseMessage? reponseMessage = JsonConvert.DeserializeObject(result); if (reponseMessage != null && reponseMessage.code == "0") { LogManager.Info("五楼CTU线程下发任务" + agvTask.ToJsonString() + "\n" + message); Console.WriteLine(DateTime.Now + ":五楼CTU线程下发任务" + item.currPointId + "," + item.endPointNo); dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmd() { cmdStatus = 4 }); dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog() { cmdStatus = 4 }); dbContext.WcsTask.Where(t => t.objid == item.objid).Update(t => new WcsTask() { taskStatus = 4 }); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 4 }); dbContext.SaveChanges(); } else { LogManager.Info("CTU第二次下发继续任务失败:" + reponseMessage?.message); } } } else if (wcsCmd.cmdStatus == 5) { LogManager.Info("五楼CTU线程完成任务" + wcsCmd.objid); Console.WriteLine(DateTime.Now + ":五楼CTU线程完成任务" + wcsCmd.objid); if (item.taskType == 30)//出库任务 { WmsRawOutstockDetail? wmsRawOutstockDetail = dbContext.WmsRawOutstockDetail.FirstOrDefault(t => t.taskCode == item.objid.ToString()); if (wmsRawOutstockDetail != null) { wmsRawOutstockDetail.executeStatus = "2"; wmsRawOutstockDetail.updateDate = DateTime.Now; dbContext.Update(wmsRawOutstockDetail); } WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation .First(t => t.locationId == item.currPointId && t.warehouseFloor == 5); wmsBaseLocation.outstockFlag = "0"; wmsBaseLocation.locationStatus = "1"; wmsBaseLocation.locationStatus = "2"; dbContext.Update(wmsBaseLocation); dbContext.WmsRawOutstockDetail.Where(t => t.locationCode == wmsBaseLocation.locationCode).Update(t => new WmsRawOutstockDetail { executeStatus = "2" }); dbContext.Remove(wcsCmd); dbContext.WcsTask.Where(t => t.objid == item.objid).Update(t => new WcsTask() { taskStatus = 6 }); dbContext.SaveChanges(); dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog() { cmdStatus = 6 }); dbContext.WcsTaskLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsTaskLog() { taskStatus = 6 }); int wcsTaskCount = dbContext.WcsTask.Where(t => t.taskType == 30 && t.taskStatus != 6).Count(); if (wcsTaskCount == 0) { StaticData.PlcDic[1].WriteToPoint(this.canReceive.plcpointAddress, "1", this.canReceive.plcpointLength?.ToString()); } } else if (item.taskType == 29)//入库任务 { WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation .First(t => t.locationId == item.endPointId && t.warehouseFloor == 5); wmsBaseLocation.instockFlag = "0"; wmsBaseLocation.locationStatus = "1"; wmsBaseLocation.locationStatus = "1"; wmsBaseLocation.ContainerStatus = "1"; dbContext.Update(wmsBaseLocation); dbContext.Remove(wcsCmd); dbContext.Remove(item); dbContext.SaveChanges(); dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog() { cmdStatus = 6 }); dbContext.WcsTaskLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsTaskLog() { taskStatus = 6 }); lock (SystemData.outStockLock) { WcsOutstockLock wcsOutstockLock = dbContext.WcsOutstockLock.Where(t => t.warehouseId == 512).First(); wcsOutstockLock.qty = 0; wcsOutstockLock.boxStatus = 0; dbContext.Update(wcsOutstockLock); dbContext.SaveChanges(); } } else if (item.taskType == 100)//出库任务 { WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation .First(t => t.locationId == item.currPointId && t.warehouseFloor == 5); wmsBaseLocation.outstockFlag = "0"; wmsBaseLocation.locationStatus = "1"; wmsBaseLocation.locationStatus = "2"; dbContext.Update(wmsBaseLocation); dbContext.Remove(wcsCmd); dbContext.WcsTask.Where(t => t.objid == item.objid).Update(t => new WcsTask() { taskStatus = 6 }); dbContext.SaveChanges(); dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog() { cmdStatus = 6 }); dbContext.WcsTaskLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsTaskLog() { taskStatus = 6 }); int wcsTaskCount = dbContext.WcsTask.Where(t => (t.taskType == 30 || t.taskType == 100) && t.taskStatus != 6).Count(); if (wcsTaskCount == 0) { StaticData.PlcDic[1].WriteToPoint(this.canReceive.plcpointAddress, "1", this.canReceive.plcpointLength?.ToString()); } } } } } } } catch (Exception ex) { if (ex is PlcException) { try { foreach (var item in StaticData.PlcDic) { if (item.Value.IP == ex.Message) { StaticData.PlcDic[item.Key] = new Plc.S7.Plc(item.Value.CPU, item.Value.IP, item.Value.Port, item.Value.Rack, item.Value.Slot); StaticData.PlcDic[item.Key].Open(); } } } catch { } } LogManager.Error(ex); } finally { Thread.Sleep(1000); } } } /// /// 通知CTU取消预执行任务 /// /// /// private void ExecuteInTask(BaseEquip baseEquip) { //while (isWait) { var executeTask = new { reqCode = StaticData.SnowId.NextId().ToString(), positionCode = "CTU_IN", nextTask = -1 }; string executeMessage = JsonConvert.SerializeObject(executeTask); string executeResult = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/genPreScheduleTask", executeMessage); var executeReponse = JsonConvert.DeserializeObject(executeResult); if (executeReponse != null && executeReponse.code == "0") { LogManager.Info("下发CTU执行入库任务成功"); } else { LogManager.Info("下发CTU执行入库任务失败"); Console.WriteLine($"{DateTime.Now}:下发CTU执行入库任务失败" + executeReponse?.message); ExecuteInTask(baseEquip); Thread.Sleep(1000); } } } } }