using Khd.Core.Domain.Models; using Khd.Core.EntityFramework; using Khd.Core.Library.Mapper; using Khd.Core.Wcs.Global; using Masuit.Tools.Logging; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Z.EntityFramework.Plus; namespace Khd.Core.Wcs.Wcs { /// /// 二楼接驳位调度 /// public class SecondFloorLine { private readonly IHost _host; private Plc.S7.Plc _plc; private readonly BasePlcpoint LineRFID; private readonly BasePlcpoint LineSignal; int FloorNo { get; set; } public SecondFloorLine(IHost host, Plc.S7.Plc plc, int floor) { this._host = host; this._plc = plc; FloorNo = floor; this.LineRFID = StaticData.BasePlcpointList.First(t => t.plcpointNo== "RFID002"); this.LineSignal = StaticData.BasePlcpointList.First(t => t.plcpointNo== "linesignal04"); //var lineRFID = this._plc.Read(NodeSettingCarNo.plcpointAddress); try { //默认启动,清理plc的上位机写入点位值 this._plc.Write(LineRFID.plcpointAddress, MainCentralControl.QingKongDianWei); } catch (Exception ex) { Console.WriteLine("楼层" + floor + " 初始化数据异常" + ex.Message); LogManager.Error(ex); } } /// /// 启动上件扫描监听 /// public void StartPoint() { Thread FlowPointThread = new Thread(MonitorInLocatorPoint); FlowPointThread.Start(); Console.WriteLine(DateTime.Now + ":二楼接驳位扫描线程启动"); LogManager.Info("二楼接驳位扫描线程启动"); } public void MonitorInLocatorPoint() { using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); BaseEquip inEquip = StaticData.BaseEquip.First(t => t.objid == 36); BaseEquip outEquip = StaticData.BaseEquip.First(t => t.objid == 37); BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.objid == 2); BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == 8); BaseEquip tsjEquip = StaticData.BaseEquip.First(t => t.objid == 6); var agvPutPoint = StaticData.BasePlcpointList.First(t => t.id == 54); while (true) { try { dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); //入库任务 var rfid = this._plc.ReadRFID(LineRFID.plcpointAddress); var isSignal = this._plc.Read(LineSignal.plcpointAddress); var agvPutValue = StaticData.PlcDic[2].Read(agvPutPoint.plcpointAddress); if (rfid != null && isSignal != null) { //正常读到输送线信息 有到位信号,并且有托盘,获取条码信息 if (Convert.ToInt32(isSignal) == 1) { //获取条码信息 var palletNo = Convert.ToString(rfid); BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.equipType == 1 && t.floorNo == FloorNo); var wcsTask = dbContext.WcsTask.OrderBy(t => t.createTime) .FirstOrDefault(t => t.containerNo == palletNo && t.nextPointId == baseEquip.objid); if (wcsTask != null) { if (wcsTask.taskStatus == 5)//入托盘入口,提升机任务是完成状态 { if (wcsTask.taskType != 99) { if (Convert.ToInt32(agvPutValue) == 0) { dbContext.WcsTask.Remove(wcsTask); WcsTask newTask = CoreMapper.Map(wcsTask); newTask.taskStatus = 0; newTask.objid = StaticData.SnowId.NextId(); newTask.nextPointId = agvEquip.objid; newTask.nextPointNo = agvEquip.equipNo; newTask.createTime = DateTime.Now; newTask.updateTime = DateTime.Now; newTask.containerNo = palletNo; newTask.currPointId = lineEquip.objid; newTask.currPointNo = lineEquip.equipNo; newTask.endPointId = inEquip.objid; newTask.endPointNo = inEquip.equipNo; newTask.taskType = 51;//到小包入口 newTask.useFlag = 1; dbContext.WcsTask.Add(newTask); WcsTaskLog wcsTaskLog = CoreMapper.Map(newTask); dbContext.Add(wcsTaskLog); dbContext.SaveChanges(); LogManager.Info("二楼接驳位生成任务入库成功,托盘号:" + palletNo); Console.WriteLine(DateTime.Now + ":二楼接驳位生成任务入库成功,托盘号:" + palletNo); } else if (Convert.ToInt32(agvPutValue) == 1) { BaseEquip? endEquip = dbContext.BaseEquip.FirstOrDefault(t => t.equipType == 20 && t.equipStatus == 0 && t.emptyCount == 0); if (endEquip != null) { dbContext.WcsTask.Remove(wcsTask); WcsTask newTask = CoreMapper.Map(wcsTask); newTask.taskStatus = 0; newTask.objid = StaticData.SnowId.NextId(); newTask.nextPointId = agvEquip.objid; newTask.nextPointNo = agvEquip.equipNo; newTask.createTime = DateTime.Now; newTask.updateTime = DateTime.Now; newTask.containerNo = palletNo; newTask.currPointId = lineEquip.objid; newTask.currPointNo = lineEquip.equipNo; newTask.endPointId = endEquip.objid; newTask.endPointNo = endEquip.equipNo; newTask.taskType = 58;//到周转位 newTask.useFlag = 1; dbContext.WcsTask.Add(newTask); WcsTaskLog wcsTaskLog = CoreMapper.Map(newTask); dbContext.Add(wcsTaskLog); dbContext.SaveChanges(); LogManager.Info("二楼接驳位生成任务入库成功,托盘号:" + palletNo); Console.WriteLine(DateTime.Now + ":二楼接驳位生成任务入库成功,托盘号:" + palletNo); } } } else { if (wcsTask.endPointId == 36) { if (Convert.ToInt32(agvPutValue) == 0) { dbContext.WcsTask.Remove(wcsTask); WcsTask newTask = CoreMapper.Map(wcsTask); newTask.taskStatus = 0; newTask.objid = StaticData.SnowId.NextId(); newTask.nextPointId = agvEquip.objid; newTask.nextPointNo = agvEquip.equipNo; newTask.createTime = DateTime.Now; newTask.updateTime = DateTime.Now; newTask.containerNo = palletNo; newTask.currPointId = lineEquip.objid; newTask.currPointNo = lineEquip.equipNo; newTask.endPointId = inEquip.objid; newTask.endPointNo = inEquip.equipNo; newTask.taskType = 51;//到小包入口 newTask.useFlag = 1; dbContext.WcsTask.Add(newTask); WcsTaskLog wcsTaskLog = CoreMapper.Map(newTask); dbContext.Add(wcsTaskLog); dbContext.SaveChanges(); LogManager.Info("二楼接驳位生成任务入库成功,托盘号:" + palletNo); Console.WriteLine(DateTime.Now + ":二楼接驳位生成任务入库成功,托盘号:" + palletNo); } else if (Convert.ToInt32(agvPutValue) == 1) { BaseEquip? endEquip = dbContext.BaseEquip.FirstOrDefault(t => t.equipType == 20 && t.equipStatus == 0 && t.emptyCount == 0); if (endEquip != null) { dbContext.WcsTask.Remove(wcsTask); WcsTask newTask = CoreMapper.Map(wcsTask); newTask.taskStatus = 0; newTask.objid = StaticData.SnowId.NextId(); newTask.nextPointId = agvEquip.objid; newTask.nextPointNo = agvEquip.equipNo; newTask.createTime = DateTime.Now; newTask.updateTime = DateTime.Now; newTask.containerNo = palletNo; newTask.currPointId = lineEquip.objid; newTask.currPointNo = lineEquip.equipNo; newTask.endPointId = endEquip.objid; newTask.endPointNo = endEquip.equipNo; newTask.taskType = 58;//到周转位 newTask.useFlag = 1; dbContext.WcsTask.Add(newTask); WcsTaskLog wcsTaskLog = CoreMapper.Map(newTask); dbContext.Add(wcsTaskLog); dbContext.SaveChanges(); LogManager.Info("二楼接驳位生成任务入库成功,托盘号:" + palletNo); Console.WriteLine(DateTime.Now + ":二楼接驳位生成任务入库成功,托盘号:" + palletNo); } } } else if (wcsTask.endPointId == 38) { dbContext.WcsTask.Remove(wcsTask); WcsTask newTask = CoreMapper.Map(wcsTask); newTask.taskStatus = 0; newTask.objid = StaticData.SnowId.NextId(); newTask.nextPointId = agvEquip.objid; newTask.nextPointNo = agvEquip.equipNo; newTask.createTime = DateTime.Now; newTask.updateTime = DateTime.Now; newTask.containerNo = palletNo; newTask.currPointId = lineEquip.objid; newTask.currPointNo = lineEquip.equipNo; newTask.taskType = 53; newTask.useFlag = 1; dbContext.WcsTask.Add(newTask); WcsTaskLog wcsTaskLog = CoreMapper.Map(newTask); dbContext.Add(wcsTaskLog); dbContext.SaveChanges(); LogManager.Info("二楼接驳位生成任务入库成功,托盘号:" + palletNo); Console.WriteLine(DateTime.Now + ":二楼接驳位生成任务入库成功,托盘号:" + palletNo); } else { BaseEquip? endEquip = dbContext.BaseEquip.FirstOrDefault(t => t.equipType == 20 && t.equipStatus == 0 && t.emptyCount == 0); if (endEquip != null) { dbContext.WcsTask.Remove(wcsTask); WcsTask newTask = CoreMapper.Map(wcsTask); newTask.taskStatus = 0; newTask.objid = StaticData.SnowId.NextId(); newTask.nextPointId = agvEquip.objid; newTask.nextPointNo = agvEquip.equipNo; newTask.createTime = DateTime.Now; newTask.updateTime = DateTime.Now; newTask.containerNo = palletNo; newTask.currPointId = lineEquip.objid; newTask.currPointNo = lineEquip.equipNo; newTask.endPointId = endEquip.objid; newTask.endPointNo = endEquip.equipNo; newTask.taskType = 58; newTask.useFlag = 1; dbContext.WcsTask.Add(newTask); WcsTaskLog wcsTaskLog = CoreMapper.Map(newTask); dbContext.Add(wcsTaskLog); dbContext.SaveChanges(); LogManager.Info("二楼接驳位生成任务入库成功,托盘号:" + palletNo); Console.WriteLine(DateTime.Now + ":二楼接驳位生成任务入库成功,托盘号:" + palletNo); } } } } else if (wcsTask.taskStatus == 8) { if (wcsTask.taskType == 44) { BaseEquip? endEquip = StaticData.BaseEquip.First(t => t.objid == 3); dbContext.WcsTask.Remove(wcsTask); WcsTask newTask = CoreMapper.Map(wcsTask); newTask.serialNo = SystemData.GetSerialNo(dbContext); newTask.taskStatus = 0; newTask.objid = StaticData.SnowId.NextId(); newTask.nextPointId = tsjEquip.objid; newTask.nextPointNo = tsjEquip.equipNo; newTask.createTime = DateTime.Now; newTask.updateTime = DateTime.Now; newTask.endPointId = endEquip.objid; newTask.endPointNo = endEquip.equipNo; newTask.containerNo = palletNo; newTask.currPointId = lineEquip.objid; newTask.currPointNo = lineEquip.equipNo; newTask.useFlag = 1; newTask.fromFloorNo = 2; newTask.floorNo = endEquip.floorNo; dbContext.WcsTask.Add(newTask); WcsTaskLog wcsTaskLog = CoreMapper.Map(newTask); dbContext.Add(wcsTaskLog); dbContext.SaveChanges(); LogManager.Info("二楼接驳位生成任务出库成功,托盘号:" + palletNo); Console.WriteLine(DateTime.Now + ":二楼接驳位生成任务出库成功,托盘号:" + palletNo); } } } } } } catch (Exception ex) { try { this._plc = new Plc.S7.Plc(this._plc.CPU, this._plc.IP, this._plc.Port, this._plc.Rack, this._plc.Slot); this._plc.Open(); } catch { } LogManager.Error(ex); } finally { Thread.Sleep(1000); } } } } }