private bool AsrsTasktypeToCheckin(AsrsControl.AsrsPortalModel port, ref SysCfg.EnumAsrsTaskType taskType, ref string logicArea, ref string reStr) { try { if (port.NodeID == "2003" || port.NodeID == "2005" || port.NodeID == "2007") { if (port.Db2Vals[1] == 1) { taskType = SysCfg.EnumAsrsTaskType.空筐入库; logicArea = "空筐区"; } else if (port.Db2Vals[1] == 2) { taskType = SysCfg.EnumAsrsTaskType.产品入库; logicArea = "NG材料区"; } else { return(false); } } else { taskType = port.BindedTaskInput; } return(true); } catch (Exception ex) { reStr = ex.ToString(); return(false); } }
public string ConvertoStr(SysCfg.EnumAsrsTaskType taskType) { StringBuilder strBuild = new StringBuilder(); strBuild.AppendFormat("{0};{1};", inputPort, outputPort); strBuild.AppendFormat("{0}-{1}-{2};", cellPos1.Row, cellPos1.Col, cellPos1.Layer); if (taskType == SysCfg.EnumAsrsTaskType.移库) { strBuild.AppendFormat("{0}-{1}-{2};", cellPos2.Row, cellPos2.Col, cellPos2.Layer); } else if (taskType == SysCfg.EnumAsrsTaskType.DCR测试) { strBuild.AppendFormat("{0}-{1}-{2};", cellPos2.Row, cellPos2.Col, cellPos2.Layer); } if (inputCellGoods != null && inputCellGoods.Count() > 0) { string goodsStr = ""; foreach (string str in inputCellGoods) { goodsStr = goodsStr + str + ","; } if (!string.IsNullOrEmpty(goodsStr)) { if (goodsStr[goodsStr.Count() - 1] == ',') { goodsStr = goodsStr.Remove(goodsStr.Count() - 1, 1); } strBuild.Append(goodsStr); } } return(strBuild.ToString()); }
public bool CreateManualOutputTask(string houseName, CellCoordModel cell, ref string reStr) { AsrsCtlModel asrsModel = null; foreach (AsrsCtlModel m in asrsCtls) { if (m.HouseName == houseName) { asrsModel = m; break; } } if (asrsModel == null) { reStr = "未识别的: " + houseName; return(false); } SysCfg.EnumAsrsTaskType taskType = SysCfg.EnumAsrsTaskType.产品出库; EnumCellStatus cellStoreStats = EnumCellStatus.空闲; EnumGSTaskStatus cellTaskStatus = EnumGSTaskStatus.完成; asrsResourceManage.GetCellStatus(houseName, cell, ref cellStoreStats, ref cellTaskStatus); EnumGSEnabledStatus cellEnabledStatus = EnumGSEnabledStatus.启用; if (!asrsResourceManage.GetCellEnabledStatus(houseName, cell, ref cellEnabledStatus)) { reStr = string.Format("获取货位启用状态失败{0}-{1}-{2}", cell.Row, cell.Col, cell.Layer); return(false); } if (cellEnabledStatus == EnumGSEnabledStatus.禁用) { reStr = string.Format("货位{0}-{1}-{2}禁用,无法生成出库任务", cell.Row, cell.Col, cell.Layer); return(false); } if (cellTaskStatus == EnumGSTaskStatus.锁定) { reStr = "货位处于锁定状态"; return(false); } if (cellStoreStats == EnumCellStatus.空料框) { taskType = SysCfg.EnumAsrsTaskType.空框出库; } asrsModel.GenerateOutputTask(cell, null, taskType, false); return(true); }
public override bool BuildCfg(System.Xml.Linq.XElement xe, ref string reStr) { if (!base.BuildCfg(xe, ref reStr)) { return(false); } XElement selfDataXE = xe.Element("SelfDatainfo"); this.portCata = int.Parse(selfDataXE.Element("PortType").Value.ToString()); if (selfDataXE.Attribute("portSeq") != null) { this.portSeq = int.Parse(selfDataXE.Attribute("portSeq").Value.ToString()); } if (selfDataXE.Attribute("capacity") != null) { this.PortinBufCapacity = int.Parse(selfDataXE.Attribute("capacity").Value.ToString()); } if (selfDataXE.Attribute("bindedTask") != null) { string[] strArray = selfDataXE.Attribute("bindedTask").Value.ToString().Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); if (strArray != null) { if (strArray.Count() > 0) { if (this.portCata == 1) { this.bindedTaskInput = (SysCfg.EnumAsrsTaskType)Enum.Parse(typeof(SysCfg.EnumAsrsTaskType), strArray[0]); } else if (this.portCata == 2) { this.bindedTaskOutput = (SysCfg.EnumAsrsTaskType)Enum.Parse(typeof(SysCfg.EnumAsrsTaskType), strArray[0]); } else if (this.portCata == 3) { this.bindedTaskInput = (SysCfg.EnumAsrsTaskType)Enum.Parse(typeof(SysCfg.EnumAsrsTaskType), strArray[0]); if (strArray.Count() > 1) { this.bindedTaskOutput = (SysCfg.EnumAsrsTaskType)Enum.Parse(typeof(SysCfg.EnumAsrsTaskType), strArray[1]); } } } } } return(true); }
private void AsrsCheckinRequire() { //foreach(AsrsControl.AsrsPortalModel port in targetPorts) for (int i = 0; i < targetPorts.Count(); i++) { AsrsControl.AsrsPortalModel port = targetPorts[i]; if (port.AsrsCtl.StackDevice.Db2Vals[0] > 0 || port.AsrsCtl.StackDevice.Db2Vals[1] > 2) { continue; } if (port.PalletBuffer.Count() < 1) { continue; } bool checkInRequire = false; if (port.PalletBuffer.Count() >= port.PortinBufCapacity) { checkInRequire = true; } else { if (db1ValsToSnd[0] == 3 && port.Db2Vals[0] == 2) { checkInRequire = true; } } for (int j = 0; j < Math.Min(port.PalletBuffer.Count(), port.PortinBufCapacity); j++) { if (port.Db2Vals[j] != 2) { checkInRequire = false; break; } } if (port.Db2Vals[2] == 2) //手动入库按钮请求 { checkInRequire = true; } if (!checkInRequire) { continue; } string palletID = port.PalletBuffer[0]; #region 查询本地应该进入哪个分区 /* * string nextProcessID = port.AsrsCtl.GetNextStepID(palletID); * int nextProcessSeq = SysCfg.SysCfgModel.stepSeqs.IndexOf(nextProcessID); * int curSeq = SysCfg.SysCfgModel.stepSeqs.IndexOf(port.AsrsCtl.MesProcessStepID[0]); * AsrsModel.EnumLogicArea logicArea = AsrsModel.EnumLogicArea.冷却区; * if (nextProcessSeq > curSeq) * { * logicArea = AsrsModel.EnumLogicArea.常温区; * }*/ #endregion #region 查询MES应该进入哪个库区 //在MES中查询入口处的第一个托盘当前工步,判断应该进入哪个库区 ANCStepResult stepRe = MesAcc.GetStep(palletID); if (stepRe.ResultCode != 0) { port.CurrentTaskDescribe = "查询MES托盘步次失败:" + stepRe.ResultMsg; continue; } AsrsModel.EnumLogicArea logicArea = AsrsModel.EnumLogicArea.冷却区; if (stepRe.Step < 12) { logicArea = AsrsModel.EnumLogicArea.冷却区; } else { logicArea = AsrsModel.EnumLogicArea.常温区; } #endregion string reStr = ""; SysCfg.EnumAsrsTaskType taskType = SysCfg.EnumAsrsTaskType.产品入库; if (port.AsrsCtl.AsrsCheckinTaskRequire(port, logicArea, taskType, port.PalletBuffer.ToArray(), ref reStr)) { //port.PalletBuffer.Clear(); if (!port.ClearBufPallets(ref reStr)) { logRecorder.AddDebugLog(port.NodeName, "清理入口缓存数据失败" + reStr); } } else { string logStr = string.Format("{0}申请失败,因为:{1}", taskType.ToString(), reStr); logRecorder.AddDebugLog(port.NodeName, logStr); } } }
private void AsrsCheckinRequire() { //foreach(AsrsControl.AsrsPortalModel port in targetPorts) for (int i = 0; i < targetPorts.Count(); i++) { AsrsControl.AsrsPortalModel port = targetPorts[i]; if (port.AsrsCtl.StackDevice.Db2Vals[0] > 0 || port.AsrsCtl.StackDevice.Db2Vals[1] > 2) { continue; } if (port.PalletBuffer.Count() < 1) { continue; } if (port.AsrsCtl.StackDevice.Db2Vals[1] > 2) { } bool checkInRequire = false; if (port.PalletBuffer.Count() >= port.PortinBufCapacity) { checkInRequire = true; } else { if (db1ValsToSnd[0] == 3 && port.Db2Vals[0] == 2) { checkInRequire = true; } } for (int j = 0; j < Math.Min(port.PalletBuffer.Count(), port.PortinBufCapacity); j++) { if (port.Db2Vals[j] != 2) { checkInRequire = false; break; } } if (port.Db2Vals[2] == 2) //手动入库按钮请求 { checkInRequire = true; } if (!checkInRequire) { continue; } string palletID = port.PalletBuffer[0]; string nextProcessID = port.AsrsCtl.GetNextStepID(palletID); int nextProcessSeq = SysCfg.SysCfgModel.stepSeqs.IndexOf(nextProcessID); int curSeq = SysCfg.SysCfgModel.stepSeqs.IndexOf(port.AsrsCtl.MesProcessStepID[0]); AsrsModel.EnumLogicArea logicArea = AsrsModel.EnumLogicArea.暂存区; if (nextProcessSeq > curSeq) { logicArea = AsrsModel.EnumLogicArea.常温区; } string reStr = ""; SysCfg.EnumAsrsTaskType taskType = SysCfg.EnumAsrsTaskType.产品入库; if (port.AsrsCtl.AsrsCheckinTaskRequire(port, logicArea, taskType, port.PalletBuffer.ToArray(), ref reStr)) { //port.PalletBuffer.Clear(); if (!port.ClearBufPallets(ref reStr)) { logRecorder.AddDebugLog(port.NodeName, "清理入口缓存数据失败" + reStr); } } else { string logStr = string.Format("{0}申请失败,因为:{1}", taskType.ToString(), reStr); logRecorder.AddDebugLog(port.NodeName, logStr); } } }
public override bool WCSMainTaskStart(MainControlTaskModel mainTask, WCSFlowPathModel wcsPath, ref string reStr) { try { if (!base.WCSMainTaskStart(mainTask, wcsPath, ref reStr)) { return(false); } WCSPathNodeModel wcsNode = wcsPath.GetNodeByID(nodeID); WCSPathNodeModel wcsNodeNext = wcsPath.GetNodeByID(wcsNode.NextNodeID); CtlDBAccess.Model.ControlTaskModel ctlTask = new CtlDBAccess.Model.ControlTaskModel(); ctlTask.TaskID = System.Guid.NewGuid().ToString(); ctlTask.DeviceID = nodeID; ctlTask.DeviceCata = devCata; ctlTask.StDevice = nodeID; ctlTask.StDeviceCata = devCata; ctlTask.StDeviceParam = mainTask.StDeviceParam; ctlTask.EndDevice = wcsNode.NextNodeID; ctlTask.EndDeviceCata = wcsNodeNext.DevCata; ctlTask.EndDeviceParam = mainTask.EndDeviceParam; ctlTask.MainTaskID = mainTask.MainTaskID; ctlTask.PalletCode = mainTask.PalletCode; UInt16 controlID = ctlTaskBll.GetUnusedControlID(); if (controlID < 1) { reStr = "没有可用的控制任务ID"; return(false); } ctlTask.ControlID = controlID; ctlTask.TaskIndex = 1; SysCfg.EnumAsrsTaskType asrsTaskType = SysCfg.EnumAsrsTaskType.空; if (mainTask.TaskType == "下架") { asrsTaskType = SysCfg.EnumAsrsTaskType.产品出库; } else if (mainTask.TaskType == "上架") { asrsTaskType = SysCfg.EnumAsrsTaskType.产品入库; } ctlTask.TaskType = (int)asrsTaskType; ctlTask.TaskParam = ""; ctlTask.TaskStatus = "待执行"; ctlTask.TaskPhase = 0; ctlTask.CreateTime = System.DateTime.Now; ctlTask.CreateMode = "自动"; bool re = ctlTaskBll.Add(ctlTask); //return re; if (re) { mainTask.TaskStatus = "已启动"; CtlDBAccess.BLL.MainControlTaskBll mainTaskBll = new CtlDBAccess.BLL.MainControlTaskBll(); return(mainTaskBll.Update(mainTask)); } else { return(false); } } catch (Exception ex) { reStr = ex.ToString(); return(false); } }
public bool CreateManualMoveGSTask(string startHouseName, CellCoordModel startCell, string endHouseName, CellCoordModel endCell, ref string reStr) { //throw new NotImplementedException(); string houseName = startHouseName; AsrsCtlModel asrsModel = null; foreach (AsrsCtlModel m in asrsCtls) { if (m.HouseName == houseName) { asrsModel = m; break; } } if (asrsModel == null) { reStr = "未识别的: " + houseName; return(false); } EnumGSEnabledStatus cellEnabledStatus = EnumGSEnabledStatus.启用; if (!asrsResourceManage.GetCellEnabledStatus(houseName, startCell, ref cellEnabledStatus)) { reStr = string.Format("获取货位启用状态失败{0}-{1}-{2}", startCell.Row, startCell.Col, startCell.Layer); return(false); } if (cellEnabledStatus == EnumGSEnabledStatus.禁用) { reStr = string.Format("货位{0}-{1}-{2}禁用,无法生成移库任务", startCell.Row, startCell.Col, startCell.Layer); return(false); } if (!asrsResourceManage.GetCellEnabledStatus(houseName, endCell, ref cellEnabledStatus)) { reStr = string.Format("获取货位启用状态失败{0}-{1}-{2}", endCell.Row, endCell.Col, endCell.Layer); return(false); } if (cellEnabledStatus == EnumGSEnabledStatus.禁用) { reStr = string.Format("货位{0}-{1}-{2}禁用,无法生成移库任务", endCell.Row, endCell.Col, endCell.Layer); return(false); } EnumCellStatus cellStoreStats = EnumCellStatus.空闲; EnumGSTaskStatus cellTaskStatus = EnumGSTaskStatus.完成; asrsResourceManage.GetCellStatus(houseName, startCell, ref cellStoreStats, ref cellTaskStatus); if (cellTaskStatus == EnumGSTaskStatus.锁定) { reStr = string.Format("货位{0}-{1}-{2}处于锁定状态,无法生成移库任务", startCell.Row, startCell.Col, startCell.Layer);; return(false); } asrsResourceManage.GetCellStatus(houseName, endCell, ref cellStoreStats, ref cellTaskStatus); if (cellTaskStatus == EnumGSTaskStatus.锁定) { reStr = string.Format("目标货位{0}-{1}-{2}处于锁定状态,无法生成移库任务", endCell.Row, endCell.Col, endCell.Layer);; return(false); } if (cellStoreStats != EnumCellStatus.空闲) { reStr = string.Format("目标货位{0}-{1}-{2}不为空,无法生成移库任务", endCell.Row, endCell.Col, endCell.Layer);; return(false); } SysCfg.EnumAsrsTaskType taskType = SysCfg.EnumAsrsTaskType.移库; return(asrsModel.GenerateOutputTask(startCell, endCell, taskType, false, null, 1000)); //return true; }
private CtlDBAccess.Model.ControlTaskModel GetCheckoutOfArea(AsrsControl.AsrsCtlModel asrsCtl, IAsrsManageToCtl asrsResManage, SysCfg.EnumAsrsTaskType taskType, IList <CtlDBAccess.Model.ControlTaskModel> taskList, AsrsModel.EnumLogicArea checkOutArea) { string houseName = asrsCtl.HouseName; ControlTaskModel task = null; if (taskList == null) { return(null); } foreach (ControlTaskModel t in taskList) { string reStr = ""; AsrsTaskParamModel paramModel = new AsrsTaskParamModel(); if (!paramModel.ParseParam(taskType, t.TaskParam, ref reStr)) { continue; } AsrsModel.EnumGSEnabledStatus cellEnabledStatus = AsrsModel.EnumGSEnabledStatus.启用; if (!asrsResManage.GetCellEnabledStatus(houseName, paramModel.CellPos1, ref cellEnabledStatus)) { // reStr = "获取货位启用状态失败"; continue; } if (cellEnabledStatus == AsrsModel.EnumGSEnabledStatus.禁用) { continue; } AsrsModel.EnumLogicArea curLogicArea = AsrsModel.EnumLogicArea.一次高温A区; if (!asrsResManage.GetLogicAreaName(houseName, paramModel.CellPos1, ref curLogicArea)) { continue; } if (curLogicArea == checkOutArea) { task = t; break; } } return(task); }
public bool AsrsInputEnabled(ref SysCfg.EnumAsrsTaskType asrsTaskType) { lock (portBufLock) { if (this.portCata == 2) { return(false); } if (this.db1ValsToSnd[0] == 2) { return(false); } if (asrsTaskType == SysCfg.EnumAsrsTaskType.产品入库) { if (this.PortinBufCapacity > 1) { //并且入口有料,并且手动强制入库 if (this.db2Vals[this.PortinBufCapacity] == 2) { if ((this.palletBuffer.Count() > 0) && (this.db2Vals[0] == 2 || this.db2Vals[1] == 2)) { return(true); } else { return(false); } } else if (this.palletBuffer.Count() >= this.PortinBufCapacity) //缓存满 { /* 屏蔽条码校验 * if (PalletBuffer.Count() >= PortinBufCapacity && dlgtBarcodeCheck != null)//条码校验 * { * string reStr = ""; * if (!dlgtBarcodeCheck(this, ref reStr)) * { * CurrentTaskDescribe = reStr; * return false; * } * }*/ for (int j = 0; j < Math.Min(PalletBuffer.Count(), PortinBufCapacity); j++) { if (this.Db2Vals[j] != 2) { return(false); } } return(true); } else { return(false); } } else { if (this.palletBuffer.Count() > 0 && this.db2Vals[0] == 2) { return(true); } else { return(false); } } } else { if (this.PortinBufCapacity > 1) { if ((this.db2Vals[this.PortinBufCapacity] == 2)) { return(true); } else { for (int j = 0; j < PortinBufCapacity; j++) { if (this.Db2Vals[j] != 2) { return(false); } } return(true); } } else { if (this.db2Vals[0] == 2) { return(true); } else { return(false); } } } } }
/// <summary> /// 控制出库任务的生成,包括产品出库,空筐出库 /// </summary> /// <param name="asrsCtl"></param> /// <param name="reStr"></param> /// <returns></returns> private bool AsrsCheckoutLoop(AsrsControl.AsrsCtlModel asrsCtl, SysCfg.EnumAsrsTaskType taskType, ref string reStr) { try { CtlDBAccess.BLL.ControlTaskBll ctlTaskBll = new CtlDBAccess.BLL.ControlTaskBll(); // SysCfg.EnumAsrsTaskType taskType = SysCfg.EnumAsrsTaskType.产品出库; // 1产品出库 List <AsrsPortalModel> ports = asrsCtl.GetOutPortsOfBindedtask(taskType); string houseName = asrsCtl.HouseName; AsrsModel.EnumCellStatus targetStoreStatus = EnumCellStatus.满位; if (taskType == SysCfg.EnumAsrsTaskType.空筐出库) { targetStoreStatus = EnumCellStatus.空料框; } foreach (AsrsPortalModel port in ports) { if (taskType == SysCfg.EnumAsrsTaskType.空筐出库) { if (port.Db2Vals[0] != 2 || port.Db2Vals[2] != 1) //禁止出库 { continue; } } else //禁止出库 { if (port.Db2Vals[0] != 2 || port.Db2Vals[1] != 1) { continue; } } //查询是否有待执行或者执行中的任务 string str = string.Format("DeviceID='{0}' and EndDevice='{1}' and TaskType={2} and (TaskStatus='待执行' or TaskStatus='执行中')", asrsCtl.StackDevice.NodeID, port.NodeID, (int)taskType); List <CtlDBAccess.Model.ControlTaskModel> taskList = ctlTaskBll.GetModelList(str); if (taskList != null && taskList.Count() > 0) { continue; } //遍历所有库位,判断材料类别,按照先入先出规则,匹配出库的货位。 Dictionary <string, AsrsModel.GSMemTempModel> asrsStatDic = new Dictionary <string, AsrsModel.GSMemTempModel>(); if (!asrsResManage.GetAllGsModel(ref asrsStatDic, ref reStr)) { Console.WriteLine(string.Format("{0} 获取货位状态失败", houseName)); return(false); } List <AsrsModel.GSMemTempModel> validCells = new List <AsrsModel.GSMemTempModel>(); int r = 1, c = 1, L = 1; //先查询所有可出库货位 for (r = 1; r < asrsCtl.AsrsRow + 1; r++) { for (c = 1; c < asrsCtl.AsrsCol + 1; c++) { for (L = 1; L < asrsCtl.AsrsLayer + 1; L++) { string strKey = string.Format("{0}:{1}-{2}-{3}", houseName, r, c, L); AsrsModel.GSMemTempModel cellStat = null; if (!asrsStatDic.Keys.Contains(strKey)) { continue; } cellStat = asrsStatDic[strKey]; if ((!cellStat.GSEnabled) || (cellStat.GSTaskStatus == AsrsModel.EnumGSTaskStatus.锁定.ToString()) || (cellStat.GSStatus != targetStoreStatus.ToString())) { // reStr = string.Format("货位{0}-{1}-{2}禁用,无法生成出库任务", cell.Row, cell.Col, cell.Layer); continue; } AsrsModel.CellCoordModel cell = new AsrsModel.CellCoordModel(r, c, L); validCells.Add(cellStat); } } } //再按照先入先出原则生成出库任务 if (validCells.Count() > 0) { //排序,按照先入先出 AsrsModel.GSMemTempModel firstGS = validCells[0]; if (validCells.Count() > 1) { for (int i = 1; i < validCells.Count(); i++) { AsrsModel.GSMemTempModel tempGS = validCells[i]; if (tempGS.InHouseDate < firstGS.InHouseDate) { firstGS = tempGS; } } } //生成出库任务 string[] strCellArray = firstGS.GSPos.Split(new string[] { "-" }, StringSplitOptions.RemoveEmptyEntries); int row = int.Parse(strCellArray[0]); int col = int.Parse(strCellArray[1]); int layer = int.Parse(strCellArray[2]); AsrsModel.CellCoordModel cell = new AsrsModel.CellCoordModel(row, col, layer); List <string> storGoods = new List <string>(); if (!asrsResManage.GetStockDetail(houseName, cell, ref storGoods)) { return(false); } string palletIDStr = ""; for (int i = 0; i < storGoods.Count(); i++) { if (storGoods.Count() > 1 && (i == storGoods.Count() - 1)) { palletIDStr = palletIDStr + storGoods[i]; } else { palletIDStr = palletIDStr + storGoods[i] + ","; } } return(asrsCtl.CreateStackerTask(port, taskType, cell, palletIDStr, ref reStr)); //if (asrsCtl.GenerateOutputTask(cell, port.BindedTaskOutput, true, port.PortSeq, ref reStr, new List<short> { palletCata })) //{ // port.Db1ValsToSnd[0] = 2; //} //else //{ // Console.WriteLine("生成任务{0}失败,{1}", port.BindedTaskOutput.ToString(), reStr); //} } } return(true); } catch (Exception ex) { reStr = ex.ToString(); return(false); } }
public bool ParseParam(SysCfg.EnumAsrsTaskType taskType, string strParam, ref string reStr) { try { //任务参数格式 "" this.strTaskParam = strParam; string[] taskParamArray = this.strTaskParam.Split(new string[] { ";" }, StringSplitOptions.None); if (taskParamArray == null || taskParamArray.Count() < 3) { reStr = "出入库参数解析错误"; return(false); } inputPort = int.Parse(taskParamArray[0]); outputPort = int.Parse(taskParamArray[1]); string[] cellPos = taskParamArray[2].Split(new string[] { "-" }, StringSplitOptions.RemoveEmptyEntries); if (cellPos == null || cellPos.Count() < 3) { reStr = "出入库参数解析错误"; return(false); } short row = short.Parse(cellPos[0]); short col = short.Parse(cellPos[1]); short layer = short.Parse(cellPos[2]); this.cellPos1 = new CellCoordModel(row, col, layer); switch (taskType) { case SysCfg.EnumAsrsTaskType.产品入库: { //产品入库 // this.inputPort = 1; if (taskParamArray.Count() > 3) { string strGoods = taskParamArray[3]; this.inputCellGoods = strGoods.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); } break; } case SysCfg.EnumAsrsTaskType.空筐入库: { //空筐入库 if (taskParamArray.Count() > 3) { string strGoods = taskParamArray[3]; this.inputCellGoods = strGoods.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); } break; } case SysCfg.EnumAsrsTaskType.产品出库: { //产品出库 if (taskParamArray.Count() > 3) { string strGoods = taskParamArray[3]; this.inputCellGoods = strGoods.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); } if (taskParamArray.Count() > 4) { string[] strReserveParams = taskParamArray[4].Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); foreach (string strP in strReserveParams) { Int16 reserveParam = Int16.Parse(strP); reserveParams.Add(reserveParam); } } break; } case SysCfg.EnumAsrsTaskType.空筐出库: { //空筐出库 if (taskParamArray.Count() > 3) { string strGoods = taskParamArray[3]; this.inputCellGoods = strGoods.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); } break; } case SysCfg.EnumAsrsTaskType.移库: { string[] cellTargetPos = taskParamArray[3].Split(new string[] { "-" }, StringSplitOptions.RemoveEmptyEntries); if (cellTargetPos == null || cellTargetPos.Count() < 3) { reStr = "移库参数解析错误"; return(false); } row = short.Parse(cellTargetPos[0]); col = short.Parse(cellTargetPos[1]); layer = short.Parse(cellTargetPos[2]); this.cellPos2 = new CellCoordModel(row, col, layer); if (taskParamArray.Count() > 4) { string strGoods = taskParamArray[4]; this.inputCellGoods = strGoods.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); } break; } default: { reStr = "入库参数错误,不可识别的任务类型:" + taskType.ToString(); return(false); } } return(true); } catch (Exception ex) { reStr = ex.ToString(); return(false); } }
public bool ParseParam(CtlDBAccess.Model.ControlTaskModel ctlTask, ref string reStr) { try { SysCfg.EnumAsrsTaskType taskType = (SysCfg.EnumAsrsTaskType)ctlTask.TaskType; if (ctlTask.DeviceCata != "堆垛机") { reStr = "设备类型不支持,要求为 '堆垛机'类型,实际:" + ctlTask.DeviceCata; return(false); } if (taskType == SysCfg.EnumAsrsTaskType.产品入库 || taskType == SysCfg.EnumAsrsTaskType.空筐入库) { inputPort = int.Parse(ctlTask.StDevice); string[] cellPos = ctlTask.EndDeviceParam.Split(new string[] { "-" }, StringSplitOptions.RemoveEmptyEntries); if (cellPos == null || cellPos.Count() < 3) { reStr = "出入库参数解析错误"; return(false); } short row = short.Parse(cellPos[0]); short col = short.Parse(cellPos[1]); short layer = short.Parse(cellPos[2]); this.cellPos1 = new CellCoordModel(row, col, layer); } else if (taskType == SysCfg.EnumAsrsTaskType.产品出库 || taskType == SysCfg.EnumAsrsTaskType.空筐出库) { outputPort = int.Parse(ctlTask.EndDevice); string[] cellPos = ctlTask.StDeviceParam.Split(new string[] { "-" }, StringSplitOptions.RemoveEmptyEntries); if (cellPos == null || cellPos.Count() < 3) { reStr = "出入库参数解析错误,货位参数不足3个"; return(false); } short row = short.Parse(cellPos[0]); short col = short.Parse(cellPos[1]); short layer = short.Parse(cellPos[2]); this.cellPos1 = new CellCoordModel(row, col, layer); } else if (taskType == SysCfg.EnumAsrsTaskType.移库) { string[] cellPos = ctlTask.StDeviceParam.Split(new string[] { "-" }, StringSplitOptions.RemoveEmptyEntries); if (cellPos == null || cellPos.Count() < 3) { reStr = "出入库参数解析错误,货位参数不足3个"; return(false); } short row = short.Parse(cellPos[0]); short col = short.Parse(cellPos[1]); short layer = short.Parse(cellPos[2]); this.cellPos1 = new CellCoordModel(row, col, layer); cellPos = ctlTask.EndDeviceParam.Split(new string[] { "-" }, StringSplitOptions.RemoveEmptyEntries); if (cellPos == null || cellPos.Count() < 3) { reStr = "出入库参数解析错误,货位参数不足3个"; return(false); } row = short.Parse(cellPos[0]); col = short.Parse(cellPos[1]); layer = short.Parse(cellPos[2]); this.cellPos2 = new CellCoordModel(row, col, layer); } else { reStr = "任务参数解析失败,不识别的任务类型:" + taskType.ToString(); return(false); } this.inputCellGoods = ctlTask.PalletCode.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); return(true); } catch (Exception ex) { reStr = ex.ToString(); return(false); } }
//A1库出库任务委托 public CtlDBAccess.Model.ControlTaskModel GetCheckoutOfA1(AsrsControl.AsrsCtlModel asrsCtl, IAsrsManageToCtl asrsResManage, IList <CtlDBAccess.Model.ControlTaskModel> taskList, SysCfg.EnumAsrsTaskType taskType) { if (asrsCtl.HouseName != AsrsModel.EnumStoreHouse.A1库房.ToString()) { return(null); } if (taskList == null) { return(null); } NodeVirStation nodeStation = GetNodeByID("4001") as NodeVirStation; //AsrsModel.EnumLogicArea requireCheckoutArea = AsrsModel.EnumLogicArea.一次高温A区; List <AsrsModel.EnumLogicArea> areaList = new List <AsrsModel.EnumLogicArea>(); if (nodeStation.Db2Vals[2] == 1) { //requireCheckoutArea = AsrsModel.EnumLogicArea.一次高温A区; areaList.Add(AsrsModel.EnumLogicArea.一次高温A区); areaList.Add(AsrsModel.EnumLogicArea.一次高温B区); } else if (nodeStation.Db2Vals[2] == 2) { areaList.Add(AsrsModel.EnumLogicArea.一次高温B区); areaList.Add(AsrsModel.EnumLogicArea.一次高温A区); } else { return(null); } string houseName = asrsCtl.HouseName; ControlTaskModel task = null; foreach (AsrsModel.EnumLogicArea requireCheckoutArea in areaList) { task = GetCheckoutOfArea(asrsCtl, asrsResManage, taskType, taskList, requireCheckoutArea); if (task != null) { break; } } return(task); }
public override bool BuildCfg(System.Xml.Linq.XElement xe, ref string reStr) { if (!base.BuildCfg(xe, ref reStr)) { return(false); } XElement selfDataXE = xe.Element("SelfDatainfo"); this.portCata = int.Parse(selfDataXE.Element("PortType").Value.ToString()); if (selfDataXE.Attribute("portSeq") != null) { this.portSeq = int.Parse(selfDataXE.Attribute("portSeq").Value.ToString()); } if (selfDataXE.Attribute("capacity") != null) { this.PortinBufCapacity = int.Parse(selfDataXE.Attribute("capacity").Value.ToString()); } if (selfDataXE.Attribute("emptyPalletCheckIn") != null) { if (selfDataXE.Attribute("emptyPalletCheckIn").Value.ToString().ToUpper() == "TRUE") { this.EmptyPalletInputEnabled = true; } } if (selfDataXE.Attribute("bindedTask") != null) { string[] strArray = selfDataXE.Attribute("bindedTask").Value.ToString().Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); if (strArray != null) { if (strArray.Count() > 0) { foreach (string strTask in strArray) { bindedTaskList.Add((SysCfg.EnumAsrsTaskType)Enum.Parse(typeof(SysCfg.EnumAsrsTaskType), strTask)); } if (this.portCata == 1) { this.bindedTaskInput = (SysCfg.EnumAsrsTaskType)Enum.Parse(typeof(SysCfg.EnumAsrsTaskType), strArray[0]); } else if (this.portCata == 2) { this.bindedTaskOutput = (SysCfg.EnumAsrsTaskType)Enum.Parse(typeof(SysCfg.EnumAsrsTaskType), strArray[0]); } else if (this.portCata == 3) { this.bindedTaskInput = (SysCfg.EnumAsrsTaskType)Enum.Parse(typeof(SysCfg.EnumAsrsTaskType), strArray[0]); if (strArray.Count() > 1) { this.bindedTaskOutput = (SysCfg.EnumAsrsTaskType)Enum.Parse(typeof(SysCfg.EnumAsrsTaskType), strArray[1]); } } } } } if (selfDataXE.Attribute("barcodeScanRequire") != null) { if (selfDataXE.Attribute("barcodeScanRequire").Value.ToString().ToUpper() == "TRUE") { BarcodeScanRequire = true; } } return(true); }
public bool AsrsInputEnabled(ref SysCfg.EnumAsrsTaskType asrsTaskType) { lock (portBufLock) { if (this.portCata == 2) { return(false); } if (this.db1ValsToSnd[0] == 2) { return(false); } if (asrsTaskType == SysCfg.EnumAsrsTaskType.产品入库) { if (this.PortinBufCapacity > 1) { //缓存满,并且入口有料,并且手动强制入库 if (this.db2Vals[this.PortinBufCapacity] == 2) { if ((this.palletBuffer.Count() > 0) && (this.db2Vals[0] == 2 || this.db2Vals[1] == 2)) { return(true); } else { return(false); } } else if (this.palletBuffer.Count() >= this.PortinBufCapacity) { for (int j = 0; j < Math.Min(PalletBuffer.Count(), PortinBufCapacity); j++) { if (this.Db2Vals[j] != 2) { return(false); } } return(true); } else { return(false); } } else { if (this.palletBuffer.Count() > 0 && this.db2Vals[0] == 2) { return(true); } else { return(false); } } } else { if (this.PortinBufCapacity > 1) { if ((this.db2Vals[this.PortinBufCapacity] == 2)) { return(true); } else { for (int j = 0; j < PortinBufCapacity; j++) { if (this.Db2Vals[j] != 2) { return(false); } } return(true); } } else { if (this.db2Vals[0] == 2) { return(true); } else { return(false); } } } } }
public bool CreateManualOutputTask(string houseName, CellCoordModel cell, ref string reStr) { AsrsCtlModel asrsModel = null; foreach (AsrsCtlModel m in asrsCtls) { if (m.HouseName == houseName) { asrsModel = m; break; } } if (asrsModel == null) { reStr = "未识别的: " + houseName; return(false); } SysCfg.EnumAsrsTaskType taskType = SysCfg.EnumAsrsTaskType.产品出库; EnumCellStatus cellStoreStats = EnumCellStatus.空闲; EnumGSTaskStatus cellTaskStatus = EnumGSTaskStatus.完成; asrsResourceManage.GetCellStatus(houseName, cell, ref cellStoreStats, ref cellTaskStatus); EnumGSEnabledStatus cellEnabledStatus = EnumGSEnabledStatus.启用; if (!asrsResourceManage.GetCellEnabledStatus(houseName, cell, ref cellEnabledStatus)) { reStr = string.Format("获取货位启用状态失败{0}-{1}-{2}", cell.Row, cell.Col, cell.Layer); return(false); } if (cellEnabledStatus == EnumGSEnabledStatus.禁用) { reStr = string.Format("货位{0}-{1}-{2}禁用,无法生成出库任务", cell.Row, cell.Col, cell.Layer); return(false); } if (cellTaskStatus == EnumGSTaskStatus.锁定) { reStr = "货位处于锁定状态"; return(false); } if (cellStoreStats == EnumCellStatus.空料框) { taskType = SysCfg.EnumAsrsTaskType.空筐出库; } List <short> asrsExtParams = new List <short>(); List <string> cellGoods = new List <string>(); if (!this.asrsResourceManage.GetStockDetail(houseName, cell, ref cellGoods)) { return(false); } if (dlgtAsrsExtParmas != null) { if (!dlgtAsrsExtParmas(cellGoods, ref asrsExtParams, ref reStr)) { return(false); } } // asrsModel.GenerateOutputTask(cell, null,taskType, false,asrsExtParams,1000); return(asrsModel.GenerateCheckoutTask(cell, taskType, false, ref reStr, 1000)); }
public bool ParseParam(SysCfg.EnumAsrsTaskType taskType, string strParam, string houseName, ref string reStr) { try { //任务参数格式 "" this.strTaskParam = strParam; string[] taskParamArray = this.strTaskParam.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries); if (taskParamArray == null || taskParamArray.Count() < 3) { reStr = "出入库参数解析错误"; return(false); } inputPort = int.Parse(taskParamArray[0]); outputPort = int.Parse(taskParamArray[1]); string[] cellPos = taskParamArray[2].Split(new string[] { "-" }, StringSplitOptions.RemoveEmptyEntries); if (cellPos == null || cellPos.Count() < 3) { reStr = "出入库参数解析错误"; return(false); } short row = short.Parse(cellPos[0]); short col = short.Parse(cellPos[1]); short layer = short.Parse(cellPos[2]); this.cellPos1 = new CellCoordModel(row, col, layer); switch (taskType) { case SysCfg.EnumAsrsTaskType.产品入库: { //产品入库 // this.inputPort = 1; if (taskParamArray.Count() > 3) { string strGoods = taskParamArray[3]; this.inputCellGoods = strGoods.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); } if (houseName == EnumStoreHouse.A1库房.ToString()) { mesStep = "PS-2"; } else { mesStep = "PS-8"; } break; } //case SysCfg.EnumAsrsTaskType.空框入库: // { // //空框入库 // break; // } case SysCfg.EnumAsrsTaskType.DCR出库: { //产品出库 if (taskParamArray.Count() > 3) { string strGoods = taskParamArray[3]; this.inputCellGoods = strGoods.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); } if (houseName == EnumStoreHouse.A1库房.ToString()) { mesStep = "PS-4"; } else { mesStep = "PS-10"; } break; } //case SysCfg.EnumAsrsTaskType.空框出库: // { // //空框出库 // break; // } case SysCfg.EnumAsrsTaskType.移库: { string[] cellTargetPos = taskParamArray[3].Split(new string[] { "-" }, StringSplitOptions.RemoveEmptyEntries); if (cellTargetPos == null || cellTargetPos.Count() < 3) { reStr = "移库参数解析错误"; return(false); } row = short.Parse(cellTargetPos[0]); col = short.Parse(cellTargetPos[1]); layer = short.Parse(cellTargetPos[2]); this.cellPos2 = new CellCoordModel(row, col, layer); if (taskParamArray.Count() > 4) { string strGoods = taskParamArray[4]; this.inputCellGoods = strGoods.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); } if (houseName == EnumStoreHouse.A1库房.ToString()) { mesStep = "PS-2"; } else { mesStep = "PS-8"; } break; } case SysCfg.EnumAsrsTaskType.DCR测试: { string[] cellTargetPos = taskParamArray[3].Split(new string[] { "-" }, StringSplitOptions.RemoveEmptyEntries); if (cellTargetPos == null || cellTargetPos.Count() < 3) { reStr = "DCR出库参数解析错误"; return(false); } row = short.Parse(cellTargetPos[0]); col = short.Parse(cellTargetPos[1]); layer = short.Parse(cellTargetPos[2]); this.cellPos2 = new CellCoordModel(row, col, layer); if (taskParamArray.Count() > 4) { string strGoods = taskParamArray[4]; this.inputCellGoods = strGoods.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); } if (houseName == EnumStoreHouse.A1库房.ToString()) { mesStep = "PS-5"; } else { mesStep = "PS-11"; } break; } case SysCfg.EnumAsrsTaskType.紧急出库: { string[] cellTargetPos = taskParamArray[2].Split(new string[] { "-" }, StringSplitOptions.RemoveEmptyEntries); if (cellTargetPos == null || cellTargetPos.Count() < 3) { reStr = "DCR出库参数解析错误"; return(false); } row = short.Parse(cellTargetPos[0]); col = short.Parse(cellTargetPos[1]); layer = short.Parse(cellTargetPos[2]); this.cellPos2 = new CellCoordModel(row, col, layer); if (taskParamArray.Count() > 3) { string strGoods = taskParamArray[3]; this.inputCellGoods = strGoods.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); } if (houseName == EnumStoreHouse.A1库房.ToString()) { mesStep = "PS-14"; } else { mesStep = "PS-15"; } break; } default: { reStr = "入库参数错误,不可识别的任务类型:" + taskType.ToString(); return(false); } } return(true); } catch (Exception ex) { reStr = ex.ToString(); return(false); } }
/// <summary> /// 判断物流线是否堵塞,选择出库任务 /// </summary> /// <param name="asrsCtl"></param> /// <param name="asrsResManage"></param> /// <param name="taskList"></param> /// <param name="taskType"></param> /// <returns></returns> public CtlDBAccess.Model.ControlTaskModel AsrsCheckoutTaskTorun(AsrsControl.AsrsCtlModel asrsCtl, IAsrsManageToCtl asrsResManage, IList <CtlDBAccess.Model.ControlTaskModel> taskList, SysCfg.EnumAsrsTaskType taskType) { try { if (taskList == null) { return(null); } string houseName = asrsCtl.HouseName; CtlDBAccess.Model.ControlTaskModel task = null; foreach (CtlDBAccess.Model.ControlTaskModel t in taskList) { if (t.TaskStatus != "待执行") { continue; } string reStr = ""; AsrsTaskParamModel paramModel = new AsrsTaskParamModel(); if (!paramModel.ParseParam(taskType, t.TaskParam, ref reStr)) { continue; } AsrsPortalModel port = asrsCtl.Ports[paramModel.OutputPort - 1]; int switchPathSeq = 1; CellCoordModel cell = paramModel.CellPos1; if (asrsCtl.NodeName == "A1库房" || asrsCtl.HouseName == "A2库房") { string area = "注液高温区"; if (!this.asrsResManage.GetLogicAreaName(houseName, cell, ref area)) { continue; } if (area == "注液高温区") { switchPathSeq = 1; } else if (area == "化成高温区") { switchPathSeq = 2; } else { continue; } if (port.Db2Vals[switchPathSeq] != 1) { continue; } } else if (asrsCtl.HouseName == "C1库房" || asrsCtl.HouseName == "C2库房" || asrsCtl.HouseName == "C3库房") { if (taskType == SysCfg.EnumAsrsTaskType.空筐出库) { if (port.Db2Vals[switchPathSeq] != 1) { continue; } } } AsrsModel.EnumGSEnabledStatus cellEnabledStatus = AsrsModel.EnumGSEnabledStatus.启用; if (!asrsResManage.GetCellEnabledStatus(houseName, paramModel.CellPos1, ref cellEnabledStatus)) { // reStr = "获取货位启用状态失败"; continue; } if (cellEnabledStatus == AsrsModel.EnumGSEnabledStatus.禁用) { continue; } task = t; break; } return(task); } catch (Exception ex) { Console.WriteLine(ex.ToString()); return(null); } }