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(); } } }