public override bool IsPathOpened(string palletID, ref string reStr) { try { if (!base.IsPathOpened(palletID, ref reStr)) { return(false); } lock (portBufLock) { int palletStep = 0; if (!MesAcc.GetStep(palletID, out palletStep, ref reStr)) { return(false); } if (palletStep == 0) { //判断第一个料框是否空筐 if (!EmptyPalletInputEnabled) { reStr = "系统已配置禁止空筐入库"; return(false); } } //先判断入口实际信号 bool portCrowd = true; for (int i = 0; i < PortinBufCapacity; i++) { if (db2Vals[i] == 1) { portCrowd = false; break; } } if (portCrowd) //入口拥堵 { return(false); } //再判断数据 if (this.palletBuffer.Count() >= PortinBufCapacity) { reStr = "缓存已满"; return(false); } if (dlgtGroupEnabled != null) { return(dlgtGroupEnabled(this, palletID, ref reStr)); } else { if (PortinBufCapacity > 1) //只有入口最大允许缓存数量大于1时才考虑库区,批次 { if (this.palletBuffer.Count() > 0) { //1 判断是否同一个库区 string lastPalletID = this.palletBuffer[0]; int lastStep = 0; if (!MesAcc.GetStep(lastPalletID, out lastStep, ref reStr)) { return(false); } int step = 0; if (!MesAcc.GetStep(palletID, out step, ref reStr)) { return(false); } string areaLast = asrsCtlModel.GetAreaToCheckin(lastPalletID, lastStep).ToString(); // AsrsModel.EnumLogicArea.注液高温区.ToString(); // areaLast=SysCfg.SysCfgModel.asrsStepCfg.AsrsAreaSwitch(lastStep); string areaCur = asrsCtlModel.GetAreaToCheckin(palletID, step).ToString(); //AsrsModel.EnumLogicArea.注液高温区.ToString(); ; // areaCur=SysCfg.SysCfgModel.asrsStepCfg.AsrsAreaSwitch(step); if (areaLast != areaCur) { reStr = string.Format("托盘{0}待进入的立库分区{1},跟当前缓存托盘待进入的分区{2}不同", palletID, areaCur, areaLast); return(false); } //2 是否同批 string batchLast = ""; string batch = ""; if (!MesAcc.GetTrayCellLotNO(palletID, out batch, ref reStr)) { return(false); } if (!MesAcc.GetTrayCellLotNO(lastPalletID, out batchLast, ref reStr)) { return(false); } if (batchLast == batch) { return(true); } else { reStr = string.Format("托盘{0} 批次{1},与入口缓存的托盘{2} 批次{3}不同", palletID, batch, lastPalletID, batchLast); return(false); } } } } return(true); } } catch (Exception ex) { reStr = ex.ToString(); return(false); } }
private int GetSwitchDecision(string palletID, ref string reStr) { int re = 0; #region 查询本地应该进入哪个分区 /* * string nextMesStepID = targetPorts[0].AsrsCtl.GetNextStepID(this.rfidUID); * string currentMesStepID = GetCurrentStepID(this.rfidUID); * int curSeq = SysCfg.SysCfgModel.stepSeqs.IndexOf(currentMesStepID); * int nextSeq = SysCfg.SysCfgModel.stepSeqs.IndexOf(nextMesStepID); * string storeAreaZone = AsrsModel.EnumLogicArea.常温区.ToString(); * int seq1 = SysCfg.SysCfgModel.stepSeqs.IndexOf("PS-60"); * //int seq2 = SysCfg.SysCfgModel.stepSeqs.IndexOf("PS-100"); * if (nextSeq <= seq1) * { * storeAreaZone = AsrsModel.EnumLogicArea.冷却区.ToString(); * } * else * { * * storeAreaZone = AsrsModel.EnumLogicArea.常温区.ToString(); * }*/ #endregion #region 查询MES 下一步应该进哪个库区 string storeAreaZone = AsrsModel.EnumLogicArea.常温区.ToString(); ANCStepResult stepRe = MesAcc.GetStep(palletID); if (stepRe.ResultCode != 0) { reStr = string.Format("查询MES托盘{0}步次失败:{1}", palletID, stepRe.ResultMsg); return(-1); } if (stepRe.Step < 12) { storeAreaZone = AsrsModel.EnumLogicArea.冷却区.ToString(); } else { storeAreaZone = AsrsModel.EnumLogicArea.常温区.ToString(); } #endregion if (targetPorts[0].PalletBuffer.Count() == 0 && targetPorts[1].PalletBuffer.Count() == 0) { //查询C1,C2库剩余货位数量 int cellEmptCounts1 = 0, cellEmptCounts2 = 0; this.asrsResManage.GetHouseAreaLeftGs("C1库房", storeAreaZone, ref cellEmptCounts1, reStr); this.asrsResManage.GetHouseAreaLeftGs("C2库房", storeAreaZone, ref cellEmptCounts2, reStr); if (cellEmptCounts1 >= cellEmptCounts2 && cellEmptCounts1 > 0 && targetPorts[0].Db2Vals[0] != 2 && targetPorts[0].Db2Vals[1] != 2) { re = 1;//流向C1, this.db1ValsToSnd[0] = 1; } else if (cellEmptCounts1 < cellEmptCounts2 && cellEmptCounts2 > 0 && targetPorts[1].Db2Vals[0] != 2 && targetPorts[1].Db2Vals[1] != 2) { re = 2;//流向C2, this.db1ValsToSnd[0] = 2; } else { re = 3;//等待 this.db1ValsToSnd[0] = 3; } } else { bool switchStat = false; for (int i = 0; i < targetPorts.Count(); i++) { if (targetPorts[i].PalletBuffer.Count() > 0 && targetPorts[i].PalletBuffer.Count() < targetPorts[i].PortinBufCapacity) { string lastPalletID = targetPorts[i].PalletBuffer[targetPorts[i].PalletBuffer.Count() - 1]; #region 查询MES应该进入那个分区,及批次 string storeAreaZoneLast = AsrsModel.EnumLogicArea.冷却区.ToString(); stepRe = MesAcc.GetStep(lastPalletID); if (stepRe.ResultCode != 0) { reStr = "查询MES托盘步次失败:" + stepRe.ResultMsg; return(-1); } if (stepRe.Step < 12) { storeAreaZoneLast = AsrsModel.EnumLogicArea.冷却区.ToString(); } else { storeAreaZoneLast = AsrsModel.EnumLogicArea.常温区.ToString(); } VMResultLot reLast = MesAcc.GetTrayCellLotNO(lastPalletID); VMResultLot reCur = MesAcc.GetTrayCellLotNO(this.rfidUID); if (reLast.ResultCode != 0) { reStr = string.Format("查询MES 托盘号{0}的批次失败,{1}", lastPalletID, reLast.ResultMsg); break; } if (reCur.ResultCode != 0) { reStr = string.Format("查询MES 托盘号{0}的批次失败,{1}", this.rfidUID, reCur.ResultMsg); break; } string preBatch = reLast.LotNO; //productOnlineBll.GetBatchNameofPallet(lastPalletID); string curBatch = reCur.LotNO; //productOnlineBll.GetBatchNameofPallet(this.rfidUID); #endregion #region 查询MES应该进入那个分区,本地批次信息 /* * string preBatch = productOnlineBll.GetBatchNameofPallet(lastPalletID); * string curBatch = productOnlineBll.GetBatchNameofPallet(this.rfidUID); * string nextMesStepIDLast = targetPorts[0].AsrsCtl.GetNextStepID(lastPalletID); * string currentMesStepIDLast = GetCurrentStepID(lastPalletID); * int curSeqLast = SysCfg.SysCfgModel.stepSeqs.IndexOf(currentMesStepIDLast); * int nextSeqLast = SysCfg.SysCfgModel.stepSeqs.IndexOf(nextMesStepIDLast); * string storeAreaZoneLast = AsrsModel.EnumLogicArea.冷却区.ToString(); * int seq1Last = SysCfg.SysCfgModel.stepSeqs.IndexOf("PS-60"); * //int seq2 = SysCfg.SysCfgModel.stepSeqs.IndexOf("PS-100"); * if (nextSeqLast <= seq1Last) * { * storeAreaZoneLast = AsrsModel.EnumLogicArea.冷却区.ToString(); * } * else * { * * storeAreaZoneLast = AsrsModel.EnumLogicArea.常温区.ToString(); * }*/ #endregion if (preBatch == curBatch && (storeAreaZone == storeAreaZoneLast)) { re = (Int16)(i + 1);//this.db1ValsToSnd[0] = //targetPorts[i].PushPalletID(this.rfidUID); switchStat = true; break; } } } if (!switchStat) //遍历各入口未能满足2筐入库规则,则选择缓存为空的入口 { for (int i = 0; i < targetPorts.Count(); i++) { //if (targetPorts[i].PalletBuffer.Count() == 0 && ((targetPorts[i].AsrsCtl.StackDevice.Db2Vals[1] < 3) || (targetPorts[i].AsrsCtl.StackDevice.Db2Vals[0] > 0))) if ((targetPorts[i].PalletBuffer.Count() == 0) && (targetPorts[i].Db2Vals[0] < 2))//入口缓存数据为空,并且入口处无板(光眼信号判断)。 { int cellEmptCounts = 0; if (!this.asrsResManage.GetHouseAreaLeftGs(targetPorts[i].AsrsCtl.HouseName, storeAreaZone, ref cellEmptCounts, reStr)) { continue; } if (cellEmptCounts <= 0) { continue; } re = (Int16)(i + 1);//this.db1ValsToSnd[0] = // targetPorts[i].PushPalletID(this.rfidUID); switchStat = true; break; } } } if (!switchStat) { re = 3;// this.db1ValsToSnd[0] = 3; //this.currentTaskDescribe = "等待分流"; //break; } } return(re); }