diff --git a/src/Khd.Core.EntityFramework/DefaultDbContext.cs b/src/Khd.Core.EntityFramework/DefaultDbContext.cs index 483eb85..b177cf8 100644 --- a/src/Khd.Core.EntityFramework/DefaultDbContext.cs +++ b/src/Khd.Core.EntityFramework/DefaultDbContext.cs @@ -91,6 +91,7 @@ namespace Khd.Core.EntityFramework public DbSet WmsWarehouseMaterial { get; set; } + public DbSet WcsOutstockLock { get; set; } } } \ No newline at end of file diff --git a/src/Khd.Core.Wcs/Global/CommFunction.cs b/src/Khd.Core.Wcs/Global/CommFunction.cs new file mode 100644 index 0000000..4a63088 --- /dev/null +++ b/src/Khd.Core.Wcs/Global/CommFunction.cs @@ -0,0 +1,45 @@ + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using System.Linq.Expressions; +using System.Collections; +using System.Net; +using Microsoft.EntityFrameworkCore.Query.Internal; +using System.Web; +using Microsoft.EntityFrameworkCore.Storage; +using Microsoft.Extensions.Hosting; +using Khd.Core.Wcs.Global; +//using KingerRobot.WMS.Dao; + +namespace Khd.Core.Wcs +{ + public class CommFunction + { + /// + /// 生成任务号 + /// + /// + public static string CreateSerialNo() + { + int SerialNo = 0; + var dic = StaticData.BaseDictionary.Where(t => t.dicKey == "WCS_SerialNo").FirstOrDefault(); + if (!dic.updateTime.GetValueOrDefault().ToString("yyyyMMdd").Equals(DateTime.Now.ToString("yyyyMMdd"))) + { + var ss = DateTime.Now.ToString("MMdd") + "00001"; + SerialNo = Convert.ToInt32(ss); + } + else + { + SerialNo = Convert.ToInt32(dic.dicValue) + 1; + } + dic.updateTime = DateTime.Now; + dic.dicValue = SerialNo.ToString(); + return SerialNo.ToString(); + } + } +} diff --git a/src/Khd.Core.Wcs/Global/StaticData.cs b/src/Khd.Core.Wcs/Global/StaticData.cs index 6268c80..b9645eb 100644 --- a/src/Khd.Core.Wcs/Global/StaticData.cs +++ b/src/Khd.Core.Wcs/Global/StaticData.cs @@ -48,5 +48,6 @@ namespace Khd.Core.Wcs.Global public static List WcsInWareOrder = new List(); public static List WcsOutWareOrder = new List(); + } } diff --git a/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs b/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs index a2ca3ad..86d536b 100644 --- a/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs +++ b/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs @@ -96,30 +96,190 @@ namespace Khd.Core.Wcs.Wcs } } } - + private void CreateTask() { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + try { - using var scope = _host.Services.CreateScope(); - using var dbContext = scope.ServiceProvider.GetRequiredService(); - var rawInstock = dbContext.WcsTask.Where(t => t.customerNo == "1" ).ToList(); - if (rawInstock.Count>0) + + //入库 + var rawInstock = dbContext.WmsProductInstock.Where(t => t.taskCode == "1").ToList(); + if (rawInstock.Count > 0) { foreach (var item in rawInstock) { - WcsTask wcsTask = new WcsTask(); - //wcsTask.customerNo = item.palletInfoCode; - dbContext.Add(wcsTask); - dbContext.SaveChanges(); } - - } + + } + + //原料&辅料出库 + CreateMaterialTask(); + //成品&半成品出库 + CreateProductTask(); + } catch (Exception ex) { //LogManager.Info($"错误日志输出 >>> OutWarePoint类 WriteMaterialMessage 方法报错 {ex}"); - LogManager.Error(ex); + LogManager.Error(ex); + } + + } + /// + /// 成品出库 + /// + public void CreateProductTask() + { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + + var proStock = dbContext.WmsProductStock.Where(t => t.activeFlag == "0").ToList(); + var proOutStock = dbContext.WmsProductOutstock.Where(t => t.executeStatus == "0").ToList(); + //获取最早入库时间 + foreach (var item in proOutStock) + { + //自动获取id + Jc.SnowId.JcSnowId id = new Jc.SnowId.JcSnowId(1, 1); + var objid = id.NextId(); + //锁定库存 + WcsOutstockLock stockLock = new() + { + objid = objid, + materialId = item.productId, + qty = item.applyQty, + warehouseId = item.warehouseId, + wmsOrderId = item.productOutstockId, + wmsOrderDetailId = item.productOutstockId, + createBy = "sys", + createTime = DateTime.Now + }; + + var dic = StaticData.BaseDictionary.Where(t => t.dicKey == "TaskType" && t.ud1 == "O" && t.dicField == item.productType).FirstOrDefault(); + for (int i = 0; i < item.applyQty; i++) + { + //获取最早入库时间 + var firstDate = proStock.Where(t => t.productId == item.productId && t.warehouseId == item.warehouseId).OrderBy(t => t.createDate).FirstOrDefault(); + var rkDate = firstDate.createDate; + + //创建出库任务 + WcsTask newTask = new() + { + objid = objid, + taskType = Convert.ToInt32(dic.dicValue), + containerNo = "", + taskStatus = 0, + materialId = item.warehouseId, + qty = 1, + startPointId = item.warehouseId, + startPointNo = "", + currPointId = item.warehouseId, + currPointNo = "", + endPointId = item.endStationCode, + endPointNo = "", + }; + dbContext.Add(newTask); + dbContext.SaveChanges(); + } + //回写出库记录表 + //item.executeStatus = "1"; + //item.updateDate = DateTime.Now; + //dbContext.WmsProductOutstock.Update(item); + //dbContext.SaveChanges(); + dbContext.WmsProductOutstock.Where(t => t.productOutstockId == item.productOutstockId).Update(t => new WmsProductOutstock() + { + executeStatus = "1", + updateDate = DateTime.Now + }); + } + + } + + public void CreateMaterialTask() + { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + + var rawStock = dbContext.WmsRawStock.Where(t => t.activeFlag == "0").ToList(); + var rawOutStock = dbContext.WmsRawOutstock.Where(t => t.executeStatus == "0").ToList(); + + foreach (var item in rawOutStock) + { + //自动获取id + Jc.SnowId.JcSnowId id = new Jc.SnowId.JcSnowId(1, 1); + var objid = id.NextId(); + long orderID = 0; + //插入锁定库存 + WcsOutstockLock stockLock = new() + { + objid = objid, + materialId = item.productId, + qty = 1, + warehouseId = item.warehouseId, + wmsOrderId = item.rawOutstockId, + wmsOrderDetailId = item.rawOutstockId, + createBy = "sys", + createTime = DateTime.Now + }; + dbContext.Add(stockLock); + //var palletInfo = StaticData.MesBasePalletInfo.Where(t => t.materialId == item.productId).FirstOrDefault() ; + if (true)//辅料 + { + //辅料出库时,需创建订单表数据 + orderID = id.NextId(); + WcsWarehouseOrder order = new() + { + objid = orderID, + wmsOrderId = item.rawOutstockId, + orderType = Convert.ToInt32(item.taskType), + qty = 1, + createBy = "", + createTime = DateTime.Now + }; + dbContext.Add(order); + } + else + { + //半成品 + + } + var dic = StaticData.BaseDictionary.Where(t => t.dicKey == "TaskType" && t.ud1 == "O").FirstOrDefault(); + WcsTask rawTask = new() + { + objid = id.NextId(), + orderId = item.rawOutstockId, + masterId = orderID, + taskType = Convert.ToInt32(dic.dicValue), + containerNo = "", + taskStatus = 0, + materialId = item.warehouseId, + qty = 1, + startPointId = item.warehouseId, + startPointNo = "", + currPointId = item.warehouseId, + currPointNo = "", + endPointId = item.endStationCode, + endPointNo = "", + }; + dbContext.Add(rawTask); + + + //获取最早入库时间 + var firstDate = rawStock.Where(t => t.materialId == item.productId && t.warehouseId == item.warehouseId).OrderBy(t => t.createDate).FirstOrDefault(); + var rkDate = firstDate.createDate; + + //回写出库记录表 + //item.executeStatus = "1"; + //item.updateDate = DateTime.Now; + //dbContext.WmsProductOutstock.Update(item); + //dbContext.SaveChanges(); + dbContext.WmsRawOutstock.Where(t => t.rawOutstockId == item.rawOutstockId).Update(t => new WmsProductOutstock() + { + executeStatus = "1", + updateDate = DateTime.Now + }); } } diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs new file mode 100644 index 0000000..aa6cfd7 --- /dev/null +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs @@ -0,0 +1,155 @@ +using Khd.Core.Domain.Dto.webapi; +using Khd.Core.Domain.Models; +using Khd.Core.EntityFramework; +using Khd.Core.Wcs.Global; +using Masuit.Tools.Logging; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Khd.Core.Wcs.Wcs +{ + /// + /// 五楼AGV调度 + /// + public class FiveFloorAGV + { + List ScanPoint { get; set; }//点位信息 + private readonly IHost _host; + private readonly Plc.S7.Plc _plc; + BasePlcpoint? LineRFID { get; set; } + BasePlcpoint? LineWcsrun { get; set; } + BasePlcpoint? LineSignal { get; set; } + BasePlcpoint? LineIsPallet { get; set; } + BasePlcpoint? LineSerialNO { get; set; } + BasePlcpoint? LineFeedSeriaNo { get; set; } + Thread FlowPointThread; + int FloorNo { get; set; } + string EquipNo = ""; + public FiveFloorAGV(IHost host, Plc.S7.Plc plc, int floor, string equipNo) + { + this._host = host; + this._plc = plc; + FloorNo = floor; + EquipNo = equipNo; + + //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() + { + + FlowPointThread = new Thread(MonitorInLocatorPoint); + FlowPointThread.Start(); + } + + public void MonitorInLocatorPoint() + { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + while (true) + { + try + { + var taskList = GetTask(FloorNo, EquipNo); + if (taskList.Count == 0) + { + LogManager.Info(FloorNo + "楼AGV无任务"); + } + foreach (var item in taskList) + { + SendTask(item); + } + } + catch (Exception ex) + { + LogManager.Error(ex); + } + finally + { + Thread.Sleep(1000); + } + } + } + + public List GetTask(int floorNo, string equipNo) + { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + List wcsTask = new List(); + var wareHouseList = StaticData.WmsBaseWarehouse.ToList(); + var equip = StaticData.BaseEquip.Where(t=>t.floorNo==floorNo && t.equipType==4).FirstOrDefault(); + //入库类型 + List taskInType = new List { 1, 3, 5, 7 }; + List taskOutType = new List { 2, 4, 6, 8 }; + try + { + //获取条码号,如果该条码任务存在就继续任务,如果条码不存在,创建入库任务并调度agv + var taskList = StaticData.WcsTask.Where(t => t.nextPointId == equip.objid).ToList(); + if (taskList.Count() == 0) + { return null; } + wcsTask = taskList; + } + catch (Exception ex) + { + LogManager.Info(floorNo + "楼AGV异常"+ ex.Message); + throw; + } + return wcsTask; + } + /// + /// 下发任务 + /// + /// + public void SendTask(WcsTask task) + { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + //获取 + if (task == null) + { + return; + } + //首先判断是否已下发指令 + var cmd = StaticData.WcsCmd.Where(t => t.taskId == task.objid).FirstOrDefault(); + //指令表存在说明已下发 + if (cmd != null) return; + //获取下发agv指令 + string ip = ""; int port = 0; string url = ""; + RequestAGVTaskDto agvtask = new RequestAGVTaskDto(); + agvtask.reqCode = task.serialNo.ToString(); + var json = JsonConvert.SerializeObject(agvtask); + HttpHelper.SendPostMessage(ip, port, url, json); + //未下发给agv下发指令 + WcsCmd taskCmd = new WcsCmd() + { + taskId = task.objid, + cmdType = task.taskType, + serialNo = task.serialNo, + equipmentNo = task.equipmentNo, + cmdStatus = 1, + createBy = FloorNo+"楼AGV", + createTime = DateTime.Now, + }; + dbContext.Add(taskCmd); + dbContext.SaveChanges(); + } + } +} diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs new file mode 100644 index 0000000..cfc12ab --- /dev/null +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs @@ -0,0 +1,155 @@ +using Khd.Core.Domain.Dto.webapi; +using Khd.Core.Domain.Models; +using Khd.Core.EntityFramework; +using Khd.Core.Wcs.Global; +using Masuit.Tools.Logging; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Khd.Core.Wcs.Wcs +{ + /// + /// 五楼CTU调度 + /// + public class FiveFloorCTU + { + List ScanPoint { get; set; }//点位信息 + private readonly IHost _host; + private readonly Plc.S7.Plc _plc; + BasePlcpoint? LineRFID { get; set; } + BasePlcpoint? LineWcsrun { get; set; } + BasePlcpoint? LineSignal { get; set; } + BasePlcpoint? LineIsPallet { get; set; } + BasePlcpoint? LineSerialNO { get; set; } + BasePlcpoint? LineFeedSeriaNo { get; set; } + Thread FlowPointThread; + int FloorNo { get; set; } + string EquipNo = ""; + public FiveFloorCTU(IHost host, Plc.S7.Plc plc, int floor, string equipNo) + { + this._host = host; + this._plc = plc; + FloorNo = floor; + EquipNo = equipNo; + + //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() + { + + FlowPointThread = new Thread(MonitorInLocatorPoint); + FlowPointThread.Start(); + } + + public void MonitorInLocatorPoint() + { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + while (true) + { + try + { + var taskList = GetTask(FloorNo, EquipNo); + if (taskList.Count == 0) + { + LogManager.Info(FloorNo + "楼CTU无任务"); + } + foreach (var item in taskList) + { + SendTask(item); + } + } + catch (Exception ex) + { + LogManager.Error(ex); + } + finally + { + Thread.Sleep(1000); + } + } + } + + public List GetTask(int floorNo, string equipNo) + { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + List wcsTask = new List(); + var wareHouseList = StaticData.WmsBaseWarehouse.ToList(); + var equip = StaticData.BaseEquip.Where(t=>t.floorNo==floorNo && t.equipType==4).FirstOrDefault(); + //入库类型 + List taskInType = new List { 1, 3, 5, 7 }; + List taskOutType = new List { 2, 4, 6, 8 }; + try + { + //获取条码号,如果该条码任务存在就继续任务,如果条码不存在,创建入库任务并调度agv + var taskList = StaticData.WcsTask.Where(t => t.nextPointId == equip.objid).ToList(); + if (taskList.Count() == 0) + { return null; } + wcsTask = taskList; + } + catch (Exception ex) + { + LogManager.Info(floorNo + "楼CTU异常" + ex.Message); + throw; + } + return wcsTask; + } + /// + /// 下发任务 + /// + /// + public void SendTask(WcsTask task) + { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + //获取 + if (task == null) + { + return; + } + //首先判断是否已下发指令 + var cmd = StaticData.WcsCmd.Where(t => t.taskId == task.objid).FirstOrDefault(); + //指令表存在说明已下发 + if (cmd != null) return; + //获取下发agv指令 + string ip = ""; int port = 0; string url = ""; + RequestAGVTaskDto agvtask = new RequestAGVTaskDto(); + agvtask.reqCode = task.serialNo.ToString(); + var json = JsonConvert.SerializeObject(agvtask); + HttpHelper.SendPostMessage(ip, port, url, json); + //未下发给agv下发指令 + WcsCmd taskCmd = new WcsCmd() + { + taskId = task.objid, + cmdType = task.taskType, + serialNo = task.serialNo, + equipmentNo = task.equipmentNo, + cmdStatus = 1, + createBy = FloorNo+"楼AGV", + createTime = DateTime.Now, + }; + dbContext.Add(taskCmd); + dbContext.SaveChanges(); + } + } +} diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorLine.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorLine.cs new file mode 100644 index 0000000..44aae74 --- /dev/null +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorLine.cs @@ -0,0 +1,187 @@ +using Khd.Core.Domain.Dto.webapi; +using Khd.Core.Domain.Models; +using Khd.Core.EntityFramework; +using Khd.Core.Wcs.Global; +using Masuit.Tools.Logging; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Khd.Core.Wcs.Wcs +{ + /// + /// 五楼人工分拣输送线 + /// + public class FiveFloorLine + { + List ScanPoint { get; set; }//点位信息 + private readonly IHost _host; + private readonly Plc.S7.Plc _plc; + BasePlcpoint? LineRFID { get; set; } + BasePlcpoint? IsArrive { get; set; } + BasePlcpoint? IsPut { get; set; } + Thread FlowPointThread; + int FloorNo { get; set; } + string EquipNo = ""; + public FiveFloorLine(IHost host, Plc.S7.Plc plc, int floor, string equipNo) + { + this._host = host; + this._plc = plc; + FloorNo = floor; + EquipNo = equipNo; + this.ScanPoint = StaticData.BasePlcpointList.Where(t => t.floorNo == floor).ToList();//加载当前站点所对应的点位 + this.LineRFID = this.ScanPoint.FirstOrDefault(t => t.plcpointNo=="RFID5001"); + this.IsArrive = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("isarrive")); + this.IsPut = this.ScanPoint.FirstOrDefault(t => t.plcpointNo=="isput"); + + //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() + { + + FlowPointThread = new Thread(MonitorInLocatorPoint); + FlowPointThread.Start(); + } + + public void MonitorInLocatorPoint() + { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + while (true) + { + try + { + + var rfid = this._plc.Read(LineRFID.plcpointAddress); + var isarrive = this._plc.Read(IsArrive.plcpointAddress); + + if (rfid != null && isarrive != null) + { + //正常读到输送线信息 有到位信号,并且有托盘,获取条码信息 + if (Convert.ToInt32(isarrive) ==1) + { + //获取条码信息 + var palletNo = Convert.ToString(rfid); + //获取辅料料箱回库任务 + var wcsTask = GetTask(palletNo, FloorNo, EquipNo); + } + } + + } + catch (Exception ex) + { + LogManager.Error(ex); + } + finally + { + Thread.Sleep(1000); + } + } + } + + public WcsTask GetTask(string containerNo, int floorNo, string equipNo) + { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + var wcsTask = new WcsTask(); + var wareHouseList = StaticData.WmsBaseWarehouse.ToList(); + try + { + var cmd = StaticData.WcsCmd.Where(t => t.containerNo == containerNo).FirstOrDefault(); + if (cmd == null) return null; + //获取条码号,如果该条码任务存在就继续任务,如果条码不存在,创建入库任务并调度agv + var task = StaticData.WcsTask.Where(t => t.objid == cmd.taskId).FirstOrDefault(); + if (task != null) + { + //下发继续执行任务 + //更新任务点位 + task.currPointId = cmd.currPointId; + task.currPointNo= cmd.currPointNo; + task.nextPointId= cmd.nextPointId; + task.nextPointNo= cmd.nextPointNo; + } + else + { + wcsTask = StaticData.WcsTask.Where(t => t.currPointNo == equipNo).FirstOrDefault(); + } + } + catch (Exception ex) + { + LogManager.Info(floorNo + "楼接驳位异常"+ ex.Message); + throw; + } + return wcsTask; + } + /// + /// 下发任务 + /// + /// + public void SendTask(WcsTask task) + { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + //入库类型 + List taskInType = new List { 1, 3, 5, 7 }; + List taskOutType = new List { 2, 4, 6, 8 }; + try + { + //获取 + if (task == null) return; + if (taskInType.Contains(task.taskType.GetValueOrDefault())) + { + //首先判断是否已下发指令 + var cmd = StaticData.WcsCmd.Where(t => t.taskId == task.objid).FirstOrDefault(); + //指令表存在说明已下发 + if (cmd != null) return; + //获取下发agv指令 + string ip = ""; int port = 0; string url = ""; + RequestAGVTaskDto agvtask = new RequestAGVTaskDto(); + agvtask.reqCode = task.serialNo.ToString(); + var json = JsonConvert.SerializeObject(agvtask); + HttpHelper.SendPostMessage(ip, port, url, json); + //未下发给agv下发指令 + WcsCmd taskCmd = new WcsCmd() + { + taskId = task.objid, + cmdType = task.taskType, + serialNo = task.serialNo, + equipmentNo = task.equipmentNo, + cmdStatus = 1, + createBy = "", + createTime = DateTime.Now, + }; + dbContext.Add(taskCmd); + dbContext.SaveChanges(); + } + else + { + + } + + } + catch (Exception) + { + + throw; + } + } + } +} diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs new file mode 100644 index 0000000..8bdd312 --- /dev/null +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs @@ -0,0 +1,239 @@ +using Khd.Core.Domain.Dto.webapi; +using Khd.Core.Domain.Models; +using Khd.Core.EntityFramework; +using Khd.Core.Wcs.Global; +using Masuit.Tools.Logging; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Khd.Core.Wcs.Wcs +{ + /// + /// 五楼接驳位调度 + /// + public class FiveFloorPoint + { + List ScanPoint { get; set; }//点位信息 + private readonly IHost _host; + private readonly Plc.S7.Plc _plc; + BasePlcpoint? LineRFID { get; set; } + BasePlcpoint? LineWcsrun { get; set; } + BasePlcpoint? LineSignal { get; set; } + BasePlcpoint? LineIsPallet { get; set; } + BasePlcpoint? LineSerialNO { get; set; } + BasePlcpoint? LineFeedSeriaNo { get; set; } + Thread FlowPointThread; + int FloorNo { get; set; } + string EquipNo = ""; + public FiveFloorPoint(IHost host, Plc.S7.Plc plc, int floor, string equipNo) + { + this._host = host; + this._plc = plc; + FloorNo = floor; + EquipNo = equipNo; + this.ScanPoint = StaticData.BasePlcpointList.Where(t => t.floorNo == floor).ToList();//加载当前站点所对应的点位 + this.LineRFID = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("RFID")); + this.LineWcsrun = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("wcsrun")); + this.LineSignal = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("linesignal")); + this.LineIsPallet = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("ispallet")); + this.LineSerialNO = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("serialno")); + this.LineFeedSeriaNo = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("feedserialno")); + + //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() + { + + FlowPointThread = new Thread(MonitorInLocatorPoint); + FlowPointThread.Start(); + } + + public void MonitorInLocatorPoint() + { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + while (true) + { + try + { + //入库任务 + var rfid = this._plc.Read(LineRFID.plcpointAddress); + var isSignal = this._plc.Read(LineSignal.plcpointAddress); + var isPallet = this._plc.Read(LineIsPallet.plcpointAddress); + if (rfid != null && isSignal != null && isPallet != null) + { + //正常读到输送线信息 有到位信号,并且有托盘,获取条码信息 + if (Convert.ToInt32(isSignal) > 0 && Convert.ToInt32(isPallet) == 1) + { + //获取条码信息 + var palletNo = Convert.ToString(rfid); + //获取入库任务 + var wcsTask = GetTask(palletNo, FloorNo, EquipNo); + //判断是否为出库任务 + if (wcsTask.taskType == 2 || wcsTask.taskType == 3) + { + this._plc.Write(LineWcsrun.plcpointAddress, 1); + //更新任务下一点位为提升机 + wcsTask.nextPointId = 6; + wcsTask.nextPointNo = "T01"; + wcsTask.updateTime=DateTime.Now; + dbContext.Update(wcsTask); + dbContext.SaveChanges(); + } + else + { + //入库任务 + //下发agv任务 + SendTask(wcsTask); + } + } + } + + } + catch (Exception ex) + { + LogManager.Error(ex); + } + finally + { + Thread.Sleep(1000); + } + } + } + + public WcsTask GetTask(string containerNo, int floorNo, string equipNo) + { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + var wcsTask = new WcsTask(); + var wareHouseList = StaticData.WmsBaseWarehouse.ToList(); + try + { + //获取条码号,如果该条码任务存在就继续任务,如果条码不存在,创建入库任务并调度agv + var task = StaticData.WcsTask.Where(t => t.containerNo == containerNo).FirstOrDefault(); + if (task == null) + { + var palletInfo = StaticData.MesBasePalletInfo.Where(t => t.palletInfoCode == containerNo).FirstOrDefault(); + //查询该条码绑定的物料信息 + var material = StaticData.WmsWarehouseMaterial.Where(t => t.storageId == palletInfo.materialId).FirstOrDefault(); + var wareHouse = wareHouseList.Where(t => t.warehouseId == material.warehouseId).FirstOrDefault(); + var dic = StaticData.BaseDictionary.Where(t => t.dicKey == "TaskType" && t.ud1 == "I" && t.dicField == wareHouse.warehouseInstockType).FirstOrDefault(); + var equip = StaticData.BaseEquip.ToList(); + var startEquip = equip.Where(t => t.equipNo == equipNo).FirstOrDefault(); + var endPoint = wareHouseList.Where(t => t.warehouseFloor == floorNo).FirstOrDefault(); + //var currEquip= + if (palletInfo != null) + { + //自动获取id + Jc.SnowId.JcSnowId id = new Jc.SnowId.JcSnowId(1, 1); + var objid = id.NextId(); + WcsTask newTask = new() + { + objid = objid, + taskType = Convert.ToInt32(dic.dicValue), + containerNo = containerNo, + taskStatus = 0, + materialId = material.storageId, + qty = Convert.ToInt32(palletInfo.bindAmount), + startPointId = startEquip.objid, + startPointNo = equipNo, + currPointId = startEquip.objid, + currPointNo = equipNo, + endPointId = endPoint.warehouseId, + endPointNo = endPoint.warehouseCode, + }; + dbContext.Add(newTask); + dbContext.SaveChanges(); + wcsTask = newTask; + } + else + { + LogManager.Info(floorNo + "楼接驳位,托盘"+ containerNo + "未绑定!" ); + } + } + else + { + wcsTask = StaticData.WcsTask.Where(t => t.currPointNo == equipNo).FirstOrDefault(); + } + } + catch (Exception ex) + { + LogManager.Info(floorNo + "楼接驳位异常"+ ex.Message); + throw; + } + return wcsTask; + } + /// + /// 下发任务 + /// + /// + public void SendTask(WcsTask task) + { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + //入库类型 + List taskInType = new List { 1, 3, 5, 7 }; + List taskOutType = new List { 2, 4, 6, 8 }; + try + { + //获取 + if (task == null) return; + if (taskInType.Contains(task.taskType.GetValueOrDefault())) + { + //首先判断是否已下发指令 + var cmd = StaticData.WcsCmd.Where(t => t.taskId == task.objid).FirstOrDefault(); + //指令表存在说明已下发 + if (cmd != null) return; + //获取下发agv指令 + string ip = ""; int port = 0; string url = ""; + RequestAGVTaskDto agvtask = new RequestAGVTaskDto(); + agvtask.reqCode = task.serialNo.ToString(); + var json = JsonConvert.SerializeObject(agvtask); + HttpHelper.SendPostMessage(ip, port, url, json); + //未下发给agv下发指令 + WcsCmd taskCmd = new WcsCmd() + { + taskId = task.objid, + cmdType = task.taskType, + serialNo = task.serialNo, + equipmentNo = task.equipmentNo, + cmdStatus = 1, + createBy = "", + createTime = DateTime.Now, + }; + dbContext.Add(taskCmd); + dbContext.SaveChanges(); + } + else + { + + } + + } + catch (Exception) + { + + throw; + } + } + } +} diff --git a/src/Khd.Core.Wcs/Wcs/SecondFloor.cs b/src/Khd.Core.Wcs/Wcs/SecondFloor.cs index 2fb629e..103b6b6 100644 --- a/src/Khd.Core.Wcs/Wcs/SecondFloor.cs +++ b/src/Khd.Core.Wcs/Wcs/SecondFloor.cs @@ -1,7 +1,11 @@ -using Khd.Core.Domain.Models; +using Khd.Core.Domain.Dto.webapi; +using Khd.Core.Domain.Models; +using Khd.Core.EntityFramework; using Khd.Core.Wcs.Global; using Masuit.Tools.Logging; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; +using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; @@ -26,12 +30,14 @@ namespace Khd.Core.Wcs.Wcs BasePlcpoint? LineFeedSeriaNo { get; set; } Thread FlowPointThread; int FloorNo { get; set; } - public SecondFloor(IHost host, Plc.S7.Plc plc, int floor) + string EquipNo = ""; + public SecondFloor(IHost host, Plc.S7.Plc plc, int floor, string equipNo) { this._host = host; this._plc = plc; FloorNo = floor; - this.ScanPoint = StaticData.BasePlcpointList.Where(t=>t.floorNo== floor).ToList();//加载当前站点所对应的点位 + EquipNo = equipNo; + this.ScanPoint = StaticData.BasePlcpointList.Where(t => t.floorNo == floor).ToList();//加载当前站点所对应的点位 this.LineRFID = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("RFID")); this.LineWcsrun = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("wcsrun")); this.LineSignal = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("linesignal")); @@ -63,30 +69,45 @@ namespace Khd.Core.Wcs.Wcs public void MonitorInLocatorPoint() { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); while (true) { try { + //入库任务 var rfid = this._plc.Read(LineRFID.plcpointAddress); var isSignal = this._plc.Read(LineSignal.plcpointAddress); var isPallet = this._plc.Read(LineIsPallet.plcpointAddress); - if (rfid != null && isSignal != null && isPallet != null ) + if (rfid != null && isSignal != null && isPallet != null) { //正常读到输送线信息 有到位信号,并且有托盘,获取条码信息 if (Convert.ToInt32(isSignal) > 0 && Convert.ToInt32(isPallet) == 1) { //获取条码信息 var palletNo = Convert.ToString(rfid); - //var carRun = GetTask(palletNo, FloorNo); - //if (string.IsNullOrEmpty(carRun)) - //{ - // Console.WriteLine($" FlowPoint类GetTargetTo方法去向返回{carRun},查看错误日志内容!"); - // Thread.Sleep(1000); - // continue; - //} - //var ToInt16carRun = MainCentralControl.getValue("2", carRun); + //获取入库任务 + var wcsTask = GetTask(palletNo, FloorNo, EquipNo); + //判断是否为出库任务 + if (wcsTask.taskType == 2 || wcsTask.taskType == 3) + { + this._plc.Write(LineWcsrun.plcpointAddress, 1); + //更新任务下一点位为提升机 + wcsTask.nextPointId = 6; + wcsTask.nextPointNo = "T01"; + wcsTask.updateTime=DateTime.Now; + dbContext.Update(wcsTask); + dbContext.SaveChanges(); + } + else + { + //入库任务 + //下发agv任务 + SendTask(wcsTask); + } } } + } catch (Exception ex) { @@ -99,37 +120,120 @@ namespace Khd.Core.Wcs.Wcs } } - public string GetTask(string customerNo,int floorNo,string equipNo) + public WcsTask GetTask(string containerNo, int floorNo, string equipNo) { - //获取条码号,如果该条码任务存在就继续任务,如果条码不存在,创建入库任务并调度agv - var task = StaticData.WcsTask.Where(t => t.customerNo == customerNo).FirstOrDefault(); - if (task == null) + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + var wcsTask = new WcsTask(); + var wareHouseList = StaticData.WmsBaseWarehouse.ToList(); + try { - var palletInfo = StaticData.MesBasePalletInfo.Where(t => t.palletInfoCode == customerNo).FirstOrDefault(); - //查询该条码绑定的物料信息 - var material = StaticData.WmsWarehouseMaterial.Where(t=>t.storageId== palletInfo.materialId).FirstOrDefault(); - var wareHouse = StaticData.WmsBaseWarehouse.Where(t => t.warehouseId == material.warehouseId).FirstOrDefault(); - var dic = StaticData.BaseDictionary.Where(t=>t.dicKey== "TaskType" && t.ud1 == "I" && t.dicField== wareHouse.warehouseInstockType).FirstOrDefault(); - var equip = StaticData.BaseEquip.ToList(); - var startEquip = equip.Where(t => t.equipNo == equipNo).FirstOrDefault(); - //var currEquip= - if (palletInfo != null) + //获取条码号,如果该条码任务存在就继续任务,如果条码不存在,创建入库任务并调度agv + var task = StaticData.WcsTask.Where(t => t.containerNo == containerNo).FirstOrDefault(); + if (task == null) { - WcsTask newTask = new() + var palletInfo = StaticData.MesBasePalletInfo.Where(t => t.palletInfoCode == containerNo).FirstOrDefault(); + //查询该条码绑定的物料信息 + var material = StaticData.WmsWarehouseMaterial.Where(t => t.storageId == palletInfo.materialId).FirstOrDefault(); + var wareHouse = wareHouseList.Where(t => t.warehouseId == material.warehouseId).FirstOrDefault(); + var dic = StaticData.BaseDictionary.Where(t => t.dicKey == "TaskType" && t.ud1 == "I" && t.dicField == wareHouse.warehouseInstockType).FirstOrDefault(); + var equip = StaticData.BaseEquip.ToList(); + var startEquip = equip.Where(t => t.equipNo == equipNo).FirstOrDefault(); + var endPoint = wareHouseList.Where(t => t.warehouseFloor == floorNo).FirstOrDefault(); + //var currEquip= + if (palletInfo != null) { - objid = Guid.NewGuid(), - taskType = Convert.ToInt32(dic.dicValue), - customerNo = customerNo, - taskStatus = 0, - materialId = material.storageId, - qty = Convert.ToInt32(palletInfo.bindAmount), - startPointId = startEquip.objid, - startPointNo = equipNo, - //endPointId = wareHouse.warehouseId, - }; - } + //自动获取id + Jc.SnowId.JcSnowId id = new Jc.SnowId.JcSnowId(1, 1); + var objid = id.NextId(); + WcsTask newTask = new() + { + objid = objid, + taskType = Convert.ToInt32(dic.dicValue), + containerNo = containerNo, + taskStatus = 0, + materialId = material.storageId, + qty = Convert.ToInt32(palletInfo.bindAmount), + startPointId = startEquip.objid, + startPointNo = equipNo, + currPointId = startEquip.objid, + currPointNo = equipNo, + endPointId = endPoint.warehouseId, + endPointNo = endPoint.warehouseCode, + }; + dbContext.Add(newTask); + dbContext.SaveChanges(); + wcsTask = newTask; + } + else + { + LogManager.Info(floorNo + "楼接驳位,托盘"+ containerNo + "未绑定!" ); + } + } + else + { + wcsTask = StaticData.WcsTask.Where(t => t.currPointNo == equipNo).FirstOrDefault(); + } + } + catch (Exception ex) + { + LogManager.Info(floorNo + "楼接驳位异常"+ ex.Message); + throw; + } + return wcsTask; + } + /// + /// 下发任务 + /// + /// + public void SendTask(WcsTask task) + { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + //入库类型 + List taskInType = new List { 1, 3, 5, 7 }; + List taskOutType = new List { 2, 4, 6, 8 }; + try + { + //获取 + if (task == null) return; + if (taskInType.Contains(task.taskType.GetValueOrDefault())) + { + //首先判断是否已下发指令 + var cmd = StaticData.WcsCmd.Where(t => t.taskId == task.objid).FirstOrDefault(); + //指令表存在说明已下发 + if (cmd != null) return; + //获取下发agv指令 + string ip = ""; int port = 0; string url = ""; + RequestAGVTaskDto agvtask = new RequestAGVTaskDto(); + agvtask.reqCode = task.serialNo.ToString(); + var json = JsonConvert.SerializeObject(agvtask); + HttpHelper.SendPostMessage(ip, port, url, json); + //未下发给agv下发指令 + WcsCmd taskCmd = new WcsCmd() + { + taskId = task.objid, + cmdType = task.taskType, + serialNo = task.serialNo, + equipmentNo = task.equipmentNo, + cmdStatus = 1, + createBy = "", + createTime = DateTime.Now, + }; + dbContext.Add(taskCmd); + dbContext.SaveChanges(); + } + else + { + + } + + } + catch (Exception) + { + + throw; } - return ""; } } } diff --git a/src/Khd.Core.Wcs/Wcs/SecondThirdFloorAGV.cs b/src/Khd.Core.Wcs/Wcs/SecondThirdFloorAGV.cs new file mode 100644 index 0000000..3b1e861 --- /dev/null +++ b/src/Khd.Core.Wcs/Wcs/SecondThirdFloorAGV.cs @@ -0,0 +1,194 @@ +using Khd.Core.Domain.Dto.webapi; +using Khd.Core.Domain.Models; +using Khd.Core.EntityFramework; +using Khd.Core.Wcs.Global; +using Masuit.Tools.Logging; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Khd.Core.Wcs.Wcs +{ + /// + /// 二楼调度 + /// + public class SecondThirdFloorAGV + { + List ScanPoint { get; set; }//点位信息 + private readonly IHost _host; + private readonly Plc.S7.Plc _plc; + BasePlcpoint? LineRFID { get; set; } + BasePlcpoint? LineWcsrun { get; set; } + BasePlcpoint? LineSignal { get; set; } + BasePlcpoint? LineIsPallet { get; set; } + BasePlcpoint? LineSerialNO { get; set; } + BasePlcpoint? LineFeedSeriaNo { get; set; } + Thread FlowPointThread; + int FloorNo { get; set; } + string EquipNo = ""; + public SecondThirdFloorAGV(IHost host, Plc.S7.Plc plc, int floor, string equipNo) + { + this._host = host; + this._plc = plc; + FloorNo = floor; + EquipNo = equipNo; + //this.ScanPoint = StaticData.BasePlcpointList.Where(t => t.floorNo == floor).ToList();//加载当前站点所对应的点位 + //this.LineRFID = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("RFID")); + //this.LineWcsrun = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("wcsrun")); + //this.LineSignal = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("linesignal")); + //this.LineIsPallet = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("ispallet")); + //this.LineSerialNO = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("serialno")); + //this.LineFeedSeriaNo = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("feedserialno")); + + //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() + { + + FlowPointThread = new Thread(MonitorInLocatorPoint); + FlowPointThread.Start(); + } + + public void MonitorInLocatorPoint() + { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + while (true) + { + try + { + var taskList = GetTask(FloorNo, EquipNo); + if (taskList.Count == 0) + { + LogManager.Info(FloorNo + "楼AGV无任务"); + } + foreach (var item in taskList) + { + SendTask(item); + } + } + catch (Exception ex) + { + LogManager.Error(ex); + } + finally + { + Thread.Sleep(1000); + } + } + } + + public List GetTask(int floorNo, string equipNo) + { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + List wcsTask = new List(); + var wareHouseList = StaticData.WmsBaseWarehouse.ToList(); + var equip = StaticData.BaseEquip.Where(t=>t.floorNo==floorNo && t.equipType==4).FirstOrDefault(); + try + { + //获取条码号,如果该条码任务存在就继续任务,如果条码不存在,创建入库任务并调度agv + var taskList = StaticData.WcsTask.Where(t => t.nextPointId == equip.objid).ToList(); + if (taskList.Count() == 0) + { return null; } + wcsTask = taskList; + } + catch (Exception ex) + { + LogManager.Info(floorNo + "楼AGV异常"+ ex.Message); + throw; + } + return wcsTask; + } + /// + /// 下发任务 + /// + /// + public void SendTask(WcsTask task) + { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + //入库类型 + List taskInType = new List { 1, 3, 5, 7 }; + List taskOutType = new List { 2, 4, 6, 8 }; + //获取 + if (task == null) return; + if (taskInType.Contains(task.taskType.GetValueOrDefault()))//入库 + { + //首先判断是否已下发指令 + var cmd = StaticData.WcsCmd.Where(t => t.taskId == task.objid).FirstOrDefault(); + //指令表存在说明已下发 + if (cmd != null) return; + //获取下发agv指令 + string ip = ""; int port = 0; string url = ""; + RequestAGVTaskDto agvtask = new RequestAGVTaskDto(); + agvtask.reqCode = task.serialNo.ToString(); + var json = JsonConvert.SerializeObject(agvtask); + HttpHelper.SendPostMessage(ip, port, url, json); + //未下发给agv下发指令 + WcsCmd taskCmd = new WcsCmd() + { + taskId = task.objid, + cmdType = task.taskType, + serialNo = task.serialNo, + equipmentNo = task.equipmentNo, + cmdStatus = 1, + createBy = FloorNo + "楼AGV", + createTime = DateTime.Now, + }; + dbContext.Add(taskCmd); + dbContext.SaveChanges(); + } + else + { + //出库 + if (task.taskType == 6)//成品出库 + { + //获取库存 + var proStock = dbContext.WmsProductStock.Where(t=>t.activeFlag=="1"&& t.stockType == "3" && t.productId==task.materialId).ToList(); + var loc = dbContext.WmsBaseLocation.Where(t => t.activeFlag == "1" ).ToList() ; + + var stockList = from t in proStock + join b in loc on t.locationCode equals b.locationCode + into temp + from newStock in temp.DefaultIfEmpty() + select new + { + proID=t.productId, + layerNum = newStock.layerNum, + locColumn= newStock.locColumn, + locRow = newStock.locRow, + locDeep=newStock.locDeep, + create =newStock.createTime, + }; + + + } + else if (task.taskType == 2)//原材料出库 + { + + } + + + } + } + } +} diff --git a/src/Khd.Core.Wcs/Wcs/SecondThirdFloorPoint.cs b/src/Khd.Core.Wcs/Wcs/SecondThirdFloorPoint.cs new file mode 100644 index 0000000..8f36d30 --- /dev/null +++ b/src/Khd.Core.Wcs/Wcs/SecondThirdFloorPoint.cs @@ -0,0 +1,246 @@ +using Khd.Core.Domain.Dto.webapi; +using Khd.Core.Domain.Models; +using Khd.Core.EntityFramework; +using Khd.Core.Wcs.Global; +using Masuit.Tools.Logging; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Khd.Core.Wcs.Wcs +{ + /// + /// 二楼调度 + /// + public class SecondThirdFloorPoint + { + List ScanPoint { get; set; }//点位信息 + private readonly IHost _host; + private readonly Plc.S7.Plc _plc; + BasePlcpoint? LineRFID { get; set; } + BasePlcpoint? LineWcsrun { get; set; } + BasePlcpoint? LineSignal { get; set; } + BasePlcpoint? LineIsPallet { get; set; } + BasePlcpoint? LineSerialNO { get; set; } + BasePlcpoint? LineFeedSeriaNo { get; set; } + Thread FlowPointThread; + int FloorNo { get; set; } + string EquipNo = ""; + public SecondThirdFloorPoint(IHost host, Plc.S7.Plc plc, int floor, string equipNo) + { + this._host = host; + this._plc = plc; + FloorNo = floor; + EquipNo = equipNo; + this.ScanPoint = StaticData.BasePlcpointList.Where(t => t.floorNo == floor).ToList();//加载当前站点所对应的点位 + this.LineRFID = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("RFID")); + this.LineWcsrun = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("wcsrun")); + this.LineSignal = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("linesignal")); + this.LineIsPallet = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("ispallet")); + this.LineSerialNO = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("serialno")); + this.LineFeedSeriaNo = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("feedserialno")); + + //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() + { + + FlowPointThread = new Thread(MonitorInLocatorPoint); + FlowPointThread.Start(); + } + + public void MonitorInLocatorPoint() + { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + while (true) + { + try + { + //入库任务 + var rfid = this._plc.Read(LineRFID.plcpointAddress); + var isSignal = this._plc.Read(LineSignal.plcpointAddress); + var isPallet = this._plc.Read(LineIsPallet.plcpointAddress); + if (rfid != null && isSignal != null && isPallet != null) + { + //正常读到输送线信息 有到位信号,并且有托盘,获取条码信息 + if (Convert.ToInt32(isSignal) > 0 && Convert.ToInt32(isPallet) == 1) + { + //获取条码信息 + var palletNo = Convert.ToString(rfid); + //获取入库任务 + var wcsTask = GetTask(palletNo, FloorNo, EquipNo); + //判断是否为出库任务 + if (wcsTask.taskType == 2 || wcsTask.taskType == 3) + { + this._plc.Write(LineWcsrun.plcpointAddress, 1); + //更新任务下一点位为提升机 + wcsTask.nextPointId = 6; + wcsTask.nextPointNo = "T01"; + wcsTask.updateTime=DateTime.Now; + dbContext.Update(wcsTask); + dbContext.SaveChanges(); + } + else + { + var nextEquip = StaticData.BaseEquip.Where(t=>t.floorNo==FloorNo && t.equipType==4).FirstOrDefault(); + //更新任务下一点位为AGV + wcsTask.nextPointId = nextEquip.objid; + wcsTask.nextPointNo = nextEquip.equipNo; + wcsTask.updateTime = DateTime.Now; + wcsTask.updateBy = FloorNo+"楼输送线"; + dbContext.Update(wcsTask); + dbContext.SaveChanges(); + ////入库任务 + ////下发agv任务 + //SendTask(wcsTask); + } + } + } + } + catch (Exception ex) + { + LogManager.Error(ex); + } + finally + { + Thread.Sleep(1000); + } + } + } + //获取输送线上的任务 + public WcsTask GetTask(string containerNo, int floorNo, string equipNo) + { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + var wcsTask = new WcsTask(); + var wareHouseList = StaticData.WmsBaseWarehouse.ToList(); + try + { + //获取条码号,如果该条码任务存在就继续任务,如果条码不存在,创建入库任务并调度agv + var task = StaticData.WcsTask.Where(t => t.containerNo == containerNo).FirstOrDefault(); + if (task == null) + { + var palletInfo = StaticData.MesBasePalletInfo.Where(t => t.palletInfoCode == containerNo).FirstOrDefault(); + //查询该条码绑定的物料信息 + var material = StaticData.WmsWarehouseMaterial.Where(t => t.storageId == palletInfo.materialId).FirstOrDefault(); + var wareHouse = wareHouseList.Where(t => t.warehouseId == material.warehouseId).FirstOrDefault(); + var dic = StaticData.BaseDictionary.Where(t => t.dicKey == "TaskType" && t.ud1 == "I" && t.dicField == wareHouse.warehouseInstockType).FirstOrDefault(); + var equip = StaticData.BaseEquip.ToList(); + var startEquip = equip.Where(t => t.equipNo == equipNo).FirstOrDefault(); + var endPoint = wareHouseList.Where(t => t.warehouseFloor == floorNo).FirstOrDefault(); + //var currEquip= + if (palletInfo != null) + { + //自动获取id + Jc.SnowId.JcSnowId id = new Jc.SnowId.JcSnowId(1, 1); + var objid = id.NextId(); + WcsTask newTask = new() + { + objid = objid, + taskType = Convert.ToInt32(dic.dicValue), + containerNo = containerNo, + taskStatus = 0, + materialId = material.storageId, + qty = Convert.ToInt32(palletInfo.bindAmount), + startPointId = startEquip.objid, + startPointNo = equipNo, + currPointId = startEquip.objid, + currPointNo = equipNo, + endPointId = endPoint.warehouseId, + endPointNo = endPoint.warehouseCode, + }; + dbContext.Add(newTask); + dbContext.SaveChanges(); + wcsTask = newTask; + } + else + { + LogManager.Info(floorNo + "楼接驳位,托盘"+ containerNo + "未绑定!" ); + } + } + else + { + wcsTask = StaticData.WcsTask.Where(t => t.currPointNo == equipNo).FirstOrDefault(); + } + } + catch (Exception ex) + { + LogManager.Info(floorNo + "楼接驳位异常"+ ex.Message); + throw; + } + return wcsTask; + } + /// + /// 下发任务 + /// + /// + public void SendTask(WcsTask task) + { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + //入库类型 + List taskInType = new List { 1, 3, 5, 7 }; + List taskOutType = new List { 2, 4, 6, 8 }; + try + { + //获取 + if (task == null) return; + if (taskInType.Contains(task.taskType.GetValueOrDefault())) + { + //首先判断是否已下发指令 + var cmd = StaticData.WcsCmd.Where(t => t.taskId == task.objid).FirstOrDefault(); + //指令表存在说明已下发 + if (cmd != null) return; + //获取下发agv指令 + string ip = ""; int port = 0; string url = ""; + RequestAGVTaskDto agvtask = new RequestAGVTaskDto(); + agvtask.reqCode = task.serialNo.ToString(); + var json = JsonConvert.SerializeObject(agvtask); + HttpHelper.SendPostMessage(ip, port, url, json); + //未下发给agv下发指令 + WcsCmd taskCmd = new WcsCmd() + { + taskId = task.objid, + cmdType = task.taskType, + serialNo = task.serialNo, + equipmentNo = task.equipmentNo, + cmdStatus = 1, + createBy = "", + createTime = DateTime.Now, + }; + dbContext.Add(taskCmd); + dbContext.SaveChanges(); + } + else + { + + } + + } + catch (Exception) + { + + throw; + } + } + } +}