using System; using System.Collections.Generic; using System.Linq; using System.Text; using AGV_WPF_Global; using System.ComponentModel; namespace AGV_WPF.Models { public class TrafficAreaModel : INotifyPropertyChanged { public int TrafficNum { get; set; } //管制区编号 public string TrafficName { get; set; } //管制区别名 public AGVInfoModel MainAgv { get; set; } //管制区主机 public DateTime EnterTime { get; set; } //管制区主机 public bool IsTraffic { get; set; } //管制区主机 private IList ListAgvQueue; //排队AGV private IList ListMark; //包含的地标卡号 public IList listAgvQueue { get { if (ListAgvQueue != null) { return ListAgvQueue; } else { ListAgvQueue = new List(); return ListAgvQueue; } } } public IList listMark { get { if (ListMark != null) { return ListMark; } else { ListMark = new List(); return ListMark; } } } object objLock = new object(); public event PropertyChangedEventHandler PropertyChanged; //有agv进入该管制区 public bool InTraffic(AGVInfoModel agv) { bool re = false; if (!this.listAgvQueue.Contains(agv)) { lock (objLock) { this.listAgvQueue.Add(agv); re = true; } } if (this.MainAgv == null) { if (this.listAgvQueue.Count > 0) { this.MainAgv = this.listAgvQueue[0]; this.IsTraffic = true; if (agv == this.listAgvQueue[0]) { agv.TrafficFlag = false; agv.TRAFFICAGV = null; re = true; } else { agv.TrafficFlag = true; agv.TRAFFICAGV = this.MainAgv; re = true; } } } else { if (this.MainAgv == agv) { agv.TRAFFICAGV = null; agv.TrafficFlag = false; re = true; } else { agv.TRAFFICAGV = this.MainAgv; agv.TrafficFlag = true; re = true; } } return re; } //有AGV进入混合管制区(交叉区域) public bool InMixTraffic(AGVInfoModel agv) { bool re = false; if (!this.listAgvQueue.Contains(agv)) { lock (objLock) { this.listAgvQueue.Insert(0, agv); re = true; } } if (this.MainAgv == null) { if (this.listAgvQueue.Count > 0) { this.MainAgv = this.listAgvQueue[0]; this.IsTraffic = true; if (agv == this.listAgvQueue[0]) { agv.TrafficFlag = false; agv.TRAFFICAGV = null; re = true; } else { agv.TrafficFlag = true; agv.TRAFFICAGV = this.MainAgv; re = true; } } } else { if (this.MainAgv == agv) { agv.TRAFFICAGV = null; agv.TrafficFlag = false; re = true; } else { agv.TRAFFICAGV = this.MainAgv; agv.TrafficFlag = true; re = true; } } return re; } //有agv退出该管制区 public bool OutTraffic(AGVInfoModel agv) { bool re = false; if (this.listAgvQueue.Contains(agv)) { lock (objLock) { this.listAgvQueue.Remove(agv); agv.IsMainAgv = false; agv.TrafficFlag = false; //agv.TRAFFICNUM.Remove(this); agv.TRAFFICAGV = null; } } //更新管制区状态 if (agv == this.MainAgv) { if (this.listAgvQueue.Count > 0) { this.IsTraffic = true; AGVInfoModel tempAgv = this.listAgvQueue[0]; //获取AGV对象 tempAgv.TrafficFlag = false; tempAgv.IsMainAgv = true; tempAgv.TRAFFICAGV = null; this.MainAgv = tempAgv; foreach (var i in this.listAgvQueue) { if (i != this.MainAgv) { i.TRAFFICAGV = this.MainAgv; } } } else { this.IsTraffic = false; this.MainAgv = null; } re = true; } return re; } public void AGVINTER0(AGVInfoModel agv, bool falg) { bool agvfirst = falg; if (!this.IsTraffic) { this.IsTraffic = true; } if (this.MainAgv != agv && !this.listAgvQueue.Contains(agv)) ++agv.ReleaseCount; //if (!GlobalPara.IsRealOpenSystem) //{ // if (!GlobalPara.dicTraffic.ContainsKey(this.TrafficNum)) // { // GlobalPara.dicTraffic.Add(this.TrafficNum, agv); // this.MainAgv = agv; // if (this.listAgvQueue.Contains(agv)) // { // this.listAgvQueue.Remove(agv); // } // if (!this.IsTraffic) // { // this.IsTraffic = true; // } // } // else // { // if (this.listMark.Contains(agv.MARKNUM)) // { // int index = this.listMark.IndexOf(agv.MARKNUM); // if (index > this.listMark.IndexOf((GlobalPara.dicTraffic[this.TrafficNum].MARKNUM))) // { // this.MainAgv = agv; // if (!this.IsTraffic) // { // this.IsTraffic = true; // } // GlobalPara.dicTraffic[this.TrafficNum].TRAFFICAGV = this.MainAgv; // GlobalPara.dicTraffic[this.TrafficNum].TrafficFlag = true; // if (this.listAgvQueue.Contains(agv)) // { // this.listAgvQueue.Remove(agv); // } // if (!this.listAgvQueue.Contains(GlobalPara.dicTraffic[this.TrafficNum])) // { // this.listAgvQueue.Add(GlobalPara.dicTraffic[this.TrafficNum]); // } // GlobalPara.dicTraffic[this.TrafficNum] = agv; // } // else // { // if (index == this.listMark.IndexOf((GlobalPara.dicTraffic[this.TrafficNum].MARKNUM))) // { // int trafficAGVNum = GlobalPara.dicTraffic[this.TrafficNum].AGVNUM; // int trafficIndex = GlobalPara.lastReadMarkList.FindIndex(o => o.Split(',')[0] == agv.AGVNUM.ToString()); // int curIndex = GlobalPara.lastReadMarkList.FindIndex(o => o.Split(',')[0] == agv.AGVNUM.ToString()); // if (trafficIndex > -1 && curIndex > -1) // { // string[] trafficAry = GlobalPara.lastReadMarkList[trafficIndex].Split(','); // string[] curAry = GlobalPara.lastReadMarkList[curIndex].Split(','); // DateTime trTraTime, curTime; // if (trafficAry.Length > 2 && curAry.Length > 2 && trafficAry[1] == curAry[1]) // { // bool b1 = DateTime.TryParse(trafficAry[2], out trTraTime); // bool b2 = DateTime.TryParse(curAry[2], out curTime); // if (b1 && b2 && curTime < trTraTime) // { // this.MainAgv = agv; // if (!this.IsTraffic) // { // this.IsTraffic = true; // } // GlobalPara.dicTraffic[this.TrafficNum].TRAFFICAGV = null; // GlobalPara.dicTraffic[this.TrafficNum].TrafficFlag = false; // GlobalPara.dicTraffic[this.TrafficNum] = agv; // } // else // { // agv.TRAFFICAGV = GlobalPara.dicTraffic[this.TrafficNum]; // agv.TrafficFlag = true; // if (!this.listAgvQueue.Contains(agv)) // { // this.listAgvQueue.Add(agv); // } // } // } // else // { // agv.TRAFFICAGV = GlobalPara.dicTraffic[this.TrafficNum]; // agv.TrafficFlag = true; // if (!this.listAgvQueue.Contains(agv)) // { // this.listAgvQueue.Add(agv); // } // } // } // else // { // agv.TRAFFICAGV = GlobalPara.dicTraffic[this.TrafficNum]; // agv.TrafficFlag = true; // if (!this.listAgvQueue.Contains(agv)) // { // this.listAgvQueue.Add(agv); // } // } // } // else // { // agv.TRAFFICAGV = GlobalPara.dicTraffic[this.TrafficNum]; // agv.TrafficFlag = true; // if (!this.listAgvQueue.Contains(agv)) // { // this.listAgvQueue.Add(agv); // } // } // } // } // } //} //else { if (this.MainAgv != null) { #region 管制区已经有主机占领了 if (this.MainAgv != agv) { if (this.listMark.Contains(agv.MARKNUM)) { int index = this.listMark.IndexOf(agv.MARKNUM); if (index < this.listMark.IndexOf(this.MainAgv.MARKNUM)) { if (this.listAgvQueue.Contains(agv)) { this.listAgvQueue.Remove(agv); } // this.MainAgv.TRAFFICAGV = agv; // this.MainAgv.TrafficFlag = true; if (!this.listAgvQueue.Contains(this.MainAgv)) { this.listAgvQueue.Add(this.MainAgv); } for (int i = 0; i < this.listAgvQueue.Count; i++) { this.listAgvQueue[i].TRAFFICAGV = agv; this.listAgvQueue[i].TrafficFlag = true; } this.MainAgv = agv; if (!this.IsTraffic) { this.IsTraffic = true; } } else { if (index == this.listMark.IndexOf(this.MainAgv.MARKNUM)) { // int trafficAGVNum = GlobalPara.dicTraffic[this.TrafficNum].AGVNUM; // int trafficIndex = GlobalPara.lastReadMarkList.FindIndex(o => o.Split(',')[0] == this.MainAgv.AGVNUM.ToString()); // int curIndex = GlobalPara.lastReadMarkList.FindIndex(o => o.Split(',')[0] == agv.AGVNUM.ToString()); // if (trafficIndex > -1 && curIndex > -1) // { // string[] trafficAry = GlobalPara.lastReadMarkList[trafficIndex].Split(','); // string[] curAry = GlobalPara.lastReadMarkList[curIndex].Split(','); DateTime trTraTime, curTime; // if (trafficAry.Length > 2 && curAry.Length > 2 && trafficAry[1] == curAry[1]) // { // bool b1 = DateTime.TryParse(trafficAry[2], out trTraTime); // bool b2 = DateTime.TryParse(curAry[2], out curTime); // if (b1 && b2 && curTime < trTraTime) if (agv.LastModifyMarkTime < this.MainAgv.LastModifyMarkTime) { if (this.listAgvQueue.Contains(agv)) { this.listAgvQueue.Remove(agv); } //this.MainAgv.TRAFFICAGV = agv; //this.MainAgv.TrafficFlag = true; if (!this.listAgvQueue.Contains(this.MainAgv)) { this.listAgvQueue.Add(this.MainAgv); } for (int i = 0; i < this.listAgvQueue.Count; i++) { this.listAgvQueue[i].TRAFFICAGV = agv; this.listAgvQueue[i].TrafficFlag = true; } this.MainAgv = agv; if (!this.IsTraffic) { this.IsTraffic = true; } } else { agv.TRAFFICAGV = this.MainAgv; agv.TrafficFlag = true; if (!this.listAgvQueue.Contains(agv)) { this.listAgvQueue.Add(agv); } } // } // else // { // agv.TRAFFICAGV = this.MainAgv; // agv.TrafficFlag = true; // if (!this.listAgvQueue.Contains(agv)) // { // this.listAgvQueue.Add(agv); // } // } //} //else //{ // agv.TRAFFICAGV = this.MainAgv; // agv.TrafficFlag = true; // if (!this.listAgvQueue.Contains(agv)) // { // this.listAgvQueue.Add(agv); // } //} } else { agv.TRAFFICAGV = this.MainAgv; agv.TrafficFlag = true; if (!this.listAgvQueue.Contains(agv)) { this.listAgvQueue.Add(agv); } } } } #region 主机不是我,这个管制区不是我管制 //foreach (var traffic in agv.TRAFFICNUM) //{ // //如果我所管制的区域里的等候名单中有即将进入的这个管制区的主机 // //表明将会发生死管现象,应该避免。所以在此检查一下。 // if (traffic.listAgvQueue.Contains(this.MainAgv)) // { // ReleaseMixMainAgv(); // break; // } //} ////排队等候 //agv.TRAFFICAGV = this.MainAgv; //if (!this.listAgvQueue.Contains(agv)) //{ // if (!agvfirst)//看是否进入交叉管制区 // { // this.listAgvQueue.Add(agv); // } // else // { // this.listAgvQueue.Insert(0, agv); // } // //this.listAgvQueue.Add(agv); //} #endregion } else { #region 主机是我,这个管制区是我管制的 agv.TRAFFICAGV = null; if (this.listAgvQueue.Contains(agv)) { this.listAgvQueue.Remove(agv); } #endregion } #endregion } else { #region 这个管制区没有主机,我将成为主机占领该区 // else { if (this.listAgvQueue.Count > 0 && this.listAgvQueue[0] != agv) { { this.MainAgv = this.listAgvQueue[0]; this.listAgvQueue.RemoveAt(0); if (!agvfirst)//看是否进入交叉管制区修改 { this.listAgvQueue.Add(agv); } else { this.listAgvQueue.Insert(0, agv); } } //this.listAgvQueue.Add(agv); } else { this.MainAgv = agv; agv.IsMainAgv = true; agv.TrafficFlag = false;//---罗国--2017-10-30成主机后状态变成不管制,为了解决互相管制的问题。 foreach (var a in this.listAgvQueue) { a.TRAFFICAGV = agv; } if (this.listAgvQueue.Contains(agv)) { this.listAgvQueue.Remove(agv); } //this.listAgvQueue.Add(agv); } } #endregion } } } //AGV进入管制区 public void AGVINTER(AGVInfoModel agv, bool falg) { bool agvfirst = falg; if (!this.IsTraffic) { this.IsTraffic = true; } if (this.MainAgv != agv && !this.listAgvQueue.Contains(agv)) ++agv.ReleaseCount; if (this.MainAgv != null) { #region 管制区已经有主机占领了 if (this.MainAgv != agv) { #region 主机不是我,这个管制区不是我管制 foreach (var traffic in agv.TRAFFICNUM) { //如果我所管制的区域里的等候名单中有即将进入的这个管制区的主机 //表明将会发生死管现象,应该避免。所以在此检查一下。 if (traffic.listAgvQueue.Contains(this.MainAgv)) { ReleaseMixMainAgv(); break; } } //排队等候 agv.TRAFFICAGV = this.MainAgv; if (!this.listAgvQueue.Contains(agv)) { if (!agvfirst)//看是否进入交叉管制区 { this.listAgvQueue.Add(agv); } else { this.listAgvQueue.Insert(0, agv); } //this.listAgvQueue.Add(agv); } #endregion } else { #region 主机是我,这个管制区是我管制的 agv.TRAFFICAGV = null; if (this.listAgvQueue.Contains(agv)) { this.listAgvQueue.Remove(agv); } #endregion } #endregion } else { #region 这个管制区没有主机,我将成为主机占领该区 if (this.listAgvQueue.Count > 0 && this.listAgvQueue[0] != agv) { this.MainAgv = this.listAgvQueue[0]; this.listAgvQueue.RemoveAt(0); if (!agvfirst)//看是否进入交叉管制区修改 { this.listAgvQueue.Add(agv); } else { this.listAgvQueue.Insert(0, agv); } //this.listAgvQueue.Add(agv); } else { this.MainAgv = agv; agv.IsMainAgv = true; agv.TrafficFlag = false;//---罗国--2017-10-30成主机后状态变成不管制,为了解决互相管制的问题。 foreach (var a in this.listAgvQueue) { a.TRAFFICAGV = agv; } if (this.listAgvQueue.Contains(agv)) { this.listAgvQueue.Remove(agv); } //this.listAgvQueue.Add(agv); } #endregion } } //AGV离开管制区 public void AGVLEAVE(AGVInfoModel agv) { --agv.ReleaseCount; //解除管制 if (this.MainAgv == agv) { this.IsTraffic = false; this.MainAgv = null; } else if (this.MainAgv == null) { this.IsTraffic = false; } if (this.listAgvQueue.Contains(agv)) { this.listAgvQueue.Remove(agv); } if (agv.TRAFFICAGV != null && agv.TRAFFICAGV.TRAFFICNUM.Contains(this)) { this.listAgvQueue.Insert(0, agv.TRAFFICAGV); } } public void ReleaseAgv() { AGVInfoModel reAgv = this.listAgvQueue[0]; if (reAgv.ReleaseCount > 1)//本来是按照1来判断 { #region 它相对这个管制区是管制者,但它不被允许放行,因为还有其他区域的管制者管制着它。 this.IsTraffic = true; this.MainAgv = reAgv; if (this.listAgvQueue.Contains(reAgv)) { this.listAgvQueue.Remove(reAgv); } reAgv.IsMainAgv = true; foreach (var a in this.listAgvQueue) { a.TRAFFICAGV = reAgv; } //判断AGV是否可以被放行 bool fx = true; foreach (var t in reAgv.TRAFFICNUM) { if (t.MainAgv != reAgv) { fx = false; } } if (fx) { reAgv.TrafficFlag = false; this.AGVINTER(reAgv, false); } else { reAgv.TrafficFlag = true; } #endregion } else { //reAgv.TrafficFlag = false; this.AGVINTER(reAgv, false); } } public void ReleaseAgv(AGVInfoModel reAgv) { if (reAgv.ReleaseCount > 1) { #region 它相对这个管制区是管制者,但它不被允许放行,因为还有其他区域的管制者管制着它。 this.IsTraffic = true; this.MainAgv = reAgv; if (this.listAgvQueue.Contains(reAgv)) { this.listAgvQueue.Remove(reAgv); } reAgv.IsMainAgv = true; foreach (var a in this.listAgvQueue) { a.TRAFFICAGV = reAgv; } //判断AGV是否可以被放行 bool fx = true; foreach (var t in reAgv.TRAFFICNUM) { if (t.MainAgv != reAgv) { fx = false; } } if (fx) { reAgv.TrafficFlag = false;//放行之前把标识位给置为false this.AGVINTER(reAgv, false); } else { reAgv.TrafficFlag = true; } #endregion } else { //reAgv.TrafficFlag = false; this.AGVINTER(reAgv, false); } } public void ReleaseMainAgv() { if (this.MainAgv.ReleaseCount < 2)//被管制的数量小于2时,说明管制区里只有1车被管制,则主机可以随便走。 { this.MainAgv.TrafficFlag = false; if (this.MainAgv.TRAFFICAGV != null) this.MainAgv.TRAFFICAGV = null; if (this.listAgvQueue.Contains(this.MainAgv)) this.listAgvQueue.Remove(this.MainAgv); } } public void ReleaseMixMainAgv() { this.MainAgv.TrafficFlag = false; if (this.MainAgv.TRAFFICAGV != null) this.MainAgv.TRAFFICAGV = null; if (this.listAgvQueue.Contains(this.MainAgv)) this.listAgvQueue.Remove(this.MainAgv); } public int Blockade(AGVInfoModel agv) { if (!this.IsTraffic) this.IsTraffic = true; //确保管制区的状态是管制中,封锁该管制区。 if (this.MainAgv != null) { if (this.MainAgv != agv) { this.listAgvQueue.Add(agv); //把该AGV加入到管制区前的等候队伍中等候。 return 2; } } else { this.MainAgv = agv;//直接让该AGV占领该管制区成为主机。 return 1; } return 0; } private void NotifyPropertyChanged(String info) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(info)); } } public void Dispose() { throw new NotImplementedException(); } } }