/// <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); } } }
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); } }
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); }
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); } }
internal bool IsLoadOrEmpty(FerryTask task, out string result) { if (task.Load == DevFerryLoadE.未知 || task.Load == DevFerryLoadE.非空) { result = "摆渡车非空非载车"; return(false); } result = ""; return(true); }
public uint GetFerryTrack(uint ferryid) { FerryTask ferry = DevList.Find(c => c.ID == ferryid); if (ferry != null) { return(ferry.LeftTrackId); } return(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); }
/// <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); }
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); } }
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); } } }
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); } }
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); } }
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); } }
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); }
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); } }
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); } }
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(); }
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); }
/// <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); }
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); } } } }
/// <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); }
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); }