using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using WCS.Data; using WCS.Data.Models; using WCS.Data.Utils; using WCS.PLC; namespace WCS.Workflow { public class AgvWorkflow { private static int _agvRun = 0; public static void AgvRun() { if (Interlocked.Exchange(ref _agvRun, 1) == 0) { Thread.Sleep(10000); //熟化架缓冲区广电检测生成AGV任务 AgvCallMaturingRack(); //生产线AGV申请WMS生成出库任务 AgvCallOutTask(); //生产线AGV申请WMS生成退料入库任务 AgvCallBackInTask(); Interlocked.Exchange(ref _agvRun, 0); } } private static int _agvUpdateStatus = 0; public static void AgvUpdateStatus() { if (Interlocked.Exchange(ref _agvUpdateStatus, 1) == 0) { Thread.Sleep(1000); //发送任务给AGV SendTaskToAgv(); //无AGV模式WCS标识AGV任务完成 FinishAgvTaskAgvStatus(); //标识agv任务Wcs完成状态 FinishAgvTaskWcsStatus(); Interlocked.Exchange(ref _agvUpdateStatus, 0); } } /// /// 生产线根据光电信号自动生成AGV任务 /// public static void AgvCallMaturingRack() { try { foreach (var item in Current.AgvCachePostionSet) { try { //if (item.WorkshopNo == "4") //{ // if (item.CachePosNo.Contains("Empty04")) continue; //} //if (item.CachePosNo.Contains("Pvc_5_Empty")) continue; int task_type = item.CachePosNo.Contains("Empty") ? 3 : 4; #region 检测光电创建AGV任务 if (Current.SysSets.Any(t => t.SET_ID == item.Workshop && t.SET_VALUE == "0")) { if (item.CachePH_Status == false && task_type == 3) { if (!Current.AgvTaskSet.Any(v => v.Task_PosidTo == item.CachePosNo)) { //创建AGV任务 var agvtask = new Middle_AGVTask() { Task_Type = task_type, Task_Whid = Current.PvchouseputongCh, Task_WorkshopNo = item.WorkshopNo, Task_ProLineNo = item.ProLineNo, Task_PosidFrom = item.ConvPostionNo, Task_PosidTo = item.CachePosNo, Task_CreateDate = DateTime.Now, Task_CreateUser = "wcs", Task_UpdateUser = "wcs", Task_UpdateDate = DateTime.Now }; SugarBase.DB.Insertable(agvtask).ExecuteCommand(); } } } #endregion; #region 创建半成品入库AGV任务 if (task_type == 4) { //查询半成品熟化架任务 var task = Current.TaskSet.Where(v => v.TASK_POSIDFROM == item.CachePosNo && v.TASK_WKSTATUS <= 1).OrderBy(v => v.TASK_ADDDATETIME).ToList().FirstOrDefault(); if (task == null) continue; #region 避开指定车间出入库高峰期 //查询指定车间已下发给WCS的AGV任务列表 var agvtaskSet = Current.AgvTaskSet.Where(v => v.Task_WorkshopNo == item.WorkshopNo && v.Task_WcsStatus > 0 && v.Task_WcsStatus != 4 && v.Task_WcsStatus != 99 && v.Task_WcsStatus != 106).ToList(); if (item.WorkshopNo == "4") { //检测是否存在出库任务 if (Current.TaskSet.Any(v => agvtaskSet.Any(t => t.Task_Id.ToString() == v.TASK_ITEM8) && v.TASK_WKSTATUS > 1 && v.TASK_WKSTATUS != 5 && v.TASK_WKSTATUS != 6 && v.TASK_WKSTATUS != 99 && v.TASK_WKSTATUS != 106 && v.TASK_COMTYPE == 2 && v.TASK_POSIDNEXT != "1070" && v.TASK_POSIDNEXT != "1071" && v.TASK_POSIDNEXT != "1072")) { //存在已经执行中的WCS出库任务 if (item.WorkshopNo != "18") { string msg = string.Format("车间[{0}]半成品入库条码[{1}]稍等,为避开高峰期出库任务完成后执行。", item.WorkshopNo, task.TASK_BOXBARCODE); BaseWorkflow.AddLedErrorMsg(item.ConvPostionNo, msg, 0); LogMessageHelper.RecordLogMessage(msg); continue; } } } else if (item.WorkshopNo == "5") { //检测是否存在出库任务 if (Current.TaskSet.Any(v => agvtaskSet.Any(t => t.Task_Id.ToString() == v.TASK_ITEM8) && v.TASK_WKSTATUS > 1 && v.TASK_WKSTATUS != 5 && v.TASK_WKSTATUS != 6 && v.TASK_WKSTATUS != 99 && v.TASK_WKSTATUS != 106 && v.TASK_COMTYPE == 2 && v.TASK_POSIDNEXT != "1070" && v.TASK_POSIDNEXT != "1071" && v.TASK_POSIDNEXT != "1072" && v.TASK_POSIDNEXT != "1085")) { //存在已经执行中的WCS出库任务 if (item.WorkshopNo != "18") { string msg = string.Format("车间[{0}]半成品入库条码[{1}]稍等,为避开高峰期出库任务完成后执行。", item.WorkshopNo, task.TASK_BOXBARCODE); BaseWorkflow.AddLedErrorMsg(item.ConvPostionNo, msg, 0); LogMessageHelper.RecordLogMessage(msg); continue; } } } #endregion; var agvtaskitem = Current.AgvTaskSet.OrderBy(v => v.Task_UpdateDate).FirstOrDefault(v => v.Task_PosidFrom == item.CachePosNo); if (item.CachePH_Status) { if (agvtaskitem == null) { #region 创建AGV任务 var workshopNo = string.Format("Agv_{0}#", item.WorkshopNo); int wcsStatus = 1; //if (Current.SysSets.FirstOrDefault(v => v.SET_ID == workshopNo).SET_VALUE.Trim() == "0") //{ // wcsStatus = 1; //} var agvtasks = SugarBase.DB.Queryable().Where(v => v.Task_PosidFrom == item.ConvPostionNo && v.Task_WcsStatus != 4 && v.Task_WcsStatus != 99 && v.Task_WcsStatus != 106).ToList(); if (agvtasks.Any(v => !string.IsNullOrWhiteSpace(v.Task_No))) { continue; } //创建AGV任务 var agvtask = new Middle_AGVTask() { Task_No = task.TASK_WMSNO, Task_BreakTrayNo = task.TASK_BOXBARCODE, Task_Type = task_type, Task_Whid = Current.PvchouseputongCh, Task_WorkshopNo = item.WorkshopNo, Task_ProLineNo = item.ProLineNo, Task_PosidFrom = item.CachePosNo, Task_PosidTo = item.ConvPostionNo, Task_WcsStatus = wcsStatus, Task_CreateDate = DateTime.Now, Task_CreateUser = "wcs", Task_UpdateUser = "wcs", Task_UpdateDate = DateTime.Now }; string result = TryCachHelper.TryTranExecute((db) => { int task_id = db.Insertable(agvtask).ExecuteReturnIdentity(); if (task_id <= 0) { throw new Exception(string.Format("WCS任务[{0}]添加agv任务失败", task_id)); } string task_idStr = task_id.ToString(); //修改任务的状态 db.Updateable(it => new WCS_TASK() { TASK_WKSTATUS = 10, TASK_EDITUSERNO = "WCS", TASK_ITEM8 = task_idStr, TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == task.TASK_NO) .ExecuteCommand(); //添加修改明细 string msg = string.Format("任务[{0}]已下发AGV", task.TASK_NO); CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, task.TASK_POSIDTO, msg); }); #endregion; } else { #region 修改AGV任务状态 if (agvtaskitem.Task_WcsStatus == 0 && agvtaskitem.Task_AgvStatus == 0) { string result = TryCachHelper.TryTranExecute((db) => { db.Updateable(it => new Middle_AGVTask() { Task_WcsStatus = 1, Task_UpdateUser = "wcs", Task_UpdateDate = DateTime.Now }).Where(it => it.Task_Id == agvtaskitem.Task_Id).ExecuteCommand(); string task_idStr = agvtaskitem.Task_Id.ToString(); //修改任务的状态 db.Updateable(it => new WCS_TASK() { TASK_WKSTATUS = 10, TASK_EDITUSERNO = "WCS", TASK_ITEM8 = task_idStr, TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == task.TASK_NO) .ExecuteCommand(); //添加修改明细 string msg = string.Format("任务[{0}]已下发AGV", task.TASK_NO); CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, task.TASK_POSIDTO, msg); }); if (string.IsNullOrWhiteSpace(result)) { LogMessageHelper.RecordLogMessage(string.Format("agvId[{0}]是agv错误插入的任务,WCS修改该任务的状态成功。", agvtaskitem.Task_Id)); } } #endregion; } } else { #region 修改AGV任务状态 if (agvtaskitem != null && agvtaskitem.Task_WcsStatus == 0 && agvtaskitem.Task_AgvStatus == 0) { string result = TryCachHelper.TryTranExecute((db) => { db.Updateable(it => new Middle_AGVTask() { Task_WcsStatus = 1, Task_UpdateUser = "wcs", Task_UpdateDate = DateTime.Now }).Where(it => it.Task_Id == agvtaskitem.Task_Id).ExecuteCommand(); string task_idStr = agvtaskitem.Task_Id.ToString(); //修改任务的状态 db.Updateable(it => new WCS_TASK() { TASK_WKSTATUS = 10, TASK_EDITUSERNO = "WCS", TASK_ITEM8 = task_idStr, TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == task.TASK_NO) .ExecuteCommand(); //添加修改明细 string msg = string.Format("任务[{0}]已下发AGV", task.TASK_NO); CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, task.TASK_POSIDTO, msg); }); if (string.IsNullOrWhiteSpace(result)) { LogMessageHelper.RecordLogMessage(string.Format("agvId[{0}]是agv错误插入的任务,WCS修改该任务的状态成功。", agvtaskitem.Task_Id)); } } #endregion; } } //if (item.CachePH_Status && task_type == 4) //{ // //查询半成品熟化架任务 // var task = Current.TaskSet.Where(v => v.TASK_POSIDFROM == item.CachePosNo && v.TASK_WKSTATUS <= 1).OrderBy(v => v.TASK_ADDDATETIME).ToList().FirstOrDefault(); // if (task != null) // { // #region 创建AGV任务,修改WCS任务状态 // else // #endregion; // } //} #endregion; } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } /// /// 生产线AGV申请WMS生成出库任务 /// public static void AgvCallOutTask() { try { //查询AGV呼叫任务,申请生成WMS出库任务 var agvTasks = Current.AgvTaskSet.Where(v => (v.Task_WcsStatus == 5 || v.Task_WcsStatus==0) && (v.Task_Type == 1 || v.Task_Type == 3)).OrderBy(v => v.Task_CreateDate).ToList(); foreach (var item in agvTasks) { try { //if (item.Task_Type == 1 && (item.Task_WorkshopNo == "5" || item.Task_WorkshopNo == "6" || item.Task_WorkshopNo == "7")) //{ // continue; //} if (!SugarBase.DB.Queryable().Any(v => v.TASK_ITEM8 == item.Task_Id.ToString())) { var param = new GetOutTaskParam(); param.OutId = item.Task_Id.ToString(); param.OutEndPostion = item.Task_PosidTo; int tasktype = 0; if (item.Task_Type == 1) { tasktype = 1; } else if (item.Task_Type == 3) { tasktype = 2; } param.OutType = tasktype; param.WareHouseId = Current.Pvchouseputong; if (item.Task_Type == 1 && item.Task_WorkshopNo != "18") { param.Memo1 = "1"; } BaseWorkflow.GetOutTask(param); //调用WMS接口生成出库任务 //ThreadHelper.TaskThread(BaseWorkflow.GetOutTask, param, 2000); } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } //查询18车间的空熟化架入库任务 var agvTaskItems = Current.AgvTaskSet.Where(v => v.Task_WcsStatus == 0 && v.Task_Type == 4 && v.Task_WorkshopNo=="18").OrderBy(v => v.Task_CreateDate).ToList(); foreach (var item in agvTaskItems) { SugarBase.DB.Updateable(it => new Middle_AGVTask() { Task_WcsStatus = 1, Task_UpdateUser = "wcs", Task_UpdateDate = DateTime.Now }) .Where(it => it.Task_Id == item.Task_Id) .ExecuteCommand(); } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } /// /// 生产线AGV申请WMS生成退料入库任务 /// public static void AgvCallBackInTask() { try { //查询AGV呼叫任务,申请生成WMS出库任务 var agvTasks = Current.AgvTaskSet.Where(v => v.Task_WcsStatus == 0 && v.Task_Type == 2 && v.Task_WorkshopNo.Trim() != "18").OrderBy(v => v.Task_CreateDate).ToList(); foreach (var item in agvTasks) { if (item.Task_WorkshopNo.Trim() == "18") { } else { if (!Current.TaskSet.Any(v => v.TASK_ITEM8 == item.Task_Id.ToString())) // if (!Current.TaskSet.Any(v => v.TASK_POSIDTO == item.Task_PosidFrom)) { var param = new GetOutTaskParam() { OutId = item.Task_Id.ToString(), OutEndPostion = item.Task_PosidFrom, OutType = item.Task_Type == 2 ? 2 : 0, WareHouseId = Current.Pvchouseputong }; //调用WMS接口生成出库任务 ThreadHelper.TaskThread(BaseWorkflow.GetOutTask, param, 2000); } } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } /// /// 半成品熟化架入库 /// //public static void AgvCallFullInTask() //{ // try // { // //查询AGV呼叫任务,申请生成WMS出库任务 // var agvTasks = Current.AgvTaskSet.Where(v => v.Task_WcsStatus == 0 && v.Task_Type == 4).OrderBy(v => v.Task_CreateDate).ToList(); // foreach (var item in agvTasks) // { // if (!Current.TaskSet.Any(v => v.TASK_POSIDFROM == item.Task_PosidFrom)) // { // var param = new GetInTaskParam(); // param.ContainerBarCode = string.Empty; // param.ContainerType = 1; // param.MatBarCode = string.Empty; // param.WareHouseId = Current.Pvchouseputong; // param.EquipmentNo = item.Task_PosidFrom; // param.EndPostion = "srm"; // ThreadHelper.TaskThread(BaseWorkflow.GetWcsInTask, param, 3000); // } // } // } // catch (Exception ex) // { // LogMessageHelper.RecordLogMessage(ex); // } //} /// /// 发送任务给AGV /// public static void SendTaskToAgv() { try { var outPosNoList_4_5 = new List() { "1097", "1104" };//4#,5# var tasks = SugarBase.DB.Queryable().Where(v => outPosNoList_4_5.Contains(v.TASK_POSIDCUR)).ToList(); var outPosNoList_6_7 = new List() { "1107", "1112", "1199" };//6#,7#,18# var tasktemps = SugarBase.DB.Queryable().Where(v => outPosNoList_6_7.Contains(v.TASK_POSIDCUR)).ToList(); tasks.AddRange(tasktemps); foreach (var item in tasks) { try { Thread.Sleep(100); int agv_taskid = 0; if (!string.IsNullOrWhiteSpace(item.TASK_ITEM8)) { agv_taskid = Convert.ToInt32(item.TASK_ITEM8); } if (agv_taskid == 0) continue; var agvtask = SugarBase.DB.Queryable().First(v => v.Task_Id == agv_taskid); if (agvtask != null && agvtask.Task_AgvStatus == 0 && (agvtask.Task_WcsStatus == 0 || agvtask.Task_WcsStatus == 5)) { string task_no = item.TASK_NO.ToString(); int wcsStatus = 5; if (Current.SysSets.FirstOrDefault(v => v.SET_ID == agvtask.Task_Workshop).SET_VALUE.Trim() == "0") { wcsStatus = 1; //任务下发给AGV SugarBase.DB.Updateable(it => new Middle_AGVTask() { Task_No = item.TASK_WMSNO, Task_WcsStatus = wcsStatus, Task_BreakTrayNo = item.TASK_BOXBARCODE, Task_BreakBarCode_1 = item.TASK_ITEM9, Task_BreakBarCode_2 = item.TASK_ITEM10, Task_UpdateUser = "wcs", Task_UpdateDate = DateTime.Now, Task_Remark = task_no }) .Where(it => it.Task_Id == agv_taskid) .ExecuteCommand(); } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } /// /// 无AGV模式WCS标识AGV任务完成 /// private static void FinishAgvTaskAgvStatus() { try { var syssets = Current.SysSets.Where(v => v.SET_TYPE == "AgvDisable").ToList(); var agvtask = Current.AgvTaskSet.Where(v => v.Task_AgvStatus < 99 && v.Task_WcsStatus < 99 && syssets.Any(t => t.SET_ID == v.Task_Workshop && t.SET_VALUE.Trim() == "1")).ToList(); foreach (var item in agvtask) { try { if (string.IsNullOrWhiteSpace(item.Task_No)) continue; if (string.IsNullOrWhiteSpace(item.Task_BreakTrayNo)) continue; if (item.Task_Type == 1 | item.Task_Type == 3) { var routeitem = Current.EquRouteSet.SingleOrDefault(v => v.ROUTE_SONPOS == item.Task_PosidTo.Trim()); var task = Current.TaskSet.FirstOrDefault(v => v.TASK_WMSNO == item.Task_No && v.TASK_POSIDNEXT == routeitem.ROUTE_STARTPOS); if (task != null) { //标识agv任务agv完成状态 SugarBase.DB.Updateable(it => new Middle_AGVTask() { Task_AgvStatus = 99, Task_UpdateUser = "wcs", Task_UpdateDate = DateTime.Now }) .Where(it => it.Task_Id == item.Task_Id) .ExecuteCommand(); } } else { if (Current.TaskSet.Any(v => v.TASK_BOXBARCODE == item.Task_BreakTrayNo && v.TASK_WMSNO == item.Task_No && v.TASK_WKSTATUS == 2)) { //标识agv任务agv完成状态 SugarBase.DB.Updateable(it => new Middle_AGVTask() { Task_AgvStatus = 99, Task_UpdateUser = "wcs", Task_UpdateDate = DateTime.Now }) .Where(it => it.Task_Id == item.Task_Id) .ExecuteCommand(); } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } /// /// 标识agv任务Wcs完成状态 /// public static void FinishAgvTaskWcsStatus() { try { var agvTasks = Current.AgvTaskSet.Where(v => (v.Task_AgvStatus == 99 || v.Task_AgvStatus == 106) && v.Task_WcsStatus < 99).ToList(); foreach (var item in agvTasks) { try { var wcstask = Current.TaskSet.FirstOrDefault(v => v.TASK_WMSNO == item.Task_No); if ((!string.IsNullOrWhiteSpace(item.Task_BreakBarCode_1)) && (!string.IsNullOrWhiteSpace(item.Task_BreakTrayNo))) { //检查是否生成了退料入库任务 if (!Current.TaskSet.Any(v => v.TASK_BOXBARCODE == item.Task_BreakTrayNo && v.TASK_COMTYPE == 1)) continue; string result = TryCachHelper.TryTranExecute((db) => { //标识agv任务Wcs完成状态 db.Updateable(it => new Middle_AGVTask() { Task_WcsStatus = item.Task_AgvStatus, Task_UpdateUser = "wcs", Task_UpdateDate = DateTime.Now }) .Where(it => it.Task_Id == item.Task_Id) .ExecuteCommand(); //标识wcs状态 if (wcstask != null && wcstask.TASK_COMTYPE == 1 && wcstask.TASK_WKSTATUS == 10) { db.Updateable(it => new WCS_TASK() { TASK_WKSTATUS = 12, TASK_EDITUSERNO = "wcs", TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == wcstask.TASK_NO) .ExecuteCommand(); //添加任务明细 string msg = string.Format("入库任务[{0}]AGV完成", wcstask.TASK_NO); CommonData.AddWCS_TASK_DTL(db, wcstask.TASK_NO, wcstask.TASK_NO, wcstask.TASK_POSIDCUR, wcstask.TASK_POSIDCUR, msg); } }); } else { string result = TryCachHelper.TryTranExecute((db) => { //标识agv任务Wcs完成状态 db.Updateable(it => new Middle_AGVTask() { Task_WcsStatus = item.Task_AgvStatus, Task_UpdateUser = "wcs", Task_UpdateDate = DateTime.Now }) .Where(it => it.Task_Id == item.Task_Id) .ExecuteCommand(); //标识wcs状态 if (wcstask != null && wcstask.TASK_COMTYPE == 1) { db.Updateable(it => new WCS_TASK() { TASK_WKSTATUS = 12, TASK_EDITUSERNO = "wcs", TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == wcstask.TASK_NO) .ExecuteCommand(); //添加任务明细 string msg = string.Format("入库任务[{0}]AGV完成", wcstask.TASK_NO); CommonData.AddWCS_TASK_DTL(db, wcstask.TASK_NO, wcstask.TASK_NO, wcstask.TASK_POSIDCUR, wcstask.TASK_POSIDCUR, msg); } }); } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } } }