using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading; using WIDESEA_Common; using WIDESEA_Common.Tools; using WIDESEA_Core.EFDbContext; using WIDESEA_Core.Utilities; using WIDESEA_Entity.DomainModels; using WIDESEA_Services; using WIDESEA_Services.IRepositories; using WIDESEA_Services.Repositories; using WIDESEA_Services.Services; using WIDESEA_WCS.WCSClient; namespace WIDESEA_WCS.Jobs { public partial class EquipmentExecutor : SchedulerExecuteBase { private static int _readFFQDOWNSignalso = 0; public static void F_FQSB_DownTask() { if (Interlocked.Exchange(ref _readFFQDOWNSignalso, 1) == 0) { try { VOLContext Context = new VOLContext(); Idt_task_numberRepository tasknumberRep = new dt_task_numberRepository(Context); dt_task_numberService tasknumber = new dt_task_numberService(tasknumberRep); Ibase_ware_locationRepository locRepository = new base_ware_locationRepository(Context); Ibase_routing_tableRepository routingRepository = new base_routing_tableRepository(Context); Ibill_pda_groupdiskRepository pdaRepository = new bill_pda_groupdiskRepository(Context); Idt_agvtaskRepository agvRepository = new dt_agvtaskRepository(Context); Ibill_group_stockRepository groupRepository = new bill_group_stockRepository(Context); IequipmentRepository equipmentRepository = new equipmentRepository(Context); List FQSBS = new List { "负机1号分切机", "负机2号分切机" }; //List FQSBS = new List { "负机2号分切机" }; PLCClient zagvplc = WCSService.Clients.Find(v => v.PLCName == "负极1号AGV"); foreach (var FQSB in FQSBS) { WriteLog.Info($"{FQSB}下料").Write($"{FQSB}开始,时间:" + DateTime.Now + " ----------", $"{FQSB}下料"); PLCClient plc = WCSService.Clients.Find(v => v.PLCName == FQSB); if (plc == null) { continue; } var task = agvRepository.FindFirst(f => f.agv_toaddress == ""&&f.agv_fromaddress.Substring(0,2)=="FJ"); if (task == null) { //读取下料请求信号 string isWork = plc.ReadValue(ConveyorLineInfoDBName.R_FQSB_DOWNrequest.ToString(), plc.PLCDescroption).ToString(); //获取工单号 string batchNo = plc.ReadValue(ConveyorLineInfoDBName.R_FQSB_DOWNbatchNo.ToString(), plc.PLCDescroption).ToString(); GetEquipmentInfo(plc.PLCDownLoc, isWork, batchNo, "", ""); WriteLog.Info($"{FQSB}下料").Write($"isWork:{isWork},batchNo:{batchNo},时间:" + DateTime.Now + " ----------", $"{FQSB}下料"); if (bool.Parse(isWork)) { //调用MES接口获取设备下料信息 MESback material = MESAPIInvoke.EquipUnloading(plc.PLCDownLoc, batchNo); WriteLog.Info($"{FQSB}下料").Write($"MES返回数据:{JsonConvert.SerializeObject(material)},时间:" + DateTime.Now + "", $"{FQSB}下料"); if (material.Code == 0) { //查询路由信息 var routes = routingRepository.Find(v => v.route_began == plc.PLCDownLoc).ToList(); foreach (var route in routes) { string ismaterial = zagvplc.ReadValue(ConveyorLineInfoDBName.R_Location_iswork.ToString(), route.route_end).ToString(); GetEquipmentInfo(plc.PLCDownLoc, isWork, batchNo, "", route.route_end + "的货位状态是" + ismaterial); if (ismaterial == "1") continue; var location = locRepository.FindFirst(v => v.upper_code == route.route_end); if (location.location_state != LocationStateEnum.LocationState_Wait.ToString()) continue; float width = float.Parse(plc.ReadValue(ConveyorLineInfoDBName.width.ToString(), plc.PLCDescroption).ToString()); int Anumber = int.Parse(plc.ReadValue(ConveyorLineInfoDBName.Anumber.ToString(), plc.PLCDescroption).ToString()); int Bnumber = int.Parse(plc.ReadValue(ConveyorLineInfoDBName.Bnumber.ToString(), plc.PLCDescroption).ToString()); GetEquipmentInfo(plc.PLCDownLoc, isWork, batchNo, "宽度:" + width + ",A轴卷数:" + Anumber + ",B轴卷数:" + Bnumber, route.route_end + "的货位状态是" + ismaterial); int Asum = Convert.ToInt32(width) * Anumber; int Bsum = Convert.ToInt32(width) * Bnumber; string taskId = "KH-" + tasknumber.GetTaskNumber(tasknumberRep); if (Asum + Bsum > 750 && Bsum!=0)//Asum + Bsum > 780 && Asum < 780 && Bsum < 780 && Bsum != 0 { //条件全部通过,生成AGV任务 dt_agvtask agvtask = new dt_agvtask { agv_materbarcode = "daiding",//下料任务预先没有条码,PDA在缓存架绑定时接收新的条码 agv_barcode = "B", agv_code = "负极1号AGV", agv_createtime = DateTime.Now, agv_fromaddress = route.route_began, agv_grade = 1, agv_materielid = material.MaterialType, agv_qty = 1, agv_tasknum = taskId + ":1", agv_taskstate = "Create", agv_tasktype = "TaskType_Outbound", agv_toaddress = "", agv_userid = "WCS", agv_worktype = 1 }; agvRepository.Add(agvtask, true); dt_agvtask agvtask2 = new dt_agvtask { agv_materbarcode = "daiding",//下料任务预先没有条码,PDA在缓存架绑定时接收新的条码 agv_barcode = "", agv_code = "负极1号AGV", agv_createtime = DateTime.Now, agv_fromaddress = route.route_end, agv_grade = 1, agv_materielid = material.MaterialType, agv_qty = 1, agv_tasknum = taskId + ":2,END", agv_taskstate = "Create", agv_tasktype = "TaskType_Outbound", agv_toaddress = "", agv_userid = "WCS", agv_worktype = 3 }; agvRepository.Add(agvtask2, true); location.location_state = LocationStateEnum.LocationState_Lock.ToString(); locRepository.Update(location, true); } else if (Bsum == 0 && Asum != 0)//Asum + Bsum < 780 && Asum < 780 && Bsum < 780 && Asum != 0//Asum + Bsum < 780 && Asum != 0// { //条件全部通过,生成AGV任务 dt_agvtask agvtask = new dt_agvtask { agv_materbarcode = "daiding",//下料任务预先没有条码,PDA在缓存架绑定时接收新的条码 agv_barcode = "A", agv_code = "负极1号AGV", agv_createtime = DateTime.Now, agv_fromaddress = route.route_began, agv_grade = 1, agv_materielid = material.MaterialType, agv_qty = 1, agv_tasknum = taskId + ":1", agv_taskstate = "Create", agv_tasktype = "TaskType_Outbound", agv_toaddress = "", agv_userid = "WCS", agv_worktype = 1 }; agvRepository.Add(agvtask, true); dt_agvtask agvtask2 = new dt_agvtask { agv_materbarcode = "daiding",//下料任务预先没有条码,PDA在缓存架绑定时接收新的条码 agv_barcode = "", agv_code = "负极1号AGV", agv_createtime = DateTime.Now, agv_fromaddress = route.route_end, agv_grade = 1, agv_materielid = material.MaterialType, agv_qty = 1, agv_tasknum = taskId + ":2,END", agv_taskstate = "Create", agv_tasktype = "TaskType_Outbound", agv_toaddress = "", agv_userid = "WCS", agv_worktype = 3 }; agvRepository.Add(agvtask2, true); location.location_state = LocationStateEnum.LocationState_Lock.ToString(); locRepository.Update(location, true); } else if (Asum + Bsum <=750)//(width * Anumber + width * Bnumber < 780) && Asum != 0 && Bsum != 0 { dt_agvtask agvtask = new dt_agvtask { agv_materbarcode = "daiding",//下料任务预先没有条码,PDA在缓存架绑定时接收新的条码 agv_barcode = "A", agv_code = "负极1号AGV", agv_createtime = DateTime.Now, agv_fromaddress = route.route_began, agv_grade = 1, agv_materielid = material.MaterialType, agv_qty = 1, agv_tasknum = taskId + ":1", agv_taskstate = "Create", agv_tasktype = "TaskType_Outbound", agv_toaddress = "", agv_userid = "WCS", agv_worktype = 1 }; agvRepository.Add(agvtask, true); dt_agvtask agvtask2 = new dt_agvtask { agv_materbarcode = "daiding",//下料任务预先没有条码,PDA在缓存架绑定时接收新的条码 agv_barcode = "B", agv_code = "负极1号AGV", agv_createtime = DateTime.Now, agv_fromaddress = route.route_began, agv_grade = 1, agv_materielid = material.MaterialType, agv_qty = 1, agv_tasknum = taskId + ":2", agv_taskstate = "Create", agv_tasktype = "TaskType_Outbound", agv_toaddress = "", agv_userid = "WCS", agv_worktype = 1 }; agvRepository.Add(agvtask2, true); dt_agvtask agvtask3 = new dt_agvtask { agv_materbarcode = "daiding",//下料任务预先没有条码,PDA在缓存架绑定时接收新的条码 agv_barcode = "", agv_code = "负极1号AGV", agv_createtime = DateTime.Now, agv_fromaddress = route.route_end, agv_grade = 1, agv_materielid = material.MaterialType, agv_qty = 1, agv_tasknum = taskId + ":3,END", agv_taskstate = "Create", agv_tasktype = "TaskType_Outbound", agv_toaddress = "", agv_userid = "WCS", agv_worktype = 3 }; agvRepository.Add(agvtask3, true); location.location_state = LocationStateEnum.LocationState_Lock.ToString(); locRepository.Update(location, true); } break; } } else { WriteLog.Info("F_FQSB_DownTask").Write("调用MES接口EquipUnloading失败"+FQSB + material.Message, "F_FQSB_DownTask"); } } } WriteLog.Info($"{FQSB}下料").Write($"{FQSB}结束,时间:" + DateTime.Now + $" ----------{Environment.NewLine}", $"{FQSB}下料"); } } catch (Exception ex) { WriteLog.Info("F_FQSB_DownTask").Write("F_FQSB_DownTask" + ex.Message, "F_FQSB_DownTask"); StackTrace stackTrace = new StackTrace(); StackFrame[] stackFrames = stackTrace.GetFrames(); string str = ""; foreach (var item in stackFrames) { str += "方法名:" + item.GetMethod().Name + ",行号:" + item.GetFileLineNumber() + ",文件名:" + item.GetFileName() + Environment.NewLine; } WIDESEA_Common.Tools.WriteLog.GetLog("负极分切设备下料").Write($"错误信息:{ex.Message},{str}", "负极分切设备下料"); } finally { Interlocked.Exchange(ref _readFFQDOWNSignalso, 0); } } } } }