Exemplo n.º 1
0
 /// <summary>
 /// 启动/停止摆渡车
 /// </summary>
 /// <param name="ferryid"></param>
 /// <param name="isstart"></param>
 public void StartStopFerry(uint ferryid, bool isstart)
 {
     if (Monitor.TryEnter(_obj, TimeSpan.FromSeconds(2)))
     {
         try
         {
             FerryTask task = DevList.Find(c => c.ID == ferryid);
             if (task != null)
             {
                 if (isstart)
                 {
                     if (!task.IsEnable)
                     {
                         task.SetEnable(isstart);
                     }
                     task.Start();
                 }
                 else
                 {
                     if (task.IsEnable)
                     {
                         task.SetEnable(isstart);
                     }
                     task.Stop();
                     PubMaster.Warn.RemoveDevWarn((ushort)task.ID);
                 }
             }
         }
         finally { Monitor.Exit(_obj); }
     }
 }
Exemplo n.º 2
0
        public bool DoLocateFerry(uint id, ushort ferry_code, out string result)
        {
            if (!Monitor.TryEnter(_obj, TimeSpan.FromSeconds(2)))
            {
                result = "稍后再试!";
                return(false);
            }
            try
            {
                FerryTask task = DevList.Find(c => c.ID == id);
                if (!CheckFerryStatus(task, out result))
                {
                    return(false);
                }

                if (!IsLoadOrEmpty(task, out result))
                {
                    return(false);
                }

                task.DoLocate(ferry_code);
                return(true);
            }
            finally
            {
                Monitor.Exit(_obj);
            }
        }
Exemplo n.º 3
0
 private void PosMsgSend(FerryTask task, DevFerry ferry)
 {
     mMsg.ID   = task.ID;
     mMsg.Name = task.Device.name;
     mMsg.o1   = ferry;
     Messenger.Default.Send(mMsg, MsgToken.FerrySiteUpdate);
 }
Exemplo n.º 4
0
        public void UpdateFerryWithTrackId(uint trackid, DevFerryLoadE devFerryLoadE)
        {
            FerryTask ferry = DevList.Find(c => c.LeftTrackId == trackid);

            if (ferry != null)
            {
                ferry.DevStatus.LoadStatus = devFerryLoadE;
                MsgSend(ferry, ferry.DevStatus);
            }
        }
Exemplo n.º 5
0
 internal bool IsLoadOrEmpty(FerryTask task, out string result)
 {
     if (task.Load == DevFerryLoadE.未知 || task.Load == DevFerryLoadE.非空)
     {
         result = "摆渡车非空非载车";
         return(false);
     }
     result = "";
     return(true);
 }
Exemplo n.º 6
0
        public uint GetFerryTrack(uint ferryid)
        {
            FerryTask ferry = DevList.Find(c => c.ID == ferryid);

            if (ferry != null)
            {
                return(ferry.LeftTrackId);
            }
            return(0);
        }
Exemplo n.º 7
0
        public bool HaveFerryOnTileTrack(ushort ferry_code, DevCarrierTaskE type, out string result)
        {
            if (!Monitor.TryEnter(_obj, TimeSpan.FromSeconds(2)))
            {
                result = "稍后再试!";
                return(false);
            }
            try
            {
                Track track = PubMaster.Track.GetTrackByCode(ferry_code);
                if (track != null)
                {
                    if (track.Type == TrackTypeE.摆渡车_入 || track.Type == TrackTypeE.摆渡车_出)
                    {
                        result = "小车已经在摆渡车上了!";
                        return(true);
                    }
                    FerryTask task = null;
                    if (type == DevCarrierTaskE.前进至摆渡车)
                    {
                        task = DevList.Find(c => c.IsOnSite(track.ferry_down_code));
                    }

                    if (type == DevCarrierTaskE.后退至摆渡车)
                    {
                        task = DevList.Find(c => c.IsOnSite(track.ferry_up_code));
                    }

                    if (task == null)
                    {
                        result = "找不到对应轨道(" + track.name + ")的摆渡车设备信息";
                        mlog.Status(true, result);
                        return(false);
                    }

                    if (!CheckFerryStatus(task, out result))
                    {
                        mlog.Status(true, task.Device.name + "摆渡车HaveFerryOnTileTrack()" + result);
                        return(false);
                    }

                    if (task.Status == DevFerryStatusE.停止)
                    {
                        return(true);
                    }
                    mlog.Status(true, task.Device.name + "摆渡车HaveFerryOnTileTrack()" + result);
                }
            }
            finally
            {
                Monitor.Exit(_obj);
            }
            result = "没有符合条件的摆渡车!";
            return(false);
        }
