protected override void StateChanged(StateItem stateItem, IProcessDispatcher dispatcher) { /* 处理事项: * 二楼空托盘组入库 * 生成入库单,入库作业。 */ try { object[] obj = ObjectUtil.GetObjects(stateItem.State); if (obj[0] == null || obj[0].ToString() == "0") return; int PalletCount = int.Parse(obj[1].ToString()); string TaskID = ""; //判断是否还有出库任务 TaskDal dal = new TaskDal(); int TaskOutCount = dal.CarTaskInfo(); if (PalletCount >= 4 || TaskOutCount <= 4) { //获取托盘组入库下达排程任务而小车未接货的任务号,防止托盘组数量变化引起触发 TaskID = dal.GetPalletInTask(); string strWhere = ""; if (TaskID == "") { PalletBillDal Billdal = new PalletBillDal(); TaskID = Billdal.CreatePalletInBillTask(false); strWhere = string.Format("TASK_ID='{0}'", TaskID); string[] CellValue = dal.AssignCellTwo(strWhere);//货位申请 string TaskNo = dal.InsertTaskDetail(CellValue[0]); dal.UpdateTaskState(CellValue[0], "1");//更新任务开始执行 ProductStateDal StateDal = new ProductStateDal(); //更新Product_State 货位 StateDal.UpdateProductCellCode(CellValue[0], CellValue[1]); //更新货位申请起始地址及目标地址。 dal.UpdateTaskDetailStation("357", "359", "2", string.Format("TASK_ID='{0}' AND ITEM_NO=1", CellValue[0])); } strWhere = string.Format("WCS_TASK.TASK_ID='{0}' AND ITEM_NO=2 AND DETAIL.STATE=0 ", TaskID); DataTable dt = dal.TaskCarDetail(strWhere); WriteToProcess("CarProcess", "CarInRequest", dt); } } catch (Exception e) { Logger.Error("THOK.XC.Process.Process_02.PalletInRequestProcess:" + e.Message); } }
/// <summary> /// 发送报文,并返回发送成功。 /// </summary> /// <param name="CraneNo"></param> /// <param name="TaskID"></param> /// <returns></returns> private bool SendTelegram(string CraneNo, DataRow drTaskID) { bool blnSend = false; //判断dCraneState[CraneNo] 是否空闲; if (!dCraneState.ContainsKey(CraneNo)) { dCraneState.Add(CraneNo, ""); SendTelegramCRQ(CraneNo); } //状态在没有收到CSR的时候,dCraneState[CraneNo]="" if (string.IsNullOrEmpty(dCraneState[CraneNo])) //等待堆垛机应答。 { if (dCraneWait[CraneNo] == null && drTaskID != null) { dCraneWait[CraneNo] = drTaskID; return false; } return false; } //堆垛机正忙。 if (dCraneState[CraneNo] == "1") return true; //堆垛机空闲,自行找任务执行 TaskDal dal = new TaskDal(); DataRow drTaskCrane = null; //出库任务调用堆垛机,drTaskID无任务,自行找出任务 if (drTaskID==null && dtCrane!=null) { //读取二楼出库站台是否有烟包,PLC //按照任务等级,任务时间,产品形态, //FORDERBILLNO 如果有校验不合格,需另外批次替代,产生的新出库单,原始出库单号FORDERBILLNO,排序不会乱掉 DataRow[] drs = dtCrane.Select(string.Format("CRANE_NO='{0}' and STATE=0 and TASK_TYPE in ('12','22','13','14')", CraneNo), "TASK_LEVEL,TASK_DATE,BILL_NO,IS_MIX,PRODUCT_CODE,TASK_ID"); for (int i = 0; i < drs.Length; i++) { //如果是二楼出库,判断当前任务的产品是不是 if (drs[i]["TASK_TYPE"].ToString() == "22") { //判断是否能出库 bool blnCan = dal.ProductCanToCar(drs[i]["FORDERBILLNO"].ToString(), drs[i]["FORDER"].ToString(), drs[i]["IS_MIX"].ToString(), false, blnOutOrder); //判断能否出库 if (!blnCan) continue; } drTaskCrane=drs[i]; break; } } else //根据任务编号发送报文。 { drTaskCrane = drTaskID; } if (drTaskCrane != null) { if (dCraneState[CraneNo] == "0") { string TaskType=drTaskCrane["TASK_TYPE"].ToString(); //Task_Detail ITEM_NO字段 //TaskType:13盘点 14移库 string ItemNo=drTaskCrane["ITEM_NO"].ToString(); //正常1,2楼出库、1楼盘点移库(非同巷道) if (TaskType.Substring(1, 1) == "2" || (TaskType == "13" && ItemNo == "1") || (TaskType == "14" && ItemNo == "1" && drTaskCrane["CRANE_NO"].ToString() != drTaskCrane["NEW_CRANE_NO"].ToString())) { //读取出库站台有无货物,如有直接返回 object t = ObjectUtil.GetObject(WriteToService(drTaskCrane["SERVICE_NAME"].ToString(), drTaskCrane["ITEM_NAME_1"].ToString()));//读取当前出库站台是否有货位 if (t.ToString() != "0") { blnSend = false; return blnSend; } } //出库任务,以堆垛机为第一步路线 if (ItemNo == "1") { //产生TASK_DETAIL明细,并返回TASKNO string strTaskDetailNo = dal.InsertTaskDetail(drTaskCrane["TASK_ID"].ToString()); DataRow[] drs = dtCrane.Select(string.Format("TASK_ID='{0}'", drTaskCrane["TASK_ID"])); if (drs.Length > 0) { drs[0].BeginEdit(); drs[0]["TASK_NO"] = strTaskDetailNo; drs[0]["ASSIGNMENT_ID"] = strTaskDetailNo.PadLeft(8, '0'); drs[0].EndEdit(); dtCrane.AcceptChanges(); } } SendTelegramARQ(drTaskCrane, true);//发送报文 blnSend = true; } } return blnSend; }
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); } }
/// <summary> /// 发送报文,并返回发送成功。 /// </summary> /// <param name="CraneNo"></param> /// <param name="TaskID"></param> /// <returns></returns> private bool SendTelegram(string CraneNo, DataRow drTaskID) { bool blnSend = false; //判断dCraneState[CraneNo] 是否空闲; if (!dCraneState.ContainsKey(CraneNo)) { dCraneState.Add(CraneNo, ""); SendTelegramCRQ(CraneNo); } if (string.IsNullOrEmpty(dCraneState[CraneNo])) //等待堆垛机应答。 { if (dCraneWait[CraneNo] == null && drTaskID != null) { dCraneWait[CraneNo] = drTaskID; return false; } return false; } if (dCraneState[CraneNo] == "1") //堆垛机正忙。 return true; TaskDal dal = new TaskDal(); DataRow drTaskCrane = null; if (drTaskID==null && dtCrane!=null) //出库任务调用堆垛机 { //读取二楼出库站台是否有烟包,PLC //按照任务等级,任务时间,产品形态, DataRow[] drs = dtCrane.Select(string.Format("CRANE_NO='{0}' and STATE=0 and TASK_TYPE in ('12','22','13','14')", CraneNo), "TASK_LEVEL,TASK_DATE,BILL_NO,IS_MIX,PRODUCT_CODE,TASK_ID"); for (int i = 0; i < drs.Length; i++) { //判断能否出库 if (drs[i]["TASK_TYPE"].ToString() == "22") //二楼出库,判断能否出库 { bool blnCan = dal.ProductCanToCar(drs[i]["FORDERBILLNO"].ToString(), drs[i]["FORDER"].ToString(), drs[i]["IS_MIX"].ToString()); //判断能否出库 if (!blnCan) continue; } drTaskCrane=drs[i]; break; } } else //根据任务编号发送报文。 { drTaskCrane = drTaskID; } if (drTaskCrane != null) { if (dCraneState[CraneNo] == "0") { string TaskType=drTaskCrane["TASK_TYPE"].ToString(); string ItemNo=drTaskCrane["ITEM_NO"].ToString(); if (TaskType.Substring(1, 1) == "2" || (TaskType.Substring(1, 1) == "3" && ItemNo == "1") || (TaskType.Substring(1, 1) == "4" && ItemNo == "1" && drTaskCrane["CRANE_NO"].ToString() != drTaskCrane["NEW_CRANE_NO"].ToString())) { object t = ObjectUtil.GetObject(WriteToService(drTaskCrane["SERVICE_NAME"].ToString(), drTaskCrane["ITEM_NAME_1"].ToString()));//读取当前出库站台是否有货位 if (t.ToString() != "0") { blnSend = false; return blnSend; } } if (drTaskCrane["ITEM_NO"].ToString() == "1") { string strTaskDetailNo = dal.InsertTaskDetail(drTaskCrane["TASK_ID"].ToString()); DataRow[] drs = dtCrane.Select(string.Format("TASK_ID='{0}'", drTaskCrane["TASK_ID"])); if (drs.Length > 0) { drs[0].BeginEdit(); drs[0]["TASK_NO"] = strTaskDetailNo; drs[0]["ASSIGNMENT_ID"] = strTaskDetailNo.PadLeft(8, '0'); drs[0].EndEdit(); dtCrane.AcceptChanges(); } } SendTelegramARQ(drTaskCrane, true);//发送报文 blnSend = true; } } return blnSend; }
/// <summary> /// ������ⷽʽ /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnPalletIn_Click(object sender, EventArgs e) { PalletSelect frm = new PalletSelect(); if (frm.ShowDialog() == DialogResult.OK) { object obj = ObjectUtil.GetObject(Context.ProcessDispatcher.WriteToService("StockPLC_01", "01_1_122_1")); if (obj == null || obj.ToString() != "0") return; if (frm.Flag == 1) //��������� { string writeItem = "01_2_122_"; int[] ServiceW = new int[3]; ServiceW[0] =9999; //����� ServiceW[1] = 131;//Ŀ�ĵ�ַ ServiceW[2] = 4; Context.ProcessDispatcher.WriteToService("StockPLC_01", writeItem + "1", ServiceW); //PLCд������ Context.ProcessDispatcher.WriteToService("StockPLC_01", writeItem + "2", 1); //PLCд������ } else if (frm.Flag == 2) { PalletBillDal Billdal = new PalletBillDal(); string TaskID = Billdal.CreatePalletInBillTask(true); //����������ⵥ������Task. string FromStation = "122"; string ToStation = "122"; string writeItem = "01_2_122_"; string strWhere = string.Format("TASK_ID='{0}'", TaskID); TaskDal dal = new TaskDal(); string[] CellValue = dal.AssignCell(strWhere, ToStation);//��λ���� string TaskNo = dal.InsertTaskDetail(CellValue[0]); SysStationDal sysDal = new SysStationDal(); DataTable dt = sysDal.GetSationInfo(CellValue[1], "11","3"); dal.UpdateTaskState(CellValue[0], "1");//��������ʼִ�� ProductStateDal StateDal = new ProductStateDal(); StateDal.UpdateProductCellCode(CellValue[0], CellValue[1]); //����Product_State ��λ dal.UpdateTaskDetailStation(FromStation, ToStation, "2", string.Format("TASK_ID='{0}' AND ITEM_NO=1", CellValue[0])); //���»�λ������ʼ��ַ��Ŀ���ַ�� int[] ServiceW = new int[3]; ServiceW[0] = int.Parse(TaskNo); //����� ServiceW[1] = int.Parse(dt.Rows[0]["STATION_NO"].ToString());//Ŀ�ĵ�ַ ServiceW[2] = 2; Context.ProcessDispatcher.WriteToService("StockPLC_01", writeItem + "1", ServiceW); //PLCд������ Context.ProcessDispatcher.WriteToService("StockPLC_01", writeItem + "2", 1); //PLCд������ dal.UpdateTaskDetailStation(ToStation, dt.Rows[0]["STATION_NO"].ToString(), "1", string.Format("TASK_ID='{0}' AND ITEM_NO=2", CellValue[0]));//���»�λ�������վ̨�� //���µ��ݿ�ʼ } } }