Beispiel #1
0
        /// <summary>
        /// 异常日志
        /// </summary>
        /// <param name="item"></param>
        /// <param name="order"></param>
        /// <param name="err"></param>
        /// <returns></returns>
        public String GetLogMessE(WCS_TASK_ITEM item, byte[] order, String err)
        {
            String message = String.Format(@"【Error】{0}({1}):WCS单号[ {2} ],ID[ {3} ],设备号[ {4} ],异常信息[ {5} ].",
                                           ItemId.GetItemIdName(item.ITEM_ID), item.ITEM_ID, item.WCS_NO, item.ID, item.DEVICE, err);

            return(message);
        }
Beispiel #2
0
        /// <summary>
        /// 创建行车出入库取放货 ITEM 任务
        /// </summary>
        /// <param name="item"></param>
        public void CreateTask_ABC(WCS_TASK_ITEM item)
        {
            try
            {
                // 判断是出入库类型
                switch (item.WCS_NO.Substring(0, 1))
                {
                case "I":       // 入库  行车 (货物)==> 货位
                    // 行车放货
                    task.CreateCustomItem(item.WCS_NO, ItemId.行车放货, item.DEVICE, "", item.LOC_TO, ItemStatus.请求执行);
                    break;

                case "O":       // 出库  货位 (货物)==> 行车
                    // 行车取货
                    task.CreateCustomItem(item.WCS_NO, ItemId.行车取货, item.DEVICE, "", item.LOC_TO, ItemStatus.请求执行);
                    break;

                default:
                    break;
                }
                //行车&运输车初始任务更新状态——完成
                task.UpdateItem(item.WCS_NO, item.ITEM_ID, ItemColumnName.作业状态, ItemStatus.完成任务);
            }
            catch (Exception ex)
            {
                //恢复
                task.UpdateItem(item.WCS_NO, item.ITEM_ID, ItemColumnName.作业状态, ItemStatus.交接中);
                task.DeleteItem(item.WCS_NO, ItemId.行车取货);
                task.DeleteItem(item.WCS_NO, ItemId.行车放货);
                throw ex;
            }
        }
Beispiel #3
0
 public ABCTack(WCS_TASK_ITEM item, string deviceType, byte[] order) : base(item, deviceType, order)
 {
     _device = new ABC(ITEM.DEVICE);
     log     = new Log("Task_ABC-" + ITEM.ID + "-");
     // 记录生成指令LOG
     log.LOG(DataControl._mTaskTools.GetLogMessC(item, order));
 }
Beispiel #4
0
 /// <summary>
 /// AGV 装货中
 /// </summary>
 /// <param name="id"></param>
 /// <param name="agv"></param>
 public void SubmitAgvLoading(int id, string agv)
 {
     try
     {
         // 获取对应AGV任务资讯
         String    sql = String.Format(@"select * from wcs_agv_info where MAGIC = '{0}' and ID = '{1}' and AGV = '{2}'", AGVMagic.到达装货点, id.ToString(), agv);
         DataTable dt  = DataControl._mMySql.SelectAll(sql);
         if (DataControl._mStools.IsNoData(dt))
         {
             // LOG
             DataControl._mTaskTools.RecordTaskErrLog("SubmitNDCPlcLoading()", "AGV装货中[AGV任务ID,AGV设备号]", id.ToString(), agv, "找不到对应AGV任务资讯!");
             return;
         }
         WCS_AGV_INFO info = dt.ToDataEntity <WCS_AGV_INFO>();
         // 生成包装线固定辊台指令
         FRT frt = new FRT(info.PICKSTATION);
         // 获取指令-- 反向送货
         byte[] order = FRT._RollerControl(frt.FRTNum(), FRT.RollerRunAll, FRT.RunObverse, FRT.GoodsDeliver, FRT.GoodsQty1);
         // 加入任务作业链表
         WCS_TASK_ITEM item = new WCS_TASK_ITEM()
         {
             ITEM_ID = "包装线送货",
             WCS_NO  = info.TASK_UID,
             ID      = info.ID,
             DEVICE  = info.PICKSTATION,
             LOC_TO  = info.AGV
         };
         DataControl._mTaskControler.StartTask(new AGVFRTTack(item, DeviceType.固定辊台, order));
     }
     catch (Exception ex)
     {
         // LOG
         DataControl._mTaskTools.RecordTaskErrLog("SubmitNDCPlcLoading()", "AGV装货中[AGV任务ID,AGV设备号]", id.ToString(), agv, ex.ToString());
     }
 }
Beispiel #5
0
        /// <summary>
        /// 发送命令日志
        /// </summary>
        /// <param name="item"></param>
        /// <param name="order"></param>
        /// <returns></returns>
        public String GetLogMess(WCS_TASK_ITEM item, byte[] order)
        {
            String ORDER   = DataControl._mStools.BytetToString(order);
            String message = String.Format(@"【SendOrder】{0}({1}):WCS单号[ {2} ],ID[ {3} ],设备号[ {4} ],来源[ {5} ],目标[ {6} ],指令[ {7} ].",
                                           ItemId.GetItemIdName(item.ITEM_ID), item.ITEM_ID, item.WCS_NO, item.ID, item.DEVICE, item.LOC_FROM, item.LOC_TO, ORDER);

            return(message);
        }
Beispiel #6
0
 public AGVFRTTack(WCS_TASK_ITEM item, string deviceType, byte[] order) : base(item, deviceType, order)
 {
     _device = new FRT(ITEM.DEVICE);
     log     = new Log("AGV_FRT-" + ITEM.ID + "-");
     // 记录生成指令LOG
     log.LOG(String.Format(@"【CreatOrder】{0}:WMS任务ID[ {1} ],AGV任务ID[ {2} ],设备号[ {3} ], 指令[ {4} ].",
                           item.ITEM_ID, item.WCS_NO, item.ID, item.DEVICE, DataControl._mStools.BytetToString(order)));
 }