Exemplo n.º 8
0
        /// <summary>
        /// 检查摆渡车状态
        /// </summary>
        /// <param name="ferry"></param>
        /// <returns></returns>
        private bool CheckFerryStatus(FerryTask ferry)
        {
            if (ferry.ConnStatus == SocketConnectStatusE.通信正常 &&
                ferry.OperateMode == DevOperateModeE.自动 &&
                ferry.Status == DevFerryStatusE.停止 &&
                ferry.Load == DevFerryLoadE.空)
            {
                return(true);
            }

            return(false);
        }
Exemplo n.º 9
0
 internal void UpdateWorking(uint devId, bool working)
 {
     if (!Monitor.TryEnter(_obj, TimeSpan.FromSeconds(2)))
     {
         return;
     }
     try
     {
         FerryTask task = DevList.Find(c => c.ID == devId);
         if (task != null)
         {
             task.IsWorking = working;
             MsgSend(task, task.DevStatus);
         }
     }
     finally { Monitor.Exit(_obj); }
 }
Exemplo n.º 10
0
 private void MsgSend(FerryTask task, DevFerry ferry)
 {
     if (Monitor.TryEnter(_objmsg, TimeSpan.FromSeconds(5)))
     {
         try
         {
             mMsg.ID   = task.ID;
             mMsg.Name = task.Device.name;
             mMsg.o1   = ferry;
             mMsg.o2   = task.ConnStatus;
             Messenger.Default.Send(mMsg, MsgToken.FerryStatusUpdate);
         }
         finally
         {
             Monitor.Exit(_objmsg);
         }
     }
 }
Exemplo n.º 11
0
 internal bool UnlockFerry(StockTrans trans, uint ferryid)
 {
     if (!Monitor.TryEnter(_obj, TimeSpan.FromSeconds(2)))
     {
         return(false);
     }
     try
     {
         FerryTask task = DevList.Find(c => c.ID == ferryid);
         if (task != null)
         {
             task.SetFerryUnlock(trans.id);
         }
         return(true);
     }
     finally
     {
         Monitor.Exit(_obj);
     }
 }
Exemplo n.º 12
0
 public bool ReSetFerry(uint id, DevFerryResetPosE resettype, out string result)
 {
     if (!Monitor.TryEnter(_obj, TimeSpan.FromSeconds(2)))
     {
         result = "稍后再试!";
         return(false);
     }
     try
     {
         FerryTask task = DevList.Find(c => c.ID == id);
         if (!CheckFerryStatus(task, out result))
         {
             return(false);
         }
         task.DoReSet(resettype);
         return(true);
     }
     finally
     {
         Monitor.Exit(_obj);
     }
 }
Exemplo n.º 13
0
        internal bool TryLock(StockTrans trans, uint ferryid, uint carriertrackid)
        {
            if (!Monitor.TryEnter(_obj, TimeSpan.FromSeconds(2)))
            {
                return(false);
            }
            try
            {
                FerryTask task = DevList.Find(c => c.ID == ferryid);
                if (task == null)
                {
                    return(false);
                }

                //小车在摆渡车上,直接锁定
                if (task.LeftTrackId == carriertrackid)
                {
                    if (!task.IsStillLockInTrans(trans.id))
                    {
                        task.SetFerryLock(trans.id);
                    }
                    return(true);
                }

                if (task.IsStillLockInTrans(trans.id))
                {
                    return(true);
                }

                if (task.IsFerryFree())
                {
                    task.SetFerryLock(trans.id);
                }

                return(false);
            }
            finally { Monitor.Exit(_obj); }
        }
