コード例 #1
0
ファイル: MasterFRT.cs プロジェクト: wsmyaopeng/WCS-1
        /// <summary>
        /// 检测任务状态
        /// </summary>
        //public void DoTask()
        //{
        //    if (task == null || task.Count == 0) return;

        //    foreach (TaskFRT t in task)
        //    {
        //        //if (!t.activie) continue;
        //        if (t.taskstatus == TaskStatus.finish) continue;
        //        if (string.IsNullOrEmpty(t.device.devName))
        //        {
        //            DevInfoFRT device = FindFreeDevice(t.area, t.tasktype, t.frt);
        //            if (device != null)
        //            {
        //                t.device = device;
        //                t.device.IsLockUnlock(true, t.jobid);
        //                t.UpdateDev();

        //                // AGV搬运 同辊台第2托货按收2货运行
        //                if (t.fromdev == DevType.AGV &&
        //                   t.device._.GoodsStatus != GoodsEnum.辊台满货 && t.device._.GoodsStatus != GoodsEnum.辊台无货)
        //                {
        //                    t.goodsnum = 2;
        //                }
        //            }
        //        }
        //        else
        //        {
        //            // 故障&异常
        //            if (t.device._.CommandStatus == CommandEnum.命令错误 || t.device._.DeviceStatus == DeviceEnum.设备故障)
        //            {
        //                continue;
        //            }

        //            switch (t.taskstatus)
        //            {
        //                case TaskStatus.init:
        //                    t.UpdateStatus(TaskStatus.totakesite);
        //                    break;

        //                case TaskStatus.totakesite:
        //                    // 无来源设备 直接前往送货点
        //                    if (t.fromdev == DevType.空设备)
        //                    {
        //                        t.UpdateStatus(TaskStatus.togivesite);
        //                    }
        //                    else
        //                    {
        //                        t.UpdateStatus(TaskStatus.ontakesite);
        //                    }
        //                    break;

        //                case TaskStatus.ontakesite:
        //                    // 判断是否启动辊台接货
        //                    if (t.takeready)
        //                    {
        //                        if (t.device._.GoodsStatus != GoodsEnum.辊台满货 && t.device._.ActionStatus == ActionEnum.停止)
        //                        {
        //                            t.device.StartTakeRoll(t.tasktype, t.goodsnum);
        //                        }

        //                        if (t.device._.RollerStatus != RollerStatusEnum.辊台停止 && t.device._.CurrentTask == TaskEnum.辊台任务)
        //                        {
        //                            t.UpdateStatus(TaskStatus.taking);
        //                        }
        //                    }
        //                    else
        //                    {
        //                        // ? JOB 更新请求
        //                        t.takeready = ADS.JobPartFRT_Take(t.jobid, t.fromdev);
        //                    }
        //                    break;

        //                case TaskStatus.taking:
        //                    bool isNext = false;
        //                    switch (t.fromdev)
        //                    {
        //                        case DevType.摆渡车:
        //                            if ((t.goodsnum == 1 && t.device._.GoodsStatus != GoodsEnum.辊台无货 && t.device._.GoodsStatus != GoodsEnum.辊台满货) ||
        //                                (t.goodsnum == 2 && t.device._.GoodsStatus == GoodsEnum.辊台满货))
        //                            {
        //                                isNext = true;
        //                            }
        //                            break;
        //                        case DevType.AGV:
        //                            if ((t.goodsnum == 1 && t.device._.GoodsStatus != GoodsEnum.辊台无货) ||
        //                                (t.goodsnum == 2 && t.device._.GoodsStatus == GoodsEnum.辊台满货))
        //                            {
        //                                isNext = true;
        //                            }
        //                            break;
        //                        default:
        //                            break;
        //                    }
        //                    if (isNext)
        //                    {
        //                        if (t.device._.ActionStatus == ActionEnum.停止)
        //                        {
        //                            t.UpdateStatus(TaskStatus.taked);
        //                        }
        //                    }
        //                    else
        //                    {
        //                        t.device.StartTakeRoll(t.tasktype, t.goodsnum);
        //                    }
        //                    break;

        //                case TaskStatus.taked:
        //                    // AGV搬运 直接完成
        //                    if (t.tasktype == TaskTypeEnum.无)
        //                    {
        //                        t.UpdateStatus(TaskStatus.gived);
        //                    }
        //                    else
        //                    {
        //                        t.UpdateStatus(TaskStatus.togivesite);
        //                    }
        //                    break;

        //                case TaskStatus.togivesite:
        //                    // 无目的设备 直接送货中(出库暂无后续流程)
        //                    if (t.todev == DevType.空设备)
        //                    {
        //                        t.UpdateStatus(TaskStatus.giving);
        //                    }
        //                    else
        //                    {
        //                        t.UpdateStatus(TaskStatus.ongivesite);
        //                    }
        //                    break;

        //                case TaskStatus.ongivesite:
        //                    // 判断是否启动辊台送货
        //                    if (t.giveready)
        //                    {
        //                        if (t.device._.GoodsStatus != GoodsEnum.辊台无货 && t.device._.ActionStatus == ActionEnum.停止)
        //                        {
        //                            t.device.StartGiveRoll(t.tasktype);
        //                        }

        //                        if (t.device._.RollerStatus != RollerStatusEnum.辊台停止 && t.device._.CurrentTask == TaskEnum.辊台任务)
        //                        {
        //                            t.UpdateStatus(TaskStatus.giving);
        //                        }
        //                    }
        //                    else
        //                    {
        //                        // ? JOB 更新请求
        //                        t.giveready = ADS.JobPartFRT_Give(t.jobid);
        //                    }
        //                    break;

        //                case TaskStatus.giving:
        //                    if (t.device._.GoodsStatus == GoodsEnum.辊台无货)
        //                    {
        //                        if (t.device._.ActionStatus == ActionEnum.停止)
        //                        {
        //                            t.UpdateStatus(TaskStatus.gived);
        //                        }
        //                    }
        //                    else
        //                    {
        //                        t.device.StartGiveRoll(t.tasktype);
        //                    }
        //                    break;

        //                case TaskStatus.gived:
        //                    // 解锁设备、完成任务
        //                    t.device.IsLockUnlock(false);
        //                    t.device = new DevInfoFRT();
        //                    t.UpdateStatus(TaskStatus.finish);
        //                    break;
        //                default:
        //                    break;
        //            }
        //        }
        //    }
        //}

        public void DoTaskNew()
        {
            if (devices == null || devices.Count == 0)
            {
                return;
            }

            foreach (DevInfoFRT d in devices)
            {
                try
                {
                    if (!d.isUseful || !ADS.mSocket.IsConnected(d.devName) ||
                        d._.CommandStatus == CommandEnum.命令错误 ||
                        d._.DeviceStatus == DeviceEnum.设备故障)
                    {
                        continue;
                    }
                    if (d._.CurrentTask == TaskEnum.辊台任务 && d._.FinishTask == TaskEnum.辊台任务)
                    {
                        d.StopRoller();
                    }

                    switch (d.taskType)
                    {
                    case TaskTypeEnum.入库:
InTask:
                        if (d.isLock)
                        {
                            if (d._.GoodsStatus == GoodsEnum.辊台无货)
                            {
                                // 锁定摆渡车
                                if (ADS.mArf.LockARF(d.area, d.taskType))
                                {
                                    // 解锁
                                    d.IsLockUnlockNew(false);
                                    d.StopRoller();
                                }
                            }
                            else
                            {
                                // 判断当前运输车任务
                                if (ADS.mRgv.GetNowTaskType(d.area) != TaskTypeEnum.出库)
                                {
                                    // 空闲摆渡车
                                    if (ADS.mArf.IsFreeARF(d.area, d.taskType))
                                    {
                                        int site = CommonSQL.GetArfByFrt(d.devName);
                                        if (site == 0)
                                        {
                                            throw new Exception("无对应固定辊台-摆渡车对接点!");
                                        }

                                        // 摆渡车来接货
                                        if (ADS.mArf.MovingButtSite(d.area, d.taskType, site))
                                        {
                                            // 启动摆渡车接货
                                            if (ADS.mArf.IsTaking(d.area, d.taskType))
                                            {
                                                // 送货
                                                d.StartGiveRoll(d.taskType);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        else
                        {
                            // agv任务
                            int aid = ADS.mNDCControl.IsExistUnLoad(d.devName);

                            if (d._.ActionStatus == ActionEnum.停止)
                            {
                                switch (d._.GoodsStatus)
                                {
                                case GoodsEnum.辊台无货:
                                    if (aid != 0)
                                    {
                                        // 只启动辊台2扫码
                                        d.StartTakeRoll(d.taskType, 1, true);
                                        d.isAGV = true;
                                    }
                                    else
                                    {
                                        if (!string.IsNullOrEmpty(d.lockID1))
                                        {
                                            d.IsLockUnlockNew(false);
                                        }
                                    }
                                    break;

                                case GoodsEnum.辊台中间有货:
                                case GoodsEnum.辊台2有货:
                                    if (string.IsNullOrEmpty(d.lockID1))
                                    {
                                        //MessageBox.Show(d.devName + "辊台没扫到码!");
                                        throw new Exception(d.devName + "辊台没扫到码!");
                                    }
                                    else
                                    {
                                        if (aid != 0)
                                        {
                                            // 接货到辊台2
                                            d.StartTakeRoll(d.taskType, 2);
                                            d.isAGV = true;
                                        }
                                        else
                                        {
                                            // 接货到辊台1
                                            d.StartTakeRoll(d.taskType, 1);
                                            d.isAGV = false;
                                        }
                                    }
                                    break;

                                case GoodsEnum.辊台1有货:
                                    if (aid != 0)
                                    {
                                        // 接货到辊台2
                                        d.StartTakeRoll(d.taskType, 2);
                                        d.isAGV = true;
                                    }
                                    else
                                    {
                                        if (!PublicParam.IsDoJobIn)
                                        {
                                            break;
                                        }

                                        // 每次只能做一个辊台
                                        if (IsLockInFRT(d.area))
                                        {
                                            break;
                                        }

                                        // 是否满足任务
                                        if (!string.IsNullOrEmpty(d.lockID1))
                                        {
                                            // 是否有超时任务
                                            if (CommonSQL.IsTimeOut(d.lockID1))
                                            {
                                                // 锁定
                                                d.IsLockUnlockNew(true, d.lockID1);
                                                goto InTask;
                                            }
                                        }
                                    }
                                    break;

                                case GoodsEnum.辊台满货:

                                    if (!PublicParam.IsDoJobIn)
                                    {
                                        break;
                                    }

                                    // 每次只能做一个辊台
                                    if (IsLockInFRT(d.area))
                                    {
                                        break;
                                    }

                                    // 是否满足任务
                                    if (!string.IsNullOrEmpty(d.lockID1) && !string.IsNullOrEmpty(d.lockID2))
                                    {
                                        // 锁定
                                        d.IsLockUnlockNew(true, d.lockID1, d.lockID2);
                                        goto InTask;
                                    }
                                    break;

                                default:
                                    break;
                                }
                            }
                            else
                            {
                                if (aid != 0)
                                {
                                    if (d.isAGV)
                                    {
                                        // NDC 请求 AGV 启动辊台卸货
                                        if (!ADS.mNDCControl.DoUnLoad(aid, out string result))
                                        {
                                            // LOG
                                            CommonSQL.LogErr("FRT.DoTaskNew()", "AGV辊台卸货[ID]", result, aid.ToString());
                                        }
                                    }
                                }
                            }
                        }
                        break;

                    case TaskTypeEnum.出库:
                        int p = CommonSQL.GetArfByFrt(d.devName);
                        if (p == 0)
                        {
                            throw new Exception("无对应固定辊台-摆渡车对接点!");
                        }
                        if (d.isLock)
                        {
                            if (d._.ActionStatus == ActionEnum.停止 && d._.GoodsStatus == GoodsEnum.辊台无货)
                            {
                                // 解锁
                                d.IsLockUnlock(false);
                            }

                            // 是否有锁定摆渡车
                            if (ADS.mArf.IsLockARF(d.area, d.taskType, out int goods))
                            {
                                // 摆渡车过来待命
                                if (ADS.mArf.MovingButtSite(d.area, d.taskType, p))
                                {
                                    // 都只有1货,接过去
                                    //if (goods == 1 && d._.GoodsStatus == GoodsEnum.辊台2有货)
                                    //{
                                    //    // 接货
                                    //    d.StartTakeRoll(d.taskType, 2);
                                    //    if (d._.ActionStatus == ActionEnum.运行中)
                                    //    {
                                    //        // 摆渡车送货
                                    //        ADS.mArf.IsGiving(d.area, d.taskType);
                                    //    }
                                    //}
                                }
                            }
                        }
                        else
                        {
                            // 空闲摆渡车
                            if (ADS.mArf.IsFreeARF(d.area, d.taskType))
                            {
                                if ((d._.GoodsStatus == GoodsEnum.辊台满货 && d._.RollerStatus == RollerStatusEnum.辊台停止) ||
                                    (d._.GoodsStatus == GoodsEnum.辊台2有货 &&
                                     d._.RollerStatus != RollerStatusEnum.辊台2启动 && d._.RollerStatus != RollerStatusEnum.辊台全启动))
                                {
                                    d.StopRoller();
                                    // 锁定
                                    d.IsLockUnlock(true);
                                }
                                else
                                {
                                    if (d._.GoodsStatus != GoodsEnum.辊台无货)
                                    {
                                        // 接货
                                        d.StartTakeRoll(d.taskType, 1);
                                    }
                                }
                            }
                            else
                            {
                                // 是否有锁定摆渡车
                                if (ADS.mArf.IsLockARF(d.area, d.taskType, out int goods))
                                {
                                    // 摆渡车来送货
                                    if (ADS.mArf.MovingButtSite(d.area, d.taskType, p))
                                    {
                                        // 试探接货,防止光电干扰
                                        d.StartTakeRoll(d.taskType, 2);

                                        if (d._.GoodsStatus != GoodsEnum.辊台满货 || goods != 0)
                                        {
                                            // 接货
                                            d.StartTakeRoll(d.taskType, 2);
                                            if (d._.ActionStatus == ActionEnum.运行中)
                                            {
                                                // 摆渡车送货
                                                ADS.mArf.IsGiving(d.area, d.taskType);
                                            }
                                        }
                                        else
                                        {
                                            if ((d._.GoodsStatus == GoodsEnum.辊台满货 && d._.RollerStatus == RollerStatusEnum.辊台停止) ||
                                                (d._.GoodsStatus == GoodsEnum.辊台2有货 &&
                                                 d._.RollerStatus != RollerStatusEnum.辊台2启动 && d._.RollerStatus != RollerStatusEnum.辊台全启动))
                                            {
                                                d.StopRoller();
                                                // 锁定
                                                d.IsLockUnlock(true);
                                            }
                                            else
                                            {
                                                if (d._.GoodsStatus != GoodsEnum.辊台无货)
                                                {
                                                    // 接货
                                                    d.StartTakeRoll(d.taskType, 1);
                                                    if (d._.RollerStatus != RollerStatusEnum.辊台停止 && goods == 1)
                                                    {
                                                        // 摆渡车送货
                                                        ADS.mArf.IsGiving(d.area, d.taskType);
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        break;

                    default:
                        break;
                    }
                }
                catch (Exception ex)
                {
                    // LOG
                    CommonSQL.LogErr("FRT.DoTaskNew()", "固定辊台作业[设备]", (ex.Message + ex.Source), d.devName);
                    continue;
                }
            }
        }