using Khd.Core.Domain.Dto.TaskType; using Khd.Core.Domain.Dto.waring; using Khd.Core.Domain.Models; using Khd.Core.EntityFramework; using Khd.Core.Library; using Khd.Core.Library.Mapper; using Khd.Core.Plc.S7; using Khd.Core.Wcs.Global; using Masuit.Tools; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Z.EntityFramework.Plus; namespace Khd.Core.Wcs.Wcs { /// /// 一楼线程(包括接驳位,提升机调度) /// public class FirstFloor { private readonly LoggerUtils _logger = new LoggerUtils(); private readonly IHost _host; private readonly long F01 = 1; private readonly long T01 = 6; /// /// 一楼RFID 读 /// private readonly BasePlcpoint RFID001; /// /// 到位信号 读 /// private readonly BasePlcpoint linesignal01; /// /// 提升机流水号 读 /// private readonly BasePlcpoint serialno06; /// /// 提升机状态 读 /// private readonly BasePlcpoint equipstate06; /// /// 提升机任务状态 读 /// private readonly BasePlcpoint hoistertrayin06; /// /// 提升机当前楼层 写 /// private readonly BasePlcpoint currentfloor06; /// /// 提升机目的楼层 写 /// private readonly BasePlcpoint targetfloor06; /// /// 提升机反馈流水号 /// private readonly BasePlcpoint reserialno06; /// /// 提升机手自动状态 /// private readonly BasePlcpoint hoisterStatus; /// /// 提升机到位信号 读 /// private readonly BasePlcpoint mesClose; public FirstFloor(IHost host) { this._host = host; //一楼RFID 读 this.RFID001 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("FirstFloorLine") && t.plcpointNo.Contains("RFID001")); //到位信号 读 this.linesignal01 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("FirstFloorLine") && t.plcpointNo.Contains("linesignal01")); //一楼提升机流水号 读 this.serialno06 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("Hoister") && t.plcpointNo.Contains("serialno06")); // Mes 关闭 this.mesClose = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("Hoister") && t.plcpointNo.Contains("mesclose")); //一楼提升机状态 读 this.equipstate06 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("Hoister") && t.plcpointNo.Contains("equipstate06")); //一楼提升机任务状态 读 this.hoistertrayin06 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("Hoister") && t.plcpointNo.Contains("hoistertrayin06")); //一楼提升机当前楼层 写 this.currentfloor06 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("Hoister") && t.plcpointNo.Contains("currentfloor06")); //一楼提升机目的楼层 写 this.targetfloor06 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("Hoister") && t.plcpointNo.Contains("targetfloor06")); //一楼提升机到位信号 读 this.reserialno06 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("Hoister") && t.plcpointNo.Contains("reserialno06")); //提升机手自动状态 this.hoisterStatus = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("Hoister") && t.plcpointNo.Contains("hoisterStatus")); } /// /// 启动上件扫描监听 /// public void StartPoint() { Thread firstFloorLine = new(FirstFloorLine)//一楼接驳位线程 { IsBackground = true, Name = "FirstFloorLine" }; firstFloorLine.Start(); Thread firstFloorHoister = new(FirstFloorHoister)//提升机 { IsBackground = true, Name = "FirstFloorHoister" }; firstFloorHoister.Start(); Thread equipStatusThread = new Thread(EquipStatusLogic)//设备状态,1-5楼接驳位能不能送货,提升机和小车任务 { IsBackground = true, Name = "EquipStatusThread" }; equipStatusThread.Start(); Console.WriteLine(DateTime.Now + ":一楼提升机线程启动成功"); _logger.Info("一楼提升机线程启动成功"); } private void EquipStatusLogic(object? obj) { using var scope = this._host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); while (true) { try { for (int i = 1; i <= 5; i++) { BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == $"linesignal0{i}"); var lineSignal = StaticData.PlcDic[0].Read(basePlcpoint.plcpointAddress); if (lineSignal != null) { if (Convert.ToInt32(lineSignal) == 1) { BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == i); if (baseEquip.equipStatus != 1)//不是忙碌状态,改为忙碌状态 { baseEquip.equipStatus = 1; dbContext.Update(baseEquip); dbContext.SaveChanges(); } //else //{ // bool hasTask = dbContext.WcsTask.Where(t => t.endPointId == i || t.currPointId == i).Any(); // if (!hasTask) // { // baseEquip.equipStatus = 0; // dbContext.Update(baseEquip); // dbContext.SaveChanges(); // } //} } else { BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == i); //bool hasCmd = dbContext.WcsCmd.Where(t => t.nextPointId == i || t.currPointId == i).Any();//小车任务 bool hasTask = dbContext.WcsTask.Where(t => (t.endPointId == i) && t.taskStatus >= 1 && t.nextPointId == 6).Any();//提升机任务,有没有正在执行的往这个接驳位送的 bool hascmd = dbContext.WcsTask.Where(t => (t.endPointId == i) && t.taskStatus >= 1 && t.nextPointId != 6).Any();//提升机任务,有没有正在执行的往这个接驳位送的 if (hascmd || hasTask) { baseEquip.containerNo = null; baseEquip.equipStatus = 1; } else//接驳位改为忙碌状态 { baseEquip.containerNo = null; baseEquip.equipStatus = 0; } dbContext.Update(baseEquip); dbContext.SaveChanges(); } } } } catch (Exception ex) { if (ex is PlcException) { } else { _logger.Error(ex.Message + "\n" + ex.StackTrace); } } Thread.Sleep(1000); } } private void CallEmpty() { using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); BasePlcpoint oneOutPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "oneOut"); BasePlcpoint someOutPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "someOut"); BaseEquip mdjEquip = StaticData.BaseEquip.First(t => t.objid == 40); while (true) { try { dbContext.ChangeTracker.Clear(); var linesignal = StaticData.PlcDic[0].Read(this.linesignal01.plcpointAddress); int taskCount = dbContext.WcsTask.Where(t => t.nextPointId == 6 && t.taskStatus > 0 && t.endPointId == 1).Count(); int firstFloorCount = dbContext.WcsTask.Where(t => t.currPointId == 1).Count(); if (Convert.ToInt32(linesignal) == 0 && taskCount == 0 && firstFloorCount == 0) { bool canSend = dbContext.WcsTask.Where(t => t.floorNo == 1).Where(t => t.taskStatus > 0).Any(); if (!canSend) { WcsTaskManual? wcsTaskManual = dbContext.WcsTaskManual.Where(t => t.nextPointId == 40).FirstOrDefault(); if (wcsTaskManual != null) { if (wcsTaskManual.taskType == 53) { StaticData.PlcDic[0].WriteToPoint(someOutPoint.plcpointAddress, "1", someOutPoint.plcpointLength.ToString()); WcsTask wcsTask = CoreMapper.Map(wcsTaskManual); wcsTask.createTime = DateTime.Now; wcsTask.createBy = "一楼接驳位线程"; wcsTask.taskStatus = 0; wcsTask.useFlag = 1; wcsTask.isEmpty = "1"; wcsTask.qty = mdjEquip.emptyCount; wcsTask.remark = "一楼创建入库任务"; WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); mdjEquip.emptyCount = 0; dbContext.Update(mdjEquip); dbContext.Add(wcsTaskLog); dbContext.Add(wcsTask); dbContext.SaveChanges(); _logger.Info("一楼接驳位线程:空托盘任务下发成功"); Console.WriteLine(DateTime.Now + ":一楼接驳位线程:空托盘任务下发成功"); } } } } } catch (Exception ex) { if (ex is PlcException) { } else { _logger.Error(ex.Message + "\n" + ex.StackTrace); } } Thread.Sleep(1000); } } public static bool ReadEmptyLocation() { var oneOutPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "oneOut"); var someOutPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "someOut"); var oneInPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "oneIn"); var someInPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "someIn"); var oneOutValue = StaticData.PlcDic[0].Read(oneOutPoint.plcpointAddress); var someOutValue = StaticData.PlcDic[0].Read(someOutPoint.plcpointAddress); var oneInValue = StaticData.PlcDic[0].Read(oneInPoint.plcpointAddress); var someInValue = StaticData.PlcDic[0].Read(someInPoint.plcpointAddress); if (oneOutValue != null && someOutValue != null && oneInValue != null && someInValue != null) { if (Convert.ToInt32(oneOutValue) == 0 && Convert.ToInt32(someOutValue) == 0 && Convert.ToInt32(oneInValue) == 0 && Convert.ToInt32(someInValue) == 0) { return true; } } return false; } /// /// 启动一楼接驳位线程 /// private void FirstFloorLine() { List Outtpyes = new() { 2, 4, 8, 6 }; using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); while (true) { try { dbContext.ChangeTracker.Clear();//上次查出1,不加这行,数据库实际2,查出1 var RFID001Value = StaticData.PlcDic[0].ReadRFID(this.RFID001.plcpointAddress); //一楼RFID 读 var linesignal01Value = StaticData.PlcDic[0].Read(this.linesignal01.plcpointAddress); //到位信号 读 //正常读到plc值 if (linesignal01Value != null && RFID001Value != null) { //正常托盘到位 BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == 1); if (Convert.ToInt32(linesignal01Value) == 1) { var wcsTasks = dbContext.WcsTask.ToList(); //判断task表里没有该rfid的未完成的入库 //信息,未下发去向 var task = wcsTasks.Where(t => t.IsDelete == 0 || t.IsDelete == null) .Where(t => t.nextPointId == 1) .OrderBy(t => t.createTime).FirstOrDefault(); if (task == null) { if (StaticData.BigContainerCodes.Contains(RFID001Value)) { var newTask = new WcsTask() { objid = StaticData.SnowId.NextId(), serialNo = SystemData.GetSerialNo(dbContext), equipmentNo = "F01", taskType = 5, taskStatus = 0, containerNo = RFID001Value, currPointId = F01, currPointNo = "TSJ_01", nextPointId = T01, nextPointNo = "TSJ_01", fromFloorNo = 1, floorNo = 4, useFlag = 1, ud1 = 20, createBy = "一楼接驳位", createTime = DateTime.Now, remark = "一楼创建入库任务" }; WcsTaskLog wcsTaskLog = CoreMapper.Map(newTask); dbContext.Add(wcsTaskLog); dbContext.Add(newTask); dbContext.SaveChanges(); } else { var hasTask = wcsTasks.Where(t => t.containerNo == RFID001Value).Any(); if (!hasTask) { //根据托盘号获取物料码 var material = dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == RFID001Value).FirstOrDefault(); WcsTaskLog? taskLog = dbContext.WcsTaskLog.Where(t => t.containerNo == RFID001Value).OrderByDescending(t => t.createTime).FirstOrDefault(); if (material != null) { if (string.IsNullOrEmpty(material.materialBarcode)) { continue; } bool hasBarInfo = dbContext.MesBaseBarcodeInfo.Where(t => t.palletInfoCode == RFID001Value && t.barcodeInfo == material.materialBarcode).Any(); if (!hasBarInfo) { continue; } if (taskLog != null) { if (taskLog.materialBarcode == material.materialBarcode) { if (baseEquip.containerNo == "0") { baseEquip.containerNo = null; dbContext.Update(baseEquip); dbContext.SaveChanges(); _logger.Info("一楼接驳位线程:托盘" + RFID001Value + "解绑信息更新成功"); } else if (baseEquip.containerNo != RFID001Value) { baseEquip.containerNo = RFID001Value; dbContext.Update(baseEquip); dbContext.SaveChanges(); _logger.Info("一楼接驳位线程:托盘" + RFID001Value + "绑定信息更新成功"); Console.WriteLine(DateTime.Now + ":一楼接驳位线程:托盘" + RFID001Value + "绑定信息更新成功"); Thread.Sleep(3000); continue; } else { Thread.Sleep(3000); continue; } } } var warehouseId = dbContext.WmsWarehouseMaterial.Where(t => t.storageType == "1" && t.storageId == material.materialId).FirstOrDefault()?.warehouseId; if (warehouseId != null) { var TargetFloor = dbContext.WmsBaseWarehouse.Where(t => t.warehouseId == warehouseId).FirstOrDefault(); if (TargetFloor != null) { BaseEquip baseEquip1 = dbContext.BaseEquip.First(t => t.objid == TargetFloor.warehouseFloor); //插入task表 var dic = StaticData.BaseDictionary.Where(t => t.dicKey == "TaskType" && t.agvType == "I" && t.dicField == TargetFloor.warehouseInstockType).FirstOrDefault(); if (dic != null) { var newTask = new WcsTask() { objid = StaticData.SnowId.NextId(), serialNo = SystemData.GetSerialNo(dbContext), equipmentNo = "F01", taskType = Convert.ToInt32(dic.dicValue), taskStatus = 0, containerNo = RFID001Value, materialBarcode = material.materialBarcode, materialId = material.materialId, qty = Convert.ToInt32(material.bindAmount), currPointId = F01, currPointNo = "TSJ_01", nextPointId = T01, nextPointNo = "TSJ_01", ud1 = 20, endPointId = baseEquip1.objid, endPointNo=baseEquip1.equipNo, fromFloorNo = 1, floorNo = TargetFloor.warehouseFloor, useFlag = 1, createBy = "一楼接驳位", createTime = DateTime.Now, remark = "一楼创建入库任务" }; WcsTaskLog wcsTaskLog = CoreMapper.Map(newTask); dbContext.Add(wcsTaskLog); dbContext.Add(newTask); dbContext.SaveChanges(); } } } else { SystemData.InsertWaringLog(dbContext, WaringType.绑定物料无仓库信息, "一楼接驳位物料未绑定仓库信息"); continue; } } } } } else { if (string.IsNullOrEmpty(task.containerNo))//人工调出 { if (task.useFlag == 1) { if (task.qty > 1)//多个托盘 { if (task.endPointId != 1) { task.nextPointId = 6; dbContext.SaveChanges(); } } else if (task.qty == 1) { if (task.endPointId != 1) { task.nextPointId = 6; task.containerNo = RFID001Value; dbContext.SaveChanges(); } } } } else { MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == RFID001Value); if (mesBasePalletInfo != null) { MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.Where(t => t.palletInfoCode == RFID001Value).FirstOrDefault(); if (mesBaseBarcodeInfo != null) { mesBaseBarcodeInfo.palletInfoCode = null; dbContext.Update(mesBaseBarcodeInfo); } mesBasePalletInfo.bindAmount = null; mesBasePalletInfo.bindAmount = null; mesBasePalletInfo.materialBarcode = null; mesBasePalletInfo.materialCode = null; mesBasePalletInfo.materialId = null; mesBasePalletInfo.materialName = null; mesBasePalletInfo.updateBy = "WCS"; mesBasePalletInfo.updateTime = DateTime.Now; dbContext.Update(mesBasePalletInfo); dbContext.Remove(task); dbContext.WcsTaskLog.Where(t => t.objid == task.objid).Update(t => new WcsTaskLog { taskStatus = 6 }); dbContext.SaveChanges(); } } } } } } catch (Exception ex) { if (ex is PlcException) { } else { _logger.Error(ex.Message + "\n" + ex.StackTrace); } } SystemData.DeleteWaringLog(dbContext, WaringType.绑定物料无仓库信息); Thread.Sleep(3000); } } /// /// 提升机线程 /// private void FirstFloorHoister() { using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); List Outtpyes = new();//有问题的楼层任务 string warningMsg = "任务无法下发"; while (true) { using var transaction = dbContext.Database.BeginTransaction(); try { Outtpyes.Clear(); var mesCloseValue = StaticData.PlcDic[0].Read(this.mesClose.plcpointAddress); //MES关闭状态 读 var serialno06Value = StaticData.PlcDic[0].Read(this.serialno06.plcpointAddress); //提升机流水号 读 var equipstate06Value = StaticData.PlcDic[0].Read(this.equipstate06.plcpointAddress); //提升机状态 读 var hoisterTrayIn06Value = StaticData.PlcDic[0].Read(this.hoistertrayin06.plcpointAddress); //提升机货物到位状态 读 var currentfloor06Value = StaticData.PlcDic[0].Read(this.currentfloor06.plcpointAddress); //提升机当前楼层 读 var targetfloor06Value = StaticData.PlcDic[0].Read(this.targetfloor06.plcpointAddress); //提升机目的楼层 写 var hoisterStatusValue = StaticData.PlcDic[0].Read(this.hoisterStatus.plcpointAddress); //提升机目的楼层 写 var reserialno06 = StaticData.PlcDic[0].Read(this.reserialno06.plcpointAddress); //反馈流水号 if (mesCloseValue != null && hoisterStatusValue != null && Convert.ToInt32(hoisterStatusValue) == 1 && Convert.ToInt32(mesCloseValue) == 0) { //正常读到plc值 if (targetfloor06Value != null && serialno06Value != null && equipstate06Value != null && currentfloor06Value != null && reserialno06 != null && hoisterTrayIn06Value != null) { //提升机空闲 if (Convert.ToInt32(equipstate06Value) == 0) { dbContext.ChangeTracker.Clear(); var wcsTasks = dbContext.WcsTask.Where(t => t.nextPointId == T01 && t.taskStatus < 5) .OrderBy(t => t.ud1).OrderBy(t => t.createTime).ToList(); foreach (var wcsTask in wcsTasks) { Outtpyes.Add(wcsTask.floorNo.Value); if (wcsTask.taskType == StaticTaskType.SecondTransitToLift && !string.IsNullOrEmpty(wcsTask.containerNo)) { var mesBasePalletInfo = dbContext.MesBasePalletInfo .Where(t => t.palletInfoCode == wcsTask.containerNo).FirstOrDefault(); if (mesBasePalletInfo == null || string.IsNullOrEmpty(mesBasePalletInfo.materialBarcode)) { warningMsg = "2楼周转位废料到3楼,托盘未绑定条码,请先绑定"; continue; } var mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo .Where(t => t.palletInfoCode == wcsTask.containerNo && t.barcodeInfo == mesBasePalletInfo.materialBarcode).FirstOrDefault(); if (mesBaseBarcodeInfo == null) { warningMsg = "2楼周转位废料到3楼,未找到条码信息,请确认"; continue; } } _logger.Info($"当前任务?{wcsTask.ToJsonString()}"); bool CanExecute = false; long agvEquip = 0; List taskType = new(); if (wcsTask.floorNo == 3) { agvEquip = 9; taskType.Add(StaticTaskType.ThirdTransitToLift); taskType.Add(StaticTaskType.ThirdStockReturnTask); } else if (wcsTask.floorNo == 5) { agvEquip = 28; taskType.Add(StaticTaskType.FiveStockReturnTask); taskType.Add(StaticTaskType.FiveProductOut); } else if (wcsTask.floorNo == 2) { agvEquip = 8; taskType.Add(StaticTaskType.SecondStorageToLift); taskType.Add(StaticTaskType.SecondTransitToLift); } else { CanExecute = true; } if (!CanExecute) { CanExecute = !dbContext.WcsTask.Where(t => taskType.Contains(t.taskType.Value) && t.nextPointId == agvEquip).Any(); } if (CanExecute) { wcsTask.serialNo ??= SystemData.GetSerialNo(dbContext); if (wcsTasks.Where(t => t.taskStatus > 0).Where(t => t.objid != wcsTask.objid).Any()) { warningMsg = "提升机线程:目的楼层有其他任务正在执行,跳过当前任务"; _logger.Info("提升机线程:目的楼层有其他任务正在执行,跳过当前任务"); continue; } BaseEquip lineEquip = dbContext.BaseEquip.First(t => t.objid == wcsTask.floorNo); if (wcsTask.taskStatus == 0 && Convert.ToInt32(hoisterTrayIn06Value) == 0)//创建状态,并且里面没有货物 { // 目的楼层从接驳位出发入库的任务 --待测试 var InTask = dbContext.WcsTask.FirstOrDefault(t => t.currPointId == lineEquip.objid); if (lineEquip.equipStatus == 1 && InTask == null) { warningMsg = $"提升机目的楼层{wcsTask.floorNo}楼接驳位有物体或任务正在执行,跳过当前任务"; _logger.Info($"提升机目的楼层{wcsTask.floorNo}楼接驳位有物体或任务正在执行,跳过当前任务"); continue; } BasePlcpoint floorPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "RFID00" + wcsTask.fromFloorNo); string? rfid = StaticData.PlcDic[0].ReadRFID(floorPoint.plcpointAddress); _logger.Info($"{wcsTask.fromFloorNo}楼RFID?{rfid},任务RFID{wcsTask.containerNo}"); if (wcsTask.containerNo == rfid || (string.IsNullOrEmpty(wcsTask.containerNo) && wcsTask.qty > 1 || wcsTask.taskType == 99)) { if (Convert.ToInt32(currentfloor06Value) == wcsTask.fromFloorNo)//当前楼层和起始楼层一致 { wcsTask.taskStatus = 2; wcsTask.updateBy = "提升机线程"; wcsTask.updateTime = DateTime.Now; wcsTask.remark = "提升机任务执行中"; BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.floorNo == wcsTask.fromFloorNo && t.plcpointNo.Contains("wcsrun")); dbContext.Update(wcsTask); dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 2, updateBy = "提升机线程", updateTime = DateTime.Now, remark = "提升机任务执行中" }); lineEquip.equipStatus = 1; dbContext.Update(lineEquip); dbContext.SaveChanges(); StaticData.PlcDic[0].WriteToPoint(basePlcpoint.plcpointAddress, "1", basePlcpoint.plcpointLength.ToString()); StaticData.PlcDic[0].WriteToPoint(this.serialno06.plcpointAddress, wcsTask.serialNo.ToString(), this.serialno06.plcpointLength.ToString()); Console.WriteLine(DateTime.Now + ":提升机下发" + wcsTask.fromFloorNo + "楼入库指令"); _logger.Info("提升机下发" + wcsTask.fromFloorNo + "楼入库指令"); transaction.Commit(); } else//当前楼层和起始楼层不一致 { wcsTask.taskStatus = 1; wcsTask.updateBy = "提升机线程"; wcsTask.updateTime = DateTime.Now; wcsTask.remark = "提升机任务执行中"; dbContext.Update(wcsTask); dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 1, updateBy = "提升机线程", updateTime = DateTime.Now, remark = "提升机任务执行中" }); lineEquip.equipStatus = 1; dbContext.Update(lineEquip); dbContext.SaveChanges(); StaticData.PlcDic[0].WriteToPoint(this.targetfloor06.plcpointAddress, wcsTask.fromFloorNo.ToString(), this.targetfloor06.plcpointLength.ToString());//目的地楼层 StaticData.PlcDic[0].WriteToPoint(this.serialno06.plcpointAddress, wcsTask.serialNo.ToString(), this.serialno06.plcpointLength.ToString()); Console.WriteLine(DateTime.Now + ":提升机下发去往" + wcsTask.fromFloorNo + "楼指令"); _logger.Info("提升机下发去往" + wcsTask.fromFloorNo + "楼指令"); transaction.Commit(); } } } if (wcsTask.taskStatus == 1 && Convert.ToInt32(reserialno06) == wcsTask.serialNo) { BasePlcpoint floorPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "RFID00" + wcsTask.fromFloorNo); string? rfid = StaticData.PlcDic[0].ReadRFID(floorPoint.plcpointAddress); _logger.Info($"{wcsTask.fromFloorNo}楼RFID?{rfid},任务RFID{wcsTask.containerNo}"); if (wcsTask.containerNo == rfid || (string.IsNullOrEmpty(wcsTask.containerNo) && wcsTask.qty > 1)) { if (Convert.ToInt32(currentfloor06Value) == wcsTask.fromFloorNo)//提升机当前楼层为初始地楼层 { wcsTask.taskStatus = 2; wcsTask.updateBy = "提升机线程"; wcsTask.updateTime = DateTime.Now; wcsTask.remark = "提升机任务执行中"; BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.floorNo == wcsTask.fromFloorNo && t.plcpointNo.Contains("wcsrun")); dbContext.Update(wcsTask); dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 2, updateBy = "提升机线程", updateTime = DateTime.Now, remark = "提升机任务执行中" }); dbContext.SaveChanges(); StaticData.PlcDic[0].WriteToPoint(basePlcpoint.plcpointAddress, "1", basePlcpoint.plcpointLength.ToString()); StaticData.PlcDic[0].WriteToPoint(this.serialno06.plcpointAddress, wcsTask.serialNo.ToString(), this.serialno06.plcpointLength.ToString()); Console.WriteLine(DateTime.Now + ":提升机下发" + wcsTask.fromFloorNo + "楼入库指令"); _logger.Info("提升机下发" + wcsTask.fromFloorNo + "楼入库指令"); transaction.Commit(); } } } if (wcsTask.taskStatus == 2 && Convert.ToInt32(reserialno06) == wcsTask.serialNo) { if (Convert.ToInt32(hoisterTrayIn06Value) == 1)//托盘已经进提升机 { wcsTask.taskStatus = 3; wcsTask.updateBy = "提升机线程"; wcsTask.updateTime = DateTime.Now; wcsTask.remark = "提升机任务执行完成"; dbContext.Update(wcsTask); dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 3, updateBy = "提升机线程", updateTime = DateTime.Now, remark = "提升机任务执行完成" }); dbContext.SaveChanges(); StaticData.PlcDic[0].WriteToPoint(this.targetfloor06.plcpointAddress, wcsTask.floorNo.ToString(), this.targetfloor06.plcpointLength.ToString());//目的地楼层 Console.WriteLine(DateTime.Now + ":提升机下发去往" + wcsTask.floorNo + "楼目的地指令"); _logger.Info("提升机下发去往" + wcsTask.floorNo + "楼目的地指令"); transaction.Commit(); } } if (wcsTask.taskStatus == 3 && Convert.ToInt32(currentfloor06Value) == wcsTask.floorNo && Convert.ToInt32(reserialno06) == wcsTask.serialNo)//任务状态为3,且当前楼层为任务的目的楼层 { if (wcsTask.floorNo == 1)//目的楼层是1 { bool emptyStatus = ReadEmptyLocation(); _logger.Info($"一楼托盘库是否有任务?{emptyStatus}"); if (emptyStatus)//托盘库是否有任务,没有任务返回true { var linesignal = StaticData.PlcDic[0].Read(StaticData.BasePlcpointList.First(t => t.plcpointNo == $"linesignal0{wcsTask.floorNo}").plcpointAddress); _logger.Info($"一楼接驳位外侧是否有东西?{linesignal}"); if (linesignal != null && Convert.ToInt32(linesignal) == 0)//接驳位外侧没有东西 { BasePlcpoint clearPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == $"clear0{wcsTask.floorNo}"); var clearValue = StaticData.PlcDic[0].Read(clearPoint.plcpointAddress); if (clearPoint != null && Convert.ToBoolean(clearValue) == true)//是否有报警 { Console.WriteLine(DateTime.Now + ":提升机下发报警消除指令"); _logger.Info("提升机下发报警消除指令"); StaticData.PlcDic[0].WriteToPoint(clearPoint.plcpointAddress, false, clearPoint.plcpointLength.ToString());//清除报警 } wcsTask.taskStatus = 4; wcsTask.updateBy = "提升机线程"; wcsTask.updateTime = DateTime.Now; wcsTask.remark = "提升机任务执行完成"; dbContext.Update(wcsTask); dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 4, updateBy = "提升机线程", updateTime = DateTime.Now, remark = "提升机任务执行完成" }); dbContext.SaveChanges(); BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.floorNo == wcsTask.floorNo && t.plcpointNo.Contains("wcsrun")); StaticData.PlcDic[0].WriteToPoint(basePlcpoint.plcpointAddress, "2", basePlcpoint.plcpointLength.ToString());//去向为2,表示提升机已到达目的地,让货出去 Console.WriteLine(DateTime.Now + ":提升机下发" + wcsTask.floorNo + "楼出库指令"); _logger.Info("提升机下发" + wcsTask.floorNo + "楼出库指令"); transaction.Commit(); } else//接驳位外侧有东西 { BasePlcpoint clearPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == $"clear0{wcsTask.floorNo}"); var clearValue = StaticData.PlcDic[0].Read(clearPoint.plcpointAddress); if (clearPoint != null && Convert.ToBoolean(clearValue) == false) { warningMsg = $"目的楼层{wcsTask.floorNo}接驳位外侧有东西,货物无法继续出提升机"; StaticData.PlcDic[0].WriteToPoint(clearPoint.plcpointAddress, true, clearPoint.plcpointLength.ToString()); } } } else { warningMsg = $"一楼托盘库有任务正在执行,等待任务执行完成"; Console.WriteLine(DateTime.Now + ":一楼托盘库有任务正在执行,等待任务执行完成"); _logger.Info("一楼托盘库有任务正在执行,等待任务执行完成"); } } else { var linesignal = StaticData.PlcDic[0].Read(StaticData.BasePlcpointList.First(t => t.plcpointNo == $"linesignal0{wcsTask.floorNo}").plcpointAddress); _logger.Info($"{wcsTask.floorNo}楼接驳位外侧是否有东西?{linesignal}"); if (linesignal != null && Convert.ToInt32(linesignal) == 0) { wcsTask.taskStatus = 4; wcsTask.updateBy = "提升机线程"; wcsTask.updateTime = DateTime.Now; wcsTask.remark = "提升机任务执行完成"; dbContext.Update(wcsTask); dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 4, updateBy = "提升机线程", updateTime = DateTime.Now, remark = "提升机任务执行完成" }); dbContext.SaveChanges(); BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.floorNo == wcsTask.floorNo && t.plcpointNo.Contains("wcsrun")); StaticData.PlcDic[0].WriteToPoint(basePlcpoint.plcpointAddress, "2", basePlcpoint.plcpointLength.ToString());//去向为2,表示提升机已到达目的地,让货出去 Console.WriteLine(DateTime.Now + ":提升机下发" + wcsTask.floorNo + "楼出库指令"); _logger.Info("提升机下发" + wcsTask.floorNo + "楼出库指令"); transaction.Commit(); } else { warningMsg = $"{wcsTask.floorNo}楼接驳位外侧有东西{linesignal}"; BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == $"clear0{wcsTask.floorNo}"); StaticData.PlcDic[0].WriteToPoint(basePlcpoint.plcpointAddress, "1", basePlcpoint.plcpointLength.ToString()); } } } else if (wcsTask.taskStatus == 4)//提升机任务结束 { BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.floorNo == wcsTask.floorNo && t.plcpointNo.Contains("wcsrun")); var wcsRun = StaticData.PlcDic[0].Read(basePlcpoint.plcpointAddress); _logger.Info($"{wcsTask.floorNo}楼接驳位任务状态{wcsRun}"); if (wcsRun != null && Convert.ToInt32(wcsRun) == 0)//判断当前接驳位的任务状态,wcsrrun如果是1代表入库,2是出库,0是空闲 { BaseEquip floorEquip = StaticData.BaseEquip.First(t => t.objid == wcsTask.floorNo); wcsTask.nextPointId = floorEquip.objid; wcsTask.nextPointNo = floorEquip.equipNo; wcsTask.taskStatus = 5; wcsTask.updateBy = "提升机线程"; wcsTask.updateTime = DateTime.Now; wcsTask.remark = "提升机任务执行完成"; lineEquip.equipStatus = 0; Console.WriteLine(DateTime.Now + ":提升机任务完成" + wcsTask.fromFloorNo + "---" + wcsTask.floorNo + "楼指令"); _logger.Info("提升机任务完成" + wcsTask.fromFloorNo + "---" + wcsTask.floorNo + "楼指令"); dbContext.Update(lineEquip); dbContext.Update(wcsTask); dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 5, nextPointId = floorEquip.objid, nextPointNo = floorEquip.equipNo, updateBy = "提升机线程", updateTime = DateTime.Now, remark = "提升机任务执行完成" }); dbContext.SaveChanges(); transaction.Commit(); } } Outtpyes.Clear(); break; } else { continue; } } } } } else//同步楼层,屏蔽状态 { if (currentfloor06Value != null && targetfloor06Value != null) { warningMsg = "MES屏蔽已打开,无法下发任务"; StaticData.PlcDic[0].WriteToPoint(this.targetfloor06.plcpointAddress, Convert.ToString(currentfloor06Value), this.targetfloor06.plcpointLength.ToString()); continue; } } if (Outtpyes.Count > 0) { SystemData.InsertWaringLog(dbContext, WaringType.提升机任务下发异常, warningMsg); } else { SystemData.DeleteWaringLog(dbContext, WaringType.提升机任务下发异常); } } catch (Exception ex) { try { transaction.Rollback(); } catch { } if (ex is PlcException) { } else { SystemData.InsertWaringLog(dbContext, WaringType.提升机任务下发异常, "提升机任务下发异常"+ex.Message); _logger.Error(ex.Message + "\n" + ex.StackTrace); } } Thread.Sleep(5000); } } } }