Exemplo n.º 14
0
        private bool CheckFerryStatus(FerryTask task, out string result)
        {
            if (task == null)
            {
                result = "找不到可上的摆渡车";
                return(false);
            }

            if (task.ConnStatus != SocketConnectStatusE.通信正常)
            {
                result = "设备未连接";
                return(false);
            }

            if (task.OperateMode == DevOperateModeE.手动)
            {
                result = "手动操作中";
                return(false);
            }

            result = "";
            return(true);
        }
Exemplo n.º 15
0
 public bool SetFerryPos(uint id, ushort ferry_code, int intpos, out string result)
 {
     if (!Monitor.TryEnter(_obj, TimeSpan.FromSeconds(2)))
     {
         result = "稍后再试!";
         return(false);
     }
     try
     {
         FerryTask task = DevList.Find(c => c.ID == id);
         if (!CheckFerryStatus(task, out result))
         {
             return(false);
         }
         task.DoSiteUpdate(ferry_code, intpos);
         //_FerrySiteCode = ferry_code;
         return(true);
     }
     finally
     {
         Monitor.Exit(_obj);
     }
 }
Exemplo n.º 16
0
        private void CheckConn(FerryTask task)
        {
            switch (task.ConnStatus)
            {
            case SocketConnectStatusE.连接成功:
            case SocketConnectStatusE.通信正常:
                PubMaster.Warn.RemoveDevWarn(WarningTypeE.DeviceOffline, (ushort)task.ID);
                break;

            case SocketConnectStatusE.连接中:
            case SocketConnectStatusE.连接断开:
            case SocketConnectStatusE.主动断开:
                if (task.IsEnable)
                {
                    PubMaster.Warn.AddDevWarn(WarningTypeE.DeviceOffline, (ushort)task.ID);
                }
                break;
            }
            if (task.MConChange)
            {
                MsgSend(task, task.DevStatus);
            }
        }
Exemplo n.º 17
0
        public void Start()
        {
            List <Device> ferrys = PubMaster.Device.GetFerrys();

            foreach (Device dev in ferrys)
            {
                FerryTask task = new FerryTask
                {
                    Device = dev
                };
                task.Start();
                DevList.Add(task);
            }
            if (_mRefresh == null || !_mRefresh.IsAlive || _mRefresh.ThreadState == ThreadState.Aborted)
            {
                _mRefresh = new Thread(Refresh)
                {
                    IsBackground = true
                };
            }

            _mRefresh.Start();
        }
Exemplo n.º 18
0
        internal bool IsStopAndSiteOnTrack(uint id, bool isferryupsite, out string result)
        {
            FerryTask task = DevList.Find(c => c.LeftTrackId == id);

            if (task == null)
            {
                result = "找不到设备";
                return(false);
            }

            if (!CheckFerryStatus(task, out result))
            {
                return(false);
            }

            if (task.Status != DevFerryStatusE.停止)
            {
                result = "摆渡车非停止状态!";
                return(false);
            }

            if (isferryupsite && !task.IsUpLight)
            {
                result = "摆渡车上光电未亮!";
                return(false);
            }

            if (!isferryupsite && !task.IsDownLight)
            {
                result = "摆渡车下光电未亮!";
                return(false);
            }

            result = "";
            return(true);
        }
