/// <summary> /// 堆垛机状态。 /// </summary> /// <param name="state"></param> private void CSR(object state) { Dictionary<string, string> msg = (Dictionary<string, string>)state; if (!dCraneState.ContainsKey(msg["CraneNo"])) { dCraneState.Add(msg["CraneNo"], ""); } //如果返回错误代码是000时,CraneMode=1表示堆垛机是自动状态,CraneMode 1: automatic 2: stopped 3: manual if (msg["ReturnCode"] == "000") { lock (dCraneState) { if (msg["AssignmenID"] == "00000000" && msg["CraneMode"] == "1") { //此堆垛机状态为空闲 dCraneState[msg["CraneNo"]] = "0"; if (dCraneWait[msg["CraneNo"]] != null) { SendTelegram(msg["CraneNo"], dCraneWait[msg["CraneNo"]]); } else { SendTelegram(msg["CraneNo"], null); } } else dCraneState[msg["CraneNo"]] = "1"; } } else { TaskDal dal = new TaskDal(); DataRow dr = null; if (dtCrane != null) { DataRow[] drs = dtCrane.Select(string.Format("ASSIGNMENT_ID='{0}'", msg["AssignmenID"])); if (drs.Length > 0) { dr = drs[0]; } } //如果在datatbale中找不到,再从数据库里查找 if (dr == null) { //根据流水号,获取资料 DataTable dt = dal.CraneTaskIn(string.Format("DETAIL.ASSIGNMENT_ID='{1}' AND DETAIL.CRANE_NO='{0}'", msg["CraneNo"], msg["AssignmenID"])); if (dt.Rows.Count > 0) dr = dt.Rows[0]; } string TaskID = ""; string ItemNo = ""; if (dr != null) { TaskID = dr["TASK_ID"].ToString(); ItemNo = dr["ITEM_NO"].ToString(); string ErrMsg = ""; DataRow[] drMsgs = dtErrMesage.Select(string.Format("CODE='{0}'", msg["ReturnCode"])); if (drMsgs.Length > 0) ErrMsg = drMsgs[0]["DESCRIPTION"].ToString(); Logger.Error(string.Format("堆垛机{0}返回错误代码{1}:{2}", msg["CraneNo"], msg["ReturnCode"], ErrMsg)); dal.UpdateCraneErrCode(TaskID, ItemNo, msg["ReturnCode"]);//更新堆垛机错误编号 } } SendACK(msg); CraneErrWriteToPLC(msg["CraneNo"], int.Parse(msg["ReturnCode"])); }
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"])); }