/// <summary> /// /// </summary> /// <param name="dt"></param> private void InsertdtCar(DataTable dt) { if (dtCar == null) { dtCar = new DataTable(); dtCar = dt.Clone(); DataColumn dcIndex = new DataColumn("Index", Type.GetType("System.Int16")); dtCar.Columns.Add(dcIndex); } if (dt.Rows.Count == 0) return; //插入 //调用小车任务插入缓存表 object[] obj = new object[dt.Columns.Count + 1]; for (int i = 0; i < dt.Rows.Count; i++) { DataRow[] drsExist = dtCar.Select(string.Format("TASK_ID='{0}'", dt.Rows[i]["TASK_ID"])); if (drsExist.Length > 0) continue; dt.Rows[i].ItemArray.CopyTo(obj, 0); obj[dt.Columns.Count] = OrderIndex + i; dtCar.Rows.Add(obj); } dtCar.AcceptChanges(); DataRow[] drsTask = dtCar.Select(string.Format("TASK_ID='{0}'", dt.Rows[0]["TASK_ID"])); if (drsTask.Length > 0) { DataRow dr = drsTask[0]; long CurPostion = 0; long ToPostion = 0; string FromStation = ""; string ToStation = ""; string TargetCode = ""; if (dr["TASK_TYPE"].ToString() == "21") { CurPostion = long.Parse(dr["IN_STATION_ADDRESS"].ToString()); ToPostion = long.Parse(dr["STATION_NO_ADDRESS"].ToString()); FromStation = dr["IN_STATION"].ToString(); ToStation = dr["STATION_NO"].ToString(); } else { CurPostion = long.Parse(dr["STATION_NO_ADDRESS"].ToString()); ToPostion = long.Parse(dr["OUT_STATION_1_ADDRESS"].ToString()); ToStation = dr["OUT_STATION_1"].ToString(); FromStation = dr["STATION_NO"].ToString(); } TaskDal dal = new TaskDal(); DataTable dtorder = GetCarOrder(CurPostion); DataRow[] drsOrder = dtorder.Select("", "orderNo desc"); for (int i = 0; i < drsOrder.Length; i++) { if (drsOrder[i]["State"].ToString() == "0") //小车空闲 { #region 小车空闲 if (dr["TASK_TYPE"].ToString() == "22") { ToPostion = -1; //判断二楼能否出库 bool blnCan = dal.ProductCanToCar(dr["FORDERBILLNO"].ToString(), dr["FORDER"].ToString(), dr["IS_MIX"].ToString(), true, blnOutOrder); if (blnCan) { if (!dBillUseTarget.ContainsKey(dr["FORDERBILLNO"].ToString())) { dBillUseTarget.Add(dr["FORDERBILLNO"].ToString(), false); dBillTargetCode.Add(dr["FORDERBILLNO"].ToString(), ""); } if (dBillUseTarget[dr["FORDERBILLNO"].ToString()]) //已经使用过两次 { if (dBillTargetCode[dr["FORDERBILLNO"].ToString()] == "370") { ToPostion = long.Parse(dr["OUT_STATION_1_ADDRESS"].ToString()); ToStation = dr["OUT_STATION_1"].ToString(); } else { ToPostion = long.Parse(dr["OUT_STATION_2_ADDRESS"].ToString()); ToStation = dr["OUT_STATION_2"].ToString(); } } else { if (dr["TARGET_CODE"].ToString().Trim() == "01") { int objstate = int.Parse(ObjectUtil.GetObject(WriteToService("StockPLC_02", "02_1_370")).ToString()); if (objstate == 0) { ToPostion = long.Parse(dr["OUT_STATION_1_ADDRESS"].ToString()); ToStation = dr["OUT_STATION_1"].ToString(); TargetCode = "370"; } else { objstate = int.Parse(ObjectUtil.GetObject(WriteToService("StockPLC_02", "02_1_390")).ToString()); if (objstate == 0) { ToPostion = long.Parse(dr["OUT_STATION_2_ADDRESS"].ToString()); ToStation = dr["OUT_STATION_2"].ToString(); TargetCode = "390"; } } } else { int objstate = int.Parse(ObjectUtil.GetObject(WriteToService("StockPLC_02", "02_1_390")).ToString()); if (objstate == 0) { ToPostion = long.Parse(dr["OUT_STATION_2_ADDRESS"].ToString()); ToStation = dr["OUT_STATION_2"].ToString(); TargetCode = "390"; } else { objstate = int.Parse(ObjectUtil.GetObject(WriteToService("StockPLC_02", "02_1_370")).ToString()); if (objstate == 0) { ToStation = dr["OUT_STATION_1"].ToString(); ToPostion = long.Parse(dr["OUT_STATION_1_ADDRESS"].ToString()); TargetCode = "370"; } } } if (dBillTargetCode[dr["FORDERBILLNO"].ToString()] != "" && dBillTargetCode[dr["FORDERBILLNO"].ToString()] != TargetCode) { dBillUseTarget[dr["FORDERBILLNO"].ToString()] = true; dBillTargetCode[dr["FORDERBILLNO"].ToString()] = TargetCode; } else { dBillTargetCode[dr["FORDERBILLNO"].ToString()] = TargetCode; } } } } if (ToPostion != -1) { long [] WriteValue = new long[2]; WriteValue[0] = CurPostion; WriteValue[1] = ToPostion; int TaskNo = int.Parse(dr["TASK_NO"].ToString()); int ProductType = int.Parse(dr["PRODUCT_TYPE"].ToString()); int[] WriteTaskValue = new int[2]; WriteTaskValue[0] = TaskNo; WriteTaskValue[1] = ProductType; string barcode = ""; string palletcode = ""; if (dr["PRODUCT_CODE"].ToString() != "0000") // { barcode = dr["PRODUCT_BARCODE"].ToString(); 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("StockPLC_02", drsOrder[i]["WriteItem"].ToString() + "_1", WriteTaskValue);//任务号。 WriteToService("StockPLC_02", drsOrder[i]["WriteItem"].ToString() + "_2", WriteValue);//地址。 WriteToService("StockPLC_02", drsOrder[i]["WriteItem"].ToString() + "_3", b); WriteToService("StockPLC_02", drsOrder[i]["WriteItem"].ToString() + "_4", 1); dr.BeginEdit(); dr["CAR_NO"] = drsOrder[i]["CAR_NO"].ToString(); dr["STATE"] = 1; dr.EndEdit(); dal.UpdateTaskDetailCar(FromStation, ToStation, "1", dr["CAR_NO"].ToString(), string.Format("TASK_ID='{0}' and ITEM_NO='{1}'", dr["TASK_ID"], dr["ITEM_NO"])); } break; #endregion } else { #region 小车不空闲,但是目的地小于当前位置 if (int.Parse(drsOrder[i]["ToStation"].ToString()) < CurPostion) //小车不空闲,但是目的地小于当前位置 { if (dtCar.Select(string.Format("STATE=0 and CAR_NO='{0}'", drsOrder[i]["CAR_NO"].ToString())).Length == 0) //判断当前小车,是否已经有分配未执行的任务,则给小车分配任务 { //判断二楼能否出库 bool blnCan = false; if (dr["TASK_TYPE"].ToString() == "21") blnCan = true; else blnCan = dal.ProductCanToCar(dr["FORDERBILLNO"].ToString(), dr["FORDER"].ToString(), dr["IS_MIX"].ToString(), true, blnOutOrder); if (blnCan) { dr.BeginEdit(); dr["CAR_NO"] = drsOrder[i]["CAR_NO"]; dr["WriteItem"] = drsOrder[i]["WriteItem"]; dr.EndEdit(); break; } } } #endregion } } } }
private void CarStateChange(string Objstate, string CarNO, string CarItem, string WriteItem) { string CarNo = ""; if (Objstate == "2") //送货完成 { TaskDal dal = new TaskDal(); #region 送货完成,写入站台 object[] obj1 = ObjectUtil.GetObjects(WriteToService("StockPLC_02", CarItem + "_1"));//小车任务号,状态 object[] obj2 = ObjectUtil.GetObjects(WriteToService("StockPLC_02", CarItem+"_2"));//读取小车位置,目标地址 DataRow[] drsAddress = dtCarAddress.Select(string.Format("CAR_ADDRESS >'{0}' and CAR_ADDRESS<'{1}'", long.Parse(obj2[1].ToString())-MaxDifferenceValue,long.Parse(obj2[1].ToString())+MaxDifferenceValue)); if (drsAddress.Length > 0) { string strStationNo = drsAddress[0]["STATION_NO"].ToString(); string strItemName = ""; string strItemState = "02_1_" + strStationNo; if (strStationNo == "340" || strStationNo == "360") { strItemName = "StockOutCarFinishProcess"; } else { if (strStationNo == "301" || strStationNo == "305" || strStationNo == "309" || strStationNo == "313" || strStationNo == "317" || strStationNo == "323") { strItemName = "PalletToCarStationProcess"; } } if (strItemName != "") WriteToProcess(strItemName, strItemState, obj1[0].ToString()); } string FinshedTaskType = ""; if (dtCar == null) return; DataRow[] drexist = dtCar.Select(string.Format("CAR_NO='{0}' and STATE=1", CarNo));//获取小车开始执行完毕之后 if (drexist.Length > 0) { FinshedTaskType = drexist[0]["TASK_TYPE"].ToString(); dtCar.Rows.Remove(drexist[0]); } #endregion DataRow[] drs = dtCar.Select(string.Format("CAR_NO='{0}' and STATE=0", CarNo)); //有待分配的任务 if (drs.Length > 0) { #region 有待分配的任务 DataRow dr = drs[0]; dr.BeginEdit(); dr["STATE"] = 1; dr.EndEdit(); int CurPostion = 0; int ToPostion = 0; string FromStation = ""; string ToStation = ""; string TargetCode = ""; if (dr["TASK_TYPE"].ToString() == "21") { CurPostion = int.Parse(dr["IN_STATION_ADDRESS"].ToString()); ToPostion = int.Parse(dr["STATION_NO_ADDRESS"].ToString()); FromStation = dr["IN_STATION"].ToString(); ToStation = dr["STATION_NO"].ToString(); } else { CurPostion = int.Parse(dr["STATION_NO_ADDRESS"].ToString()); ToPostion = int.Parse(dr["OUT_STATION_1_ADDRESS"].ToString()); FromStation = dr["STATION_NO"].ToString(); ToStation = dr["OUT_STATION_1"].ToString(); if (!dBillUseTarget.ContainsKey(dr["FORDERBILLNO"].ToString())) { dBillUseTarget.Add(dr["FORDERBILLNO"].ToString(), false); dBillTargetCode.Add(dr["FORDERBILLNO"].ToString(), ""); } if (dBillUseTarget[dr["FORDERBILLNO"].ToString()]) //已经使用过两次 { if (dBillTargetCode[dr["FORDERBILLNO"].ToString()] == "370") { ToPostion = int.Parse(dr["OUT_STATION_1_ADDRESS"].ToString()); ToStation = dr["OUT_STATION_1"].ToString(); } else { ToPostion = int.Parse(dr["OUT_STATION_2_ADDRESS"].ToString()); ToStation = dr["OUT_STATION_2"].ToString(); } } else { //制丝线1 正常走360,390拆盘有故障的时候,走340 if (dr["TARGET_CODE"].ToString().Trim() == "01") { int objstate = int.Parse(ObjectUtil.GetObject(WriteToService("StockPLC_02", "02_1_390")).ToString()); if (objstate == 0) { ToPostion = int.Parse(dr["OUT_STATION_2_ADDRESS"].ToString()); ToStation = dr["OUT_STATION_2"].ToString(); TargetCode = "390"; } else { objstate = int.Parse(ObjectUtil.GetObject(WriteToService("StockPLC_02", "02_1_370")).ToString()); if (objstate == 0) { ToPostion = int.Parse(dr["OUT_STATION_1_ADDRESS"].ToString()); ToStation = dr["OUT_STATION_1"].ToString(); TargetCode = "370"; } } } else //制丝线02,03 走340 如果370拆盘坏掉,走360至390处拆盘 { int objstate = int.Parse(ObjectUtil.GetObject(WriteToService("StockPLC_02", "02_1_370")).ToString()); if (objstate == 0) { ToPostion = int.Parse(dr["OUT_STATION_1_ADDRESS"].ToString()); ToStation = dr["OUT_STATION_1"].ToString(); TargetCode = "370"; } else { objstate = int.Parse(ObjectUtil.GetObject(WriteToService("StockPLC_02", "02_1_390")).ToString()); if (objstate == 0) { ToStation = dr["OUT_STATION_2"].ToString(); ToPostion = int.Parse(dr["OUT_STATION_2_ADDRESS"].ToString()); TargetCode = "390"; } } } if (dBillTargetCode[dr["FORDERBILLNO"].ToString()] != "" && dBillTargetCode[dr["FORDERBILLNO"].ToString()] != TargetCode) { dBillUseTarget[dr["FORDERBILLNO"].ToString()] = true; dBillTargetCode[dr["FORDERBILLNO"].ToString()] = TargetCode; } else { dBillTargetCode[dr["FORDERBILLNO"].ToString()] = TargetCode; } } } int[] WriteValue = new int[2]; WriteValue[0] = CurPostion; WriteValue[1] = ToPostion; int TaskNo = int.Parse(dr["TASK_NO"].ToString()); int ProductType = int.Parse(dr["PRODUCT_TYPE"].ToString()); int[] WriteTaskValue = new int[2]; WriteTaskValue[0] = TaskNo; WriteTaskValue[1] = ProductType; string barcode = ""; string palletcode = ""; if (dr["PRODUCT_CODE"].ToString() != "0000") // { barcode = dr["PRODUCT_BARCODE"].ToString(); 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("StockPLC_02", dr["WriteItem"].ToString() + "_1", WriteTaskValue);//任务号。 WriteToService("StockPLC_02", dr["WriteItem"].ToString() + "_2", WriteValue);//地址。 WriteToService("StockPLC_02", dr["WriteItem"].ToString() + "_3", b); WriteToService("StockPLC_02", dr["WriteItem"].ToString() + "_4", 1); dal.UpdateTaskDetailCar(FromStation, ToStation, "1", dr["CAR_NO"].ToString(), string.Format("TASK_ID='{0}' and ITEM_NO='{1}'", dr["TASK_ID"], dr["ITEM_NO"])); #endregion } else //小车空闲,且没任务。 { #region 小车空闲,且没任务。 按顺序查找任务 long CurPostion = 0; long ToPostion = -1; string FromStation = ""; string ToStation = ""; string TargetCode = ""; DataRow[] drsNotCar = dtCar.Select("CAR_NO='' and STATE=0", "Index"); if (drsNotCar.Length > 0) { for (int i = 0; i < drs.Length; i++) { DataRow dr = drs[i]; if (dr["TASK_TYPE"].ToString() == "21") { CurPostion = long.Parse(dr["IN_STATION_ADDRESS"].ToString()); ToPostion = long.Parse(dr["STATION_NO_ADDRESS"].ToString()); FromStation = dr["IN_STATION"].ToString(); ToStation = dr["STATION_NO"].ToString(); } else { CurPostion = long.Parse(dr["STATION_NO_ADDRESS"].ToString()); //判断使用哪个出口? ToPostion = long.Parse(dr["OUT_STATION_1_ADDRESS"].ToString()); ToStation = dr["OUT_STATION_1"].ToString(); FromStation = dr["STATION_NO"].ToString(); ToPostion = -1; //判断二楼能否出库 bool blnCan = false; blnCan = dal.ProductCanToCar(dr["FORDERBILLNO"].ToString(), dr["FORDER"].ToString(), dr["IS_MIX"].ToString(), true, blnOutOrder); if (blnCan) { if (!dBillUseTarget.ContainsKey(dr["FORDERBILLNO"].ToString())) { dBillUseTarget.Add(dr["FORDERBILLNO"].ToString(), false); dBillTargetCode.Add(dr["FORDERBILLNO"].ToString(), ""); } if (dBillUseTarget[dr["FORDERBILLNO"].ToString()]) //已经使用过两次 { if (dBillTargetCode[dr["FORDERBILLNO"].ToString()] == "370") { ToPostion = long.Parse(dr["OUT_STATION_1_ADDRESS"].ToString()); ToStation = dr["OUT_STATION_1"].ToString(); } else { ToPostion = long.Parse(dr["OUT_STATION_2_ADDRESS"].ToString()); ToStation = dr["OUT_STATION_2"].ToString(); } } else { if (dr["TARGET_CODE"].ToString().Trim() == "01") { //读取370拆盘有无故障 int objstate = int.Parse(ObjectUtil.GetObject(WriteToService("StockPLC_02", "02_1_390")).ToString()); if (objstate == 0) { ToPostion = long.Parse(dr["OUT_STATION_2_ADDRESS"].ToString()); ToStation = dr["OUT_STATION_2"].ToString(); TargetCode = "390"; } else { //读取390拆盘有无故障 objstate = int.Parse(ObjectUtil.GetObject(WriteToService("StockPLC_02", "02_1_370")).ToString()); if (objstate == 0) { ToPostion = long.Parse(dr["OUT_STATION_2_ADDRESS"].ToString()); ToStation = dr["OUT_STATION_2"].ToString(); TargetCode = "370"; } } } else { int objstate = int.Parse(ObjectUtil.GetObject(WriteToService("StockPLC_02", "02_1_370")).ToString()); if (objstate == 0) { ToPostion = long.Parse(dr["OUT_STATION_1_ADDRESS"].ToString()); ToStation = dr["OUT_STATION_1"].ToString(); TargetCode = "370"; } else { objstate = int.Parse(ObjectUtil.GetObject(WriteToService("StockPLC_02", "02_1_390")).ToString()); if (objstate == 0) { ToStation = dr["OUT_STATION_2"].ToString(); ToPostion = long.Parse(dr["OUT_STATION_2_ADDRESS"].ToString()); TargetCode = "390"; } } } if (dBillTargetCode[dr["FORDERBILLNO"].ToString()] != "" && dBillTargetCode[dr["FORDERBILLNO"].ToString()] != TargetCode) { dBillUseTarget[dr["FORDERBILLNO"].ToString()] = true; dBillTargetCode[dr["FORDERBILLNO"].ToString()] = TargetCode; } else { dBillTargetCode[dr["FORDERBILLNO"].ToString()] = TargetCode; } } } } if (ToPostion != -1) { long[] WriteValue = new long[2]; WriteValue[0] = CurPostion; WriteValue[1] = ToPostion; int TaskNo = int.Parse(dr["TASK_NO"].ToString()); int ProductType = int.Parse(dr["PRODUCT_TYPE"].ToString()); int[] WriteTaskValue = new int[2]; WriteTaskValue[0] = TaskNo; WriteTaskValue[1] = ProductType; string barcode = ""; string palletcode = ""; if (dr["PRODUCT_CODE"].ToString() != "0000") // { barcode = dr["PRODUCT_BARCODE"].ToString(); 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("StockPLC_02", WriteItem + "_1", WriteTaskValue);//任务号。 WriteToService("StockPLC_02", WriteItem + "_2", WriteValue);//地址。 WriteToService("StockPLC_02", WriteItem + "_3", b); WriteToService("StockPLC_02", WriteItem + "_4", 1); dal.UpdateTaskDetailCar(FromStation, ToStation, "1", dr["CAR_NO"].ToString(), string.Format("TASK_ID='{0}' and ITEM_NO='{1}'", dr["TASK_ID"], dr["ITEM_NO"])); break; } } } #endregion #region 小车空闲,且找不到任务,则移动到最大目的地址的下一个工位 if (ToPostion == -1) { obj2 = ObjectUtil.GetObjects(WriteToService("StockPLC_02", CarItem+"_2"));//读取小车位置 //判断当前位 DataTable dtOrder = GetCarOrder(int.Parse(obj2[0].ToString())); DataRow[] drMax = dtOrder.Select("state=1", "ToStationOrder desc"); //按照最大目的地址倒排。最大目的地址大于当前位置,则下任务给小车移动到最大目的地址+1个工位。 if (drMax.Length > 0) { if ((int)drMax[0]["ToStation"] > int.Parse(obj2[1].ToString())) { string strNextStation = GetNextStation(obj2[1].ToString()); long[] WriteValue = new long[2]; WriteValue[0] = long.Parse(obj2[0].ToString()); ; WriteValue[1] = long.Parse(strNextStation);//下任务给小车移动到最大目的地址+1个工位。; int TaskNo = 9999; int ProductType = 5; int[] WriteTaskValue = new int[2]; WriteTaskValue[0] = TaskNo; WriteTaskValue[1] = ProductType; string barcode = ""; string palletcode = ""; byte[] b = new byte[190]; Common.ConvertStringChar.stringToByte(barcode, 80).CopyTo(b, 0); Common.ConvertStringChar.stringToByte(palletcode, 110).CopyTo(b, 80); WriteToService("StockPLC_02", WriteItem + "_1", WriteTaskValue);//任务号。 WriteToService("StockPLC_02", WriteItem + "_2", WriteValue);//地址。 WriteToService("StockPLC_02", WriteItem + "_3", b); WriteToService("StockPLC_02", WriteItem + "_4", 1); } } } #endregion } } else { #region 烟包接货完成,处理目前位置与目的地之间的空闲小车 if (Objstate == "1")// { object[] obj = ObjectUtil.GetObjects(WriteToService("StockPLC_02", CarItem+"_2"));//读取小车位置 //判断当前位置 DataTable dtOrder = GetCarOrder(int.Parse(obj[0].ToString())); DataRow[] drMax = dtOrder.Select(string.Format("state=0 and CurStation>={0} and CurStation<={1}", obj[1], obj[2]), "orderNo desc"); //按照最大目的地址倒排。最大目的地址大于当前位置,则下任务给小车移动到最大目的地址+1个工位。 if (drMax.Length > 0) { for (int i = 0; i < drMax.Length; i++) { string strNextStation = GetNextStation(obj[2].ToString()); long[] WriteValue = new long[2]; WriteValue[0] = long.Parse(drMax[i]["CurStation"].ToString()); WriteValue[1] = long.Parse(strNextStation);//下任务给小车移动到最大目的地址+1个工位。; int TaskNo = 9999; int ProductType = 5; int[] WriteTaskValue = new int[2]; WriteTaskValue[0] = TaskNo; WriteTaskValue[1] = ProductType; string barcode = ""; string palletcode = ""; byte[] b = new byte[190]; Common.ConvertStringChar.stringToBytes(barcode, 80).CopyTo(b, 0); Common.ConvertStringChar.stringToBytes(palletcode, 110).CopyTo(b, 80); WriteToService("StockPLC_02", drMax[i]["WriteItem"].ToString() + "_1", WriteTaskValue);//任务号。 WriteToService("StockPLC_02", drMax[i]["WriteItem"].ToString() + "_2", WriteValue);//地址。 WriteToService("StockPLC_02", drMax[i]["WriteItem"].ToString() + "_3", b); WriteToService("StockPLC_02", drMax[i]["WriteItem"].ToString() + "_4", 1); } } } #endregion } }