Beispiel #7
0
        /// <summary>
        /// 创建摆渡车&运输车对接出入库 ITEM 任务
        /// </summary>
        /// <param name="item"></param>
        public void CreateTask_ARF_RGV(WCS_TASK_ITEM item)
        {
            String wcsno_R  = "";
            String itemid_R = "";
            String device_R = "";

            try
            {
                // 查看运输车是否到位
                String    sql_R    = String.Format(@"select WCS_NO, ITEM_ID, DEVICE from WCS_TASK_ITEM where STATUS = 'R' and WCS_NO = '{0}' and ITEM_ID = '{1}'", item.WCS_NO, ItemId.运输车复位1);
                DataTable dtitem_R = mySQL.SelectAll(sql_R);
                if (tools.IsNoData(dtitem_R))
                {
                    return;
                }
                wcsno_R  = dtitem_R.Rows[0]["WCS_NO"].ToString();
                itemid_R = dtitem_R.Rows[0]["ITEM_ID"].ToString();
                device_R = dtitem_R.Rows[0]["DEVICE"].ToString();
                // 判断是出入库类型
                switch (item.WCS_NO.Substring(0, 1))
                {
                case "I":       // 入库  摆渡车 (货物)==> 运输车
                    // 先动运输车滚棒
                    task.CreateCustomItem(item.WCS_NO, ItemId.运输车入库, device_R, "", "", ItemStatus.请求执行);
                    // 后动摆渡车滚棒
                    task.CreateCustomItem(item.WCS_NO, ItemId.摆渡车入库, item.DEVICE, "", device_R, ItemStatus.请求执行);     //入库目的为运输车
                    break;

                case "O":       // 出库  运输车 (货物)==> 摆渡车
                    // 先动摆渡车滚棒
                    task.CreateCustomItem(item.WCS_NO, ItemId.摆渡车出库, item.DEVICE, "", "", ItemStatus.请求执行);
                    // 后动运输车滚棒
                    task.CreateCustomItem(item.WCS_NO, ItemId.运输车出库, device_R, "", item.DEVICE, ItemStatus.请求执行);     //出库目的为摆渡车
                    break;

                default:
                    break;
                }
                //摆渡车&运输车初始任务更新状态——完成
                task.UpdateItem(item.WCS_NO, item.ITEM_ID, ItemColumnName.作业状态, ItemStatus.完成任务);
                task.UpdateItem(wcsno_R, itemid_R, ItemColumnName.作业状态, ItemStatus.完成任务);
            }
            catch (Exception ex)
            {
                //恢复
                task.UpdateItem(item.WCS_NO, item.ITEM_ID, ItemColumnName.作业状态, ItemStatus.交接中);
                task.UpdateItem(wcsno_R, itemid_R, ItemColumnName.作业状态, ItemStatus.交接中);
                task.DeleteItem(item.WCS_NO, ItemId.运输车入库);
                task.DeleteItem(item.WCS_NO, ItemId.摆渡车入库);
                task.DeleteItem(item.WCS_NO, ItemId.摆渡车出库);
                task.DeleteItem(item.WCS_NO, ItemId.运输车出库);
                throw ex;
            }
        }
Beispiel #8
0
        /// <summary>
        /// 创建运输车&行车对接出入库 ITEM 任务
        /// </summary>
        /// <param name="item"></param>
        public void CreateTask_RGV_ABC(WCS_TASK_ITEM item)
        {
            String wcsno_R  = "";
            String itemid_R = "";
            String device_R = "";

            try
            {
                // 查看运输车是否在运输车对接待命点
                String    sql_R    = String.Format(@"select WCS_NO, ITEM_ID, DEVICE from WCS_TASK_ITEM where STATUS = 'R' and WCS_NO = '{0}' and ITEM_ID = '{1}'", item.WCS_NO, ItemId.运输车定位);
                DataTable dtitem_R = mySQL.SelectAll(sql_R);
                if (tools.IsNoData(dtitem_R))
                {
                    return;
                }
                wcsno_R  = dtitem_R.Rows[0]["WCS_NO"].ToString();
                itemid_R = dtitem_R.Rows[0]["ITEM_ID"].ToString();
                device_R = dtitem_R.Rows[0]["DEVICE"].ToString();
                // 判断是出入库类型
                switch (item.WCS_NO.Substring(0, 1))
                {
                case "I":       // 入库  运输车 (货物)==> 行车
                    // 行车取货
                    task.CreateCustomItem(item.WCS_NO, ItemId.行车取货, item.DEVICE, "", item.LOC_TO, ItemStatus.请求执行);
                    break;

                case "O":       // 出库  行车 (货物)==> 运输车
                    // 行车放货
                    task.CreateCustomItem(item.WCS_NO, ItemId.行车放货, item.DEVICE, "", item.LOC_TO, ItemStatus.请求执行);
                    break;

                default:
                    break;
                }
                //行车&运输车初始任务更新状态——完成
                task.UpdateItem(item.WCS_NO, item.ITEM_ID, ItemColumnName.作业状态, ItemStatus.完成任务);
                task.UpdateItem(wcsno_R, itemid_R, ItemColumnName.作业状态, ItemStatus.完成任务);
            }
            catch (Exception ex)
            {
                //恢复
                task.UpdateItem(item.WCS_NO, item.ITEM_ID, ItemColumnName.作业状态, ItemStatus.交接中);
                task.UpdateItem(wcsno_R, itemid_R, ItemColumnName.作业状态, ItemStatus.交接中);
                task.DeleteItem(item.WCS_NO, ItemId.行车取货);
                task.DeleteItem(item.WCS_NO, ItemId.行车放货);
                throw ex;
            }
        }
