using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using yunneiWCS.Common; using yunneiWCS.data; using yunneiWCS.EnumDefine; using yunneiWCS.EnumDefine.Device; using yunneiWCS.ORM; namespace yunneiWCS.ExtendFunction { /// /// 增补创建的扩展帮助类 【EditBy shaocx,2022-02-05】 /// public class MyExtendHelper { /// /// 验证AGV是否执行回原点的任务 /// /// /// public static bool ValidateAgvNoParting(string isP) { // return MyExtendHelper.ValidateAgvNoParting(isP);//原来的代码 return true;//先确认返回,试试效果 【Editby shaocx,2024-10-11】 } /// /// 过滤这些真正的空库位 /// /// /// /// public static List FilterEmptyPosition(dbmodel mod, List findPosition) { List new_outPosition = new List(); if (findPosition == null || findPosition.Count == 0) { return new_outPosition; } productStock _productStock = null; foreach (var item in findPosition) { _productStock = null; _productStock = mod.productStock.Where(x => x.positionId == item.positionId).FirstOrDefault(); if (_productStock != null) {//说明有库存 } else {//说明无库存 new_outPosition.Add(item); } } return new_outPosition; } /// /// 是否允许给堆垛机发送新任务 /// /// /// public static bool IsAllowSendNewTaskToSrm(int sleepTime = 2000) { Thread.Sleep(sleepTime);//等待一秒钟 【EditBy shaocx,2022-03-26】 if (Form1.srm.mode == "自动" && Form1.srm.Alarm_info == "无故障" && Form1.srm.state == "待机" && Form1.srm.srmTaskExcuteName == "复位") { return true; } return false; } /// /// 获取输送线站点 /// /// /// /// /// /// /// /// public static string GetConvPlace(convEntity conv1, convEntity conv2, convEntity conv3, convEntity conv4, task item, TaskAreaEnum queryTaskAreaEnum) { string convPlace = ""; if (!IsAllowSimulatorHandle(item)) { switch (queryTaskAreaEnum) { case TaskAreaEnum.缸体侧: if (conv1.taskId.ToString() == item.PlcTaskNo) { convPlace = "2-39-1"; } if (conv2.taskId.ToString() == item.PlcTaskNo) { convPlace = "1-39-1"; } break; case TaskAreaEnum.缸盖侧: if (conv3.taskId.ToString() == item.PlcTaskNo) { convPlace = "1-0-1"; } if (conv4.taskId.ToString() == item.PlcTaskNo) { convPlace = "2-0-1"; } break; } } else {//虚拟模式或强制完成 switch (queryTaskAreaEnum) { case TaskAreaEnum.缸体侧: convPlace = "2-39-1";//写死 break; case TaskAreaEnum.缸盖侧: convPlace = "1-0-1";//写死 break; } } return convPlace; } /// /// 判断任务是否允许模拟完成(虚拟模拟或者是强制完成模式) /// /// /// public static bool IsAllowSimulatorHandle(task _task) { if (Form1.isvirtual) { return true; } if (_task != null && _task.isForceComplete == 1) { return true; } return false; } /// /// 根据站点位置获取输送线的设备枚举 /// /// /// public static TransEnum GetTransByPlace(string placeName) { /* * 缸体下线、上线 、缸体余料回库 的立体入库口和出库口 1-39-1(对应输送线短的L2)、2-39-1(对应输送线长的L1) 缸盖下线、上线、缸盖余料回库的立库入库口和出库口 1-0-1(对应输送线短的L3)、2-0-1(对应输送线长的L4) */ switch (placeName) { case "2-39-1": return TransEnum.输送线L1; case "1-39-1": return TransEnum.输送线L2; case "2-0-1": return TransEnum.输送线L4; case "1-0-1": return TransEnum.输送线L3; } throw new Exception("根据站点位置" + placeName + "获取输送线的设备枚举失败"); } /// /// 通过站点ID获取库存 /// /// /// /// public static productStock GetProductStockById(dbmodel mod, long positionId) { productStock stock = mod.productStock.FirstOrDefault(x => x.positionId == positionId); return stock; } /// /// 处理入库单,获取任务类型 【EditBy shaocx,2022-02-06】 /// /// /// public static taskType GetTaskTypeForInStockOrder(inStockOrder inTask) { //增加 toStieCode的判断 【EditBy shaocx,2022-02-06】 taskType tasktype = 0; if (string.IsNullOrEmpty(inTask.toStieCode)) { //根据起点判断任务类型 if (SysGloble.TransStations.Contains(inTask.siteCode)) { tasktype = taskType.手动入库; } else { //tasktype = inTask.siteCode.Substring(0, 2) == "GT" ? 1 : 2; tasktype = inTask.siteCode.Substring(0, 2) == "GT" ? taskType.缸体下线 : taskType.缸盖下线; } } else {//表示不入立体库,直接去天永机器人那里 tasktype = inTask.siteCode.Substring(0, 2) == "GT" ? taskType.缸体下线直接去上线点 : taskType.缸盖下线直接去上线点; } return tasktype; } /// /// 处理入库单,获取任务区域 【EditBy shaocx,2022-02-06】 /// /// /// public static int GetTaskAreaForInStockOrder(inStockOrder inTask) { return inTask.orderType == 1 ? (int)TaskAreaEnum.缸体侧 : (int)TaskAreaEnum.缸盖侧; } /// /// 根据出库口的位置,获取任务区域 【EditBy shaocx,2022-02-06】 /// /// /// public static int GetTaskAreaByOutStorePostion(string postionName) { TaskAreaEnum _TaskAreaEnum = default(TaskAreaEnum); switch (postionName) { case "1-39-1": case "2-39-1": _TaskAreaEnum = TaskAreaEnum.缸体侧; break; case "1-0-1": case "2-0-1": _TaskAreaEnum = TaskAreaEnum.缸盖侧; break; } return (int)_TaskAreaEnum; } /// /// 站点是否被任务占用 /// /// /// /// public static FunctionReturnEntity IsStationHasDoingTask(dbmodel mod, string station) { //判断站点是否有任务被占用 var queryStatus1 = (int)taskStatus.完成; var queryStatus2 = (int)taskStatus.作废; int taskCount = mod.task.Where(x => (x.sourcePlace == station || x.toPlace == station) && x.taskStatus != queryStatus1 && x.taskStatus != queryStatus2).Count(); if (taskCount > 0) { return FunctionReturnEntity.Fail("站点" + station + "有任务被占用"); } return FunctionReturnEntity.Success("站点" + station + "没有任务被占用"); } /// /// 输送线站点是否被任务占用 /// /// /// /// public static FunctionReturnEntity IsStationHasDoingTaskForMiddlePlace(dbmodel mod, string _middlePlace) { //判断站点是否有任务被占用 var queryStatus1 = (int)taskStatus.完成; var queryStatus2 = (int)taskStatus.作废; int taskCount = mod.task.Where(x => (x.middlePlace == _middlePlace) && x.taskStatus != queryStatus1 && x.taskStatus != queryStatus2).Count(); if (taskCount > 0) { return FunctionReturnEntity.Fail("站点" + _middlePlace + "有任务被占用"); } return FunctionReturnEntity.Success("站点" + _middlePlace + "没有任务被占用"); } /// /// 站点是否可以被创建新任务 /// /// /// /// public static FunctionReturnEntity IsStationAllowCreateNewTask(dbmodel mod, string station) { var position = mod.position.Where(x => (x.positionName == station)).FirstOrDefault(); if (position == null) { return FunctionReturnEntity.Fail("站点" + station + "不存在"); } if (position.isLock == true) { return FunctionReturnEntity.Fail("站点" + station + "被锁定"); } if (position.enable == false) { return FunctionReturnEntity.Fail("站点" + station + "被禁用"); } return FunctionReturnEntity.Success("站点" + station + "可以被使用"); } /// /// 验证AGV是否空闲,可发送任务给他 /// /// /// /// /// public static bool ValidateAgvIsFree(task item, TaskAreaEnum _taskArea, List agvs, string[] agvSendStatus ) { if (MyExtendHelper.IsAllowSimulatorHandle(item)) return true; bool isReadAgv = false; switch (_taskArea) { case TaskAreaEnum.缸体侧: if (!MyExtendHelper.IsAllowSimulatorHandle(item)) { if (agvs.Count == 4) { #region 判断AGV是否空闲 string isP = agvs[2].orderId == null ? "" : agvs[2].orderId.Substring(agvs[2].orderId.Length - 1, 1); if (agvs[2].operatingMode == 2 && agvs[2].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP)) { isReadAgv = true; } isP = agvs[3].orderId == null ? "" : agvs[3].orderId.Substring(agvs[3].orderId.Length - 1, 1); if (agvs[3].operatingMode == 2 && agvs[3].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP)) { isReadAgv = true; } #endregion } } break; case TaskAreaEnum.缸盖侧: if (!MyExtendHelper.IsAllowSimulatorHandle(item)) { if (agvs.Count == 4) { #region 判断AGV是否空闲 string isP = agvs[0].orderId == null ? "" : agvs[0].orderId.Substring(agvs[0].orderId.Length - 1, 1); if (agvs[0].operatingMode == 2 && agvs[0].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP)) { isReadAgv = true; } isP = agvs[1].orderId == null ? "" : agvs[1].orderId.Substring(agvs[1].orderId.Length - 1, 1); if (agvs[1].operatingMode == 2 && agvs[1].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP)) { isReadAgv = true; } #endregion } } break; } return isReadAgv; } } }