Exemplo n.º 19
0
        /// <summary>
        /// 是否允许交管摆渡车移动
        /// </summary>
        /// <returns></returns>
        private bool IsAllowToMoveForFerry(uint ferryid, uint trackid, out string result)
        {
            FerryTask ferry = PubTask.Ferry.GetFerry(ferryid);

            if (!PubTask.Ferry.IsAllowToMove(ferry, trackid, out result))
            {
                result = string.Format("[ ❌ ]摆渡车[ {0} - {1}]", PubMaster.Device.GetDeviceName(ferryid), result);
                return(false);
            }
            else
            {
                result = string.Format("[ ✔ ]摆渡车[ {0} - 允许移动]", PubMaster.Device.GetDeviceName(ferryid));
            }

            // 是否锁定任务 判断任务节点是否允许移动
            if (ferry.IsLock && ferry.TransId != 0)
            {
                StockTrans trans = PubTask.Trans.GetTrans(ferry.TransId);
                if (trans != null && !trans.finish)
                {
                    List <uint> Ftraids = ferry.GetFerryCurrentTrackIds();
                    if (Ftraids == null || Ftraids.Count == 0)
                    {
                        result = string.Format("[ ❌ ]摆渡车[ {0} - 没有当前位置信息]", PubMaster.Device.GetDeviceName(ferryid));
                        return(false);
                    }

                    // 空车 - 在运输车对应位置 则不能移动
                    uint Ctraid = PubTask.Carrier.GetCarrierTrackID(trans.carrier_id);
                    if (Ftraids.Contains(Ctraid))
                    {
                        result = string.Format("[ ❌ ]摆渡车[ {0} - 被任务[ {1} ]锁定, 等待运输车[ {2} ]作业]",
                                               PubMaster.Device.GetDeviceName(ferryid), trans.id,
                                               PubMaster.Device.GetDeviceName(trans.carrier_id));
                        return(false);
                    }

                    // 载车 - 在任务的对应位置 则不能移动
                    if (ferry.Load != DevFerryLoadE.空)
                    {
                        switch (trans.TransType)
                        {
                        case TransTypeE.入库:
                        case TransTypeE.手动入库:
                            if (trans.TransStaus == TransStatusE.取砖流程 && Ftraids.Contains(trans.take_track_id))
                            {
                                result = string.Format("[ ❌ ]自动任务取砖流程中, 摆渡车[ {0} - 被任务[ {1} ]锁定, 等待运输车[ {2} ]作业]",
                                                       PubMaster.Device.GetDeviceName(ferryid), trans.id,
                                                       PubMaster.Device.GetDeviceName(trans.carrier_id));
                                return(false);
                            }
                            if (trans.TransStaus == TransStatusE.放砖流程 && Ftraids.Contains(trans.give_track_id))
                            {
                                result = string.Format("[ ❌ ]自动任务放砖流程中, 摆渡车[ {0} - 被任务[ {1} ]锁定, 等待运输车[ {2} ]作业]",
                                                       PubMaster.Device.GetDeviceName(ferryid), trans.id,
                                                       PubMaster.Device.GetDeviceName(trans.carrier_id));
                                return(false);
                            }
                            if (trans.TransStaus == TransStatusE.取消 && Ftraids.Contains(trans.give_track_id))
                            {
                                result = string.Format("[ ❌ ]自动任务取消流程中, 摆渡车[ {0} - 被任务[ {1} ]锁定, 等待运输车[ {2} ]作业]",
                                                       PubMaster.Device.GetDeviceName(ferryid), trans.id,
                                                       PubMaster.Device.GetDeviceName(trans.carrier_id));
                                return(false);
                            }
                            break;

                        case TransTypeE.出库:
                        case TransTypeE.手动出库:
                            if (trans.TransStaus == TransStatusE.取砖流程)
                            {
                                // 运输车无货 需要取砖
                                if (PubTask.Carrier.IsNotLoad(trans.carrier_id) && Ftraids.Contains(trans.take_track_id))
                                {
                                    result = string.Format("[ ❌ ]自动任务取砖流程中, 摆渡车[ {0} - 被任务[ {1} ]锁定, 等待运输车[ {2} ]作业]",
                                                           PubMaster.Device.GetDeviceName(ferryid), trans.id,
                                                           PubMaster.Device.GetDeviceName(trans.carrier_id));
                                    return(false);
                                }
                                // 运输车载货 需要放砖
                                if (PubTask.Carrier.IsLoad(trans.carrier_id) && Ftraids.Contains(trans.give_track_id))
                                {
                                    result = string.Format("[ ❌ ]自动任务放砖流程中, 摆渡车[ {0} - 被任务[ {1} ]锁定, 等待运输车[ {2} ]作业]",
                                                           PubMaster.Device.GetDeviceName(ferryid), trans.id,
                                                           PubMaster.Device.GetDeviceName(trans.carrier_id));
                                    return(false);
                                }
                            }
                            if (trans.TransStaus == TransStatusE.还车回轨 && Ftraids.Contains(trans.finish_track_id))
                            {
                                result = string.Format("[ ❌ ]自动任务还车回轨流程中, 摆渡车[ {0} - 被任务[ {1} ]锁定, 等待运输车[ {2} ]作业]",
                                                       PubMaster.Device.GetDeviceName(ferryid), trans.id,
                                                       PubMaster.Device.GetDeviceName(trans.carrier_id));
                                return(false);
                            }
                            if (trans.TransStaus == TransStatusE.取消 && Ftraids.Contains(trans.take_track_id))
                            {
                                result = string.Format("[ ❌ ]自动任务取消流程中, 摆渡车[ {0} - 被任务[ {1} ]锁定, 等待运输车[ {2} ]作业]",
                                                       PubMaster.Device.GetDeviceName(ferryid), trans.id,
                                                       PubMaster.Device.GetDeviceName(trans.carrier_id));
                                return(false);
                            }
                            break;

                        case TransTypeE.倒库:
                        case TransTypeE.移车:
                            if (trans.TransStaus == TransStatusE.移车中 && Ftraids.Contains(trans.give_track_id))
                            {
                                result = string.Format("[ ❌ ]自动任务移车流程中, 摆渡车[ {0} - 被任务[ {1} ]锁定, 等待运输车[ {2} ]作业]",
                                                       PubMaster.Device.GetDeviceName(ferryid), trans.id,
                                                       PubMaster.Device.GetDeviceName(trans.carrier_id));
                                return(false);
                            }
                            break;
                        }
                    }
                }
            }

            return(true);
        }
Exemplo n.º 20
0
        private void FerryMsgUpdate(SocketMsgMod mod)
        {
            if (mod != null)
            {
                if (Monitor.TryEnter(_obj, TimeSpan.FromSeconds(2)))
                {
                    try
                    {
                        FerryTask task = DevList.Find(c => c.ID == mod.ID);
                        if (task != null)
                        {
                            task.ConnStatus = mod.ConnStatus;
                            if (mod.Device is DevFerry ferry)
                            {
                                task.DevStatus = ferry;
                                task.UpdateInfo();
                                if (ferry.IsUpdate || mTimer.IsTimeOutAndReset(TimerTag.DevRefreshTimeOut, ferry.ID, 5))
                                {
                                    MsgSend(task, ferry);
                                }

                                ///摆渡车对位中
                                if (_IsSetting)
                                {
                                    if (_FerryPosSetList.Find(c => c.FerryId == task.ID && !c.IsRF) is FerryPosSet set)
                                    {
                                        PosMsgSend(task, ferry);
                                    }

                                    if (_FerryPosSetList.Find(c => c.FerryId == task.ID && c.IsRF) is FerryPosSet rfset)
                                    {
                                        RfPosMsgSend(rfset, ferry);
                                    }
                                }
                            }

                            if (mod.Device is DevFerrySite site)
                            {
                                task.DevSite = site;

                                if (_FerryPosSetList.Find(c => c.FerryId == task.ID && !c.IsRF) is FerryPosSet fset)
                                {
                                    PosMsgSend(task, site);
                                }

                                if (_FerryPosSetList.Find(c => c.FerryId == task.ID && c.IsRF) is FerryPosSet rfset)
                                {
                                    RfPosSiteMsgSend(rfset, task.ID, site);
                                }
                            }
                            CheckConn(task);
                        }
                    }
                    catch (Exception e)
                    {
                        mlog.Error(true, e.Message, e);
                    }
                    finally { Monitor.Exit(_obj); }
                }
            }
        }
Exemplo n.º 21
0
        /// <summary>
        /// 定位摆渡车
        /// </summary>
        /// <param name="ferryid">摆渡车ID</param>
        /// <param name="to_track_id">定位轨道ID</param>
        /// <param name="result">结果</param>
        /// <returns></returns>
        internal bool DoLocateFerry(uint ferryid, uint to_track_id, out string result)
        {
            if (!Monitor.TryEnter(_obj, TimeSpan.FromSeconds(2)))
            {
                result = "稍后再试!";
                return(false);
            }
            try
            {
                FerryTask task = DevList.Find(c => c.ID == ferryid);
                if (task == null)
                {
                    result = "找不到设备";
                    return(false);
                }

                if (!CheckFerryStatus(task, out result))
                {
                    return(false);
                }

                //if(!IsLoadOrEmpty(task, out result))
                //{
                //    return false;
                //}

                if (task.Status == DevFerryStatusE.停止 &&
                    (task.DevStatus.CurrentTask == task.DevStatus.FinishTask ||
                     task.DevStatus.CurrentTask == DevFerryTaskE.未知 ||
                     ((task.DevStatus.CurrentTask == DevFerryTaskE.终止 || task.DevStatus.CurrentTask == DevFerryTaskE.定位) &&
                      (task.DevStatus.FinishTask == DevFerryTaskE.未知 || task.DevStatus.FinishTask == DevFerryTaskE.定位))))
                {
                    if (task.DevStatus.TargetSite != 0 && PubMaster.Track.GetTrackId(task.DevStatus.TargetSite) != to_track_id)
                    {
                        Thread.Sleep(500);
                        task.DoStop();
                        return(false);
                    }

                    //上砖测轨道ID 或 下砖测轨道ID
                    if (task.UpTrackId == to_track_id && task.IsUpLight)
                    {
                        if (task.DevStatus.CurrentTask == DevFerryTaskE.终止)
                        {
                            return(true);
                        }
                        else
                        {
                            Thread.Sleep(500);
                            task.DoStop();
                        }

                        return(false);
                    }

                    if (task.DownTrackId == to_track_id && task.IsDownLight)
                    {
                        if (task.DevStatus.CurrentTask == DevFerryTaskE.终止)
                        {
                            return(true);
                        }
                        else
                        {
                            Thread.Sleep(500);
                            task.DoStop();
                        }

                        return(false);
                    }

                    // 定位前检查同轨道的摆渡车
                    List <AreaDevice> areatras = PubMaster.Area.GetAreaDevList(task.AreaId, task.Type);
                    //List<AreaDevice> areatras = PubMaster.Area.GetAreaDevListWithType(task.Type);
                    uint  taskTrackId;
                    short trackOrder;
                    short takeTrackOrder = PubMaster.Track.GetTrack(to_track_id)?.order ?? 0;
                    int   safedis        = PubMaster.Dic.GetDtlIntCode("FerryAvoidNumber");
                    foreach (AreaDevice ferry in areatras)
                    {
                        if (ferry.device_id != ferryid)
                        {
                            //同区域另一台摆渡车
                            FerryTask taskB = DevList.Find(c => c.ID == ferry.device_id);
                            if (!CheckFerryStatus(taskB, out string r))
                            {
                                continue;
                            }

                            //另一台摆渡车对着的轨道id
                            uint taskBTrackId = taskB.GetFerryCurrentTrackId();

                            short trackBOrder = PubMaster.Track.GetTrack(taskBTrackId)?.order ?? 0;

                            //另一台摆渡车的目的轨道的顺序
                            short taskBTargetOrder = PubMaster.Track.GetTrackByCode(taskB.DevStatus.TargetSite)?.order ?? 0;

                            //当前摆渡车对着的轨道id
                            taskTrackId = task.GetFerryCurrentTrackId();

                            //当前摆渡车对着的轨道的顺序
                            trackOrder = PubMaster.Track.GetTrack(taskTrackId)?.order ?? 0;

                            if (trackBOrder == 0 || trackOrder == 0)
                            {
                                return(false);
                            }

                            int leftCompare, rightCompare;
                            if (trackOrder >= takeTrackOrder)
                            {
                                leftCompare  = takeTrackOrder - safedis;
                                rightCompare = trackOrder + safedis;
                            }
                            else
                            {
                                leftCompare  = trackOrder - safedis;
                                rightCompare = takeTrackOrder + safedis;
                            }
                            leftCompare = leftCompare < 0 ? 0 : leftCompare;
                            switch (taskB.Status)
                            {
                            case DevFerryStatusE.停止:
                                //当前摆渡车要前进
                                if ((leftCompare < trackBOrder && trackBOrder < rightCompare) ||
                                    (leftCompare < taskBTargetOrder && taskBTargetOrder < rightCompare))
                                {
                                    if (taskB.IsFerryLock())
                                    {
                                        return(false);
                                    }
                                    uint avoidTrackId;
                                    if (trackOrder < takeTrackOrder)
                                    {
                                        avoidTrackId = PubMaster.Track.GetTrackIdByDifference(to_track_id, safedis, true);
                                    }
                                    else
                                    {
                                        avoidTrackId = PubMaster.Track.GetTrackIdByDifference(to_track_id, safedis, false);
                                    }
                                    if (PubMaster.Track.GetTrackFerryCode(avoidTrackId, task.Type, out ushort newtrackferrycode, out result))
                                    {
                                        taskB.DoLocate(newtrackferrycode);
                                        return(false);
                                    }
                                }
                                break;

                            case DevFerryStatusE.前进:
                            case DevFerryStatusE.后退:
                                //当前摆渡车在另一台摆渡车的后面
                                if ((leftCompare < trackBOrder && trackBOrder < rightCompare) ||
                                    (leftCompare < taskBTargetOrder && taskBTargetOrder < rightCompare))
                                {
                                    return(false);
                                }
                                break;

                            default:
                                return(false);
                            }
                        }
                    }

                    if (PubMaster.Track.GetTrackFerryCode(to_track_id, task.Type, out ushort trackferrycode, out result))
                    {
                        task.DoLocate(trackferrycode);
                    }
                }
            }
            finally
            {
                Monitor.Exit(_obj);
            }

            return(false);
        }