Beispiel #9
0
        /// <summary>
        /// 下发设备指令(除滚棒任务)
        /// </summary>
        /// <param name="item"></param>
        public void WriteDeviceNotRoller(WCS_TASK_ITEM item)
        {
            try
            {
                // =>运输车[外]对接目的位置需计算

                // =>组合资讯,下发指令

                //更新状态
                task.UpdateItem(item.WCS_NO, item.ITEM_ID, ItemColumnName.作业状态, ItemStatus.任务中);
            }
            catch (Exception ex)
            {
                //初始化
                task.UpdateItem(item.WCS_NO, item.ITEM_ID, ItemColumnName.作业状态, ItemStatus.请求执行);
                throw ex;
            }
        }
Beispiel #10
0
        /// <summary>
        /// 后续任务作业
        /// </summary>
        /// <param name="item"></param>
        public void Task_Continued(WCS_TASK_ITEM item)
        {
            try
            {
                // 任务目的比对检测
                CheckTask(item.WCS_NO, item.LOC_TO);

                // 清单是[结束]状态不作业
                if (task.GetCommandStep(item.WCS_NO) == CommandStep.结束)
                {
                    return;
                }

                // Item非[完成]状态不作业
                if (item.STATUS != ItemStatus.完成任务)
                {
                    return;
                }

                // 依出入库类型处理
                switch (item.WCS_NO.Substring(0, 1))
                {
                case "I":       //入库
                    ProcessInTask(item);
                    break;

                case "O":       //出库
                    ProcessOutTask(item);
                    break;

                default:
                    break;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Beispiel #11
0
        /// <summary>
        /// 创建摆渡车&固定辊台对接出入库 ITEM 任务
        /// </summary>
        /// <param name="item"></param>
        public void CreateTask_ARF_FRT(WCS_TASK_ITEM item)
        {
            try
            {
                // 判断是出入库类型
                switch (item.WCS_NO.Substring(0, 1))
                {
                case "I":       // 入库  固定辊台 (货物)==> 摆渡车
                    // 先动摆渡车滚棒
                    task.CreateCustomItem(item.WCS_NO, ItemId.摆渡车入库, item.DEVICE, "", "", ItemStatus.请求执行);
                    // 后动固定辊台滚棒
                    task.CreateCustomItem(item.WCS_NO, ItemId.固定辊台入库, task.GetFRTDevice(item.LOC_TO), "", item.DEVICE, ItemStatus.请求执行);     //入库目的为摆渡车
                    break;

                case "O":       // 出库  摆渡车 (货物)==> 固定辊台
                    // 先动固定辊台滚棒
                    task.CreateCustomItem(item.WCS_NO, ItemId.固定辊台出库, task.GetFRTDevice(item.LOC_TO), "", "", ItemStatus.请求执行);
                    // 后动摆渡车滚棒
                    task.CreateCustomItem(item.WCS_NO, ItemId.摆渡车出库, item.DEVICE, "", task.GetFRTDevice(item.LOC_TO), ItemStatus.请求执行);     //出库目的为固定辊台
                    break;

                default:
                    break;
                }
                //摆渡车初始任务更新状态——完成
                task.UpdateItem(item.WCS_NO, item.ITEM_ID, ItemColumnName.作业状态, ItemStatus.完成任务);
            }
            catch (Exception ex)
            {
                //恢复
                task.UpdateItem(item.WCS_NO, item.ITEM_ID, ItemColumnName.作业状态, ItemStatus.交接中);
                task.DeleteItem(item.WCS_NO, ItemId.固定辊台入库);
                task.DeleteItem(item.WCS_NO, ItemId.固定辊台出库);
                task.DeleteItem(item.WCS_NO, ItemId.摆渡车入库);
                task.DeleteItem(item.WCS_NO, ItemId.摆渡车出库);
                throw ex;
            }
        }
Beispiel #12
0
        private void UpdateTask()
        {
            String    sql = String.Format(@"select * From wcs_task_item where id = '{0}'", _ID);
            DataTable dt  = DataControl._mMySql.SelectAll(sql);

            if (DataControl._mStools.IsNoData(dt))
            {
                Notice.Show("异常:找不到资讯!", "错误", 3, MessageBoxIcon.Error);
                this.Close();
            }
            WCS_TASK_ITEM item = dt.ToDataEntity <WCS_TASK_ITEM>();

            // 锁定
            TBwcsno.Text       = item.WCS_NO;
            TBlocfrom.Text     = item.LOC_FROM;
            TBlocto.Text       = item.LOC_TO;
            CBitemid.Text      = item.ITEM_ID + " - " + ItemId.GetItemIdName(item.ITEM_ID);
            TBwcsno.IsEnabled  = false;
            CBitemid.IsEnabled = false;
            AddCombBoxForDev(item.DEVICE, item.STATUS);
            BTNuse.Content = "更新";
            _DEV           = item.DEVICE;
        }
Beispiel #13
0
        /// <summary>
        /// 生成对应辊台任务指令
        /// </summary>
        /// <param name="agv"></param>
        public void CreatOrderTask(WCS_AGV_INFO agv)
        {
            try
            {
                // 按任务当前状态处理
                switch (Convert.ToInt32(agv.MAGIC))
                {
                case AGVMagic.到达装货点:
                    // 获取对应包装线固定辊台资讯
                    FRT frt = new FRT(agv.PICKSTATION);
                    // 是否作业中
                    if (frt.CurrentStatus() != FRT.RollerStop)
                    {
                        return;
                    }
                    // 是否存在货物
                    //if (frt.GoodsStatus() == FRT.GoodsYesAll)
                    if (frt.GoodsStatus() == FRT.GoodsYesAll || PublicParam.IsIgnoreFRT)      //add调试判断
                    {
                        // 分配 WMS TASK
                        if (String.IsNullOrEmpty(agv.TASK_UID.Trim()))
                        {
                            // 获取WMS TASK ID
                            String    sql = String.Format(@"select TASK_UID from wcs_task_info where TASK_TYPE = '{0}' and W_S_LOC = '{1}' and TASK_UID not in 
(select DISTINCT TASK_UID from wcs_agv_info where TASK_UID is not null)", TaskType.AGV搬运, DataControl._mTaskTools.GetArea(agv.PICKSTATION));
                            DataTable dt  = DataControl._mMySql.SelectAll(sql);
                            if (DataControl._mStools.IsNoData(dt))
                            {
                                // LOG
                                DataControl._mTaskTools.RecordTaskErrLog("CreatOrderTask()", "AGV辊台任务[AGV任务ID]", agv.ID.ToString(), "", "无对应 WMS Task!");
                                return;
                            }
                            // 更新AGV任务资讯-- WMS TASK ID
                            agv.TASK_UID = dt.Rows[0]["TASK_UID"].ToString();
                            sql          = String.Format(@"update wcs_agv_info set TASK_UID = '{1}' where ID = '{0}'", agv.ID, agv.TASK_UID);
                            DataControl._mMySql.ExcuteSql(sql);
                        }

                        // 分配卸货点
                        if (agv.UPDATE_TIME == null)
                        {
                            // 获取 WMS 任务目标点
                            String    sqlloc = String.Format(@"select distinct DEVICE from wcs_config_device where FLAG in('{1}','{2}') and TYPE = '{3}' 
                                                                   and AREA in (select W_D_LOC from wcs_task_info where TASK_UID = '{0}')
	                                                               and DEVICE in (select distinct DROPSTATION From wcs_agv_info where MAGIC <> {4} group by DROPSTATION HAVING count(DROPSTATION) < {5})
                                                                 order by FLAG,CREATION_TIME", agv.TASK_UID, DeviceFlag.占用, DeviceFlag.空闲, DeviceType.固定辊台, AGVMagic.任务完成, 3);//最多三辆车
                            DataTable dtloc  = DataControl._mMySql.SelectAll(sqlloc);
                            if (DataControl._mStools.IsNoData(dtloc))
                            {
                                // LOG
                                DataControl._mTaskTools.RecordTaskErrLog("CreatOrderTask()", "AGV辊台任务[AGV任务ID]", agv.ID.ToString(), "", "无对应 WMS Task 目标位置!");
                                return;
                            }
                            // 更新AGV任务资讯-- 卸货点
                            agv.DROPSTATION = dtloc.Rows[0]["DEVICE"].ToString();
                            sqlloc          = String.Format(@"update wcs_agv_info set UPDATE_TIME = NOW(), DROPSTATION = '{1}' where ID = '{0}';
                                                         update wcs_config_device set FLAG = '{2}' where DEVICE = '{1}'", agv.ID, agv.DROPSTATION, DeviceFlag.占用);
                            DataControl._mMySql.ExcuteSql(sqlloc);

                            // 发送 NDC 更新点位
                            UpdateAGVStation(agv.ID, agv.DROPSTATION);
                        }

                        // 发指令请求AGV启动辊台装货
                        if (!DataControl._mNDCControl.DoLoad(agv.ID, Convert.ToInt32(agv.AGV), out string result))
                        {
                            // LOG
                            DataControl._mTaskTools.RecordTaskErrLog("CreatOrderTask()", "AGV辊台任务[AGV任务ID]", agv.ID.ToString(), "", result.ToString());
                            return;
                        }
                    }

                    break;

                case AGVMagic.到达卸货点:
                    // 获取对应包装线固定辊台资讯
                    FRT frtdrop = new FRT(agv.DROPSTATION);
                    // 是否作业中
                    if (frtdrop.CurrentStatus() != FRT.RollerStop)
                    {
                        // 当已启动辊台
                        if (frtdrop.CurrentTask() == FRT.TaskTake && (frtdrop.CurrentStatus() == FRT.RollerRun1 || frtdrop.CurrentStatus() == FRT.RollerRunAll))
                        {
                            // 发指令请求AGV启动辊台装货
                            if (!DataControl._mNDCControl.DoUnLoad(agv.ID, Convert.ToInt32(agv.AGV), out string result))
                            {
                                // LOG
                                DataControl._mTaskTools.RecordTaskErrLog("CreatOrderTask()", "AGV辊台任务[AGV任务ID]", agv.ID.ToString(), "", result.ToString());
                                return;
                            }
                        }
                        return;
                    }
                    else     // 未启动辊台
                    {
                        byte[] order = null;
                        // 当辊台都无货
                        //if (frtdrop.GoodsStatus() == FRT.GoodsNoAll)
                        if (frtdrop.GoodsStatus() == FRT.GoodsNoAll || PublicParam.IsIgnoreFRT)     //add调试判断
                        {
                            // 获取指令-- 启动所有辊台 正向接货
                            order = FRT._RollerControl(frtdrop.FRTNum(), FRT.RollerRunAll, FRT.RunFront, FRT.GoodsReceive, FRT.GoodsQty1);
                        }
                        // 当仅2#辊台有货
                        else if (frtdrop.GoodsStatus() == FRT.GoodsYes2)
                        {
                            // 获取指令-- 只启动1#辊台 正向接货
                            order = FRT._RollerControl(frtdrop.FRTNum(), FRT.RollerRun1, FRT.RunFront, FRT.GoodsReceive, FRT.GoodsQty1);
                        }
                        // 加入任务作业链表
                        WCS_TASK_ITEM item = new WCS_TASK_ITEM()
                        {
                            ITEM_ID  = "库区接货",
                            WCS_NO   = agv.TASK_UID,
                            ID       = agv.ID,
                            DEVICE   = agv.DROPSTATION,
                            LOC_FROM = agv.AGV
                        };
                        DataControl._mTaskControler.StartTask(new AGVFRTTack(item, DeviceType.固定辊台, order));
                    }

                    break;

                default:
                    return;
                }
            }
            catch (Exception ex)
            {
                // LOG
                DataControl._mTaskTools.RecordTaskErrLog("CreatOrderTask()", "AGV辊台任务[AGV任务ID]", agv.ID.ToString(), "", ex.ToString());
            }
        }
Beispiel #14
0
        /// <summary>
        /// 分配任务设备
        /// </summary>
        /// <param name="item"></param>
        public void ReadDevice(WCS_TASK_ITEM item)
        {
            try
            {
                // 获取任务所在固定辊台
                String frt = task.GetFRTByWCSNo(item.WCS_NO);
                if (String.IsNullOrEmpty(frt))
                {
                    return;
                }

                // 获取任务所在作业区域
                String area = task.GetArea(frt);
                if (String.IsNullOrEmpty(frt))
                {
                    return;
                }

                switch (item.ITEM_ID.Substring(0, 2))
                {
                case "01":
                    #region 摆渡车
                    // 获取作业区域内空闲的摆渡车
                    List <WCS_CONFIG_DEVICE> dList_ARF = task.GetDeviceList(area, DeviceType.摆渡车);
                    // 确认其中最适合的摆渡车

                    // =>根据任务讯息获取位置允许范围可用设备

                    // =>确认设备

                    //更新状态
                    task.UpdateItem(item.WCS_NO, item.ITEM_ID, ItemColumnName.作业状态, ItemStatus.请求执行);
                    #endregion
                    break;

                case "02":
                    #region 运输车
                    // =>根据任务讯息获取位置允许范围可用设备

                    // =>确认设备

                    //更新状态
                    task.UpdateItem(item.WCS_NO, item.ITEM_ID, ItemColumnName.作业状态, ItemStatus.请求执行);
                    #endregion
                    break;

                case "03":
                    #region 行车
                    // =>根据任务讯息获取位置允许范围可用设备

                    // =>确认设备

                    //更新状态
                    task.UpdateItem(item.WCS_NO, item.ITEM_ID, ItemColumnName.作业状态, ItemStatus.请求执行);
                    #endregion
                    break;

                default:
                    break;
                }
            }
            catch (Exception ex)
            {
                //初始化
                task.UpdateItem(item.WCS_NO, item.ITEM_ID, ItemColumnName.作业状态, ItemStatus.可执行);
                throw ex;
            }
        }
Beispiel #15
0
        /// <summary>
        /// 出库任务处理
        /// </summary>
        /// <param name="item"></param>
        public void ProcessOutTask(WCS_TASK_ITEM item)
        {
            try
            {
                // 运输车
                String rgv;
                // 摆渡车于运输车对接点
                String AR = ConfigurationManager.AppSettings["StandbyAR"];
                // 运输车[外]待命复位点
                String R1 = ConfigurationManager.AppSettings["StandbyP1"];
                // 运输车[内]待命复位点
                String R2 = ConfigurationManager.AppSettings["StandbyP2"];
                // 运输车于运输车对接点
                String RR = ConfigurationManager.AppSettings["StandbyRR"];

                // 获取对应清单
                String    sql = String.Format(@"select FRT, TASK_UID_1,LOC_FROM_1,SITE_1, TASK_UID_2,LOC_FROM_2,SITE_2 from wcs_command_v where WCS_NO = '{0}'", item.WCS_NO);
                DataTable dt  = mySQL.SelectAll(sql);
                if (tools.IsNoData(dt))
                {
                    return;
                }
                String frt     = dt.Rows[0]["FRT"].ToString();        // 锁定固定辊台
                String taskid1 = dt.Rows[0]["TASK_UID_1"].ToString(); //任务1
                String taskid2 = dt.Rows[0]["TASK_UID_2"].ToString(); //任务2
                String site1   = dt.Rows[0]["SITE_1"].ToString();     //状态1
                String site2   = dt.Rows[0]["SITE_2"].ToString();     //状态2
                String loc1    = dt.Rows[0]["LOC_FROM_1"].ToString(); //来源点1
                String loc2    = dt.Rows[0]["LOC_FROM_2"].ToString(); //来源点2

                // 默认出库时 taskid1对接运输车设备辊台①、taskid2对接运输车设备辊台②
                String loc_1 = task.GetRGVLoc(1, loc1); //辊台①任务1
                String loc_2 = task.GetRGVLoc(2, loc2); //辊台②任务2

                switch (item.ITEM_ID)                   //根据最后的设备指令,可得货物已在流程中该设备对接的下一设备处
                {
                case ItemId.行车取货:
                    #region 行车轨道定位与运输车对接点
                    // 生成行车库存定位任务
                    task.CreateCustomItem(item.WCS_NO, ItemId.行车轨道定位, item.DEVICE, "", task.GetABCTrackLoc(item.LOC_TO), ItemStatus.请求执行);
                    #endregion

                    break;

                case ItemId.行车放货:
                    #region 将运输车复位待命点 / 将运输车移至行车对接位置 && 行车库存定位
                    // 获取当前运输车加以分配
                    rgv = task.GetItemDeviceLast(item.WCS_NO, ItemId.运输车定位);
                    // 流程上确认是先分配运输车辊台①放置货物,即现确认运输车辊台②是否有货
                    // => 获取当前运输车资讯
                    // => 辊台②是否有货?

                    // 有货 则将运输车复位待命点
                    // => 当前设备位置 > 运输车[内]待命复位点 ?  运输车[内]复位 :运输车[外]复位
                    task.CreateCustomItem(item.WCS_NO, ItemId.运输车复位2, rgv, "", R2, ItemStatus.请求执行);
                    task.CreateCustomItem(item.WCS_NO, ItemId.运输车复位1, rgv, "", R1, ItemStatus.请求执行);

                    // 无货 则将运输车移至行车对接位置 && 行车库存定位
                    // 生成运输车定位任务
                    task.CreateCustomItem(item.WCS_NO, ItemId.运输车定位, rgv, "", loc_2, ItemStatus.请求执行);
                    // 生成行车库存定位任务
                    task.CreateCustomItem(item.WCS_NO, ItemId.行车库存定位, item.DEVICE, "", task.GetABCTrackLoc(loc2), ItemStatus.请求执行);
                    #endregion

                    break;

                case ItemId.运输车出库:
                    #region 将摆渡车移至固定辊台对接点 / 将运输车移至摆渡车对接点(复位待命点1)
                    // 获取当前运输车加以分配
                    rgv = task.GetItemDeviceLast(item.WCS_NO, ItemId.运输车定位);
                    // => 获取当前运输车资讯

                    // => 当位置在待命点1时,判断为将货物移至摆渡车
                    // 生成将摆渡车移至固定辊台对接点任务
                    String ARFloc = task.GetARFLoc(frt);        //获取对应摆渡车位置
                    task.CreateCustomItem(item.WCS_NO, ItemId.摆渡车定位固定辊台, item.LOC_TO, "", ARFloc, ItemStatus.请求执行);

                    // => 当位置在待命点2时,判断为将货物移至运输车[外]
                    // 生成将运输车复位待命点1任务
                    task.CreateCustomItem(item.WCS_NO, ItemId.运输车复位1, item.LOC_TO, "", R1, ItemStatus.请求执行);
                    #endregion

                    break;

                default:
                    break;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Beispiel #16
0
        /// <summary>
        /// 入库任务处理
        /// </summary>
        /// <param name="item"></param>
        public void ProcessInTask(WCS_TASK_ITEM item)
        {
            try
            {
                // 摆渡车于运输车对接点
                String AR = ConfigurationManager.AppSettings["StandbyAR"];
                // 运输车[内]待命复位点
                String R = ConfigurationManager.AppSettings["StandbyP2"];
                // 运输车于运输车对接点
                String RR = ConfigurationManager.AppSettings["StandbyRR"];

                // 获取对应清单
                String    sql = String.Format(@"select TASK_UID_1,LOC_TO_1,SITE_1, TASK_UID_2,LOC_TO_2,SITE_2 from wcs_command_v where WCS_NO = '{0}'", item.WCS_NO);
                DataTable dt  = mySQL.SelectAll(sql);
                if (tools.IsNoData(dt))
                {
                    return;
                }
                String taskid1 = dt.Rows[0]["TASK_UID_1"].ToString(); //任务1
                String taskid2 = dt.Rows[0]["TASK_UID_2"].ToString(); //任务2
                String site1   = dt.Rows[0]["SITE_1"].ToString();     //状态1
                String site2   = dt.Rows[0]["SITE_2"].ToString();     //状态2
                String loc1    = dt.Rows[0]["LOC_TO_1"].ToString();   //目标点1
                String loc2    = dt.Rows[0]["LOC_TO_2"].ToString();   //目标点2

                // 默认入库时 taskid1对接运输车设备辊台②、taskid2对接运输车设备辊台①
                String loc_1 = task.GetRGVLoc(2, loc1); //辊台②任务1
                String loc_2 = task.GetRGVLoc(1, loc2); //辊台①任务2
                String loc;                             //执行目标

                switch (item.ITEM_ID)                   //根据最后的设备指令,可得货物已在流程中该设备对接的下一设备处
                {
                case ItemId.固定辊台入库:                     //目的设备为对接的摆渡车,可直接加以分配
                    #region 将摆渡车移至运输车对接位置
                    // 可断定货物需移至运输车
                    // 生成摆渡车任务
                    task.CreateCustomItem(item.WCS_NO, ItemId.摆渡车定位运输车对接, item.LOC_TO, "", AR, ItemStatus.请求执行);
                    #endregion

                    break;

                case ItemId.摆渡车入库:      //目的设备为对接的运输车,可直接加以分配
                    #region 将运输车移至行车对接位置 || 运输车间对接
                    // 根据货物目的地判断是否需要运输车对接运输车
                    loc = task.GetLocByRgvToLoc(loc_1, loc_2);
                    if (loc == "NG")
                    {
                        //不能没有货物目的位置
                        break;
                    }
                    // 判断是否需要对接到运输车[内]范围内作业
                    if (Convert.ToInt32(loc) >= Convert.ToInt32(R))      // 需对接运输车[内]
                    {
                        // 生成运输车[内]复位任务
                        task.CreateItem(item.WCS_NO, ItemId.运输车复位2, R);        // 待分配设备
                        // 生成运输车[外]对接位任务
                        task.CreateCustomItem(item.WCS_NO, ItemId.运输车对接定位, item.LOC_TO, "", RR, ItemStatus.请求执行);
                    }
                    else
                    {
                        // 生成运输车[外]定位任务
                        task.CreateCustomItem(item.WCS_NO, ItemId.运输车定位, item.LOC_TO, "", loc, ItemStatus.请求执行);
                    }
                    #endregion

                    break;

                case ItemId.运输车入库:      //目的设备为对接的运输车,可直接加以分配
                    #region 将运输车移至行车对接位置
                    // 判断是否作业过运输车定位对接行车任务
                    String    sqlrr = String.Format(@"select * from wcs_task_item where ITEM_ID = '033' and STATUS not in ('E','X') and WCS_NO = '{0}'", item.WCS_NO);
                    DataTable dtrr  = mySQL.SelectAll(sqlrr);
                    if (tools.IsNoData(dt))
                    {
                        loc = task.GetLocByRgvToLoc(loc_1, loc_2);
                        if (loc == "NG")
                        {
                            //不能没有货物目的位置
                            break;
                        }
                        // 生成运输车定位任务
                        task.CreateCustomItem(item.WCS_NO, ItemId.运输车定位, item.LOC_TO, "", loc, ItemStatus.请求执行);
                    }
                    #endregion

                    break;

                case ItemId.行车取货:
                    #region 将运输车移至行车对接位置 && 行车定位
                    // 默认入库时 taskid1对接运输车设备辊台②、taskid2对接运输车设备辊台①
                    // 获取当前运输车加以分配
                    String rgv = task.GetItemDeviceLast(item.WCS_NO, ItemId.运输车定位);
                    // =>获取当前运输车资讯
                    // =>获取有货&无货辊台各对应的WMS任务目标
                    String loc_Y = "";      //有货辊台对应目标点
                    String loc_N = "";      //无货辊台对应目标点
                    // 根据当前运输车坐标及任务目标,生成对应运输车定位/对接运输车任务

                    // 生成行车库存定位任务
                    task.CreateCustomItem(item.WCS_NO, ItemId.行车库存定位, item.DEVICE, "", task.GetABCStockLoc(loc_N), ItemStatus.请求执行);
                    #endregion

                    break;

                case ItemId.行车放货:
                    #region 行车定位
                    // 未完成的任务目标点
                    loc = site1 == "Y" ? loc2 : loc1;
                    // 行车到运输车对接取货点
                    String ABCloc = task.GetABCTrackLoc(loc);     //获取对应行车位置
                    // 生成行车轨道定位任务
                    task.CreateCustomItem(item.WCS_NO, ItemId.行车轨道定位, item.DEVICE, "", ABCloc, ItemStatus.请求执行);
                    #endregion

                    break;

                default:
                    break;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Beispiel #17
0
 /// <summary>
 /// 构造函数
 /// </summary>
 /// <param name="item"></param>
 /// <param name="deviceType"></param>
 /// <param name="order"></param>
 public Task(WCS_TASK_ITEM item, string deviceType, byte[] order)
 {
     _ITEM       = item;
     _deviceType = deviceType;
     _order      = order;
 }
Beispiel #18
0
        /// <summary>
        /// 摆渡车复位
        /// </summary>
        /// <param name="dev"></param>
        /// <param name="mes"></param>
        public void ResetLoc_ARF(List <WCS_CONFIG_DEVICE> dev, out string mes)
        {
            try
            {
                // 摆渡车待命点1
                int loc1 = Convert.ToInt32(DataControl._mStools.GetValueByKey("StandbyF1"));
                // 摆渡车待命点2
                int loc2 = Convert.ToInt32(DataControl._mStools.GetValueByKey("StandbyF2"));

                // 获取当前摆渡车资讯
                ARF a1 = new ARF(dev[0].DEVICE);
                ARF a2 = new ARF(dev[1].DEVICE);

                // 定位任务指令
                byte[] order1;
                byte[] order2;

                // 任务明细
                WCS_TASK_ITEM item1;
                WCS_TASK_ITEM item2;

                if (a1.CurrentSite() < a2.CurrentSite())
                {
                    // 定位任务指令
                    order1 = ARF._Position(a1.ARFNum(), (byte)loc1);
                    order2 = ARF._Position(a2.ARFNum(), (byte)loc2);
                    // 任务明细
                    item1 = new WCS_TASK_ITEM()
                    {
                        ITEM_ID = ItemId.摆渡车复位,
                        ID      = 1,
                        DEVICE  = dev[0].DEVICE,
                        LOC_TO  = loc1.ToString()
                    };
                    item2 = new WCS_TASK_ITEM()
                    {
                        ITEM_ID = ItemId.摆渡车复位,
                        ID      = 2,
                        DEVICE  = dev[1].DEVICE,
                        LOC_TO  = loc2.ToString()
                    };
                }
                else
                {
                    // 定位任务指令
                    order1 = ARF._Position(a1.ARFNum(), (byte)loc2);
                    order2 = ARF._Position(a2.ARFNum(), (byte)loc1);
                    // 任务明细
                    item1 = new WCS_TASK_ITEM()
                    {
                        ITEM_ID = ItemId.摆渡车复位,
                        ID      = 1,
                        DEVICE  = dev[0].DEVICE,
                        LOC_TO  = loc2.ToString()
                    };
                    item2 = new WCS_TASK_ITEM()
                    {
                        ITEM_ID = ItemId.摆渡车复位,
                        ID      = 2,
                        DEVICE  = dev[1].DEVICE,
                        LOC_TO  = loc1.ToString()
                    };
                }
                // 加入任务作业链表
                mes = null;
                if (dev[0].FLAG == DeviceFlag.空闲)
                {
                    DataControl._mTaskControler.StartTask(new ARFTack(item1, DeviceType.摆渡车, order1));
                }
                else
                {
                    mes = dev[0].DEVICE + " 摆渡车目前无法操作复位任务; \r";
                }

                if (dev[1].FLAG == DeviceFlag.空闲)
                {
                    DataControl._mTaskControler.StartTask(new ARFTack(item2, DeviceType.摆渡车, order2));
                }
                else
                {
                    mes = mes + dev[0].DEVICE + " 摆渡车目前无法操作复位任务; \r";
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Beispiel #19
0
        /// <summary>
        /// 行车复位
        /// </summary>
        /// <param name="dev"></param>
        /// <param name="mes"></param>
        public void ResetLoc_ABC(List <WCS_CONFIG_DEVICE> dev, out string mes)
        {
            try
            {
                int locY = 1;
                int locZ = 1;
                // 行车待命点1
                int locX1 = Convert.ToInt32(DataControl._mStools.GetValueByKey("StandbyA1"));
                // 行车待命点2
                int locX2 = Convert.ToInt32(DataControl._mStools.GetValueByKey("StandbyA2"));

                // 获取当前摆渡车资讯
                ABC a1 = new ABC(dev[0].DEVICE);
                ABC a2 = new ABC(dev[1].DEVICE);

                // 定位任务指令
                byte[] order1;
                byte[] order2;

                // 任务明细
                WCS_TASK_ITEM item1;
                WCS_TASK_ITEM item2;

                if (DataControl._mStools.BytesToInt(a1.CurrentXsite(), 0) < DataControl._mStools.BytesToInt(a2.CurrentXsite(), 0))
                {
                    // 定位任务指令
                    order1 = ABC._TaskControl(ABC.TaskLocate, a1.ABCNum(), DataControl._mStools.IntToBytes(locX1), DataControl._mStools.IntToBytes(locY), DataControl._mStools.IntToBytes(locZ));
                    order2 = ABC._TaskControl(ABC.TaskLocate, a2.ABCNum(), DataControl._mStools.IntToBytes(locX2), DataControl._mStools.IntToBytes(locY), DataControl._mStools.IntToBytes(locZ));
                    // 任务明细
                    item1 = new WCS_TASK_ITEM()
                    {
                        ITEM_ID = ItemId.行车复位,
                        ID      = 5,
                        DEVICE  = dev[0].DEVICE,
                        LOC_TO  = Convert.ToString(locX1) + "-" + Convert.ToString(locY) + "-" + Convert.ToString(locZ)
                    };
                    item2 = new WCS_TASK_ITEM()
                    {
                        ITEM_ID = ItemId.行车复位,
                        ID      = 6,
                        DEVICE  = dev[1].DEVICE,
                        LOC_TO  = Convert.ToString(locX2) + "-" + Convert.ToString(locY) + "-" + Convert.ToString(locZ)
                    };
                }
                else
                {
                    // 定位任务指令
                    order1 = ABC._TaskControl(ABC.TaskLocate, a1.ABCNum(), DataControl._mStools.IntToBytes(locX2), DataControl._mStools.IntToBytes(locY), DataControl._mStools.IntToBytes(locZ));
                    order2 = ABC._TaskControl(ABC.TaskLocate, a2.ABCNum(), DataControl._mStools.IntToBytes(locX1), DataControl._mStools.IntToBytes(locY), DataControl._mStools.IntToBytes(locZ));
                    // 任务明细
                    item1 = new WCS_TASK_ITEM()
                    {
                        ITEM_ID = ItemId.行车复位,
                        ID      = 5,
                        DEVICE  = dev[0].DEVICE,
                        LOC_TO  = Convert.ToString(locX2) + "-" + Convert.ToString(locY) + "-" + Convert.ToString(locZ)
                    };
                    item2 = new WCS_TASK_ITEM()
                    {
                        ITEM_ID = ItemId.行车复位,
                        ID      = 6,
                        DEVICE  = dev[1].DEVICE,
                        LOC_TO  = Convert.ToString(locX1) + "-" + Convert.ToString(locY) + "-" + Convert.ToString(locZ)
                    };
                }
                // 加入任务作业链表
                mes = null;
                if (dev[0].FLAG == DeviceFlag.空闲)
                {
                    DataControl._mTaskControler.StartTask(new ABCTack(item1, DeviceType.行车, order1));
                }
                else
                {
                    mes = dev[0].DEVICE + " 行车目前无法操作复位任务; \r";
                }

                if (dev[1].FLAG == DeviceFlag.空闲)
                {
                    DataControl._mTaskControler.StartTask(new ABCTack(item2, DeviceType.行车, order2));
                }
                else
                {
                    mes = mes + dev[1].DEVICE + " 行车目前无法操作复位任务; \r";
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Beispiel #20
0
        /// <summary>
        /// 运输车复位
        /// </summary>
        /// <param name="dev"></param>
        /// <param name="mes"></param>
        public void ResetLoc_RGV(List <WCS_CONFIG_DEVICE> dev, out string mes)
        {
            try
            {
                // 运输车待命点1
                int loc1 = Convert.ToInt32(DataControl._mStools.GetValueByKey("StandbyR1"));
                // 运输车待命点2
                int loc2 = Convert.ToInt32(DataControl._mStools.GetValueByKey("StandbyR2"));

                // 获取当前摆渡车资讯
                RGV a1 = new RGV(dev[0].DEVICE);
                RGV a2 = new RGV(dev[1].DEVICE);

                // 定位任务指令
                byte[] order1;
                byte[] order2;

                // 任务明细
                WCS_TASK_ITEM item1;
                WCS_TASK_ITEM item2;

                if (a1.GetCurrentSite() < a2.GetCurrentSite())
                {
                    // 定位任务指令
                    order1 = RGV._Position(a1.RGVNum(), DataControl._mStools.IntToBytes(loc1));
                    order2 = RGV._Position(a2.RGVNum(), DataControl._mStools.IntToBytes(loc2));
                    // 任务明细
                    item1 = new WCS_TASK_ITEM()
                    {
                        ITEM_ID = ItemId.运输车复位1,
                        ID      = 3,
                        DEVICE  = dev[0].DEVICE,
                        LOC_TO  = loc1.ToString()
                    };
                    item2 = new WCS_TASK_ITEM()
                    {
                        ITEM_ID = ItemId.运输车复位2,
                        ID      = 4,
                        DEVICE  = dev[1].DEVICE,
                        LOC_TO  = loc2.ToString()
                    };
                }
                else
                {
                    // 定位任务指令
                    order1 = RGV._Position(a1.RGVNum(), DataControl._mStools.IntToBytes(loc2));
                    order2 = RGV._Position(a2.RGVNum(), DataControl._mStools.IntToBytes(loc1));
                    // 任务明细
                    item1 = new WCS_TASK_ITEM()
                    {
                        ITEM_ID = ItemId.运输车复位2,
                        ID      = 3,
                        DEVICE  = dev[0].DEVICE,
                        LOC_TO  = loc2.ToString()
                    };
                    item2 = new WCS_TASK_ITEM()
                    {
                        ITEM_ID = ItemId.运输车复位1,
                        ID      = 4,
                        DEVICE  = dev[1].DEVICE,
                        LOC_TO  = loc1.ToString()
                    };
                }
                // 加入任务作业链表
                mes = null;
                if (dev[0].FLAG == DeviceFlag.空闲)
                {
                    DataControl._mTaskControler.StartTask(new RGVTack(item1, DeviceType.运输车, order1));
                }
                else
                {
                    mes = dev[0].DEVICE + " 运输车目前无法操作复位任务; \r";
                }

                if (dev[1].FLAG == DeviceFlag.空闲)
                {
                    DataControl._mTaskControler.StartTask(new ARFTack(item2, DeviceType.运输车, order2));
                }
                else
                {
                    mes = mes + dev[1].DEVICE + " 运输车目前无法操作复位任务; \r";
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }