/// <summary> /// 发送报文后,堆垛机发送接收确认。 /// </summary> /// <param name="state"></param> private void ACK(object state) { Dictionary<string, string> msg = (Dictionary<string, string>)state; DataRow dr = null; TaskDal dal = new TaskDal(); if (dtCrane != null) { DataRow[] drs = dtCrane.Select(string.Format("SQUENCE_NO='{0}'", msg["SequenceNo"])); if (drs.Length > 0) { dr = drs[0]; } } if (dr == null) { //根据流水号,获取资料 DataTable dt = dal.CraneTaskIn(string.Format("DETAIL.SQUENCE_NO='{0}' AND DETAIL.CRANE_NO IS NOT NULL", msg["SequenceNo"])); if (dt.Rows.Count > 0) dr = dt.Rows[0]; } #region 缓存数据存在 if (dr != null) { string TaskType = dr["TASK_TYPE"].ToString(); string ItemNo = dr["ITEM_NO"].ToString(); BillDal bdal = new BillDal(); if (TaskType.Substring(1, 1) == "2" || (TaskType == "13" && ItemNo == "1") || (TaskType == "14" && ItemNo == "1" && dr["CRANE_NO"].ToString() != dr["NEW_CRANE_NO"].ToString())) { dal.UpdateTaskState(dr["TASK_ID"].ToString(), "1"); dal.UpdateTaskDetailCrane(dr["CELL_CODE"].ToString(), dr["STATION_NO"].ToString(), "1", dr["CRANE_NO"].ToString(), string.Format("TASK_ID='{0}' AND ITEM_NO={1}", dr["TASK_ID"], dr["ITEM_NO"])); //更新BILL_MASTER 单据状态作业中 bdal.UpdateBillMasterStart(dr["BILL_NO"].ToString(), dr["PRODUCT_CODE"].ToString() == "0000" ? false : true); } else if (TaskType == "14" && ItemNo == "1" && dr["CRANE_NO"].ToString() == dr["NEW_CRANE_NO"].ToString()) { //出库任务 更新任务状态:任务执行中 dal.UpdateTaskState(dr["TASK_ID"].ToString(), "1"); dal.UpdateTaskDetailCrane(dr["CELL_CODE"].ToString(), dr["NEWCELL_CODE"].ToString(), "1", dr["CRANE_NO"].ToString(), string.Format("TASK_ID='{0}' AND ITEM_NO={1}", dr["TASK_ID"], dr["ITEM_NO"])); bdal.UpdateBillMasterStart(dr["BILL_NO"].ToString(), true); } else dal.UpdateTaskDetailState(string.Format("TASK_ID='{0}' and ITEM_NO={1}", dr["TASK_ID"], dr["ITEM_NO"]), "1"); if (dtCrane != null) { DataRow []drs=dtCrane.Select(string.Format("TASK_ID='{0}'",dr["TASK_ID"])); if(drs.Length>0) { drs[0].BeginEdit(); drs[0]["state"]="1"; drs[0].EndEdit(); dtCrane.AcceptChanges(); } } } #endregion }
private void ACP(object state) { Dictionary<string, string> msg = (Dictionary<string, string>)state; TaskDal dal = new TaskDal(); if (!dCraneState.ContainsKey(msg["CraneNo"])) { dCraneState.Add(msg["CraneNo"], ""); } DataRow dr = null; if (dtCrane != null) { DataRow[] drs = dtCrane.Select(string.Format("SQUENCE_NO='{0}'", msg["SequenceNo"])); if (drs.Length > 0) { dr = drs[0]; } } //如果在datatbale中找不到,再从数据库里查找 if (dr == null) { //根据流水号,获取资料 DataTable dt = dal.CraneTaskIn(string.Format("DETAIL.SQUENCE_NO='{1}' AND DETAIL.CRANE_NO='{0}'", msg["CraneNo"], msg["SequenceNo"])); if (dt.Rows.Count > 0) dr = dt.Rows[0]; } string TaskType = ""; string TaskID = ""; string ItemNo = ""; if (dr != null) { TaskType = dr["TASK_TYPE"].ToString(); TaskID = dr["TASK_ID"].ToString(); ItemNo = dr["ITEM_NO"].ToString(); } if (msg["ReturnCode"] == "000") { #region 正常处理流程 if (dr != null) { //判断暂存的任务是否是当前完成的任务,如果是清空暂存 if (dCraneWait[msg["CraneNo"]] != null) { if (dCraneWait[msg["CraneNo"]]["TASK_ID"].ToString() == TaskID) { dCraneWait[msg["CraneNo"]] = null; } } string strWhere = string.Format("TASK_ID='{0}' and ITEM_NO='{1}'", TaskID, ItemNo); //出库,一楼盘点出库 if (TaskType.Substring(1, 1) == "2" || (TaskType == "13" && ItemNo == "1")) { if (TaskType == "12") //一楼出库 { CellDal Cdal = new CellDal(); //货位解锁 Cdal.UpdateCellOutFinishUnLock(dr["CELL_CODE"].ToString()); //更新PRODUCTSTATE 出库单号 ProductStateDal psdal = new ProductStateDal(); psdal.UpdateOutBillNo(TaskID); } if(TaskType=="12" || TaskType=="13") dal.UpdateTaskDetailState(strWhere, "2"); //更新堆垛机状态 string ToStation; if (TaskType == "22") ToStation = dr["MEMO"].ToString(); else ToStation = dr["TARGET_CODE"].ToString(); //更新TASK_DETAIL FROM_STATION TO_STATION STATE dal.UpdateTaskDetailStation(dr["STATION_NO"].ToString(), ToStation, "1", string.Format("TASK_ID='{0}' AND ITEM_NO=2", TaskID)); int[] WriteValue = new int[3]; WriteValue[0] = int.Parse(dr["TASK_NO"].ToString()); if (TaskType == "22") WriteValue[1] = int.Parse(dr["MEMO"].ToString()); else WriteValue[1] = int.Parse(dr["TARGET_CODE"].ToString()); WriteValue[2] = int.Parse(dr["PRODUCT_TYPE"].ToString()); string Barcode = dr["PRODUCT_BARCODE"].ToString(); string PalletCode = dr["PALLET_CODE"].ToString(); byte[] b = new byte[190]; Common.ConvertStringChar.stringToByte(Barcode, 80).CopyTo(b, 0); Common.ConvertStringChar.stringToByte(PalletCode, 110).CopyTo(b, 80); //到达出库站台,再下任务给PLC WriteToService(dr["SERVICE_NAME"].ToString(), dr["ITEM_NAME_2"].ToString() + "_1", WriteValue); WriteToService(dr["SERVICE_NAME"].ToString(), dr["ITEM_NAME_2"].ToString() + "_2", b); WriteToService(dr["SERVICE_NAME"].ToString(), dr["ITEM_NAME_2"].ToString() + "_3", 1); } //入库完成,更新Task任务完成。 else if (TaskType.Substring(1, 1) == "1" || (TaskType == "13" && dr["ITEM_NO"].ToString() == "4")) { dal.UpdateTaskDetailState(strWhere, "2"); //更新堆垛机状态 dal.UpdateTaskState(TaskID, "2");//更新任务状态。 if (TaskType == "11") { CellDal Cdal = new CellDal(); Cdal.UpdateCellInFinishUnLock(TaskID);//入库完成,更新货位。 } BillDal billdal = new BillDal(); string isBill = "1"; if (dr["PRODUCT_CODE"].ToString() == "0000") isBill = "0"; billdal.UpdateInBillMasterFinished(dr["BILL_NO"].ToString(), isBill);//更新表单 } else if (TaskType == "14") { #region 移库 //如果目标地址与源地址不同巷道 if (dr["CRANE_NO"].ToString() != dr["NEW_CRANE_NO"].ToString()) { dal.UpdateTaskDetailState(strWhere, "2"); //更新堆垛机状态 if (ItemNo == "1") { //更新货位信息 CellDal Cdal = new CellDal(); Cdal.UpdateCellOutFinishUnLock(dr["CELL_CODE"].ToString()); //更新TASK_DETAIL FROM_STATION TO_STATION STATE dal.UpdateTaskDetailStation(dr["STATION_NO"].ToString(), dr["NEW_TARGET_CODE"].ToString(), "1", string.Format("TASK_ID='{0}' AND ITEM_NO=2", TaskID)); //下达给PLC任务 int[] WriteValue = new int[3]; WriteValue[0] = int.Parse(dr["TASK_NO"].ToString()); WriteValue[1] = int.Parse(dr["NEW_TARGET_CODE"].ToString()); WriteValue[2] = int.Parse(dr["PRODUCT_TYPE"].ToString()); string Barcode = dr["PRODUCT_BARCODE"].ToString(); string PalletCode = dr["PALLET_CODE"].ToString(); byte[] b = new byte[190]; Common.ConvertStringChar.stringToByte(Barcode, 80).CopyTo(b, 0); Common.ConvertStringChar.stringToByte(PalletCode, 110).CopyTo(b, 80); WriteToService(dr["SERVICE_NAME"].ToString(), dr["ITEM_NAME_2"].ToString() + "_1", WriteValue); WriteToService(dr["SERVICE_NAME"].ToString(), dr["ITEM_NAME_2"].ToString() + "_2", b); WriteToService(dr["SERVICE_NAME"].ToString(), dr["ITEM_NAME_2"].ToString() + "_3", 1); BillDal billdal = new BillDal(); billdal.UpdateBillMasterStart(dr["BILL_NO"].ToString(), true);//更新表单 } else { dal.UpdateTaskState(TaskID, "2");//更新任务状态。 CellDal Cdal = new CellDal(); Cdal.UpdateCellInFinishUnLock(dr["NEWCELL_CODE"].ToString()); BillDal billdal = new BillDal(); string isBill = "1"; if (dr["PRODUCT_CODE"].ToString() == "0000") isBill = "0"; billdal.UpdateInBillMasterFinished(dr["BILL_NO"].ToString(), isBill);//更新表单 } } else //相同巷道 { dal.UpdateTaskDetailState(strWhere, "2"); //更新堆垛机状态 dal.UpdateTaskState(TaskID, "2");//更新任务状态。 CellDal Cdal = new CellDal(); Cdal.UpdateCellRemoveFinish(dr["NEWCELL_CODE"].ToString(), dr["CELL_CODE"].ToString()); //入库完成,更新货位。 Cdal.UpdateCellOutFinishUnLock(dr["CELL_CODE"].ToString()); BillDal billdal = new BillDal(); string isBill = "1"; if (dr["PRODUCT_CODE"].ToString() == "0000") isBill = "0"; //更新WMS单据状态 billdal.UpdateInBillMasterFinished(dr["BILL_NO"].ToString(), isBill);//更新表单 } #endregion } lock (dCraneState) { dCraneState[msg["CraneNo"]] = "0"; } //移除完成的任务 if (dtCrane != null) { DataRow[] drs = dtCrane.Select(string.Format("TASK_ID='{0}'", TaskID)); if (drs.Length > 0) { dtCrane.Rows.Remove(drs[0]); } } //查找发送下条报文。 GetNextTaskID(msg["CraneNo"], TaskType); } #endregion } else { string ErrMsg = ""; DataRow[] drMsgs = dtErrMesage.Select(string.Format("CODE='{0}'", msg["ReturnCode"])); if (drMsgs.Length > 0) ErrMsg = drMsgs[0]["DESCRIPTION"].ToString(); dal.UpdateCraneErrCode(TaskID, ItemNo, msg["ReturnCode"]);//更新堆垛机错误编号 Logger.Error(string.Format("堆垛机{0}返回错误代码{1}:{2}", msg["CraneNo"], msg["ReturnCode"], ErrMsg)); } SendACK(msg); CraneErrWriteToPLC(msg["CraneNo"], int.Parse(msg["ReturnCode"])); }
protected override void StateChanged(StateItem stateItem, IProcessDispatcher dispatcher) { /* * 一楼入库货位申请 */ try { string FromStation = ""; string writeItem = ""; string ToStation = ""; string TaskID = ""; object obj = ObjectUtil.GetObject(stateItem.State); if (obj == null || obj.ToString() == "0") return; string BarCode = ""; //读取PLC,获得产品编码 switch (stateItem.ItemName) { case "01_1_218_1": FromStation = "210"; ToStation = "218"; writeItem = "01_2_218_"; BarCode = Common.ConvertStringChar.BytesToString(ObjectUtil.GetObjects(WriteToService("StockPLC_01", "01_1_218_2"))); break; case "01_1_110_1": FromStation = "101"; ToStation = "110"; writeItem = "01_2_110_"; BarCode = Common.ConvertStringChar.BytesToString(ObjectUtil.GetObjects(WriteToService("StockPLC_01", "01_1_110_2"))); break; case "01_1_126_1": FromStation = "124"; ToStation = "126"; writeItem = "01_2_126_"; BarCode = Common.ConvertStringChar.BytesToString(ObjectUtil.GetObjects(WriteToService("StockPLC_01", "01_1_126_2"))); break; case "01_1_131": //空托盘组盘入 PalletBillDal Billdal = new PalletBillDal(); TaskID = Billdal.CreatePalletInBillTask(true); //空托盘组入库单,生成Task. FromStation = "124"; ToStation = "131"; writeItem = "01_2_131_"; break; case "PllateInRequest": break; } string strWhere = ""; if (TaskID == "") strWhere = string.Format("PRODUCT_BARCODE='{0}'", BarCode); else strWhere = string.Format("TASK_ID='{0}'", TaskID); TaskDal dal = new TaskDal(); //分配货位,返回 0:TaskID,1:货位 string[] CellValue = dal.AssignCell(strWhere, ToStation);//货位申请 //返回任务号9999 string TaskNo = dal.InsertTaskDetail(CellValue[0]); SysStationDal sysDal = new SysStationDal(); //获取task_detail行走路线item_no=3的信息,也就是堆垛机取货入库的动作 DataTable dt = sysDal.GetSationInfo(CellValue[1], "11","3"); DataTable dtTask = dal.TaskInfo(string.Format("TASK_ID='{0}'", CellValue[0])); //更新任务开始执行 dal.UpdateTaskState(CellValue[0], "1"); //更新Product_State 货位 ProductStateDal StateDal = new ProductStateDal(); StateDal.UpdateProductCellCode(CellValue[0], CellValue[1]); //更新货位申请起始地址及目标地址。 dal.UpdateTaskDetailStation(FromStation, ToStation, "2", string.Format("TASK_ID='{0}' AND ITEM_NO=1", CellValue[0])); //0:任务号 1:目标地址 2:货物类型 int[] ServiceW = new int[3]; ServiceW[0] = int.Parse(TaskNo); // ServiceW[1] = int.Parse(dt.Rows[0]["STATION_NO"].ToString()); if (stateItem.ItemName == "01_1_131") ServiceW[2] = 2; else ServiceW[2] = 1; //PLC写入任务 WriteToService("StockPLC_01", writeItem + "1", ServiceW); if (stateItem.ItemName == "01_1_131") { WriteToService("StockPLC_01", writeItem + "2", 1); } else { byte[] b = new byte[110]; Common.ConvertStringChar.stringToByte(dtTask.Rows[0]["PALLET_CODE"].ToString(), 110).CopyTo(b, 0); //写入RFID WriteToService("StockPLC_01", writeItem + "2", b); //标识位置1 WriteToService("StockPLC_01", writeItem + "3", 1); } BillDal Bdal = new BillDal(); Bdal.UpdateBillMasterStart(dtTask.Rows[0]["BILL_NO"].ToString(), ServiceW[2] == 1 ? true : false); dal.UpdateTaskDetailStation(ToStation, dt.Rows[0]["STATION_NO"].ToString(), "1", string.Format("TASK_ID='{0}' AND ITEM_NO=2", CellValue[0]));//更新货位到达入库站台, } catch (Exception e) { Logger.Error("THOK.XC.Process.Process_01.StockInRequestProcess:" + e.Message); } }