Exemplo n.º 22
0
        public bool DoManualLocate(uint ferryid, uint trackid, bool isdownferry, out string result)
        {
            Track tra = PubMaster.Track.GetTrack(trackid);

            if (tra == null)
            {
                result = "找不到轨道信息!";
                return(false);
            }

            if (!PubMaster.Area.IsFerrySetTrack(ferryid, tra.id))
            {
                result = "摆渡车未配置" + tra.name + "!";
                return(false);
            }

            ushort ferrycode = tra.ferry_down_code;

            if (isdownferry)
            {
                if (tra.Type == TrackTypeE.砖轨道 || tra.Type == TrackTypeE.储砖_出)
                {
                    result = "请选择下砖区域的轨道";
                    return(false);
                }
            }
            else
            {   //上砖摆渡
                if (tra.Type == TrackTypeE.砖轨道 || tra.Type == TrackTypeE.储砖_入)
                {
                    result = "请选择上砖区域的轨道";
                    return(false);
                }
            }

            switch (tra.Type)
            {
            case TrackTypeE.砖轨道:
                ferrycode = tra.ferry_up_code;
                break;

            case TrackTypeE.砖轨道:
                ferrycode = tra.ferry_down_code;
                break;

            case TrackTypeE.储砖_入:
                ferrycode = tra.ferry_up_code;
                break;

            case TrackTypeE.储砖_出:
                ferrycode = tra.ferry_down_code;
                break;

            case TrackTypeE.储砖_出入:
                ferrycode = isdownferry ? tra.ferry_up_code : tra.ferry_down_code;
                break;

            case TrackTypeE.摆渡车_入:
            case TrackTypeE.摆渡车_出:
                result = "请重新选择其他轨道";
                return(false);
            }

            if (Monitor.TryEnter(_obj, TimeSpan.FromSeconds(2)))
            {
                try
                {
                    //查看是否有小车正在上摆渡车
                    FerryTask task = DevList.Find(c => c.ID == ferryid);
                    if (!CheckFerryStatus(task, out result))
                    {
                        return(false);
                    }

                    if (!IsLoadOrEmpty(task, out result))
                    {
                        return(false);
                    }

                    if (task.IsUpLight &&
                        PubTask.Carrier.HaveCarrierTaskInTrack(task.UpTrackId, DevCarrierTaskE.后退至摆渡车))
                    {
                        result = "小车正在上摆渡车";
                        return(false);
                    }

                    if (task.IsDownLight &&
                        PubTask.Carrier.HaveCarrierTaskInTrack(task.DownTrackId, DevCarrierTaskE.前进至摆渡车))
                    {
                        result = "小车正在上摆渡车";
                        return(false);
                    }

                    task.DoLocate(ferrycode);
                    return(true);
                }
                finally
                {
                    Monitor.Exit(_obj);
                }
            }
            result = "稍后再试!";
            return(false);
        }